Убраны наслоения старой сессии (фокус «начни со сборок», дубли состояния, стартовая инструкция про IParts7). Актуально: 76 инструментов / 218 тестов; сборки завершены, чертёж 4 инкремента; следующий — радиальный/угловой размер (A) или рамка/формат (B). Процесс, ловушки, паттерн теста, отрицательный результат сохранены и сжаты. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
11 KiB
Промт для следующей сессии
Скопируй блок ниже как стартовое сообщение новой сессии Claude Code.
Продолжаем разработку MCP-сервера КОМПАС-3D (kompas3d-mcp). Работай автономно, с коммитами и
пушами в main; используй Codex для ревью КАЖДОЙ реализованной фичи (спека и реализации).
КОМПАС-3D должен быть запущен (нужен для интеграционных тестов).
Фокус — продолжать ВЕХУ 2D-ЧЕРТЁЖ (самый ценный развивающийся класс). Деталь и сборки близки к насыщению. Следующий инкремент — радиальный/угловой размер ИЛИ рамка/формат листа (см. «Следующий инкремент»).
Текущее состояние (main = origin)
76 MCP-инструментов, 218 тестов зелёных (141 unit + 77 integration). Сборка Release чистая.
Три класса функционала:
- ДЕТАЛЬ (насыщена): эскизы (полный набор 2D-примитивов), формообразующие (extrude/revolve/
fillet/chamfer/shell/rib/sweep/loft), массивы и зеркало, уклон (
draft), все типы отверстий (hole/_counterbore/_countersink/_conic), переменные (create/set/delete_variable), STEP import/export, прямое редактирование B-rep (move_face/split_solid_by_plane/move_body/boolean_union), структурный осмотр (describe_model/list_*/measure). - СБОРКИ — завершены (
AssemblyService, namespaceKompas.Mcp.Core.Assemblies, API7):assembly_add_component(filePath, x, y, z)— вставка детали/подсборки.m3d/.a3dс позицией.IParts7.AddFromFile(path,true,true)→part.Placement.SetOrigin→UpdatePlacement(true)→top.RebuildModel(true).assembly_add_mate(mateType, x1,y1,z1, x2,y2,z2, value)— сопряжение граней двух компонентов (coincidence/distance).(IMateConstraints3D)top.MateConstraints.Add(...)→BaseObject1/2(грани черезtop.FindObjectsByPoint(x,y,z,FirstLevel=false)) →Update→ проверкаmate.Valid.list_components(чтение сборки) был и раньше.
- 2D-ЧЕРТЁЖ — 4 инкремента готовы (
DrawingService, namespaceKompas.Mcp.Core.Drawings, API7):drawing_create_standard_views(partFilePath, scale, x, y)— стандартные виды (спереди/сверху/ слева) сохранённой модели; возвращаетViewNumbers(для адресации видов при простановке размеров).drawing_fill_title_block(designation?, name?, material?)— основная надпись (графы 2/1/3).drawing_add_linear_dimension(x1,y1,x2,y2,x3,y3, orientation, viewNumber)— линейный размер (horizontal/vertical/parallel).drawing_add_diametral_dimension(xc,yc,radius,angle°, viewNumber)— диаметральный размер (Ø=2R).
Спеки всех фич — в docs/superpowers/specs/2026-05-27-*.md. Память (читать перед работой):
kompas-drawing-api7 (чертёж: виды, штамп, размеры — все приёмы), kompas-assembly-insert-api7
(сборки: вставка + сопряжения), kompas-step-and-assembly-api, kompas-hole-api7 (паттерн API7-
сервиса), kompas-parametric-sketch-findings (тупик — не повторять).
Следующий инкремент (на выбор; оба расписаны)
Вариант A — радиальный / угловой размер (продолжает размеры, ценнее)
Тот же контейнер, что у линейного/диаметрального — ISymbols2DContainer (QI от вида); есть готовый
хелпер RequireSymbols2DContainer(viewNumber) в DrawingService. Точки входа (рефлексия подтвердила):
- Радиальный:
symbols.RadialDimensions(IRadialDimensions.Add()→IRadialDimension):Xc,Yc,Radius,Angle+DimensionType+ ветви (AddBranch/AddBranchByArcParam/ShelfX,Y). - Угловой:
symbols.AngleDimensions(IAngleDimension) — задание через две прямые/точки. Сделай спайк ДО спека (у радиального —DimensionType/ветви; у углового — что измеряет и как задаются стороны угла; что вNominalValue). Значение читается((IDimensionText)dim).NominalValue. Тест —*Dimensions.Countцелевого вида вырос + значение (как у диаметрального).
Вариант B — рамка / формат листа (проще, без спайка)
ILayoutSheet.Format (SheetFormat) — задать формат листа (A4/A3) и ориентацию. Детерминированно
тестируется (задать формат → прочитать). doc2d.LayoutSheets.ItemByNumber[1] → .Format.
Менее ценно, чем размеры, но низкий риск.
ОТРИЦАТЕЛЬНЫЙ результат (не повторять)
Параметрические эскизы (переменная двигает геометрию) — НЕДОСТИЖИМЫ через COM-API.
ksCDimWithVariable (IDrawingObject1.NewConstraint) Create()=FALSE из внешней автоматизации;
ksCFixedLenght игнорирует Expression-ссылку. См.
docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md. НЕ трогать.
Процесс на каждый инкремент (отлажен — 6 фич за прошлую сессию)
- Рефлексия interop — подтверди сигнатуры (имена/типы могут отличаться от справки):
Enum'ы — в
$a7=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/KompasAPI7.dll').Path) ($a7.GetTypes()|?{$_.Name -eq 'IRadialDimension'}).GetProperties()|%{ "$($_.PropertyType.Name) $($_.Name)" }Kompas6Constants/Kompas6Constants3D. Тестовый проект НЕ ссылается на эти constants-сборки → COM-enum в публичном API сервиса оборачивай СВОИМ enum (какMateType/DimensionOrientation), unit-тесть по(int)-коду нельзя — проверяй только свой enum/Parse. - Семантику API уточняй навыком
kompas-sdk-research(субагент Sonnet), не рой справку сам. - При неопределённости (привязка к геометрии, координаты, единицы) — СПАЙК ДО СПЕКА: черновой
метод сервиса + временный
*SpikeTests.cs, прогнать, зафиксировать находку. (Так делалось для сопряжений, видов, штампа, линейного и диаметрального размеров — всегда окупалось.) - Краткий спек в
docs/superpowers/specs/→ коммит → ревью Codex (codex:rescue --freshдля новой темы) → внеси обоснованные правки (оценивай технически, отклоняй неуместное с обоснованием — напр. точечный release RCW отклоняется по конвенции v2-2). - TDD: метод в
DrawingService(или новом сервисе), инструмент в*Tools.cs, чистые валидаторы в static (unit), интеграционный тест в*Tests.cs(наследуетIntegrationTestBase, CollectionKompasCollection). Спайк-методы/тесты УДАЛИ, промотировав в финальный код. - Ревью Codex реализации (
--resumeтого же треда) → правки. - Документация навыком
docs-delegate(Sonnet: README/CLAUDE/ARCHITECTURE/OPEN_QUESTIONS/ presentation.html). Число тестов задавай ТОЧНО поdotnet testраннеру (НЕ по числу[Fact]/[Theory]— теории разворачиваются в несколько кейсов). merge --no-ffв main → удали ветку →push origin main→ обнови этот handoff + память.
Паттерн интеграционного теста
CreateAsync(...) → построить/вставить → операция → проверить → finally CloseAsync.
- ДЕТАЛЬ — объём/габарит/МЦХ. СБОРКА — габарит/
list_components. - ЧЕРТЁЖ — числом, не объёмом: виды —
Views.Count/ObjectCount; размеры — НЕ вIView.ObjectCount(они вISymbols2DContainer) → считатьISymbols2DContainer.*Dimensions.Countцелевого вида; значение размера —((IDimensionText)dim).NominalValue. - Артефакты (
.m3dдетали для видов/сборок) — в gitignored.scratch/(TestPaths.NewFile). - Возможен ТРАНЗИЕНТНЫЙ сбой пакета сразу после большого прогона (нестабильность КОМПАС) — перезапусти.
Ключевые ловушки (проверено)
- Все COM-вызовы — на STA-потоке (
KompasDispatcher.InvokeAsync). Контейнеры берём COM-QI:(IModelContainer)part,(ISymbols2DContainer)view,(IMateConstraints3D)top.MateConstraints. - Размеры чертежа — в
ISymbols2DContainer(QI ОТ КОНКРЕТНОГОIView), координаты — в ЛОКАЛЬНОЙ СК вида (= координаты модели на плоскости вида при 1:1).AutoNominalValue=trueавто-измеряет. - Углы 2D-размеров — в РАДИАНАХ в API (инструмент экспонирует градусы →
DimensionAngles.ToRadians). - Валидацию — в чистые static (unit-тестируемо), проверяй
double.IsFinite. Проверяй результатUpdate()/RebuildModel(); при неуспехе послеAdd()— откат.Delete(). - НЕ освобождай транзитные RCW точечно — общий отложенный долг (OPEN_QUESTIONS v2-2).
- Команды:
dotnet build -c Release;dotnet test --filter "Category=Unit";dotnet test --filter "Category=Integration"(нужен запущенный КОМПАС).
Начни с выбора варианта (A — радиальный/угловой размер, рекомендуется; B — рамка/формат листа), затем рефлексия interop соответствующих интерфейсов + (для A) спайк до спека.