Files
kompas3d-mcp/docs/superpowers/specs/2026-05-26-offset-plane-loft-design.md
T
mikhail b2aac016af feat: смещённая плоскость (sketch_create_on_offset_plane) + операция по сечениям (loft)
OpenSketchOnOffsetPlaneAsync (o3d_planeOffset=14, ksPlaneOffsetDefinition) —
эскиз на смещённой плоскости. LoftAsync (o3d_baseLoft=30, ksBaseLoftDefinition):
Sketchs().Add сечений + SetLoftParam + SetThinParam(false). Смещённая плоскость
разблокировала loft (параллельные сечения). Integration: цилиндр на высоте 20;
loft 2 квадратов → призма 16000 мм³.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 23:17:00 +03:00

61 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Дизайн: смещённая плоскость + операция по сечениям (loft)
**Дата:** 2026-05-26
**Статус:** на ревью (автономный режим; ревьюер — Codex)
## Цель
Два связанных инструмента:
1. **`sketch_create_on_offset_plane`** — эскиз на плоскости, смещённой от базовой на `offset` мм
(вспомогательная геометрия; снимает ограничение «только 3 базовые плоскости»).
2. **`loft`** — операция по сечениям (несколько эскизов-сечений → сплошное тело). Сечения
строятся на параллельных смещённых плоскостях, что и разблокирует первый инструмент.
## Сигнатуры COM (рефлексия interop)
```
Obj3dType.o3d_planeOffset = 14
ksPlaneOffsetDefinition:
double offset
bool direction
bool SetPlane(object basePlane) // базовая плоскость (o3d_planeXOY/XOZ/YOZ)
Obj3dType.o3d_baseLoft = 30
ksBaseLoftDefinition:
bool SetLoftParam(bool closed, bool flipVertex, bool autoPath)
bool SetThinParam(bool thin, short thinType, double normal, double reverse)
object Sketchs() // ksEntityCollection эскизов-сечений
```
## Новые MCP-инструменты
| Инструмент | Параметры | Поведение |
|---|---|---|
| `sketch_create_on_offset_plane` | `basePlane: string (XOY/XOZ/YOZ)`, `offset: double`, `direction: bool = true` | Создать смещённую плоскость (`o3d_planeOffset`: база + offset мм + направление) и открыть на ней эскиз. Возвращает id эскиза (как `sketch_create`). |
| `loft` | `sketchIds: int[]`, `closed: bool = false` | Операция по сечениям: построить сплошное тело по ≥2 закрытым эскизам-сечениям (в порядке списка). `closed` — замкнуть в кольцо. Возвращает id операции. |
## Реализация
- **`OpenSketchOnOffsetPlaneAsync(BasePlane, double offset, bool direction, ct)`** в
`PartModeler.Sketch.cs`: `NewEntity(o3d_planeOffset)``ksPlaneOffsetDefinition`
(`SetPlane(GetDefaultEntity(базовая))`, `offset`, `direction`) → `Create()``CreateSketchOn(part, planeEntity)`.
Валидация `double.IsFinite(offset)`.
- **`LoftAsync(IReadOnlyList<int> sketchIds, bool closed, ct)`** в `PartModeler.Features.cs`:
закрыть все эскизы; `NewEntity(o3d_baseLoft)``ksBaseLoftDefinition``Sketchs()` (null-check)
`Add` каждого `sketch.Entity` в порядке списка → `SetLoftParam(closed, false, true)`
`SetThinParam(false, 0, 0, 0)``Create()`. Валидация: `sketchIds` не null, `Distinct` ≥ 2;
каждый id есть в реестре (`RequireSketch`).
- Инструменты в `SketchTools.cs` (`sketch_create_on_offset_plane`) и `FeatureTools.cs` (`loft`).
- Транзитные RCW не освобождаются — консистентно (долг v2-2).
## Тестирование
**Integration** (`FeatureOpsTests`):
1. `OffsetPlane_sketch_extrudes_at_height`: эскиз на XOY+offset 20 → окружность R5 → extrude 10 →
габарит по Z ≈ [20; 30] (`box.MinZ ≈ 20`), объём ≈ π·25·10.
2. `Loft_two_sections_makes_solid`: сечение 1 — квадрат 20×20 на XOY (offset 0, через
`sketch_create_on_offset_plane` с offset 0 или базовый `sketch_create`); сечение 2 — квадрат
20×20 на XOY+offset 40 → `loft([s1,s2])` → призма ~20×20×40, объём ≈ 16000 мм³
(`InRange ±10%`, т.к. форма сечения сохраняется). Если loft капризничает на квадратах —
проверить `volume > 0` и габарит Z ≈ 40.