3D-печатная модель: коробка (box) + крышка (lid), раздельные STL. Генерация — Python (trimesh + manifold3d CSG, shapely для 2D-контуров), не Fusion.
Габариты
- Внутренняя полость: 95×140×200 мм (IW×ID×IH)
- Стенка: 3 мм
- Внешние габариты: 101×146×203 мм (до скругления углов)
- Радиус скругления вертикальных углов: R25 мм (по образцу референсного 3MF
Cat_food_dispenser.3mf, ~27мм на 106мм ширине)
Текущая версия (v8: овал + текстура спереди + новая крышка)
Файлы: zhora_box_v7_oval.stl, zhora_lid_v8_oval.stl (папка "3D печать"). Крышка ПЕРЕСОБРАНА С НУЛЯ (старая Zhora_lid_UNIFIED/zhora_lid_final линия, основанная на ручной референс-модели, больше не используется).
Ключевые решения:
- Скругление всех вертикальных углов (не только верхний срез, а по всей высоте) — сделано через intersection с full-height rounded-rect envelope, а НЕ subtraction отдельных "серпов" по углам (последнее давало non-manifold геометрию).
- Критический баг и фикс: при R=25мм (>> толщины стенки 3мм) внешнее скругление отрезало угловую "стойку" целиком — передняя стенка отваливалась от боковой (watertight=True, но components=2). Фикс: внутренняя полость получила ТО ЖЕ скругление (тот же центр дуги, radius = CORNER_R - WALL), так что толщина стенки остаётся константой 3мм по всей дуге угла, включая угловую стойку. После фикса — watertight, 1 компонент.
- Текстура (рыбий скелет / отпечаток лапы, side_relief) — на БОКОВЫХ и ТЕПЕРЬ ТАКЖЕ на ПЕРЕДНЕЙ стенке (полоса над окном-подсветкой плашки, между plate pocket и верхним краем), протрузия НАРУЖУ от плоской стены (без утопленных карманов — те давали нависающие/неподдерживаемые участки при печати).
- Окно/scoop спереди — WIN_W=76, SCOOP_W=92 (расширено под пакетик 95×140×10, зазор по ширине 3мм, работает за счёт гибкости пакетика).
- Новая крышка (v8): простая функциональная форма — юбка (skirt, кольцо по контуру, толщина 2.6мм, нахлёст 15мм на стенку коробки + 4мм над верхним краем) + плоская крышка-кэп (3мм) + D-образная ручка-скоба по центру (арка вертикальная, печатается без поддержек). Форма юбки взята НЕ формулой, а замером реального контура коробки через
mesh.section()на z=195 — формула (outer_rounded_rectс padding 1.6мм от скругления углов) давала расхождение ~1-2мм у углов и коллизию 1728мм³; замер контура с реальной модели даёт точное совпадение (0мм³ пересечения).
Отложено
Редизайн окна/scoop (приподнятый пол, горизонтальный вырез стенка-в-стенку, 2 выреза под пальцы, по референс-фото) — пользователь отложил ("пока оставим это"), не начато.
Инструменты/техники (для будущих итераций)
- CSG через trimesh
.union/.difference/.intersection(manifold3d backend) WELD_EPS(~0.2-0.3мм) — принудительный нахлёст для настоящего volumetric weld при flush-контакте (иначе no-op union)mesh.split(only_watertight=False)— проверка связности (кол-во компонентов)mesh1.intersection(mesh2)— точная проверка коллизии крышка/коробка; при 0 пересечении результат имеет 0 faces/vertices (не throwит, просто пустой mesh)- Скругление углов шелла большого радиуса ТРЕБУЕТ скругления внутренней полости тем же центром дуги — иначе тонкая угловая стойка вырезается целиком
- Подгонку крышки под нестандартный контур коробки лучше делать замером реального контура (
mesh.section()на безопасном z) вместо пересчёта формулой — формула может разойтись с реальной геометрией из-за паддингов/промежуточных буферов в пайплайне коробки - Ориентация arch/bracket-геометрии под вертикальный свод (без поддержек): строить профиль в (X=ширина, Y=высота), extrude по Z (=толщина), затем повернуть
rotation_matrix(pi/2,[1,0,0])— меняет местами Y и Z (эмпирически проверено бордер-боксами, не выведено аналитически "на глаз")
Комментарии