docs: правки спека пакета C по дизайн-ревью Codex (circular свойствами, multi-feature тест, эмпирические тонкости)

This commit is contained in:
2026-05-27 00:03:47 +03:00
parent d6ab16fd6a
commit 8cc0f49f99
@@ -70,11 +70,21 @@ ksMirrorCopyAllDefinition: // зеркало тела(
- **Линейный массив — 1D** (одна ось): `SetAxis1` + `SetCopyParamAlongAxis(true,…)`, `count2=1`
(второе направление выключено). 2D-сетку добавим позже при необходимости.
- `factor=false` (шаг между соседними — интуитивнее для пользователя).
- Круговой `step`: задаём явный угловой шаг (°). Дефолт инструмента не подставляем — пусть
агент передаёт (например 90 для 4 шт). `factor=false`.
- `mirror_body` использует `ksMirrorCopyAllDefinition` без `ChooseBodies` (по умолчанию все тела).
- **Круговой — задаём свойства напрямую** (`SetCopyParamAlongDir` неоднозначен: `dir`/radial vs
annular): `count1=1` (радиально — один «ряд»), `count2=count` (кольцевое — N вокруг оси),
`step2=step` (°), `factor2=false`, `inverce=reverse`. Угловой шаг задаёт агент (например 90).
- `mirror_body` использует `ksMirrorCopyAllDefinition` + `SetPlane`. В API5-interop у определения
**нет** `SaveInitialObjects` (по рефлексии — только `ChooseBodies/Get/SetPlane`); поведение
«оригинал + зеркало» проверяем эмпирически. `ChooseBodies` дорефлексировать в инкременте 3
(для односложного тела, вероятно, не требуется; если `Create` упадёт — выставить `ksAllBodies`).
- `geomArray` дефолт `false` (полное копирование операции — надёжнее для несложных тел).
### Открытые API-тонкости (проверяются интеграционными тестами)
- `count` включает оригинал — подтверждается тестом (count=3 → 3 экз.). Если нет — поправить.
- `count2=1` действительно выключает 2-е направление линейного массива.
- Круговой: `count2=count`/`count1=1` даёт чистый круговой массив (без радиального дубля).
- `mirror_body` оставляет исходное тело (а не заменяет его).
## Реализация
- **Enum** `CoordinateAxis { X, Y, Z }` + `CoordinateAxes.ToObj3dType/Parse` — новый файл
@@ -104,11 +114,15 @@ ksMirrorCopyAllDefinition: // зеркало тела(
1. **linear_pattern**: цилиндр R5×H10 в центре (V₁≈785 мм³) → `linear_pattern([cyl], X, 3, 30)`
3 непересекающихся цилиндра → V≈3·785=2356 (`InRange ±5%`); габарит X≈70 (от −5 до 65).
2. **circular_pattern**: цилиндр R3×H10 со смещением (центр (20,0)) → `circular_pattern([cyl], Z, 4, 90)`
4 цилиндра по кругу R20 → V≈4·283=1131 (`±5%`); габарит X≈Y≈46 (от −23 до 23).
3. **mirror_operation**: цилиндр R3×H10 центр (20,0) → `mirror_operation([cyl], YOZ)` → копия в
2. **circular_pattern**: цилиндр R3×H10 со смещением (центр (20,0)) → `circular_pattern([cyl], Z, 3, 90)`
3 цилиндра в (20,0),(0,20),(20,0) (count=3, несимметрично → осмысленный поворот, не «полный
круг») → V≈3·283=849 (`±5%`); габарит X≈46 (от 23 до 23), SizeY≈26 (от 3 до 23).
3. **mirror_operation** (две исходные операции — проверяет заполнение `ksEntityCollection`):
цилиндр R3 центр (20,0) + цилиндр R2 центр (10,0), оба H10 → `mirror_operation([c1,c2], YOZ)`
копии в (20,0),(10,0) → V≈2·(283+125.7)=817 (`±5%`); габарит X≈46.
4. **mirror_body**: цилиндр R3×H10 центр (20,0) → `mirror_body(YOZ)` → оригинал + зеркало в
(20,0) → V≈2·283=565 (`±5%`); габарит X≈46.
4. **mirror_body**: то же тело → `mirror_body(YOZ)` → симметричная пара, габарит X≈46, V≈2·283.
Ожидаемые объёмы считаем аналитически, сверяем `InRange ±5%`. Если `count` НЕ включает
оригинал или направление шага иное — корректируем по факту, сохранив суть проверки.
Ожидаемые объёмы считаем аналитически, сверяем `InRange ±5%`. Открытые тонкости (count вкл.
оригинал; count2=1; круговой count1=1/count2=N; mirror_body оставляет оригинал) — проверяются
этими тестами; при расхождении корректируем по факту, сохранив суть проверки.