первый коммит: инструмент, документ, правила, шаблоны
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Инструменты, использованные при создании 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 мм — как оригинал.
|
||||
Reference in New Issue
Block a user