Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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, namespaceKompas.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/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 или расстояния). API7-путь (из ревью SDK): коллекция(IMateConstraints3D)top.MateConstraints→Add(MateConstraintType)→IMateConstraint3D(BaseObject1/BaseObject2= IModelObject граней компонентов; дляmc_Distance—ParamValue;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 компонента). - Перемещение/массив компонентов, фиксация — при необходимости.
Тонкости: компоненту нужен сохранённый файл-источник (сначала сохрани деталь). Уточни через
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)— чертёж со стандартными видами детали. Тест: построить деталь → сохранить → создать чертёж →AddStandartViews→ проверитьViews.Count > 0(виды созданы). Объёмом не проверить — считать виды/объекты.- Размеры/обозначения на видах (линейные/диаметральные), рамка/основная надпись — по мере надобности.
Тонкости: чертёж проверяется не объёмом, а числом видов/объектов; ассоциативные виды требуют
сохранённого .m3d-файла детали. Уточни workflow через kompas-sdk-research.
Процесс на каждую операцию (отлажен в прошлых сессиях)
Сборки/чертёж — это НЕ 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 (вставка детали из файла в сборку).