From 67afbbfb3ef6a71b9d70291e4a7dfc30bb84112f Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Wed, 27 May 2026 11:43:29 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D1=80=D0=B0=D0=B7=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D1=8D=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=B2=20=E2=80=94=20findings=20(=D0=BA=D1=80?= =?UTF-8?q?=D1=83=D0=BF=D0=BD=D0=B0=D1=8F=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC=D0=B0=20API7,=20=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Установлено эмпирически: управляющий размер (ksCDimWithVariable) есть только в API7; API5-эскиз через API7 ISketch.Curves не аннотируется (Curves=null); правильный путь — ISketch.BeginEdit→FragmentDocument→IDrawingContainer — отдельная подсистема построения эскизов. Реализация выделена в отдельный труд; spike-артефакты не коммичены. --- .../2026-05-27-parametric-sketch-findings.md | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md 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 + чтение), без привязки к геометрии — это +зафиксировано и честно отражено в документации/инструментах.