Топологически зависимые преобразования

Существует класс операций, требующий в качестве параметра выбрать элемент топологии модели. В интерактивных CAD мы можем, используя указатель мыши, выделить такой элемент и указать в качестве параметра. Этот метод недоступен в скриптовом CAD. Один из подходов ZenCad состоит в том, что такой элемент задаётся методом "ближайшей точки". При задании аргумента, вместо элемента топологии задаётся точка. Выбранным считается элемент, расстояние до которого от заданной точки будет минимальным.

Для явного выбора рёбер и граней используйте селекторы топологии.


Fillet

Операция скругления тела. Если тело объёмное - модификации подвергаются ребра. Если плоское - вершины. Скругления задаются радиусом r и масивом ближайших точек refs. Если refs == None, выбранными считаются все элементы топологии.

fillet(model, radius, referencedPoints)
fillet(model, radius)
model.fillet(radius, referencedPoints)
model.fillet(radius)




Chamfer

Операция взятия фаски тела. В отличие от скругления применяется только к объёмным телам. Фаска задаётся расстоянием r, взятым от ребра до линии фаски и масивом ближайших точек refs. Если refs == None, выбранными считаются все элементы топологии.

chamfer(model, radius, referencedPoints)



Уклон граней (Draft)

draft наклоняет выбранные грани относительно нейтральной плоскости. Это нужно, например, чтобы деталь извлекалась из пресс-формы. Положительный угол снимает материал по направлению вытяжки, отрицательный — добавляет. Нейтральная плоскость остаётся неподвижной.

По умолчанию направление равно +Z, а нейтральная плоскость проходит через начало координат перпендикулярно направлению. neutral также принимает плоскую грань или пару (origin, normal). Выбранные грани должны принадлежать исходному телу и быть плоскими, цилиндрическими или коническими.

body = box(20)
side_faces = body.faces().filter_by_position(Axis.Z, 10)

narrower = draft(body, side_faces, deg(5))
wider = draft(body, side_faces, deg(-5))
midplane = draft(
    body,
    side_faces,
    deg(5),
    neutral=((0, 0, 10), (0, 0, 1)),
)

Thicksolid

Операция создания тонкостенного объёмного тела. Задаётся прототипной моделью shp и массивом точек, ближайших к удаляемым граням refs. Также задаётся толщина стенок t. Если толщина стенок положительная, стенки наращиваются наружу. Если отрицательная - внутрь.

thicksolid(model, t=thickness, refs=referencedPoints)

Тип результата и выбор элементов

fillet() и chamfer() возвращают Shape; тип содержимого проверяется через faces() и solids(). Даже для одного полученного тела оболочка результата остаётся Shape.

Для выбора ближайших элементов передавайте список point3(...) или Vertex, а для явного выбора рёбер — список Edge исходного тела. Смешивать рёбра с точками нельзя. Обычные числовые кортежи внутри списка ссылок не поддерживаются; используйте point3. None выбирает все элементы, пустой список вызывает ValueError. Рёбра другой модели отвергаются. Для скругления плоской грани выбирайте вершины или точки.