Булевы операции.

CSG геометрия операется на булевы операции. В zencad представлены операции объединения, вычитания и пересечения 3д и 2д объектов. В zencad есть два группы этих операций:

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


Объединение тел.

Сигнатура:

# Функция:
result = union(array)

# Оператор:
result = shp0 + shp1

Пример:

#with operators:
sphere(r=10) + cylinder(r=5, h=10, center=True) + cylinder(r=5, h=10, center=True).rotateX(deg(90))

#with function:
union([
    sphere(r=10),
    cylinder(r=5, h=10, center=True),
    cylinder(r=5, h=10, center=True).rotateX(deg(90))
])



Вычитание тел.

Сигнатура:

# Функция:
result = difference(array)

# Оператор:
result = shp0 - shp1

Пример:

#with operators:
sphere(r=10) - cylinder(r=5, h=10, center=True) - cylinder(r=5, h=10, center=True).rotateX(deg(90))

#with function:
difference([
    sphere(r=10),
    cylinder(r=5, h=10, center=True),
    cylinder(r=5, h=10, center=True).rotateX(deg(90))
])



Пересечение тел.

Сигнатура:

# Функция:
result = intersect(array)

# Оператор:
result = shp0 ^ shp1

Пример:

#with operators:
sphere(r=10) ^ cylinder(r=5, h=10, center=True) ^ cylinder(r=5, h=10, center=True).rotateX(deg(90))

#with function:
intersect([
    sphere(r=10),
    cylinder(r=5, h=10, center=True),
    cylinder(r=5, h=10, center=True).rotateX(deg(90))
])



Пересечение оболочек.

Побратим операции intersect, производящий вычисление пересечения оболочек тел.

Сигнатура:

# Функция:
result = section(a, b)

Пример:

m0 = section(box(10, center=True) - sphere(4))
m1 = section(box(10, center=True), sphere(7))


Разбиение и сечение плоскостью.

split(body, tools) разделяет тело Shape-инструментами, slice(body, z=..., axis=...) — одной плоскостью. Обе операции возвращают коллекции solid-частей и сохраняют неразрезанные тела. Пустой набор инструментов для split вызывает ValueError.

Части slice упорядочены вдоль нормали плоскости. При двух частях результат можно распаковать как lower, upper. Подробнее и примеры — в разделе «Разделение тел».

parts = split(box(10), (infplane().up(3), infplane().up(7)))

lower, upper = slice(box(10), z=4)
left, right = slice(box(10), z=2, axis="x")
negative, positive = slice(box(10), plane=((0, 5, 0), (0, 1, 0)))

Булевы операции над двумерными телами.

Точно также как и к трёхмерным объектам, перечисленные выше операции могут применяться к двумерным объектам до тех пор, пока они находятся в одной плоскости.

Пример:

m0 = circle(10) - square(10)
m1 = circle(10) + square(10)
m2 = circle(10) ^ square(10)
m3 = section(circle(10), square(10))