cb1984f227
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
146 lines
14 KiB
Markdown
146 lines
14 KiB
Markdown
# Промт для следующей сессии
|
||
|
||
Скопируй блок ниже как стартовое сообщение новой сессии 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` (вставка детали из файла в сборку).
|