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

Выдавливание 2D-эскизов в 3D-тела

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

В предыдущих уроках мы научились готовить "чертежи" — двумерные эскизы, комбинируя фигуры вроде Rectangle и Circle. Вы создали параметрический эскиз печатной платы, который является идеальной отправной точкой для сегодняшней темы.

Цель этого урока — сделать решающий шаг от плоского чертежа к объемному объекту. Мы научимся выдавливать (extrude) 2D-эскизы, чтобы создавать из них трехмерные тела. Это фундаментальная операция в CAD, которая превращает ваш код в нечто, что можно напечатать на 3D-принтере. К концу этого урока вы сможете создать свою первую полноценную 3D-модель в build123d.

Что такое выдавливание (Extrusion)?

Выдавливание — это процесс, при котором 2D-профиль "вытягивается" вдоль определенного направления, образуя 3D-тело. Представьте, что ваш 2D-эскиз — это формочка для печенья. Выдавливание — это процесс вдавливания этой формочки в тесто на определенную глубину.

Иллюстрация процесса выдавливания (Extrusion)
Визуализация процесса выдавливания: 2D-эскиз (The Base Sketch) вытягивается в третье измерение (The Extrusion), чтобы создать твердотельную 3D-модель (The Base Model).

В build123d этот процесс реализуется с помощью функции extrude.

Базовое использование extrude

Рабочий процесс остается последовательным и логичным, что соответствует вашему опыту в разработке ПО:

  1. Создать и полностью определить 2D-эскиз в контексте Sketch.
  2. Передать готовый объект эскиза в функцию extrude, указав толщину.

Функция extrude принимает как минимум два аргумента:

  • target: Объект, который нужно выдавить (в нашем случае, это будет результат работы Sketch).
  • amount: Величина выдавливания в миллиметрах.

Давайте создадим новый файл lesson7_extrude.py и начнем с простого примера:

# lesson7_extrude.py
from build123d import Sketch, Rectangle, extrude, show_object

# 1. Создаем 2D-эскиз
with Sketch() as box_sketch:
    Rectangle(30, 40)

# 2. Выдавливаем эскиз на 10 мм
my_box = extrude(box_sketch, amount=10)

# Теперь мы отображаем 3D-объект, а не эскиз
show_object(my_box, name="My First 3D Box")

Сохраните файл. watchexec перестроит модель, и вместо плоского прямоугольника вы увидите в OCP CAD Viewer полноценный параллелепипед. Обратите внимание, что show_object теперь работает с трехмерным Solid, который вернула функция extrude.

Практическое применение: создаем 3D-модель печатной платы

Теперь применим этот навык к более полезной задаче. Возьмем код для эскиза печатной платы из предыдущего урока и придадим ему толщину. Стандартная толщина текстолита для плат часто составляет 1.6 мм.

Дополним наш файл:

# lesson7_extrude.py
from build123d import Sketch, Plane, Rectangle, Circle, Locations, Align, extrude, show_object

# --- Код эскиза платы из предыдущего урока ---
plate_width = 100
plate_height = 50
hole_radius = 2.5
hole_margin = 5

with Sketch(Plane.XY) as pcb_sketch:
    Rectangle(plate_width, plate_height) # Выравнивание по центру по умолчанию
    
    h_pos = plate_width / 2 - hole_margin
    v_pos = plate_height / 2 - hole_margin
    hole_positions = [
        (h_pos, v_pos), (-h_pos, v_pos),
        (-h_pos, -v_pos), (h_pos, -v_pos)
    ]

    # В эскизе мы использовали вычитание (mode=Mode.SUBTRACT в прошлом уроке)
    # или просто добавляли окружности. При выдавливании "дыры" в эскизе
    # автоматически становятся сквозными отверстиями в 3D-модели.
    with Locations(*hole_positions):
        Circle(hole_radius)
# --- Конец кода эскиза ---

# 3. Выдавливаем эскиз платы на стандартную толщину
pcb_thickness = 1.6
my_pcb = extrude(pcb_sketch, amount=pcb_thickness)

# Отображаем только 3D-модель платы
# Если вы хотите сравнить, можете показать и эскиз: show_object(pcb_sketch)
show_object(my_pcb, name="3D PCB Model")

