Files
kompas3d-mcp/docs/superpowers/NEXT-SESSION.md
T
mikhail ced95b742b docs: переписан handoff набело под продолжение (веха 2D-чертёж, инкремент 5)
Убраны наслоения старой сессии (фокус «начни со сборок», дубли состояния, стартовая
инструкция про IParts7). Актуально: 76 инструментов / 218 тестов; сборки завершены,
чертёж 4 инкремента; следующий — радиальный/угловой размер (A) или рамка/формат (B).
Процесс, ловушки, паттерн теста, отрицательный результат сохранены и сжаты.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 18:49:05 +03:00

11 KiB
Raw Blame History

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

Скопируй блок ниже как стартовое сообщение новой сессии 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, namespace Kompas.Mcp.Core.Assemblies, API7):
    • assembly_add_component(filePath, x, y, z) — вставка детали/подсборки .m3d/.a3d с позицией. IParts7.AddFromFile(path,true,true)part.Placement.SetOriginUpdatePlacement(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, namespace Kompas.Mcp.Core.Drawings, API7):
    1. drawing_create_standard_views(partFilePath, scale, x, y) — стандартные виды (спереди/сверху/ слева) сохранённой модели; возвращает ViewNumbers (для адресации видов при простановке размеров).
    2. drawing_fill_title_block(designation?, name?, material?) — основная надпись (графы 2/1/3).
    3. drawing_add_linear_dimension(x1,y1,x2,y2,x3,y3, orientation, viewNumber) — линейный размер (horizontal/vertical/parallel).
    4. 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 фич за прошлую сессию)

  1. Рефлексия interop — подтверди сигнатуры (имена/типы могут отличаться от справки):
    $a7=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/KompasAPI7.dll').Path)
    ($a7.GetTypes()|?{$_.Name -eq 'IRadialDimension'}).GetProperties()|%{ "$($_.PropertyType.Name) $($_.Name)" }
    
    Enum'ы — в Kompas6Constants/Kompas6Constants3D. Тестовый проект НЕ ссылается на эти constants-сборки → COM-enum в публичном API сервиса оборачивай СВОИМ enum (как MateType/ DimensionOrientation), unit-тесть по (int)-коду нельзя — проверяй только свой enum/Parse.
  2. Семантику API уточняй навыком kompas-sdk-research (субагент Sonnet), не рой справку сам.
  3. При неопределённости (привязка к геометрии, координаты, единицы) — СПАЙК ДО СПЕКА: черновой метод сервиса + временный *SpikeTests.cs, прогнать, зафиксировать находку. (Так делалось для сопряжений, видов, штампа, линейного и диаметрального размеров — всегда окупалось.)
  4. Краткий спек в docs/superpowers/specs/ → коммит → ревью Codex (codex:rescue --fresh для новой темы) → внеси обоснованные правки (оценивай технически, отклоняй неуместное с обоснованием — напр. точечный release RCW отклоняется по конвенции v2-2).
  5. TDD: метод в DrawingService (или новом сервисе), инструмент в *Tools.cs, чистые валидаторы в static (unit), интеграционный тест в *Tests.cs (наследует IntegrationTestBase, Collection KompasCollection). Спайк-методы/тесты УДАЛИ, промотировав в финальный код.
  6. Ревью Codex реализации (--resume того же треда) → правки.
  7. Документация навыком docs-delegate (Sonnet: README/CLAUDE/ARCHITECTURE/OPEN_QUESTIONS/ presentation.html). Число тестов задавай ТОЧНО по dotnet test раннеру (НЕ по числу [Fact]/[Theory] — теории разворачиваются в несколько кейсов).
  8. 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) спайк до спека.