diff --git a/.claude/skills/kompas-3d/SKILL.md b/.claude/skills/kompas-3d/SKILL.md index a4d547a..747aafe 100644 --- a/.claude/skills/kompas-3d/SKILL.md +++ b/.claude/skills/kompas-3d/SKILL.md @@ -32,6 +32,24 @@ description: > импорт/экспорт обменных форматов, разбор сборки, измерения, снимки. Для поиска сигнатур/констант в справке — отдельный навык `kompas-sdk-research`. Для правки документации — `docs-delegate`. +## Два правила прежде всего + +**1. «Зрение» — структурное, не по картинке.** Чтобы «увидеть» деталь, вызывай **`describe_model`** — +это единый структурный паспорт одним запросом: габарит, МЦХ, тела, топология (грани/рёбра, сгруппированные +по типам), дерево построения с параметрами, переменные. Это **точнее и дешевле по контексту**, чем +`model_snapshot`. Для деталей углубляйся `describe_face` / `describe_edge` / `measure` / `list_faces|edges|bodies|features|variables`. +**`model_snapshot` бери только** для визуально-пространственных вопросов, на которые паспорт не отвечает +(общая форма, ориентация, правдоподобность результата, «куда смотрит грань»). **Не анализируй изображение +там, где достаточно чисел** — снимок дорог по контексту и менее точен. + +**2. `validate_part` — после КАЖДОЙ операции.** Любая формообразующая или прямое редактирование +(`extrude_*`/`revolve_*`/`fillet_*`/`chamfer_*`/`move_face`/`split_solid_by_plane`/`move_body`/`boolean_union`) +может «пройти» (`Update()==true`), оставив деталь в ошибке. После каждой операции вызывай `validate_part`: +**пустой результат = чисто; непустой = провал** (напр. `et3dError54`) — не продолжай и не экспортируй, +исправь или переделай другим методом. Перед `export_step` / выдачей результата — обязательно чистый `validate_part`. +(`move_face`/`move_body`/`boolean_union` сами дописывают итог `validate_part` в ответ, но проверяй явно после +формообразующих тоже.) + ## Инструменты MCP **Реализованы (v2+, 46 инструментов):** @@ -53,12 +71,12 @@ description: > Опорный сценарий построения, проверен end-to-end (см. `usecases/0001`): -1. `kompas_connect` (+ `kompas_set_visible true`, чтобы снимки были осмысленны). +1. `kompas_connect` (+ `kompas_set_visible true`). 2. `document_create part`. 3. `sketch_create XOY` → `sketch_add_*` → `sketch_close`. -4. `extrude_boss`/`revolve_boss`/… -5. **Осмотр:** `model_snapshot` (увидеть) + `get_part_info`/`get_bounding_box` (сверить числами). -6. Итерация «на грани»: `model_snapshot` → `list_faces` → `sketch_create_on_face_index` → операция. +4. `extrude_boss`/`revolve_boss`/… → **`validate_part`** (правило 2). +5. **Осмотр — структурно:** `describe_model` (паспорт: габарит, МЦХ, топология, дерево). Снимок — только если нужен визуальный контроль. +6. Итерация «на грани»: `describe_model`/`list_faces` (+`describe_face`) → `sketch_create_on_face_index` → операция → `validate_part`. ## Работа с импортом / сборками (выработано в usecases/0002) @@ -71,34 +89,33 @@ description: > 3. **Извлечение отдельной детали**: при импорте включать «создавать файлы компонентов», тогда компоненты пишутся как отдельные `.m3d` рядом; открывать деталь самостоятельным документом (`OpenSourceDocument`). Гашение видимости компонента на снимок **не влияет** — изоляция так не делается. -4. **Осмотр детали**: габарит по осям (какая ось — «высота»), `list_faces`/`list_edges`, стандартные - проекции (`#Спереди/#Сверху/#Слева/#Справа/#Изометрия`) + `model_snapshot` для каждой. -5. **Модификация** на «тупой» импортированной B-rep: +4. **Осмотр детали — структурно:** `describe_model` (габарит по осям → какая ось «высота», МЦХ, + тела, топология). Грани/рёбра под операцию — `list_faces`/`describe_face`, `measure`. `model_snapshot` + (или стандартные проекции `#Спереди/#Сверху/#Слева/#Справа/#Изометрия`) — **только** если нужен + визуально-пространственный контроль формы. +5. **Модификация** на «тупой» импортированной B-rep (после каждой операции — `validate_part`): - *Простой случай* — `move_face`: сдвинуть плоскую грань на +N мм (наружу) или −N (внутрь). - ⚠ На сложном торце (с отверстием/пазом) FaceMover может дать `et3dError54` — **обязательно `validate_part` после**. + ⚠ На сложном торце (с отверстием/пазом) FaceMover может дать `et3dError54`. - *Вставка N мм в середину призматической ножки* (надёжно, грани совпадают): `split_solid_by_plane(plane, offset)` → `move_body(индекс верхнего тела, dz=N)` → - `move_face(точка на грани реза, +N)` (мост) → `boolean_union()`. После — `validate_part`. -6. **Экспорт STEP**: `export_step(path, format=auto|ap203|ap214|ap242)`. + `move_face(точка на грани реза, +N)` (мост) → `boolean_union()`. +6. **Проверка перед выдачей:** `validate_part` — чисто; затем **Экспорт STEP** `export_step(path, format=auto|ap203|ap214|ap242)`. Точные COM-приёмы и сигнатуры — в авто-памяти `kompas-step-and-assembly-api` и в `usecases/0002/case.md`. ## Эвристики и подводные камни -- **Решай по снимку.** После каждой формообразующей операции делай `model_snapshot` и проверяй - визуально; числами — `get_part_info`/`get_bounding_box`. -- **Грань/ребро по индексу надёжнее, чем по точке.** Сначала `list_faces`/`list_edges`, затем - `*_on_face_index` / `*_edge_index`. По точке (`SelectByPoint`) — только когда индекс не подходит. -- **Направление операции.** `extrude_boss(..., forward)` может уйти «не туда» в зависимости от - нормали выбранной грани — проверь снимком, при необходимости инвертируй `forward`. -- **МЦХ.** Объём/масса меняющейся геометрии бери через `get_part_info` (под капотом API5 - `CalcMassInertiaProperties`); перед чтением после правок — `rebuild`. +- **Зрение — структурное (правило 1).** Осматривай через `describe_model`/`describe_face`/`describe_edge`/`measure`, + а не снимком. `model_snapshot` — только для визуально-пространственных вопросов; не гоняй картинку зря. +- **`validate_part` после каждой операции (правило 2).** `Update()==true` ≠ успех; непустой `validate_part` + (напр. `et3dError54`) — деталь невалидна, в STEP/печать не брать. +- **Грань/ребро по индексу надёжнее, чем по точке.** Сначала `list_faces`/`list_edges` (или `describe_model`), + затем `*_on_face_index` / `*_edge_index`. По точке (`SelectByPoint`) — только когда индекс не подходит. +- **Направление операции.** `extrude_boss(..., forward)` / `move_face(distance±)` может уйти «не туда» — + сверяй результат `get_bounding_box`/`describe_model` (числами), снимок лишь при необходимости. +- **МЦХ.** Объём/масса меняющейся геометрии бери через `get_part_info`/`describe_model`; перед чтением после правок — `rebuild`. - **id эскизов/операций** недействительны после смены активного документа (create/open/close). - **Единицы — мм** (геометрия) и кг (масса). Локальные координаты эскиза ≠ мировые координаты модели. -- **`Update()==true` ≠ успех.** Прямое редактирование (move_face/split/union) может «пройти», оставив - операцию в ошибке. **Всегда `validate_part` после редактирования** — пустой результат = чисто; - иначе деталь невалидна (напр. `et3dError54`), и STEP/печать брать нельзя. Инструменты - move_face/move_body/boolean_union сами дописывают итог `validate_part` в ответ. ## Открытые вопросы / границы