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

17 KiB
Raw Blame History

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

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


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

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

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

  • 75 MCP-инструментов, 203 теста зелёных (131 unit + 72 integration).
  • ВЕХА 2D-ЧЕРТЁЖ: 3 инкремента готовы. (1) drawing_create_standard_views — стандартные виды (возвращает ViewNumbers для адресации). (2) drawing_fill_title_block — основная надпись (Stamp.Text[id].Str). (3) drawing_add_linear_dimension(x1,y1,x2,y2,x3,y3,orientation,viewNumber) — линейный размер на виде (horizontal/vertical/parallel) через (ISymbols2DContainer)view (QI от вида) → LineDimensions.Add → координаты в ЛОКАЛЬНОЙ СК вида → Update → авто-значение ((IDimensionText)dim).NominalValue. Находка: размеры НЕ в IView.ObjectCount (они в ISymbols2DContainer). Память: kompas-drawing-api7. СЛЕДУЮЩЕЕ — инкремент 4: диаметральные/ радиальные/угловые размеры (те же ISymbols2DContainer.*Dimensions; нужен спайк привязки к окружности/дуге) ИЛИ рамка/формат листа (ILayoutSheet.Format/SheetFormat — проще).
  • ВЕХА 2 (2D-ЧЕРТЁЖ) НАЧАТА: drawing_create_standard_views(partFilePath, scale, x, y) СДЕЛАН (инкремент 1) — стандартные ассоциативные виды (спереди/сверху/слева) детали/сборки на активном чертеже (API7, DrawingService, namespace Kompas.Mcp.Core.Drawings). Workflow: doc2d.ViewsAndLayersManager.Views.AddStandartViews(path, "#Спереди", object[]{1,3,5}, x, y, scale, 20, 20). Эмпирика: object[]→SAFEARRAY VT_I4 ОК; новый чертёж стартует с Count=1 (системный вид), 3 проекции → Count=4; ObjectCount>0 сразу (rebuild не нужен); проверка created==3 + непустота по новым видам (разница IView.Number) + откат IView.Delete. Спек: 2026-05-27-drawing-standard-views-design.md. СЛЕДУЮЩЕЕ — инкремент 2 чертежа: оформление (размеры/обозначения на видах, рамка, основная надпись).
  • СБОРКИ: инкременты 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.MateConstraintsAdd(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/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/distance (см. «Текущее состояние»). Расширения (будущее): прочие типы (parallel/perpendicular/concentric/angle/tangency — добавить с геометрической проверкой, concentric требует цилиндрических граней), параметр Alignment (ksMCAlignmentCooriented/Opposite/Closest). Для concentric/angle проверять тип грани.
  3. (по желанию) Перемещение/массив/фиксация компонентов. ИЛИ сразу переходить к ВЕХЕ 2 (чертёж) — она самый ценный нереализованный класс после сборок.

Проверенный API сопряжений (для расширений): (IMateConstraints3D)top.MateConstraintsAdd(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, x, y) — стандартные виды (спереди/сверху/слева) детали/сборки на чертеже. AddStandartViews(path, "#Спереди", object[]{1,3,5}, x, y, scale, 20, 20); проверено created==3 + непустота. Память: kompas-drawing-api7.
  2. СДЕЛАНО: drawing_fill_title_block(designation?, name?, material?) — основная надпись.
  3. СДЕЛАНО: drawing_add_linear_dimension — линейный размер на виде (ISymbols2DContainer. LineDimensions). Размеры — в ISymbols2DContainer (QI от IView), НЕ в IDrawingContainer/ IView.ObjectCount. Координаты — локальная СК вида. Память kompas-drawing-api7.
  4. СЛЕДУЮЩЕЕ: диаметральные/радиальные/угловые размеры — те же ISymbols2DContainer: DiametralDimensions/RadialDimensions/AngleDimensions (IDiametralDimension/IRadialDimension/ IAngleDimension есть в interop). Спайк ДО спека (привязка к окружности/дуге вида — точка на окружности vs центр; авто-значение). Тест — *Dimensions.Count целевого вида вырос, значение. Проще/альтернатива: рамка/формат листа (ILayoutSheet.FormatSheetFormat).

Тонкости: чертёж проверяется не объёмом, а числом видов/объектов; ассоциативные виды требуют сохранённого .m3d/.a3d-файла. Коды видов ksRelativeProjectionTypeEnum: ksPtFront=1, ksPtUp=3, ksPtLeft=5, ksPtIsoXYZ=7 и т.д.

Процесс на каждую операцию (отлажен в прошлых сессиях)

Сборки/чертёж — это НЕ 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 (вставка детали из файла в сборку).