Skip to main content

Someone wanted to learn this too, so Grasp built them a personal learning path.

You can keep exploring this one or create your own

Экспорт 3D-моделей в STL

Здравствуйте!

В предыдущем уроке мы сделали нашу модель параметрической, научившись управлять ее размерами с помощью переменных. Это был ключевой шаг к созданию гибких и легко изменяемых конструкций. Теперь у нас есть Python-скрипт, который генерирует виртуальный 3D-блок на основе заданных параметров, таких как размеры печатной платы и толщина стенок.

Однако, чтобы ваш 3D-принтер Creality смог воплотить эту модель в реальный объект, ее нужно сохранить в специальном формате.

Цель этого урока — научиться экспортировать созданную 3D-модель в формат STL. Завершив этот урок, вы освоите полный базовый цикл: от идеи и параметрического кода до файла, готового к отправке в слайсер для последующей печати.

Что такое STL-файл?

Файл STL (Standard Tessellation Language) — это, по сути, отраслевой стандарт для передачи 3D-моделей в программы подготовки к печати (слайсеры).

Представьте поверхность вашего 3D-объекта, будь она плоской или изогнутой. Формат STL описывает эту поверхность как сетку из множества соединенных между собой треугольников. Этот процесс называется тесселяцией или триангуляцией. Слайсер использует эту сетку, чтобы "нарезать" модель на горизонтальные слои и сгенерировать G-код, управляющий движениями вашего принтера.

3D-модель Benchy в формате STL (полигональная сетка)
Стандартная тестовая модель "Benchy" в виде полигональной сетки. Хорошо видно, как ее поверхность аппроксимирована множеством треугольников. Именно так выглядит геометрия в STL-файле.

Важно понимать, что STL — это "глупый" формат. Он содержит только геометрию поверхности и ничего не знает о том, как модель была создана: ни о параметрах, ни о материалах, ни о структуре сборки. Вся эта "инженерная магия" остается в вашем Python-скрипте, который является исходным кодом вашей модели.

Экспорт модели в build123d

В библиотеке build123d экспорт в STL выполняется очень просто — с помощью метода export_stl() у объекта Shape.

Давайте модифицируем наш скрипт из прошлого урока.

  1. Создайте копию файла lesson3_parametric_box.py и назовите ее lesson4_export.py.
  2. Откройте lesson4_export.py в Helix.
  3. В конце файла, перед строкой show_object(...), добавьте вызов метода экспорта.

Ваш код должен выглядеть примерно так:

# lesson4_export.py
from build123d import Box, show_object

# --- Ключевые параметры ---
pcb_length = 65.0
pcb_width = 50.0
wall_thickness = 1.6
clearance = 1.0
pcb_components_height = 12.0
top_clearance = 3.0

# --- Расчетные размеры ---
inner_length = pcb_length + 2 * clearance
inner_width = pcb_width + 2 * clearance
inner_height = pcb_components_height + top_clearance
enclosure_length = inner_length + 2 * wall_thickness
enclosure_width = inner_width + 2 * wall_thickness
enclosure_height = inner_height + 2 * wall_thickness

# --- Моделирование ---
enclosure_block = Box(
    length=enclosure_length, 
    width=enclosure_width, 
    height=enclosure_height
)

# --- Экспорт в STL ---
# Метод export_stl() вызывается у объекта, который мы хотим сохранить
enclosure_block.export_stl("enclosure_block.stl")

# Отображение во вьювере по-прежнему работает
show_object(enclosure_block, name="Заготовка корпуса (экспортировано)")

Теперь, когда watchexec в вашем tmux выполнит этот скрипт, произойдет два действия:

  1. В директории проекта появится новый файл: enclosure_block.stl.
  2. Модель, как и раньше, обновится в окне OCP CAD Viewer.

Вы можете открыть полученный STL-файл в вашем слайсере (например, Creality Print или Cura), чтобы убедиться, что экспорт прошел успешно. Модель должна появиться на виртуальном столе вашего принтера, готовая к нарезке.

Управление качеством (разрешением) сетки

