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

13 KiB

Промт для следующей сессии

Скопируй блок ниже как стартовое сообщение новой сессии Claude Code.


Продолжаем разработку MCP-сервера КОМПАС-3D (kompas3d-mcp). Работай автономно, с коммитами и пушами в main; используй Codex для ревью каждой реализованной фичи. КОМПАС-3D должен быть запущен (нужен для интеграционных тестов).

Фокус этой сессии — два новых крупных класса: СБОРКИ и 2D-ЧЕРТЁЖ. До сих пор сделана только геометрия ДЕТАЛИ (она близка к насыщению). Сборки и чертёж — самый ценный нереализованный функционал. Начни со СБОРОК (тестируются объёмом/габаритом/числом компонентов), затем ЧЕРТЁЖ.

Текущее состояние (main, синхронизирован с origin)

  • 71 MCP-инструмент, 138 тестов зелёных (83 unit + 55 integration).
  • СБОРКИ начаты: assembly_add_component СДЕЛАН (инкремент 1 вехи 1) — вставка детали/подсборки из .m3d/.a3d в активную сборку с позицией (API7, AssemblyService, namespace Kompas.Mcp.Core.Assemblies). Workflow: IParts7.AddFromFile(path,true,true)part.Placement.SetOrigin(x,y,z)UpdatePlacement(true)top.RebuildModel(true). Эмпирика: UpdatePlacement=FALSE для вручную позиционируемого компонента — НЕ ошибка; позицию применяет SetOrigin, видимой делает RebuildModel; разфиксация первого компонента НЕ нужна. Спек: docs/superpowers/specs/2026-05-27-assembly-add-component-design.md. СЛЕДУЮЩЕЕ — инкремент 2: assembly_add_mate (сопряжения).
  • Деталь: эскизы (пакет 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/DrawingDocumentTypeEnum.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 → IPart7IPart7.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 или расстояния). API7-путь (из ревью SDK): коллекция (IMateConstraints3D)top.MateConstraintsAdd(MateConstraintType)IMateConstraint3D (BaseObject1/BaseObject2 = IModelObject граней компонентов; для mc_DistanceParamValue; Alignment) → Update(). Типы: mc_Coincidence=0, mc_Parallel=1, mc_Perpendicular=2, mc_Tangency=3, mc_Concentric=4, mc_Distance=5, mc_Angle=6, mc_Symmetric=11. Альтернатива API5: ksDocument3D.AddMateConstraint(type, obj1, obj2, direction, fixed, val). Сначала рефлексия interop (IMateConstraints3D/IMateConstraint3D/MateConstraintType — проверь наличие и точные имена в v24) — возможна тонкость с именами/доступностью, как с параметрикой. Тест: 2 компонента → сопряжение совпадения/расстояния граней → габарит сборки меняется предсказуемо. Объекты граней компонентов брать через их IPart7.FindObjectsByPoint (в мировых координатах с учётом placement компонента).
  3. Перемещение/массив компонентов, фиксация — при необходимости.

Тонкости: компоненту нужен сохранённый файл-источник (сначала сохрани деталь). Уточни через 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-типы):
    $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 (вставка детали из файла в сборку).