# Инструменты, использованные при создании 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 мм — как оригинал.