Files
kompas3d-mcp/docs/superpowers/NEXT-SESSION.md
T

146 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Промт для следующей сессии
Скопируй блок ниже как стартовое сообщение новой сессии Claude Code.
---
Продолжаем разработку MCP-сервера КОМПАС-3D (kompas3d-mcp). Работай автономно,
с коммитами и пушами в `main`; используй Codex для ревью каждой реализованной фичи.
КОМПАС-3D должен быть запущен (нужен для интеграционных тестов).
**Фокус этой сессии — два новых крупных класса: СБОРКИ и 2D-ЧЕРТЁЖ.** До сих пор сделана
только геометрия ДЕТАЛИ (она близка к насыщению). Сборки и чертёж — самый ценный
нереализованный функционал. Начни со СБОРОК (тестируются объёмом/габаритом/числом компонентов),
затем ЧЕРТЁЖ.
## Текущее состояние (main, синхронизирован с origin)
- 72 MCP-инструмента, 156 тестов зелёных (98 unit + 58 integration).
- **СБОРКИ: инкременты 1 и 2 СДЕЛАНЫ** (API7, `AssemblyService`, namespace `Kompas.Mcp.Core.Assemblies`):
- `assembly_add_component(filePath, x, y, z)` — вставка детали/подсборки из `.m3d`/`.a3d` с позицией.
Workflow: `IParts7.AddFromFile(path,true,true)``part.Placement.SetOrigin(x,y,z)`
`UpdatePlacement(true)``top.RebuildModel(true)`. Эмпирика: `UpdatePlacement`=FALSE для вручную
позиционируемого компонента — НЕ ошибка; позицию применяет SetOrigin+RebuildModel; разфиксация
первого компонента НЕ нужна.
- `assembly_add_mate(mateType, x1,y1,z1, x2,y2,z2, value)` — сопряжение граней двух компонентов.
Workflow: `(IMateConstraints3D)top.MateConstraints``Add(MateConstraintType)``BaseObject1/2`
(грани через `top.FindObjectsByPoint(x,y,z,FirstLevel=false)`) → `ParamValue` (distance) →
`Update()``RebuildModel(true)` → проверка `mate.Valid` (false→ошибка+откат). Типы: `coincidence`,
`distance` (value>0). Решатель может двигать любой компонент → тест по ширине габарита.
- Спеки: `2026-05-27-assembly-add-component-design.md`, `2026-05-27-assembly-add-mate-design.md`.
- **Тест-инфра:** `IntegrationTestBase` (per-test `DocumentService.CloseAllAsync`) — все интеграционные
классы наследуют его.
- **СЛЕДУЮЩЕЕ — инкремент 3 (по желанию) или ВЕХА 2 (2D-ЧЕРТЁЖ).** См. ниже.
- Деталь: эскизы (пакет A), формообразующие (extrude/revolve/fillet/chamfer/shell/rib/sweep/loft),
массивы и зеркало (пакет C), уклон (`draft`), все типы отверстий (`hole`/`_counterbore`/
`_countersink`/`_conic`, API7), переменные (`create/set/delete_variable`), STEP import/export,
прямое редактирование B-rep (`move_face`/`split_solid_by_plane`/`move_body`/`boolean_union`),
структурный осмотр (`describe_model`/`list_*`/`measure`).
- **`list_components` УЖЕ ЕСТЬ** (читает сборку: `IKompasDocument3D.TopPart → IPart7.Parts (IParts7)`).
- Документы: `DocumentService` уже умеет создавать `Assembly` и `Drawing`
(`KompasDocumentType.Assembly/Drawing``DocumentTypeEnum.ksDocumentAssembly/ksDocumentDrawing`).
Есть `document_save_as` (сохранить деталь в файл — нужно, чтобы вставить её в сборку/на чертёж).
- API7-сервисы существуют как образец: `HoleService`, `FaceEditService` (паттерн: `(IXxx)part`
через COM-QI, операции на STA-потоке `KompasDispatcher`).
- Прочитай память: `kompas-step-and-assembly-api` (обход сборки, извлечение компонента, STEP),
`kompas-hole-api7` (паттерн API7-сервиса), `kompas-parametric-sketch-findings` (тупик — не повторять).
## ОТРИЦАТЕЛЬНЫЙ результат (не повторять)
- **Параметрические эскизы (переменная двигает геометрию) — НЕДОСТИЖИМЫ через COM-API.**
`ksCDimWithVariable` (`IDrawingObject1.NewConstraint`) `Create()`=FALSE из внешней автоматизации;
`ksCFixedLenght` игнорирует `Expression`-ссылку на переменную. См.
`docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md`. НЕ трогать повторно.
## Веха 1 — СБОРКИ (начать отсюда; новый `AssemblyService` на API7)
Точки входа (проверено рефлексией interop, всё есть):
- Создать сборку: `DocumentService.CreateAsync(KompasDocumentType.Assembly)`.
- `IKompasDocument3D.TopPart → IPart7``IPart7.Parts` (это `IParts7`).
- **Вставка компонента из файла:** `IParts7.AddFromFile(string fileName, bool, bool)` или
`AddFromFileWithParam(string fileName, IPlacement3D placement, IInsertPartParameters prm, bool)`.
Позиция/ориентация — `IPlacement3D` (есть `IPlacement3DManipulator`).
- **Сопряжения (mates):** `IMateConstraints3D`/`IMateConstraint3D` + типы `IMate3DByAngle`,
`IMate3DByTangent`, `IMate3DSymmetry`, и др. (совпадение/параллельность/расстояние/угол).
Рекомендуемые инкременты (по одному, до зелёного → merge):
1.**СДЕЛАНО:** `assembly_add_component(filePath, x, y, z)` — вставка детали из файла в сборку.
2.**СДЕЛАНО:** `assembly_add_mate` — сопряжения coincidence/distance (см. «Текущее состояние»).
Расширения (будущее): прочие типы (parallel/perpendicular/concentric/angle/tangency — добавить с
геометрической проверкой, concentric требует цилиндрических граней), параметр `Alignment`
(`ksMCAlignmentCooriented`/`Opposite`/`Closest`). Для concentric/angle проверять тип грани.
3. **(по желанию)** Перемещение/массив/фиксация компонентов. ИЛИ сразу переходить к ВЕХЕ 2 (чертёж) —
она самый ценный нереализованный класс после сборок.
Проверенный API сопряжений (для расширений): `(IMateConstraints3D)top.MateConstraints`
`Add(MateConstraintType)``IMateConstraint3D` (`BaseObject1`/`BaseObject2` = IModelObject граней;
`ParamValue` для distance/angle; `Alignment`) → `Update()``RebuildModel(true)`. Типы:
`mc_Coincidence=0`, `mc_Parallel=1`, `mc_Perpendicular=2`, `mc_Tangency=3`, `mc_Concentric=4`,
`mc_Distance=5`, `mc_Angle=6`, `mc_Symmetric=11`. Грани компонентов — `top.FindObjectsByPoint(x,y,z,
FirstLevel=false)` (мировые координаты с учётом placement). Память: `kompas-assembly-insert-api7`.
Тонкости: компоненту нужен сохранённый файл-источник (сначала сохрани деталь). Уточни через
`kompas-sdk-research` точные сигнатуры `AddFromFile`/`AddFromFileWithParam`, что такое
`IInsertPartParameters` и как задать `IPlacement3D` (СК вставки).
## Веха 2 — 2D-ЧЕРТЁЖ (после сборок; новый `DrawingService` на API7)
Точки входа (проверено):
- Создать чертёж: `DocumentService.CreateAsync(KompasDocumentType.Drawing)`.
- `IKompasDocument2D.ViewsAndLayersManager.Views` (это `IViews`).
- **Стандартные ассоциативные виды детали из файла:**
`IViews.AddStandartViews(string FileName, string ProjectionName, object ProjectionsTypes,
double X, double Y, double Scale, double DX, double DY)` — создаёт виды (спереди/сверху/слева)
по сохранённой модели.
- Отдельный вид: `IViews.Add(LtViewType)`; геометрия/размеры вида — через `IDrawingContainer`
вида (`LineSegments`/`Circles`/… — как в разведке параметрики).
Рекомендуемые инкременты:
1. `drawing_create_standard_views(partFilePath, scale)` — чертёж со стандартными видами детали.
Тест: построить деталь → сохранить → создать чертёж → `AddStandartViews` → проверить
`Views.Count > 0` (виды созданы). Объёмом не проверить — считать виды/объекты.
2. Размеры/обозначения на видах (линейные/диаметральные), рамка/основная надпись — по мере надобности.
Тонкости: чертёж проверяется не объёмом, а числом видов/объектов; ассоциативные виды требуют
сохранённого `.m3d`-файла детали. Уточни workflow через `kompas-sdk-research`.
## Процесс на каждую операцию (отлажен в прошлых сессиях)
Сборки/чертёж — это НЕ `PartModeler` (он API5-деталь). Заводи НОВЫЕ сервисы (`AssemblyService`,
`DrawingService`) и НОВЫЕ классы инструментов (`AssemblyTools`, `DrawingTools`); регистрируй
сервисы в DI (`Program.cs`, `AddSingleton`). Образец API7-сервиса — `HoleService`.
1. Рефлексия interop — подтверди сигнатуры (`AddFromFile`, `AddStandartViews`, mate-типы):
```powershell
$a7=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/KompasAPI7.dll'))
# члены IParts7 / IMateConstraints3D / IViews — имена методов, типы параметров
```
Если высокая неопределённость (как было с параметрикой) — сделай spike ДО спека.
2. Семантику API уточняй через навык `kompas-sdk-research` (субагент Sonnet), не рой справку сам.
3. Краткий спек в `docs/superpowers/specs/` → коммит → ОТДАЙ НА РЕВЬЮ Codex (`codex:rescue`,
`--fresh` для новой темы) → внеси обоснованные правки (оценивай технически, не слепо).
4. Реализация TDD: метод в новом сервисе (паттерн API7 как в `HoleService`), инструмент в новом
классе `*Tools.cs`, интеграционный тест в новом `*Tests.cs` (Collection `KompasCollection`).
5. Codex-ревью реализации (`--resume` того же треда) → правки.
6. Документация через навык `docs-delegate` (Sonnet обновит README/CLAUDE/ARCHITECTURE/
presentation.html). **ВАЖНО:** число тестов задавай субагенту ТОЧНО (по `dotnet test` раннеру,
НЕ по числу `[Fact]`/`[Theory]` — теории разворачиваются в несколько кейсов).
7. `merge --no-ff` в main, удали ветку, `push origin main`. Обнови этот handoff.
## Паттерн интеграционного теста
`CreateAsync(...)` → построить/вставить → операция → `RebuildAsync`/`Update` →
проверить результат; `finally CloseAsync`. Для СБОРКИ — объём/габарит сборки или `list_components`
(число компонентов). Для ЧЕРТЕЖА — число видов (`Views.Count`)/объектов (объёмом не проверить).
Артефакты (сохранённые `.m3d`) — в gitignored `.scratch/`.
## Ключевые ловушки (проверено)
- Все COM-вызовы — на STA-потоке (`KompasDispatcher.InvokeAsync`). Контейнеры API7 берём
COM-QI: `(IModelContainer)part`, `(IParts7)part.Parts` и т.п.
- Выбор грани/ребра — по стабильному индексу из `list_faces`/`list_edges`; для сопряжений
объекты компонентов искать через их `IPart7`/`FindObjectsByPoint`.
- Углы — в градусах. Валидацию — в чистые static (unit-тестируемо), проверяй `double.IsFinite`.
- НЕ освобождай транзитные RCW точечно — общий отложенный долг (OPEN_QUESTIONS v2-2).
- Команды: `dotnet build -c Release`; `dotnet test --filter "Category=Unit"`;
`dotnet test --filter "Category=Integration"` (нужен запущенный КОМПАС).
Начни с рефлексии interop `IParts7` (вставка компонента) + `kompas-sdk-research` по
`AddFromFile`/`AddFromFileWithParam`/`IPlacement3D`, затем первый инкремент —
`assembly_add_component` (вставка детали из файла в сборку).