7.7 KiB
7.7 KiB
Инструменты, использованные при создании 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 для зоны гиба — дают сплайновую грань, распознавание листа ломается
- Растяжение по глобальной оси для наклонной стенки — даёт ступеньку в контуре; тянуть надо вдоль плоскости стенки
Три ошибки, найденные и исправленные по ходу
- Метрология мерила до тела, а не до поверхности.
distToShapeдо солида возвращает 0 для точек внутри материала — «толстая» деталь проходила приёмку. Проверка: сдвиг 0.3 мм давал 74 % точек в допуске, после исправления 29.8 % - Односторонняя выборка не видит лишний металл. Кандидат длиннее эталона давал RMS 0 и 100 %. Невязка сделана двусторонней
- Не было проверки замкнутости. Деталь может быть точной и дырявой одновременно; метрология этого не ловит. Добавлен подсчёт свободных рёбер — предсказал отказ портала до самого отказа
Три критерия приёмки (итог)
| Критерий | Чем проверяется | Что ловит |
|---|---|---|
| Метрология | point-sampling двусторонний, до поверхности | точность геометрии |
| Целостность | свободные рёбра = 0, солидов ≥ 1 | дыры, незамкнутость |
| Производство | загрузка на портал поставщика | распознавание как листовой детали |
Третий критерий главный и не заменяется первыми двумя. Проверено: номинальная реконструкция прошла портал Blechcon с развёрткой 299 × 168 мм — как оригинал.