Merge feat/parametric-sketch: разведка параметрических эскизов (findings)

This commit is contained in:
2026-05-27 11:43:29 +03:00
@@ -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 + чтение), без привязки к геометрии — это
зафиксировано и честно отражено в документации/инструментах.