3D-модели STEP/STL (твердотельное моделирование)
Построение и правка твердотельных 3D-моделей через build123d (ядро OCC) в песочнице: примитивы и булевы, тела вращения по профилю, выдавливание с уклоном, скругления и фаски по запросу рёбер, массивы отверстий, фланцы; проверка модели перед выдачей — watertight, manifold, объём и масса против графы «кг» чертежа, с готовой подсказкой при расхождении; серия исполнений по таблице параметров в отдельные файлы; импорт и правка чужого STEP; рендер PNG с нескольких ракурсов; экспорт STEP AP214, STL и плоского DXF-сечения. Файлы открываются в КОМПАС-3D, SolidWorks, Fusion, FreeCAD, nanoCAD и слайсерах.
3D-модели STEP/STL (твердотельное моделирование)
S0. ТРИ ПРАВИЛА
1. STEP пишет ядро. Файл появляется двумя путями: solid_build.save_part(part, "имя") собирает его из твоего Python-исходника, либо solid_build.load_part(path) читает чужой. Текст STEP набранный вручную — это ISO-10303-21; с выдуманными номерами сущностей: он проходит взгляд и не открывается ни в одном ядре, а ошибка всплывает у человека, который его получил.
2. После каждого изменения — cad_check, и только потом рендер. Числа стоят доли секунды, картинка — секунды и токены на её разглядывание. Сходятся объём, масса и габариты — тогда смотри cad_render и сверяй форму с чертежом. Порядок «дёшево → дорого» экономит те попытки, которых потом не хватит.
Человек читает эту строку и приносит недостающее (размер, которого нет на чертеже; допуск; вид сбоку). Пятая попытка вслепую тратит бюджет и приносит ту же ошибку.
S1. WORKFLOW
Скругления и фаски берут рёбра запросом — сначала отбери, потом применяй:
edges(), faces(), vertices() возвращают списки с .filter_by(Axis.Z), .group_by(Axis.Z)[-1] (верхняя группа), .sort_by(SortBy.AREA).
Профиль → тело: контур точками, затем вращение или выдавливание (см. S3 — там это одной строкой).
Измерение прямо в ячейке, когда нужно принять решение по ходу:
is_valid и is_manifold — свойства, не методы: со скобками получишь TypeError: 'bool' object is not callable.
S3. ГОТОВЫЕ ТЕЛА — solid_build
Формы, которые руками пишутся длинно и ломаются тихо.
revolve_profile(points, angle=360, plane="XZ")— тело вращения вокруг оси Z; точки это(радиус, высота), то есть ровно та половина сечения, которой деталь размечена на чертеже. Контур замыкается сам; отрицательный радиус означает пересечение оси и отвергается сразу.extrude_profile(points, height, plane="XY", taper=0)— выдавливание замкнутого контура,taperв градусах даёт уклон.hole_pattern(part, positions, diameter, depth=None)— массив отверстий;depth=Noneсверлит насквозь по габариту.bolt_circle(count, circle_diameter, start_angle=0)— координаты болтовой окружности, отдельно от сверления.flange(...)— диск + опциональные бобышка, расточка и болтовая окружность; болтовая окружность, вылезающая за наружный диаметр, отвергается с указанием обоих чисел.save_part(part, filename)— STEP в/tmp/cad, не в артефакты.load_part(path)— чтение обратно.
S4. ЯДРО ЦИКЛА — cad_check
Ответ — JSON, и первые два ключа status и hint. hint читается первым: это готовая подсказка, что делать дальше, остальные числа — её обоснование.
Гейт: watertight (в файле есть тело, а не поверхности) ∧ manifold ∧ volume > 0 ∧ valid (ядро не нашло самопересечений). Гейт красный — экспорта нет: cad_export отказывается писать и печатает тот же отчёт. Так поверхностный «супчик», который вьюер ещё покажет, а станок и печать уже нет, не доезжает до человека.
Проверки против чертежа — величины mass_kg, volume_mm3, bbox_x/y/z, face_count, edge_count, solid_count, area_mm2. Формы: имя=низ..верх, имя>=число, имя<=число. Точного равенства нет намеренно: у чисел с плавающей точкой оно не выполняется никогда, а графа «кг» на чертеже всё равно округлена — бери коридор ±2%.
Материал задаётся именем (сталь, чугун, алюминий, латунь, бронза, медь, титан, нержавейка, abs, pla, petg) или плотностью числом в кг/м³; по умолчанию сталь 7850.
Из ячейки то же самое доступно как функции: cad_check.check(path, material, [cad_check.parse_assertion("mass_kg>=1.2")]).
S5. РЕНДЕР — cad_render
PNG с несколькими ракурсами одним листом в $OUTPUT_ROOT/. Ракурсы: iso, front, back, left, right, top, bottom. --tolerance — допуск тесселяции в мм (мельче = точнее и медленнее).
S6. СЕРИЯ ИСПОЛНЕНИЙ — params_table
Таблица исполнений на чертеже — это одна модель с параметрами, а не пять моделей. Напиши модуль с функцией build(**params), где имена аргументов совпадают с колонками таблицы:
Каждая строка проходит тот же гейт и те же --assert; файл получают только прошедшие, у остальных в отчёте стоит свой hint. Колонка с именем исполнения читается как текст, поэтому «01» остаётся «01».
S7. ЧУЖОЙ STEP — cad_inspect
load_part возвращает одно тело как тело, а несколько — как компаунд, и не сплавляет их: сборка из трёх деталей не должна молча стать одной.
S8. ЭКСПОРТ — cad_export
Гейт и --assert прогоняются здесь заново: артефакт — это то, что уйдёт человеку, и проверка на нём стоит дешевле разбирательства после.
S9. ГРАНИЦЫ
Тело собирает ядро из твоего кода; cad_check решает, тело ли это; рендер отвечает на «та ли форма»; экспорт — последняя дверь, и она заперта, пока гейт красный.
Похожие навыки
Попробуйте этот навык
Зарегистрируйтесь и используйте навык «3D-модели STEP/STL (твердотельное моделирование)» бесплатно.