Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
17 KiB
Промт для следующей сессии
Скопируй блок ниже как стартовое сообщение новой сессии 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, namespaceKompas.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, namespaceKompas.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-testDocumentService.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):
- ✅ СДЕЛАНО:
assembly_add_component(filePath, x, y, z)— вставка детали из файла в сборку. - ✅ СДЕЛАНО:
assembly_add_mate— сопряжения coincidence/distance (см. «Текущее состояние»). Расширения (будущее): прочие типы (parallel/perpendicular/concentric/angle/tangency — добавить с геометрической проверкой, concentric требует цилиндрических граней), параметрAlignment(ksMCAlignmentCooriented/Opposite/Closest). Для concentric/angle проверять тип грани. - (по желанию) Перемещение/массив/фиксация компонентов. ИЛИ сразу переходить к ВЕХЕ 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/… — как в разведке параметрики).
Рекомендуемые инкременты:
- ✅ СДЕЛАНО:
drawing_create_standard_views(partFilePath, scale, x, y)— стандартные виды (спереди/сверху/слева) детали/сборки на чертеже.AddStandartViews(path, "#Спереди", object[]{1,3,5}, x, y, scale, 20, 20); провереноcreated==3+ непустота. Память:kompas-drawing-api7. - ✅ СДЕЛАНО:
drawing_fill_title_block(designation?, name?, material?)— основная надпись. - ✅ СДЕЛАНО:
drawing_add_linear_dimension— линейный размер на виде (ISymbols2DContainer. LineDimensions). Размеры — вISymbols2DContainer(QI отIView), НЕ вIDrawingContainer/IView.ObjectCount. Координаты — локальная СК вида. Памятьkompas-drawing-api7. - СЛЕДУЮЩЕЕ: диаметральные/радиальные/угловые размеры — те же
ISymbols2DContainer:DiametralDimensions/RadialDimensions/AngleDimensions(IDiametralDimension/IRadialDimension/IAngleDimensionесть в interop). Спайк ДО спека (привязка к окружности/дуге вида — точка на окружности vs центр; авто-значение). Тест —*Dimensions.Countцелевого вида вырос, значение. Проще/альтернатива: рамка/формат листа (ILayoutSheet.Format→SheetFormat).
Тонкости: чертёж проверяется не объёмом, а числом видов/объектов; ассоциативные виды требуют
сохранённого .m3d/.a3d-файла. Коды видов ksRelativeProjectionTypeEnum: ksPtFront=1,
ksPtUp=3, ksPtLeft=5, ksPtIsoXYZ=7 и т.д.
Процесс на каждую операцию (отлажен в прошлых сессиях)
Сборки/чертёж — это НЕ PartModeler (он API5-деталь). Заводи НОВЫЕ сервисы (AssemblyService,
DrawingService) и НОВЫЕ классы инструментов (AssemblyTools, DrawingTools); регистрируй
сервисы в DI (Program.cs, AddSingleton). Образец API7-сервиса — HoleService.
- Рефлексия interop — подтверди сигнатуры (
AddFromFile,AddStandartViews, mate-типы):Если высокая неопределённость (как было с параметрикой) — сделай spike ДО спека.$a7=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/KompasAPI7.dll')) # члены IParts7 / IMateConstraints3D / IViews — имена методов, типы параметров - Семантику API уточняй через навык
kompas-sdk-research(субагент Sonnet), не рой справку сам. - Краткий спек в
docs/superpowers/specs/→ коммит → ОТДАЙ НА РЕВЬЮ Codex (codex:rescue,--freshдля новой темы) → внеси обоснованные правки (оценивай технически, не слепо). - Реализация TDD: метод в новом сервисе (паттерн API7 как в
HoleService), инструмент в новом классе*Tools.cs, интеграционный тест в новом*Tests.cs(CollectionKompasCollection). - Codex-ревью реализации (
--resumeтого же треда) → правки. - Документация через навык
docs-delegate(Sonnet обновит README/CLAUDE/ARCHITECTURE/ presentation.html). ВАЖНО: число тестов задавай субагенту ТОЧНО (поdotnet testраннеру, НЕ по числу[Fact]/[Theory]— теории разворачиваются в несколько кейсов). 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 (вставка детали из файла в сборку).