diff --git a/README.md b/README.md index bce900a..d28847b 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ STEP/STL, осмотр и измерение модели — плюс два н | | | |---|---| -| **MCP-сервер `kompas`** | 85 инструментов: документы, эскизы, выдавливание/вращение/по сечениям/по траектории, оболочка, рёбра, уклон, скругления и фаски, массивы и зеркало, отверстия, булевы операции, прямое редактирование B-rep, переменные и параметризация, сборки и сопряжения, 2D-чертежи (виды, размеры, обозначения, тех. требования), STEP/STL, осмотр (`describe_model`, `list_faces`, `list_edges`, `measure`) | +| **MCP-сервер `kompas`** | 86 инструментов: документы, эскизы, выдавливание/вращение/по сечениям/по траектории, оболочка, рёбра, уклон, скругления и фаски, массивы и зеркало, отверстия, булевы операции, прямое редактирование B-rep, переменные и параметризация, **исполнения** (несколько геометрий одной модели в одном файле), сборки и сопряжения (в том числе по вспомогательным плоскостям и осям), 2D-чертежи (виды, размеры, обозначения, тех. требования), STEP/STL, осмотр (`describe_model`, `list_faces`, `list_edges`, `measure`) | | **Навык `kompas-3d`** | методика построения: порядок работы, выбор подхода, проверенные приёмы и ловушки | | **Навык `kompas-fdm-design`** | проектирование под FDM/FFF-печать: нависания, толщины стенок, зазоры и посадки, ориентация, бобышки и защёлки | | **Команда `/kompas:doctor`** | диагностика установки | diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 5d90d1c..0b162de 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "kompas", "displayName": "КОМПАС-3D", - "version": "0.1.0", + "version": "0.2.0", "description": "Управление КОМПАС-3D из Claude Code: детали, сборки, чертежи, STEP — через MCP-сервер", "author": { "name": "Shahovalov Mikhail", diff --git a/plugin/bin/Kompas.Mcp.Core.dll b/plugin/bin/Kompas.Mcp.Core.dll index f7703b5..7d5e300 100644 Binary files a/plugin/bin/Kompas.Mcp.Core.dll and b/plugin/bin/Kompas.Mcp.Core.dll differ diff --git a/plugin/bin/Kompas.Mcp.Core.pdb b/plugin/bin/Kompas.Mcp.Core.pdb index d608c40..dd648d6 100644 Binary files a/plugin/bin/Kompas.Mcp.Core.pdb and b/plugin/bin/Kompas.Mcp.Core.pdb differ diff --git a/plugin/bin/kompas-mcp.deps.json b/plugin/bin/kompas-mcp.deps.json index ac27e5d..0b81682 100644 --- a/plugin/bin/kompas-mcp.deps.json +++ b/plugin/bin/kompas-mcp.deps.json @@ -7,9 +7,9 @@ "targets": { ".NETCoreApp,Version=v8.0": {}, ".NETCoreApp,Version=v8.0/win-x64": { - "kompas-mcp/0.1.0": { + "kompas-mcp/0.2.0": { "dependencies": { - "Kompas.Mcp.Core": "0.1.0", + "Kompas.Mcp.Core": "0.2.0", "Microsoft.Extensions.Hosting": "8.0.1", "ModelContextProtocol": "2.0.0" }, @@ -483,21 +483,21 @@ } } }, - "Kompas.Mcp.Core/0.1.0": { + "Kompas.Mcp.Core/0.2.0": { "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "10.0.10" }, "runtime": { "Kompas.Mcp.Core.dll": { - "assemblyVersion": "0.1.0", - "fileVersion": "0.1.0.0" + "assemblyVersion": "0.2.0", + "fileVersion": "0.2.0.0" } } } } }, "libraries": { - "kompas-mcp/0.1.0": { + "kompas-mcp/0.2.0": { "type": "project", "serviceable": false, "sha512": "" @@ -761,7 +761,7 @@ "path": "system.text.json/10.0.10", "hashPath": "system.text.json.10.0.10.nupkg.sha512" }, - "Kompas.Mcp.Core/0.1.0": { + "Kompas.Mcp.Core/0.2.0": { "type": "project", "serviceable": false, "sha512": "" diff --git a/plugin/bin/kompas-mcp.dll b/plugin/bin/kompas-mcp.dll index dd47290..dc8c2cf 100644 Binary files a/plugin/bin/kompas-mcp.dll and b/plugin/bin/kompas-mcp.dll differ diff --git a/plugin/bin/kompas-mcp.exe b/plugin/bin/kompas-mcp.exe index c82b843..88bb9a3 100755 Binary files a/plugin/bin/kompas-mcp.exe and b/plugin/bin/kompas-mcp.exe differ diff --git a/plugin/bin/kompas-mcp.pdb b/plugin/bin/kompas-mcp.pdb index 08f8c8d..c3dd34d 100644 Binary files a/plugin/bin/kompas-mcp.pdb and b/plugin/bin/kompas-mcp.pdb differ diff --git a/plugin/skills/kompas-3d/SKILL.md b/plugin/skills/kompas-3d/SKILL.md index 036c659..1e577c9 100644 --- a/plugin/skills/kompas-3d/SKILL.md +++ b/plugin/skills/kompas-3d/SKILL.md @@ -34,12 +34,21 @@ variables | errors | components` (`sections` сужает и ответ, и об форма, ориентация, правдоподобность, «куда смотрит грань»): снимок дорог по контексту и менее точен, чем числа. +**1а. Осмотр НЕ перестраивает документ.** Если модель правили снаружи (человек в GUI, соседний +агент) или операция запросила перестроение, `describe_model` покажет числа ДО правки — и ответ +будет выглядеть безупречным: размеры новые, положения старые, сопряжения валидны. Такой ответ сам +скажет «Документ ТРЕБУЕТ ПЕРЕСТРОЕНИЯ» (`needsRebuild: true`); увидел — `rebuild` и повтори осмотр, +выводов по непересчитанной модели не делай. + **2. Ответ мутирующей операции — это ТРИ проверки, читай все.** Любая операция может «пройти» (`Create()==true`), оставив деталь в ошибке, поэтому каждая мутирующая операция сама дописывает к ответу итог проверки построения и сводку состояния «Тел: N, объём V мм³»: - **«⚠ N операц. в ошибке»** (напр. `et3dError54`) — деталь невалидна: не продолжай и не экспортируй, исправь или переделай другим методом. «Построение чистое» = порядок. + Строки с «ℹ» — не отказы: «требуется перестроение» лечится `rebuild`, а «не определено + положение (N)» означает, что компоненту не хватает сопряжений или фиксации. Бросать из-за них + исправную сборку не нужно; в обеих названы имя и индекс компонента. - **«Тел: 2»** там, где ждёшь одно тело, — деталь распалась: касание объединением не считается (см. «Надписи»). Смотри на число ТЕЛ, а не граней: объединение сливает компланарные грани, и счётчик граней законно остаётся прежним. @@ -89,7 +98,12 @@ variables | errors | components` (`sections` сужает и ответ, и об - *Обмен:* `import_model` (3D: step, iges, sat, xt, stl, c3d, jt, obj + родные форматы чужих САПР), `import_drawing` (плоский .dxf/.dwg), `export_model` (`format=auto` по расширению: `.step` — точная геометрия в другую САПР, `.stl` — сетка в слайсер). -- *Сборка:* `assembly_add_component` (положение + поворот `rx/ry/rz`), `assembly_add_mate` +- *Исполнения:* `embodiment` (`set|add|delete|rename`; `kind=embodiment|mirror|variant`) — несколько + геометрий одной модели в одном файле; список с габаритом и массой каждого — + `describe_model(sections=embodiments)`. +- *Сборка:* `assembly_add_component` (положение + поворот `rx/ry/rz`, `embodiment` — какое исполнение + источника вставлять), `assembly_add_mate` (стороной может быть грань ИЛИ вспомогательный объект + `object1/object2`: плоскости и оси СК компонента, а без `componentIndex` — самой сборки) (семь типов, `orientation`), `assembly_fix_component`, `assembly_delete`, `assembly_check_interference` (не налезли ли детали друг на друга — больше это не видно нигде), `assembly_transform_point` (`to=world|local` — точка между ЛСК компонента и СК сборки). @@ -207,7 +221,8 @@ variables | errors | components` (`sections` сужает и ответ, и об кроме помеченного `(ТЗ)`. - **После связывания правка паспорта перестраивает деталь** (проверено: `set_variable(badge_T=4)` → габарит по Z 3.00 → 4.00, объём 5154.5 → 5861.5 мм³). Это и есть параметрическая модель, - а не комментарий к ней. + а не комментарий к ней. **До связывания — не перестраивает**, и `set_variable` говорит об этом + прямо: «⚠ НИЧЕГО НЕ ВЕДЁТ». Такой ответ — не успех: число поменялось, деталь нет. - **Сверка и уборка в конце:** `describe_model(sections=variables)` помечает «⚠ ничего не ведёт» — это либо забытая связь, либо мусор; разбери оба. `delete_variable(unused=true)` — только ПОСЛЕ `link_parameter` на всё, что должно вести геометрию: вычистка не отличает мусор от несвязанного размера из ТЗ. @@ -496,6 +511,38 @@ variables | errors | components` (`sections` сужает и ответ, и об 5. **Перед выдачей:** последняя операция «Построение чистое» → `export_model` (STEP для обмена, STL для печати). +## Исполнения: одна модель — несколько геометрий + +Типоразмеры (профиль на 100, 200, 500 мм), правое и левое зеркало, версии с отверстием и без часто +живут **в одном файле** исполнениями. Тогда всё, что ты меришь и экспортируешь, относится к +**текущему** исполнению — не к «детали вообще». + +- **Признак замечаешь не ты, а ответ.** У модели с несколькими исполнениями `describe_model` сам + пишет, сколько их и какое сейчас текущее. Увидел эту строку — прежде чем считать массу или резать + чертёж, посмотри `describe_model(sections=embodiments)`: там габарит и масса **каждого**, и это + чтение ничего не переключает. +- **Переключение равно смене документа.** `embodiment(action="set", target="L200")` обнуляет + сессию построения: хендлы `sk_…`/`op_…` после него мертвы. Сохраняй документ до переключения. +- **Индекс живёт до первой правки дерева**: после `delete` индексы смещаются. Адресуй обозначением + («L500»), а индексом — только сразу после того, как увидел список. +- **Строишь новое исполнение** — `embodiment(action="add", number="02")`; оно сразу становится + текущим, строй в нём немедленно. `depended=false` нужен, когда правки НЕ должны наследоваться от + родителя, — иначе изменение уедет и в него. +- **В сборку исполнение выбирается явно**: `assembly_add_component(embodiment="L500")`. Без + параметра встанет **базовое** исполнение, а не то, что сохранено в файле текущим. Обозначение + нужно ПОЛНОЕ («ПРОБА.001-01», а не «-01»); сервер откажет, если КОМПАС подсунет базовое. +- **«Удлинить эти профили с 500 до 600» — это смена исполнения экземпляра, а не новая вставка**: + `embodiment(action="set", target="L600", component=N)` и затем `rebuild`. Сопряжения при этом + **сохраняются** — пересоздание вставки, наоборот, порвало бы их все. Какие исполнения есть у + конкретного экземпляра, показывает `describe_model(sections="embodiments", component=N)`. +- **Выгнать всю линейку на печать** — `export_model(embodiment="all")`: каждое исполнение в свой + файл с суффиксом обозначения. +- **После смены исполнения в собранном узле проверь сопряжения** (`sections="mates"`): если у нового + исполнения нет объекта, на который опиралась связь, она рвётся — «ССЫЛКА ПОТЕРЯНА», `valid: false`, + компонент недоопределён. Что было потеряно, хранит имя сопряжения; `assembly_delete` сотрёт и его. + +Подробности и границы — `help(topic="embodiments")`. + ## Эвристики и подводные камни - **Правила 1 и 2 действуют всегда:** осмотр структурный; «⚠ N операц. в ошибке» — в STEP/печать diff --git a/release.json b/release.json index 65f3a51..7f369d9 100644 --- a/release.json +++ b/release.json @@ -1,6 +1,6 @@ { - "version": "0.1.0", - "tag": "v0.1.0", - "sourceSha": "c7b0387a24cfeae3f19c052eb16d29dcc8030e31", - "built": "2026-08-06T21:03:33Z" + "version": "0.2.0", + "tag": "v0.2.0", + "sourceSha": "53ac64e24c4930b29dc2125cf1b488e8b5a1463e", + "built": "2026-08-07T10:08:21Z" }