Files
project/tool/ИНСТРУМЕНТЫ.md

78 lines
7.7 KiB
Markdown

# Инструменты, использованные при создании RECADA-реверса
Всё бесплатное и open source. Платные строки проекта — только серверы и токены.
## Установка целиком
```
pip install cadquery-ocp build123d networkx numpy scipy streamlit ezdxf
```
## Ядро геометрии
| Инструмент | Роль в проекте |
|---|---|
| **OCP** (cadquery-ocp 7.9.3) | Python-биндинг ядра OpenCASCADE. Чтение и запись STEP, обход B-Rep, все булевы операции, наращивание, сшивка, метрология. Ровно то ядро, что внутри FreeCAD, но как библиотека — поэтому FreeCAD в цепочке не нужен |
| **build123d 0.11.1** | Параметрическое построение (кубики листового металла). Проверено: операций Bend/Flange/Hem в нём НЕТ, писали свои |
| **networkx 3.6** | Графы: AAG (смежность граней), FTG (переходы гибки), двухцветная раскраска для разделения оболочек, поиск поддеревьев при повороте шарниров |
| **numpy** | Векторная математика: нормали, оси, углы, проекции |
| **scipy** | Оптимизатор Powell — подбор неизвестных параметров по метрологической невязке |
| **ezdxf** | Экспорт развёртки в DXF с линиями гиба на отдельном слое |
| **streamlit 1.62** | Браузерный интерфейс: загрузка STEP, ползунки углов, вердикты, скачивание |
## Конкретные модули OpenCASCADE, которые пригодились
| Модуль | Зачем |
|---|---|
| `STEPControl_Reader/Writer` | чтение и запись STEP |
| `TopExp_Explorer`, `TopTools_IndexedDataMapOfShapeListOfShape` | обход топологии, поиск смежности граней и свободных рёбер |
| `BRepAdaptor_Surface`, `BRepLProp_SLProps` | тип поверхности, точка и нормаль в UV |
| `BRepTopAdaptor_FClass2d` | проверка, попадает ли UV-точка внутрь обрезанной грани (без неё метрология врала) |
| `BRepExtrema_DistShapeShape` | расстояние точка→поверхность — основа метрологии |
| `BRepBuilderAPI_Sewing` | сшивка граней в оболочку |
| `BRepBuilderAPI_MakeSolid` + флаг Closed | превращение замкнутой оболочки в тело (без этого STEP пишет поверхность, и портал отклоняет) |
| `BRepOffset_MakeOffset` | наращивание на толщину; поэлементно надёжнее, чем всей оболочкой |
| `BRepAlgoAPI_Fuse / Common` | объединение кусков, разрез полупространством |
| `BRepPrimAPI_MakeHalfSpace / MakePrism / MakeBox` | растяжение детали: разрез, призма сечения |
| `BRepFill_Filling` | заплатки на свободные контуры (даёт сплайн — распознавание листа ломает, применять осторожно) |
| `ShapeAnalysis_FreeBounds` | сборка свободных рёбер в контуры |
| `ShapeUpgrade_UnifySameDomain` | склейка граней одной поверхности после булевых |
| `GProp/BRepGProp` | объёмы и площади |
| `Bnd_Box/BRepBndLib` | габариты |
## Методы (что из v25 реально пригодилось)
- **AAG** — граф смежности граней, основа всего обмера
- **Виртуальный щуп** — точка минус нормаль на толщину: попала на поверхность → грань оболочечная. Дал разделение на две стороны листа там, где не сработали три других алгоритма
- **Парование + двухцветная раскраска** — щуп сообщает, на какую грань попал; граф парования оказался двудольным, стороны разделились 21/20
- **FTG** — фланцы узлы, гибы рёбра
- **Оригами-кинематика** — жёсткие поддеревья на шарнирах по осям гибов
- **Метрология point-sampling** — расстояние от точек эталона до поверхности кандидата
- **Два угла гиба** — поворот и двугранный (180 − поворот)
- **Аналитическая развёртка** — BA = φ·(R + K·t), K по таблице R/t
## Отвергнуто на практике
- **pythonocc-core отдельно** — то же ядро уже есть через OCP
- **CadQuery** — дублирует build123d
- **Analysis Situs** — тяжёлая C++-платформа ради того, что делают ~100 строк на networkx
- **Наращивание оболочки целиком** — оставляет дыры; поэлементно надёжнее
- **Заплатки BRepFill** для зоны гиба — дают сплайновую грань, распознавание листа ломается
- **Растяжение по глобальной оси** для наклонной стенки — даёт ступеньку в контуре; тянуть надо вдоль плоскости стенки
## Три ошибки, найденные и исправленные по ходу
1. **Метрология мерила до тела, а не до поверхности.** `distToShape` до солида возвращает 0 для точек внутри материала — «толстая» деталь проходила приёмку. Проверка: сдвиг 0.3 мм давал 74 % точек в допуске, после исправления 29.8 %
2. **Односторонняя выборка не видит лишний металл.** Кандидат длиннее эталона давал RMS 0 и 100 %. Невязка сделана двусторонней
3. **Не было проверки замкнутости.** Деталь может быть точной и дырявой одновременно; метрология этого не ловит. Добавлен подсчёт свободных рёбер — предсказал отказ портала до самого отказа
## Три критерия приёмки (итог)
| Критерий | Чем проверяется | Что ловит |
|---|---|---|
| Метрология | point-sampling двусторонний, до поверхности | точность геометрии |
| Целостность | свободные рёбра = 0, солидов ≥ 1 | дыры, незамкнутость |
| Производство | загрузка на портал поставщика | распознавание как листовой детали |
Третий критерий главный и не заменяется первыми двумя. Проверено: номинальная
реконструкция прошла портал Blechcon с развёрткой 299 × 168 мм — как оригинал.