395 lines
45 KiB
Markdown
395 lines
45 KiB
Markdown
---
|
||
name: kompas-3d
|
||
description: >
|
||
Методика работы с КОМПАС-3D через MCP-сервер плагина: построение и
|
||
модификация деталей, импорт/экспорт STEP, работа со сборками, осмотр геометрии
|
||
снимками и запросами. Используй ВСЕГДА, когда задача — что-то СДЕЛАТЬ в КОМПАС
|
||
через MCP-инструменты (создать/править деталь, импортировать STEP, разобрать
|
||
сборку, померить, отрендерить, экспортировать). Здесь — playbook'и и эвристики,
|
||
проверенные на практике. Триггеры: «построй деталь в КОМПАС», «импортируй STEP»,
|
||
«что в этой сборке», «нарасти/измени деталь», «экспортируй STEP», «сделай снимок модели».
|
||
---
|
||
|
||
# kompas-3d — методика управления КОМПАС-3D через MCP
|
||
|
||
MCP-сервер даёт **общие** операции КОМПАС (эскизы, формообразующие, осмотр, обмен), этот навык —
|
||
**методику**: в каком порядке их применять, как выбирать геометрию, чем проверять результат и какие
|
||
подводные камни обходить. Коротко: **MCP = чем делать, навык = как делать.** Подробности вызова —
|
||
варианты операций, обязательные поля, типы примитивов эскиза и их параметры — живут в описаниях
|
||
самих инструментов: контракт сервера подробен, читай его, а не восстанавливай по памяти.
|
||
|
||
## Когда применять
|
||
|
||
Любая задача «сделать что-то В КОМПАС» через MCP: создать/править деталь, эскизы и операции,
|
||
импорт/экспорт обменных форматов, разбор сборки, измерения, снимки.
|
||
|
||
## Указатель: тип задачи → файл
|
||
|
||
Этот файл — ядро: применяется в любой задаче. Развёрнутый playbook под конкретный тип работы вынесен
|
||
в `reference/*.md` — читай Read'ом ровно тот файл, что подошёл, остальные не трогай.
|
||
|
||
| Задача | Файл |
|
||
|---|---|
|
||
| Переменные, параметрическая модель | `reference/parametrization.md` |
|
||
| Надпись, логотип, SVG, рельеф, выбор маршрута для внешнего контура | `reference/text-and-relief.md` |
|
||
| Переиспользуемый чертёжный блок (*.frw) | `reference/fragments.md` |
|
||
| Сборка с нуля (вставка, сопряжения, фиксация) | `reference/assembly-playbook.md` |
|
||
| Чертёж по ГОСТ, виды, разрез, размеры | `reference/drawing-playbook.md` |
|
||
| Разбор ЧУЖОЙ модели/сборки (импорт, STEP) | `reference/import-playbook.md` |
|
||
| Исполнения (типоразмеры, зеркала в одном файле) | `reference/embodiments-playbook.md` |
|
||
|
||
Ни один файл не подошёл — вопрос, скорее всего, про механику КОНКРЕТНОГО инструмента, а не про
|
||
порядок работы: туда — `help(topic="…")`/`help(query="…")` (см. ниже), а не в `reference/`.
|
||
Не нашёлся и там — `Grep` по `reference/**` словами задачи: это и есть весь механизм поиска, ничего
|
||
специального заводить не пришлось.
|
||
|
||
## Два правила прежде всего
|
||
|
||
**1. «Зрение» — структурное, не по картинке.** «Увидеть» деталь = **`describe_model`** — паспорт
|
||
одним запросом и ЕДИНСТВЕННЫЙ инструмент осмотра: разделы `box | mass | bodies | topology | tree |
|
||
variables | errors | components` (`sections` сужает и ответ, и объём чтения модели). Углубляться —
|
||
`list_faces(index=N)` / `list_edges` (отбор `type` + координатное окно — им адресуют то, что не
|
||
выбрать по одному: весь нижний контур под фаску) / `measure`. **`model_snapshot`
|
||
бери только** для визуально-пространственных вопросов, на которые паспорт не отвечает (общая
|
||
форма, ориентация, правдоподобность, «куда смотрит грань»): снимок дорог по контексту и менее
|
||
точен, чем числа.
|
||
|
||
**1а. Осмотр НЕ перестраивает документ.** Если модель правили снаружи (человек в GUI, соседний
|
||
агент) или операция запросила перестроение, `describe_model` покажет числа ДО правки — и ответ
|
||
будет выглядеть безупречным: размеры новые, положения старые, сопряжения валидны. Такой ответ сам
|
||
скажет «Документ ТРЕБУЕТ ПЕРЕСТРОЕНИЯ» (`needsRebuild: true`); увидел — `rebuild` и повтори осмотр,
|
||
выводов по непересчитанной модели не делай.
|
||
|
||
**2. Ответ мутирующей операции — это НЕСКОЛЬКО проверок, читай все.** Любая операция может «пройти»
|
||
(`Create()==true`), оставив деталь в ошибке, поэтому каждая мутирующая операция сама дописывает
|
||
к ответу итог проверки построения и сводку состояния «Тел: N, объём V мм³»:
|
||
|
||
- **«⚠ N операц. в ошибке»** (напр. `et3dError54`) — деталь невалидна: не продолжай и не
|
||
экспортируй, исправь или переделай другим методом. «Построение чистое» = порядок.
|
||
Строки с «ℹ» — не отказы: «требуется перестроение» лечится `rebuild`, а «не определено
|
||
положение (N)» означает, что компоненту не хватает сопряжений или фиксации. Бросать из-за них
|
||
исправную сборку не нужно; в обеих названы имя и индекс компонента.
|
||
- **«Тел: 2»** там, где ждёшь одно тело, — деталь распалась: касание объединением не считается
|
||
(см. «Надписи»). Смотри на число ТЕЛ, а не граней: объединение сливает компланарные грани,
|
||
и счётчик граней законно остаётся прежним.
|
||
**Но обратное неверно: «Тел: 1» распад не опровергает.** Счётчик в сводке ОПАЗДЫВАЕТ. Замер
|
||
(журнал операций кейса с хвостом по сечениям): `loft` построил второе тело и отчитался
|
||
«Тел: 1», следом `mirror` — снова «Тел: 1», и только третья операция, `chamfer_edge`, напечатала
|
||
«Тел: 2», хотя между ними ничего не создавалось. Три операции подряд шли по детали, объём
|
||
которой считал пересечение дважды. Поэтому «Тел: 2» — тревога, которой верят сразу, а «Тел: 1» —
|
||
не доказательство: там, где важно именно СРАСТАНИЕ (loft/sweep на грань, надпись, примитив
|
||
впритык), проверяй `describe_model(sections="bodies")` — у каждого тела там свой габарит — и сверяй
|
||
объём с прикидкой.
|
||
- **Объём сверяй с прикидкой** «площадь контура × высота». Так ловятся молча не применившаяся
|
||
тонкая стенка (прирост как у сплошного сечения), вычитание мимо цели и операция «не туда» —
|
||
габарит и снимок этого не покажут.
|
||
- **«⚠ Сверка с запросом: …»** — четвёртая, отдельная от первых трёх строка: сервер сравнил
|
||
результат с ВХОДНЫМИ параметрами вызова. Сейчас это положение материала у `extrude(mode=boss)`
|
||
и покрытие сечений у `loft(mode=boss)` (на базовых и смещённых плоскостях), убыль объёма у
|
||
`extrude(mode=cut)`, а у `primitive` — объём против номинала по его же размерам. Сработала —
|
||
построено не то, о чём просили, и в тексте сказано что именно. **Молчание успех НЕ доказывает**:
|
||
сверка односторонняя и намеренно молчит там, где улика неоднозначна (прирост меньше
|
||
запрошенного, материал целиком внутри габарита, эскиз выдавливания на грани, сечения лофта на
|
||
наклонной грани или с одинаковыми именами). Размер-выражение сверке не мешает: и у `primitive`,
|
||
и у `extrude` величина проверяется по уже вычисленному значению. Механика и границы —
|
||
`help(topic="build-verification")`.
|
||
|
||
Отдельный `describe_model(sections=errors,bodies,mass)` после каждого шага не нужен. Он
|
||
возвращается, когда авто-проверку выключили (`set_auto_validate(false)` на тяжёлой модели, где
|
||
проверка каждого шага тормозит): тогда `describe_model(sections=errors,bodies,mass)` вручную перед выдачей: одного
|
||
`errors` мало — распад детали на два тела показывает только раздел `bodies`.
|
||
|
||
## Справочник сервера: `help`
|
||
|
||
Подробности инструментов — маршруты, порядок вызовов, ловушки — лежат в самом сервере и достаются
|
||
по требованию, а не занимают контекст заранее:
|
||
|
||
- `help()` — оглавление тем (дёшево, одна строка на тему);
|
||
- `help(topic="…")` — статья целиком;
|
||
- `help(query="…")` — поиск словами с цитатами;
|
||
- `help(tool="extrude")` — что известно про конкретный инструмент.
|
||
|
||
**Зови его, когда инструмент повёл себя не так, как ты ожидал, и когда тема названа в тексте
|
||
ошибки.** Ссылки вида `help(topic="…")` по этому файлу — не украшение: там лежит то, что здесь
|
||
намеренно не повторяется. Справочник описывает ЭТОТ сервер; справка по COM API КОМПАС — отдельная
|
||
история и в работе через MCP не нужна.
|
||
|
||
## Инструменты: где искать каталог
|
||
|
||
Полный перечень 86 инструментов с параметрами — README плагина §«Инструменты» (единый источник
|
||
правды, держать вторую копию здесь не нужно) или `tools/list` самого MCP-сервера. Что известно про
|
||
КОНКРЕТНЫЙ инструмент — `help(tool="extrude")`. Три сквозных свойства контракта, которые полезно
|
||
держать в голове, а не искать заново на каждом инструменте: **размерный параметр принимает число ИЛИ выражение** (имя
|
||
переменной/формулу — параметр сразу становится ведомым); **объект выбирается индексом** (надёжно)
|
||
или точкой (запасной путь — если выбирал точкой, ответ подскажет, что выбралось); **списковые
|
||
параметры** (`entities[]`, `edgeIndices[]`, `points[]`, `faceIndices[]`, `variables[]`, `links[]`) —
|
||
весь пакет одним вызовом: прямоугольник с четырьмя отверстиями — ОДИН `sketch_create`, скругление
|
||
восьми рёбер — ОДИН `fillet_edge`, крепёжная картина из шести отверстий — ОДИН `hole(points=[…])`,
|
||
наращивание двух торцов — ОДИН `move_face(faceIndices=[…])`; каждый лишний вызов — лишний шанс
|
||
сбиться. Пакет НЕ транзакционен: отказ называет позицию элемента в списке, а сделанное до него
|
||
остаётся — повторяй вызов с оставшимися, а не с начала. Если инструмента под задачу нет — собирай
|
||
результат из имеющихся общих операций.
|
||
|
||
**Оговорка для больших групп рёбер в `fillet_edge`/`chamfer_edge`.** «Один вызов на весь пакет»
|
||
экономит вызовы, но у катета/радиуса есть рабочий диапазон, заданный ВСЕЙ группой рёбер разом, а
|
||
не отдельным ребром (измерено: один и тот же контур строится с меньшим катетом и отказывает с
|
||
большим). Параметрическая модель может пройти это на одном значении переменной и отказать на
|
||
другом — большая группа сама по себе фактор хрупкости при последующей правке размеров. Если пакет
|
||
на 15+ рёбер отказывает без диагноза по длине, разбейте его на 2–3 группы — сервер сам подскажет
|
||
это в тексте отказа (`help(topic="edge-groups")`).
|
||
|
||
## Два пути формообразования — выбирай по форме, а не по привычке
|
||
|
||
«Эскиз → выдавливание» — не единственный способ. `primitive` строит тело сразу по размерам, и это
|
||
короче и надёжнее там, где форма призматическая:
|
||
|
||
| Форма | Чем строить |
|
||
|---|---|
|
||
| Плита, брусок, бобышка, штифт, цилиндрическая стойка | `primitive(kind=block\|cylinder)` — один вызов вместо «эскиз + выдавливание» |
|
||
| Прямоугольный карман, паз, срез угла | `primitive(..., result=subtract)` — вычитание тела вместо `extrude(mode=cut)` по эскизу |
|
||
| Скруглённые углы призмы | `primitive` + `fillet_edge` по рёбрам (скругление после, а не дуги в эскизе) |
|
||
| Текст, кривые, произвольный контур | ТОЛЬКО эскиз: `sketch_create(entities=[…])` + `extrude`/`revolve` |
|
||
| Переменное сечение: хвост, гребень, переход круга в квадрат | `loft` по сечениям на смещённых плоскостях (`mode=boss` приклеивает к телу) |
|
||
| Труба, поручень, кант по кривой | `sweep(profileSketchId, pathSketchId)` — профиль и траектория на разных плоскостях |
|
||
| Тонкая стенка, ободок по контуру | эскиз + `extrude(thinThickness, thinSide)` |
|
||
|
||
Их **сочетают в одной детали**: корпусные объёмы — примитивами, сложные контуры — эскизами.
|
||
|
||
- **Ось цилиндра и конуса задаётся параметром, а не системой координат детали:**
|
||
`primitive(kind="cylinder", axis="X"|"Y"|"Z")`. Точка `x,y,z` остаётся центром основания в
|
||
мировых координатах, высота растёт вдоль выбранной оси. Не перепроектируй деталь ради того,
|
||
чтобы её ось совпала с Z (у `block` и `sphere` параметра нет: у блока ось задают размеры
|
||
`length/width/height`, у сферы оси нет).
|
||
|
||
- **Тонкую стенку по сложному контуру строй ДО того, как появится тело, которое она пересечёт.**
|
||
`extrude(thinThickness=…)` по многоконтурному эскизу (надпись — десяток замкнутых контуров с
|
||
«дырками») отказывает, если стенка пересекает уже построенное тело; простой прямоугольный контур
|
||
проходит и с пересечением. Ошибка сервера называет причину, но порядок планируй заранее: на
|
||
шильдике «плашка → буквы → кайма» падает, а «буквы → кайма → плашка `primitive(union)` → карман
|
||
`primitive(subtract)`» проходит — примитивам пересечение безразлично.
|
||
- **Скругления делай, пока рёбер мало** — сразу после примитивов их видно в `list_edges` наперечёт.
|
||
Если рёбер уже сотни, бери их ПО ТОЧКАМ: `fillet_edge(radius, points=[…])` по углам известных
|
||
координат — одна операция на все; точки без ребра ошибка перечислит разом.
|
||
- **Скругление не построится там, где ребро «съедено» соседним элементом** (угол плашки под каймой
|
||
букв). Это нормальный ответ геометрии, а не ошибка вызова: проверь снимком, виден ли угол снаружи.
|
||
- **Фаска на почти касательном стыке может ДОСТРОИТЬ объём, а не срезать.** Замер: `chamfer_edge`
|
||
0.3 по кромке, где поверхность лофта сходит в плоскость почти по касательной, — «построение
|
||
чистое», а объём ВЫРОС на 2.2 мм³. На выпуклом ребре фаска обязана объём УМЕНЬШАТЬ (на вогнутом
|
||
легитимно добавляет); сверяй ЗНАК приращения в сводке ответа со своим ожиданием — вырос без
|
||
причины, значит фаска выродилась в достройку: убери её `feature_delete`, пологому стыку она
|
||
и не нужна.
|
||
- **`result=new` даёт ОТДЕЛЬНОЕ тело**, `subtract` мимо цели сервер ловит сам — и то и другое
|
||
видно по сводке «Тел/объём» в ответе; при распаде зови `boolean_union`.
|
||
- **Сужающуюся или изогнутую форму не набирай лесенкой из примитивов.** `primitive` не умеет
|
||
поворота, и «хвост» из десятка блоков со ступеньками — это обход отсутствующего инструмента,
|
||
а не решение: он и печатается хуже, и правится только целиком. Бери `loft` по 4–6 сечениям на
|
||
смещённых плоскостях — параметричность не теряется, `offset` плоскости принимает выражение.
|
||
**`loft` может отказать молча, и отказ зависит от ПРОЛЁТА, а не от одного сечения** — поиск
|
||
виновника перебором пар не работает, ломается СОЧЕТАНИЕ «сечение-выброс + длина набора»; механика
|
||
и порядок поиска — `help(topic="loft-and-sweep")`.
|
||
- **`loft(mode=boss)` прирастает перекрытием, а не касанием.** Первое сечение ставь на плоскость
|
||
ВНУТРИ уже построенного тела (смещение на 1–2 мм вглубь), а не на его грань: касание объединением
|
||
не считается — на грани получишь ВТОРОЕ тело вместо приросшего. **Проверять это сводкой «Тел: 1»
|
||
НЕЛЬЗЯ** — именно здесь она и соврала (см. правило 2): считай тела
|
||
`describe_model(sections="bodies")`, там у каждого свой габарит, и сверь объём с прикидкой.
|
||
|
||
## Базовый цикл (эскиз → операция → осмотр)
|
||
|
||
Опорный сценарий построения, проверен end-to-end:
|
||
|
||
1. `kompas_connect` (+ `kompas_set_visible true`). **Работаешь не один — бери свой экземпляр:**
|
||
`kompas_connect(instance="private")` (см. «Когда КОМПАС общий»).
|
||
2. `document_create(type="part", name="…")` — наименование даём сразу, здесь оно ничего не стоит.
|
||
3. **Запиши замысел переменными** до первого эскиза (см. «Параметризация») и связывай каждый
|
||
размер, взятый из паспорта, при построении — иначе переменная останется числом в списке.
|
||
4. `sketch_create(plane="XOY", entities=[…])` — весь контур одним вызовом.
|
||
5. `extrude` / `revolve` → прочитай итог проверки и сводку прямо в ответе (правило 2).
|
||
6. Осмотр — структурно: `describe_model` (нужен кусок — `sections="box,mass"`).
|
||
7. Итерация «на грани»: `list_faces` → `sketch_create(faceIndex=N, entities=[…])` → операция.
|
||
8. **Задай материал, если смотришь на массу** — `set_part_material`: у нового документа стоит
|
||
сталь 7.86, и МЦХ печатной детали завышена вшестеро; плотности ходовых материалов перечислены
|
||
в описании инструмента.
|
||
9. **Проверь, что деталь названа** (шаг 2 или `set_part_info`) — безликая «Деталь» уедет в штамп
|
||
чертежа и спецификацию; имя файла при сохранении этого не заменяет.
|
||
|
||
**Называй каждую операцию** — `name` есть у всех: «Контур плашки», «Рельеф букв OldMan», «Карман
|
||
под площадку». Дерево из «Эскиз:1, Элемент выдавливания:3» нечитаемо ни человеку, ни тебе самому
|
||
через сотню вызовов.
|
||
|
||
## Параметризация: сначала переменные, потом геометрия
|
||
|
||
**В новом документе первым делом опиши будущую модель переменными — до первого эскиза.** Пока
|
||
деталь пуста, компоновка стоит одного вызова на размер; после десятка операций та же мысль стоит
|
||
пересборки. Набор переменных — это план построения числами и паспорт, по которому человек поймёт
|
||
модель, не разбирая дерево.
|
||
|
||
- **Заводи переменной то, что было РЕШЕНИЕМ** (габариты из ТЗ, толщины, зазоры), позиции, подобранные
|
||
замером, оставляй числами; **размер передавай выражением прямо в операцию**
|
||
(`extrude(depth="badge_T")`) — переменная должна существовать ДО операции.
|
||
- **После связывания правка паспорта перестраивает деталь; до связывания — нет**, и `set_variable`
|
||
прямо говорит «⚠ НИЧЕГО НЕ ВЕДЁТ» в этом случае — не успех, хоть число и поменялось.
|
||
- **Сверка и уборка в конце:** `describe_model(sections=variables)` помечает «⚠ ничего не ведёт»;
|
||
`delete_variable(unused=true)` не трогает справочные (`information`) и внешние.
|
||
|
||
Полная методика — обязательные поля (`note`), как сервер ловит промахи в формулах, справочные
|
||
переменные `(ТЗ)` и порядок уборки — [reference/parametrization.md](reference/parametrization.md).
|
||
|
||
## Надписи, логотипы и рельеф
|
||
|
||
Надпись — примитив `type=text` в эскизе; все поля (шрифт, кегль, `widthFactor`, выравнивание
|
||
`align`/`vAlign`) описаны в схеме `entities`. Она сразу переводится в кривые, поэтому выдавливается
|
||
как обычный контур: гравировка — `extrude(mode="cut")`, выпуклые буквы — `mode="boss"`.
|
||
|
||
- **Ответ даёт габарит ГЛИФОВ и ширину ячейки — позиционируй по глифам.** Ячейка шире на 1–2 % у
|
||
наборных шрифтов (Zilla Slab, Bevan) и на 7–9 % у скриптовых (Lobster, Pacifico).
|
||
- **Кегль калибруй `measure_text`** — он ничего не строит. Пробу, которую всё же пришлось
|
||
построить, убирает `feature_delete`; отдельный черновой документ для этого не нужен.
|
||
- **`height` — высота ПРОПИСНОЙ, а не габарит строки** (Zilla Slab, height=10: «HH» → 9.97 мм,
|
||
«Hy» → 13.24 мм, выносной уходит на −3.27) — закладывай выносные отдельно. Прочие тонкости полей
|
||
(`widthFactor`, `align`, `vAlign`) — `help(topic="sketch-text")`.
|
||
- **Подложка под надпись — тем же эскизом тонкой стенкой:** один хендл эскиза можно передать в
|
||
несколько операций — сплошное выдавливание на высоту подложки + `extrude(thinThickness,
|
||
thinSide="outward")` дают силуэт с равномерной каймой. Стенку проверяй по объёму из сводки:
|
||
не применившаяся толщина молча даёт сплошное сечение при том же габарите.
|
||
- **Надпись и плашка обязаны ПЕРЕКРЫВАТЬСЯ** — по размерам чертежа блоки обычно только касаются,
|
||
а касание объединением не считается. Приём: кайму/полосу плашки сделать выше самой плашки на
|
||
1–1.5 мм с той стороны, где стоит надпись. Распад видно по «Тел: 2» в ответе операции — не тяни
|
||
проверку до конца построения. Молчание сводки распад не опровергает (счётчик опаздывает, п. 2):
|
||
убедиться, что срослось, можно только `describe_model(sections="bodies")`.
|
||
- **Рельеф = разница глубин от одной плоскости** (основание 2 мм + буквы 3 мм = выступ 1 мм);
|
||
не строй буквы «на грани основания» — из одного эскиза на базовой плоскости получается и то и
|
||
другое, и рельеф не зависит от порядка операций.
|
||
- **Надпись читается только с той стороны, куда смотрит нормаль плоскости эскиза** — XOY → +Z,
|
||
XOZ → +Y, **YOZ → −X**. Гравировка по эскизу на YOZ, положенная на грань с бОльшим X, выходит
|
||
ЗЕРКАЛЬНОЙ, и `angle` этого не исправляет: он вращает, а не отражает (замер — цифра на щеке
|
||
X=20.4 зеркальна при любом угле, тот же эскиз на X=0 встаёт верно). Выбирайте грань по нормали,
|
||
а поворотом задавайте только, куда смотрит верх глифа. Проверять — снимком С ТОЙ СТОРОНЫ, где
|
||
надпись будет видна: `model_snapshot(view=left)` для грани X=0, `right` для X=max.
|
||
- **Шрифт должен быть установлен в системе** — неизвестное имя КОМПАС молча подменяет; сервер
|
||
предупреждает об этом в ответе `sketch_create`/`measure_text` — не игнорируй.
|
||
|
||
**Логотип (SVG) и выбор маршрута для внешнего контура (вычисляемый / срисованный / CAD-файл) —
|
||
в [reference/text-and-relief.md](reference/text-and-relief.md).** Там же — точная подгонка (кегль
|
||
под заданную ширину, ступени `widthFactor`/`height`, приросты каймы на острых терминалах, разрядка
|
||
пробелами, кайма вокруг прямоугольной плашки) и отделка рельефа (скругления/фаски на сотнях рёбер).
|
||
Прочитай его, как только контур не сводится к простому вычисляемому эскизу.
|
||
|
||
Фрагмент (*.frw, самостоятельный файл переиспользуемого контура/чертежа) —
|
||
[reference/fragments.md](reference/fragments.md).
|
||
|
||
## Сборка: собрать своё
|
||
|
||
Плейбук: **создать → вставить → ЗАФИКСИРОВАТЬ базовую → сопрячь → rebuild → проверить.**
|
||
Сборка с нуля целиком, с адресацией граней, семью типами сопряжений и порядком проверки —
|
||
[reference/assembly-playbook.md](reference/assembly-playbook.md). Разбор чужой сборки (пришедшей
|
||
STEP/импортом) — следующий раздел.
|
||
|
||
## Чертёж: оформить деталь по ГОСТ
|
||
|
||
Чертёж строится не так, как деталь: **авто-валидации здесь нет** — верность тут не про геометрию,
|
||
а про место на листе, и проверяется только просмотром. Порядок «формат → виды → координаты замером
|
||
→ разрез до размеров → простановка → `drawing_export_image`», разрез, три ловушки, на которых
|
||
чертёж молча выходит неверным (`viewNumber=0`, ассоциативность размеров, допуск без read-back), и
|
||
чего в 2D нет — [reference/drawing-playbook.md](reference/drawing-playbook.md).
|
||
|
||
## Работа с импортом / сборками
|
||
|
||
Конвейер «импорт → разбор → извлечение детали → осмотр → модификация → экспорт» для ЧУЖОЙ модели —
|
||
[reference/import-playbook.md](reference/import-playbook.md).
|
||
|
||
## Исполнения: одна модель — несколько геометрий
|
||
|
||
Типоразмеры, зеркала, версии с отверстием и без в одном файле — переключение равно смене документа
|
||
(хендлы гибнут), индексация и адресация в сборке, порядок «сначала геометрия, исполнения последним
|
||
шагом» — [reference/embodiments-playbook.md](reference/embodiments-playbook.md).
|
||
|
||
## Эвристики и подводные камни
|
||
|
||
- **Правила 1 и 2 действуют всегда:** осмотр структурный; «⚠ N операц. в ошибке» — в STEP/печать
|
||
не брать.
|
||
- **Направление операции** (`extrude(forward)`, знак `distance` у `move_face`): на выбранной грани
|
||
зависит от ориентации её нормали — реши ДО построения, прочитав нормаль в `list_faces(index=N)`
|
||
(или по снимку), а после сверь сводку объёма в ответе.
|
||
- **У ВЫРЕЗА `forward` смотрит в другую сторону, чем у прилива.** Замерено на плите Z 0..10 с
|
||
эскизом на плоскости z=10: `extrude(mode=boss, forward=true)` наращивает ВВЕРХ, а
|
||
`extrude(mode=cut, forward=true)` режет ВНИЗ, в тело. То есть у выреза «прямое» — это внутрь
|
||
материала. Оба умолчания делают то, чего обычно и хотят, но рассуждение «forward — это плюс
|
||
нормали» даст перевёрнутый карман. **Вырез, ушедший в пустоту, КОМПАС считает успехом** —
|
||
дерево чистое, объём не изменился; ловит это только строка сверки в ответе.
|
||
- **На YOZ деталь растёт в МИНУС X, и туда же уезжает смещение плоскости.** Нормаль базовой
|
||
плоскости смотрит в плюс своей оси не всегда — замерено: XOY → +Z, XOZ → +Y, а **YOZ → −X**.
|
||
Значит `extrude(forward=true)` по эскизу на YOZ кладёт материал в отрицательные X, а
|
||
`sketch_create(plane="YOZ", offset=30)` ставит плоскость в X = −30, а не +30. Обе вещи следуют
|
||
одной нормали, так что путаницы между ними нет — но знак учитывай при компоновке, иначе деталь
|
||
уедет зеркально задуманному. Таблица целиком — `help(topic="build-verification")`.
|
||
- **`sketch_update` несущего эскиза МОЛЧА теряет часть отделки.** Фаска и скругление, снятые по
|
||
точкам, после переиздания базового контура остаются в дереве, ошибок не дают — а построены
|
||
оказываются не на всех рёбрах: замерено трижды на одной детали, из четырёх скруглений выживали
|
||
то два, то одно. Иногда КОМПАС всё же сознаётся («код 145: операция потеряла опорные объекты»),
|
||
но чаще молчит, и единственный признак — объём: он оказывается БОЛЬШЕ ожидаемого ровно на
|
||
недоснятый материал. Порядок после каждого переиздания несущего эскиза: сверить объём с прикидкой
|
||
либо пересчитать результат отделки (`list_faces(type="cylinder")` для скруглений — их должно быть
|
||
ровно столько, сколько рёбер в пакете); недосчитались — снести отделочные узлы
|
||
(`feature_delete(featureIndices=[…])`) и построить заново, уже по новым рёбрам. Пересборка
|
||
дешевле поиска виновного, а «построение чистое» здесь не значит ничего.
|
||
- **Эскизы и операции адресуются ХЕНДЛАМИ из ответов** — `sk_7c1e5aa3f1_1_2`, `op_7c1e5aa3f1_1_5`.
|
||
Не сочиняй их и не передавай числа: числовая адресация не поддерживается, а сервер объяснит формат
|
||
отказом. Хендл живёт только в текущей сессии построения: смена активного документа
|
||
(create/open/close) и перезапуск сервера делают прежние хендлы **мёртвыми**, и они отказывают с
|
||
указанием причины — не молча, как раньше делали числовые id. Потерял хендл — читай
|
||
`describe_model(sections=tree)` и строй заново; сохраняйся перед долгими паузами.
|
||
Хендл — это НЕ индекс: `faceIndex`/`edgeIndices` из `list_faces`/`list_edges` и параметр
|
||
`feature` у `link_parameter`/`list_parameters` (имя или индекс узла дерева) остаются числовыми.
|
||
`primitive` и `hole` тоже возвращают хендл (у `hole` — по одному на КАЖДОЕ отверстие серии),
|
||
так что примитив и отверстие можно удалить `feature_delete` и размножить `pattern`/`mirror`.
|
||
Если ответ вместо хендла говорит «выдать не удалось» — операция построена, но адресовать её
|
||
нечем: переставить её потом можно только пересборкой.
|
||
- **Единицы — мм** (геометрия) и **кг** (масса). Локальные координаты эскиза ≠ мировые координаты
|
||
модели.
|
||
- **Одинаковая ошибка у ВСЕХ инструментов — это транспорт, а не КОМПАС.** «Unable to connect…»,
|
||
таймаут или пустой ответ на `kompas_connect`, `kompas_status` и `describe_model` одновременно
|
||
означают, что до MCP-сервера не дошёл ни один байт: перебирать инструменты и «пробовать ещё раз»
|
||
бесполезно. Один-два подтверждающих вызова — и сдавай задачу как заблокированную, назвав, что
|
||
именно не отвечает. Отдельный признак того же — сообщение без имени инструмента и без слова
|
||
«КОМПАС»: наши ошибки всегда называют операцию и причину.
|
||
|
||
## Когда КОМПАС общий
|
||
|
||
По умолчанию (`instance="shared"`) сервер работает в том же экземпляре КОМПАС, что человек и другие
|
||
агенты, а **активный документ там один на всех**. Два симптома, которые легко принять за свою
|
||
ошибку: операция ушла в чужую деталь (кто-то создал документ — активность переехала), либо твой
|
||
документ исчез, потому что сосед вызвал `document_close(all=true)` — тот закрывает ВСЁ и без
|
||
сохранения.
|
||
|
||
- **Строишь параллельно с кем-то — `instance="private"`** при первом `kompas_connect` (потом режим
|
||
не сменить). Свой экземпляр: активный документ только твой, окно скрыто (`kompas_set_visible true`
|
||
покажет).
|
||
- **`shared` оставляй**, когда работа идёт на глазах у человека и ты единственный агент.
|
||
- **Один файл в двух экземплярах не открыть** — второй получит его только на чтение: работу делите
|
||
по файлам, а не по вкладкам.
|
||
|
||
## Открытые вопросы / границы
|
||
|
||
- **Параметрика работает через параметры ОПЕРАЦИЙ, а не координаты ВНУТРИ эскиза** — сдвинуть
|
||
контур переменной нельзя, только пересобрать эскиз (`sketch_update`). Но это ограничение уже
|
||
границей: **плоскость** эскиза — обычный узел дерева с параметром «Расстояние», и она
|
||
параметризуется как всё остальное. Планируй членение так, чтобы изменяемое задавалось параметром
|
||
операции (глубина, радиус, габарит примитива) или положением плоскости, а не координатами точек.
|
||
- **2D покрыт вместе с разрезом и сечением.** Есть виды (с выбором набора, ориентации главного и
|
||
невидимых линий), разрез/сечение, листы, штамп, размеры с допусками, осевые, обозначения,
|
||
техтребования, удаление и сдвиг объекта, вывод в растр — методика в §«Чертёж». Нет выносного
|
||
элемента, местного разреза внутри вида, местного вида и вида с разрывом.
|
||
- **Разрез не переживает правку модели, если он не первый на своём базовом виде.** Замерено:
|
||
обновляется только ПЕРВЫЙ, остальные молча остаются со старой геометрией, и ни одно перестроение
|
||
этого не чинит. Порядок один: сначала модель, потом разрезы.
|
||
- **Вставку фрагмента правят только целиком** (заново `fragment_place`). Экспорт наружу — растр и
|
||
STEP; DXF/DWG и PDF не пишутся.
|
||
- **SVG сервер не читает** — и не будет: разбор путей, деление кривых Безье на дуги и разбор
|
||
вложенности контуров живут во внешнем конвертере, а серверу достаётся готовый список примитивов.
|
||
|
||
## Связанное
|
||
|
||
- Проверка окружения (КОМПАС установлен, сервер запускается, подключение живое): команда **`/kompas:doctor`**.
|
||
- Установка, требования и настройка сервера: README плагина.
|
||
- Правила проектирования под FDM/FFF-печать: навык **`kompas-fdm-design`**.
|