docs: параметрические эскизы — решающий spike отрицательный (ksCDimWithVariable не строится)

API7-путь построения эскиза работает (Sketchs.Add→BeginEdit→FragmentDocument→IDrawingContainer→
LineSegments.Add), но управляющий размер недостижим: ksCDimWithVariable Create=False из внешней
автоматизации; ksCFixedLenght игнорирует Expression со ссылкой на переменную (привязан к литералу).
Вывод: переменные не драйвят геометрию эскиза через доступный COM-API. Путь признан тупиковым.
This commit is contained in:
2026-05-27 11:54:10 +03:00
parent b5487c05ec
commit 9237340667
@@ -58,13 +58,40 @@ API5-эскиза» через `ISketch.Curves` НЕ работает.
5. Эмпирическая проверка ОСТАЁТСЯ открытой: пересчитывает ли решатель эскиза геометрию при
изменении переменной из ВНЕШНЕЙ автоматизации (не проверено — это ключевой риск).
## Рекомендация
## Решающий spike (API7, выполнен) — ОТРИЦАТЕЛЬНЫЙ результат
Выделить параметрические эскизы в **отдельную сессию** (или несколько): начать с минимального
spike «построить отрезок через API7 IDrawingContainer → размер ksCDimWithVariable с именем
сменить переменную → перестроить → отрезок изменил длину». Если этот spike подтвердит управление
геометрией из внешней автоматизации — разворачивать подсистему. Если решатель не реагирует —
параметрика остаётся ограниченной CRUD переменных (текущее состояние пакета D).
Построен полный API7-путь и проверено управление геометрией:
`IModelContainer.Sketchs.Add()``ISketch.Plane = part.DefaultObject[o3d_planeXOY]`
`ISketch.BeginEdit()``FragmentDocument``ViewsAndLayersManager.Views.ActiveView`
(приводится к `IDrawingContainer`) → `LineSegments.Add()` (создаёт `ILineSegment` = `IDrawingObject1`).
Геометрия строится — ОК. Дальше пробовали наложить размер-переменную и проверить, следует ли длина
за переменной `plen` (создана заранее), после `RebuildModel`:
Пока пакет D = переменные (create/set/delete + чтение), без привязки к геометрии — это
зафиксировано и честно отражено в документации/инструментах.
- **`ksCDimWithVariable` (тип 13, «размер с переменной») — `Create()` = FALSE** (и с авто-именем, и
с явным `Variable="plen"`, и с/без `Expression`/`Value`/`SegmentIndex`). Ограничение, ради которого
всё затевалось, через `IDrawingObject1.NewConstraint()` на отрезке эскиза НЕ создаётся.
- **`ksCFixedLenght` (тип 19) — `Create()` = TRUE, НО привязан к литеральному `Value`**, а
`Expression="plen"` игнорируется: после `plen`: 50→80 длина осталась **50** (не 80). `Variable` пуст.
- `ksCFixedPoint`, `ksCFixedLenght` создаются; `ksCDimWithVariable`, `ksCFixedDim` — нет.
**Итог:** через доступные пути COM-автоматизации связать размер эскиза с переменной модели
(чтобы её изменение двигало геометрию) НЕ удаётся: нужный тип ограничения `ksCDimWithVariable` не
строится, а рабочий `ksCFixedLenght` не привязывается к переменной. Вероятно, `ksCDimWithVariable`
требует контекста, недоступного внешней автоматизации (интерактивная простановка размера / иной
порядок создания, не отражённый в справке).
## Рекомендация (обновлено по итогам spike)
Управляемые переменными эскизы через текущий COM-API **признаны нереализуемыми** (`ksCDimWithVariable`
не строится из внешней автоматизации). Не тратить на этот путь время повторно. Возможные направления,
если тема снова станет приоритетной:
- Проверить, не строится ли `ksCDimWithVariable` через **API5** `ksSetObjConstraint` (хотя справка
говорит, что в API5 этот тип недоступен — подтвердить рефлексией/пробой).
- Попробовать создавать размер как самостоятельный объект-аннотацию (не через `NewConstraint` на
отрезке) и затем связывать — но коллекции размеров у `IDrawingContainer` нет (только геометрия).
- Принять, что параметрика ограничена **CRUD переменных** (пакет D, готово) — переменные полезны
для импортированных параметрических моделей и как информационные; управление геометрией из
внешней автоматизации в этой версии КОМПАС/SDK недоступно.
Пакет D = переменные (create/set/delete + чтение), без привязки к геометрии — зафиксировано честно
в документации и описаниях инструментов.