docs: разведка параметрических эскизов — findings (крупная подсистема API7, отложено)
Установлено эмпирически: управляющий размер (ksCDimWithVariable) есть только в API7; API5-эскиз через API7 ISketch.Curves не аннотируется (Curves=null); правильный путь — ISketch.BeginEdit→FragmentDocument→IDrawingContainer — отдельная подсистема построения эскизов. Реализация выделена в отдельный труд; spike-артефакты не коммичены.
This commit is contained in:
@@ -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 + чтение), без привязки к геометрии — это
|
||||||
|
зафиксировано и честно отражено в документации/инструментах.
|
||||||
Reference in New Issue
Block a user