diff --git a/docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md b/docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md new file mode 100644 index 0000000..f057026 --- /dev/null +++ b/docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md @@ -0,0 +1,70 @@ +# Разведка: параметрические эскизы (управление геометрией переменными) + +**Дата:** 2026-05-27 +**Статус:** РАЗВЕДКА завершена; реализация НЕ начата (крупный отдельный труд — см. вывод) + +## Цель разведки + +Можно ли сделать так, чтобы переменная модели (`set_variable`, уже есть) управляла геометрией +эскиза — т.е. реализовать параметрические эскизы? Это «завершение» пакета D. + +## Главный вывод + +**Параметрические эскизы реализуемы ТОЛЬКО через API7 и требуют отдельной новой подсистемы +построения эскизов** (через `FragmentDocument` + `IDrawingContainer` + ограничения +`ksCDimWithVariable`), несовместимой с текущим API5-путём (`ksDocument2D`). Это многосессионный +архитектурный труд, а не один инкремент. В рамках этой сессии НЕ реализуется. + +## Что установлено (рефлексия + исследование справки + spike) + +### 1. В API5 управляющего размера нет +Справка (`docs/Kompas3D_SDK/interfaces/ограничения.md`, прим. 2): в API5 **нельзя** создать +ограничения **«Размер с переменной» (`ksCDimWithVariable=13`)** и «Фиксированный размер» +(`ksCFixedDim=14`). А именно они нужны, чтобы размер управлял геометрией. `ksDocument2D.ksLinDimension` +создаёт лишь аннотационный (неуправляющий) размер. Значит API5-путь (наш текущий) для параметрики +непригоден. + +### 2. Управляющий размер — только через API7 `IParametriticConstraint` +- `IDrawingObject1.NewConstraint()` → `IParametriticConstraint`; `ConstraintType=ksCDimWithVariable`, + `Variable` (уникальное имя), `Expression`/`Value`, `Create()`. Всё это ЕСТЬ в interop + (`KompasAPI7.dll`: `IDrawingObject1`, `IParametriticConstraint`, `ksConstraintTypeEnum`). +- При установке своего имени переменной надо следить за уникальностью, иначе «Недопустимое имя». + +### 3. SPIKE: API5-эскиз через API7 НЕ аннотируется +Проба (`ISketch` последнего эскиза → `ISketch.Curves`) показала **`Curves == null`** для эскиза, +построенного и закрытого через API5 `ksDocument2D`. Значит «достроить параметрику поверх нашего +API5-эскиза» через `ISketch.Curves` НЕ работает. + +### 4. Правильный путь — целиком через API7 FragmentDocument +- `ISketch.BeginEdit()` → **`FragmentDocument`** (`IKompasDocument2D`). +- `IKompasDocument2D.ViewsAndLayersManager` → вид → `IDrawingContainer`. +- `IDrawingContainer` — типизированные коллекции: `LineSegments`, `Rectangles`, `Circles`, `Arcs`, + `Points`, `Nurbses`, … (`.Add()` создаёт объект-кривую = `IDrawingObject1`). +- На объекте-кривой → `NewConstraint(ksCDimWithVariable)` с именем переменной. +- `ISketch.EndEdit()` → перестроение. + +То есть параметрический эскиз строится **другим API** (API7 drawing objects), чем наш текущий +(`PartModeler.Sketch.cs` на API5 `ksDocument2D`). Это новая параллельная подсистема эскизов. + +## Объём работ для реализации (оценка) + +1. Новый сервис/слой построения эскиза через API7 (`ISketch.BeginEdit`→`FragmentDocument`→ + `IDrawingContainer`): создание отрезков/прямоугольников/окружностей через API7-коллекции. +2. Наложение геометрических ограничений (`ksSetObjConstraint`/API7) — фиксация, горизонталь/ + вертикаль — чтобы при изменении размера эскиз не «расплывался». +3. Управляющие размеры `ksCDimWithVariable` с именами переменных, увязанные с моделью переменных + (уже есть `VariableService`). +4. Интеграция с существующими формообразующими (выдавить такой эскиз) и реестром `_features`. +5. Эмпирическая проверка ОСТАЁТСЯ открытой: пересчитывает ли решатель эскиза геометрию при + изменении переменной из ВНЕШНЕЙ автоматизации (не проверено — это ключевой риск). + +## Рекомендация + +Выделить параметрические эскизы в **отдельную сессию** (или несколько): начать с минимального +spike «построить отрезок через API7 IDrawingContainer → размер ksCDimWithVariable с именем → +сменить переменную → перестроить → отрезок изменил длину». Если этот spike подтвердит управление +геометрией из внешней автоматизации — разворачивать подсистему. Если решатель не реагирует — +параметрика остаётся ограниченной CRUD переменных (текущее состояние пакета D). + +Пока пакет D = переменные (create/set/delete + чтение), без привязки к геометрии — это +зафиксировано и честно отражено в документации/инструментах.