Сохранив этот код, вы получите параметрическую 3D-модель печатной платы. Отверстия, которые были просто окружностями в 2D-эскизе, теперь стали сквозными отверстиями в 3D-теле. Это одна из самых мощных концепций CAD: сложность определяется на уровне 2D-эскиза, а затем легко переносится в 3D.

Build123d Code and 3D Model Extrusion Example
Рабочий процесс в `build123d`: слева — Python-код, определяющий геометрию, справа — результат его выполнения в виде 3D-моделей. Это наглядно демонстрирует связь между кодом и конечным объектом.

Управление направлением выдавливания

По умолчанию extrude создает геометрию в положительном направлении оси, перпендикулярной плоскости эскиза (для Plane.XY это ось Z). Но этим можно управлять:

  • Положительное значение amount: выдавливание "вверх" по оси Z.
  • Отрицательное значение amount: выдавливание "вниз" по оси Z. extrude(my_sketch, amount=-10)
  • Симметричное выдавливание: both=True. Этот параметр делит amount пополам и выдавливает в обе стороны от плоскости эскиза. Это крайне удобно, когда плоскость эскиза должна оставаться в центре симметрии детали.

Пример симметричного выдавливания:

# ... ваш код эскиза ...
symmetric_part = extrude(pcb_sketch, amount=10, both=True)
# В результате получится деталь толщиной 10 мм, 
# где 5 мм выше плоскости XY и 5 мм ниже.
# show_object(symmetric_part, name="Symmetric Part")

Чтобы лучше понять синтаксис и увидеть extrude в действии в официальной документации, изучите следующий фрагмент.

gumyr/build123d: A python CAD programming library

Официальный README build123d на GitHub содержит краткий, но емкий пример, который демонстрирует весь цикл: создание 1D-линий, преобразование их в 2D-эскиз и, наконец, выдавливание в 3D-тело. Это поможет закрепить пройденный материал.

Найдите раздел 'Usage', затем подраздел 'Upgrading to 2D and 3D'. Обратите внимание на последнюю строку кода в этом блоке: part = extrude(sketch, amount=2). Она наглядно показывает, как 2D-объект sketch преобразуется в 3D-объект part.

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

Задание:
Возьмите код решения из практического задания предыдущего урока (эскиз "лицевой панели" face_plate) и превратите его в 3D-модель.

  1. Скопируйте код, создающий эскиз face_plate.
  2. Выдавите этот эскиз на толщину 3 мм.
  3. Отобразите получившуюся 3D-модель с помощью show_object.
Показать решение

Вот возможное решение. Оно демонстрирует, как эскиз со сложными вырезами превращается в цельную 3D-деталь.

# lesson7_exercise_solution.py
from build123d import *

# Параметры из предыдущего задания
panel_width = 120
panel_height = 40
center_hole_radius = 10
cutout_width = 10
cutout_height = 20
cutout_offset = 40
panel_thickness = 3 # Новая переменная для толщины

# 1. Создаем эскиз точно так же, как и в прошлый раз
with Sketch() as face_plate_sketch:
    Rectangle(panel_width, panel_height)
    Circle(center_hole_radius, mode=Mode.SUBTRACT)
    with Locations((-cutout_offset, 0), (cutout_offset, 0)):
        Rectangle(cutout_width, cutout_height, mode=Mode.SUBTRACT)

# 2. Выдавливаем готовый эскиз
face_plate_part = extrude(face_plate_sketch, amount=panel_thickness)

# 3. Отображаем 3D-модель
show_object(face_plate_part, name="3D Face Plate")

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

  • Функция extrude — основной инструмент для перехода от 2D к 3D, создающий объем из плоского эскиза.
  • "Отверстия" в 2D-эскизе (созданные через mode=Mode.SUBTRACT или просто как внутренние замкнутые контуры) автоматически становятся сквозными отверстиями в 3D-модели при выдавливании.
  • Направлением и симметрией выдавливания можно управлять с помощью знака amount и параметра both=True.
  • Основной рабочий процесс в параметрическом моделировании: Sketch → extrude.

Что дальше?

Мы научились создавать одиночные твердые тела. Но реальные объекты, особенно корпуса, часто состоят из нескольких частей, которые нужно соединить, или имеют сложные вырезы, которые проще сделать уже на 3D-модели. В следующем уроке мы изучим булевы операции (add, subtract, intersect), которые позволят нам комбинировать и модифицировать 3D-тела для создания более сложных конструкций.

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

Sign up