Поскольку криволинейные поверхности аппроксимируются плоскими треугольниками, возникает вопрос точности этой аппроксимации. build123d позволяет управлять качеством генерируемой STL-сетки с помощью параметров метода export_stl. Два ключевых параметра:

  • tolerance (линейная точность): Максимальное расстояние (в миллиметрах) между исходной поверхностью модели и сгенерированной сеткой. Чем меньше это значение, тем точнее сетка следует кривым, но тем больше треугольников она содержит и, следовательно, больше размер файла.
  • angular_tolerance (угловая точность): Максимальный допустимый угол (в радианах) между нормалями соседних треугольников. Этот параметр влияет на гладкость кривых. Меньшие значения дают более гладкую на вид поверхность.

Для нашего текущего Box, состоящего только из плоских граней, эти параметры не имеют значения. Но как только мы начнем добавлять скругления (fillet) или создавать цилиндрические элементы (отверстия), они станут критически важными.

Стандартные значения в build123d обеспечивают хороший баланс между качеством и размером файла, но вы можете их настроить:

# Пример экспорта с высоким разрешением
enclosure_block.export_stl(
    "enclosure_high_res.stl", 
    tolerance=0.01,        # Линейная точность 0.01 мм
    angular_tolerance=0.1  # Угловая точность ~5.7 градусов
)

# Пример экспорта с низким разрешением (для быстрой черновой печати)
enclosure_block.export_stl(
    "enclosure_low_res.stl",
    tolerance=0.5,         # Линейная точность 0.5 мм
    angular_tolerance=0.5  # Угловая точность ~28.6 градусов
)

Выбор оптимальных значений — это всегда компромисс:

  • Слишком высокое разрешение: огромный размер STL-файла, долгая обработка в слайсере, но при этом качество печати на FDM-принтере практически не улучшится, так как оно ограничено механикой самого принтера.
  • Слишком низкое разрешение: кривые поверхности будут выглядеть "огранёнными", что может быть заметно на финальном изделии.

Для большинства задач по печати корпусов на FDM-принтере стандартных настроек export_stl() более чем достаточно.

Проверьте себя!

Задание:
Добавьте в свой скрипт lesson4_export.py вторую строку экспорта с явно заниженными параметрами качества, как в примере enclosure_low_res.stl выше.

  1. Запустите скрипт. У вас должны появиться два STL-файла: enclosure_block.stl (со стандартным качеством) и enclosure_low_res.stl.
  2. Сравните их размеры в байтах с помощью команды ls -l в терминале. Насколько сильно они отличаются? (Примечание: поскольку наша текущая модель — это просто куб, разница в размере может быть минимальной или отсутствовать. Этот эффект станет очевиден на моделях с кривыми поверхностями).
Показать ответ

Ваш код в конце файла должен выглядеть так:

# ... предыдущий код ...

# --- Экспорт в STL ---
# Стандартное качество
enclosure_block.export_stl("enclosure_block.stl")

# Низкое качество
enclosure_block.export_stl(
    "enclosure_low_res.stl",
    tolerance=0.5,
    angular_tolerance=0.5
)

show_object(enclosure_block, name="Заготовка корпуса (экспортировано)")

После выполнения скрипта команда ls -l enclosure_*.stl покажет вам два файла. Для простого Box их размеры будут практически идентичны, потому что нет кривых для аппроксимации. Мы вернемся к этому упражнению, когда у нас будут более сложные модели.

Ключевые выводы

Поздравляю! Вы завершили первый модуль и освоили полный цикл создания 3D-модели для печати:

  • Мы поняли, что STL-файл — это представление поверхности объекта в виде треугольной сетки, необходимое для слайсера.
  • Мы научились экспортировать наши build123d объекты с помощью метода object.export_stl("filename.stl").
  • Мы узнали о параметрах tolerance и angular_tolerance, которые позволяют управлять компромиссом между точностью модели и размером файла.
  • Теперь у нас есть отлаженный рабочий процесс: Код -> Параметры -> Модель во вьювере -> STL-файл -> Слайсер.

Что дальше?

До сих пор мы работали только с примитивом Box. Это полезно, но сильно ограничивает наши возможности. В подавляющем большинстве случаев сложные объекты создаются другим, более гибким методом: сначала рисуется 2D-эскиз (например, контур стенки корпуса), а затем он "выдавливается" в третье измерение, чтобы получить объемное тело.

В следующем уроке мы начнем второй модуль и погрузимся в этот фундаментальный для CAD-моделирования процесс. Мы научимся определять рабочую плоскость (Plane), которая служит "холстом" для наших будущих 2D-эскизов.

Can't find a good explanation? Sign up and we'll make it for you

Sign up