# Работа с импортом / сборками

Дополнение к SKILL.md — конвейер разбора ЧУЖОЙ модели/сборки: «импорт → разбор → извлечение детали →
осмотр → модификация → экспорт». Сборка С НУЛЯ — `reference/assembly-playbook.md`.

1. **`import_model`** — `type` задаёт документ: `assembly` (по умолчанию) или `part`.
   Формат берётся из расширения; `.prt` и `.asm` носят несколько САПР сразу — там задавай `format`
   явно. Нужна отдельная деталь файлом — включай `createComponentFiles` (по умолчанию `false`).
   **Выключенный переключатель чистого диска НЕ гарантирует:** конвертер пишет файлы рядом с
   ИСХОДНИКОМ и помимо него — замерено, четыре импорта положили четыре незапрошенных `.m3d`.
   Что реально изменилось в каталоге исходника, ответ перечисляет поимённо; не хочешь засорять
   чужой каталог — копируй файл во временный (`help(topic="model-exchange")`).
   **STL/OBJ приходят СЕТКОЙ:** «тел 0, объём 0.0 мм³» после такого импорта — норма, а не провал,
   проверяй габаритом; ответ говорит это вслух и называет число треугольников из самого файла.
   Плоский чертёж (.dxf/.dwg) читает не он, а `import_drawing`.
2. **Разбор:** `describe_model(sections=components)` (у каждого компонента — origin, поворот,
   фиксация) и `describe_model(sections=mates)`, если сборка пришла со связями; грани компонента —
   `list_faces(component=N)`. Извлечённую деталь открывай самостоятельным документом.
   Гашение видимости компонента на снимок **не влияет** — изоляция так не делается.
3. **Осмотр — структурно** (`describe_model`: какая ось «высота», МЦХ, топология). Снимок
   `model_snapshot(view=…)` — ракурс выбирай по плоскости детали (плоскую смотри сверху или
   спереди, не в изометрии); один и тот же `view` даёт воспроизводимый кадр «до/после».
   **Пары ракурсов противоположны по оси:** `front` смотрит из +Z, `rear` — из −Z, так же
   `top`/`bottom` и `left`/`right`. Следствие, которое нужно чаще всего: деталь, лежащая на столе
   гранью Z=0 (эскиз на XOY, выдавливание вперёд), видна столу как **`rear`**, а `front` покажет
   зеркальную картинку. Читаемость надписи или логотипа доказывают снимком с нужной стороны, а не
   рассуждением.
   **Но «ортогонально» — правило про ПЛОСКУЮ деталь.** Как только форма выходит из одной плоскости
   (кронштейн, косынка, изогнутый профиль), ортогональный кадр перестаёт читаться: он плоский,
   подписей осей на нём нет, и сопоставить увиденное с координатами не выходит — `right` даёт
   картинку, по которой не сказать, где перёд. Профиль такой детали смотри `view="iso"`: там видно,
   что куда загнуто.
4. **Модификация «тупой» B-rep** (итог — в ответе каждой операции). Инструмент выбирается по тому,
   ЧТО задано в требовании, а не по тому, что привычнее:

   | Требование звучит как | Инструмент | Почему не `move_face` |
   |---|---|---|
   | «сдвинуть грань на N мм» | `move_face` | это он и есть |
   | «диаметр отверстия (бобышки) должен стать D» | **`resize_face`** | задаётся ДИАМЕТР, ось не двигается; `move_face` сдвинул бы стенку на (D−d)/2, и это пришлось бы считать самому |
   | «грань должна встать НА объект: на плоскость, на грань соседнего тела» | **`replace_face`** | расстояние считает КОМПАС; `move_face` требует вычислить его заранее |
   | вставка N мм в призматическую ножку | `split_solid_by_plane` → `move_body` → `move_face` (мост) → `boolean_union` | цепочка проверена end-to-end: проставка 39.45 → 41.45 мм |

   `resize_face` и `replace_face` требуют КОМПАС v25; на версиях старше они отвечают отказом с
   номером установленной версии, и тогда остаётся `move_face` с арифметикой.

   **Проверяйте прямое редактирование РАЗНОСТЬЮ ОБЪЁМОВ против аналитической формулы** — объём и так
   печатается в сводке каждой операции, лишних вызовов не нужно. Расточка отверстия обязана снять
   ровно `π(R²−r²)·h`, наращивание грани — добавить ровно `площадь_грани × Δh`. Считайте формулу по
   СВОИМ числам и сверяйте с тем, что напечатала операция: одно число ловит и «операция ушла не
   туда», и «отверстие перестало быть сквозным».

   **Оси отверстий сверяют полем `axis`.** У грани типа `cylinder`, `cone`, `torus` `list_faces`
   отдаёт `axis` — точку на оси и направление, в мировых координатах; у цилиндра и сферы там же
   `radius`. Требование «оси сдвигать нельзя» доказывается сравнением `axis` до и после, а не
   арифметикой по расстояниям. Осторожно с двумя соседними полями: `normal` у цилиндра — про
   сторону поверхности, а не про ось, а `pointOnFace` лежит на стенке (help(topic="cylinder-axis")).
5. **Перед выдачей:** последняя операция «Построение чистое» → `export_model` (STEP для обмена,
   STL для печати).
