Линии и циклы.
Во многих случаях объёмных и плоских примитивов недостаточно для построения требуемой геометрии. Продвинутые операции, из числа тех, что встречаются в данном руководстве позволяют строить геометрические тела на основе произвольных линий.
В ZenCad (и геометрическом ядре opencascade) существует два класса одномерных геометрических тел - Edge и Wire. Edge является простым примитивом. Объединение нескольких Edge в одну составную кривую порождают объект Wire. Как правило, в ZenCad, Wire и Edge могут использоваться взаимозаменяемо, однако при анализе модели с использованием рефлексии эта разница может быть существенной.")
Набор Wire и/или Edge может быть соединён в сложную кривую с помощью функции sew (Подробнее ниже в этом разделе).
Замкнутые кривые называются циклами. Если кривая (все составные кривые) цикла лежит в одной плоскости, то такой цикл может быть преобразован в грань (Face) при помощи функции fill (см. раздел "Плоские примитивы".).
Некоторые дополнительные операции при работе с кривыми описаны в разделе "Анализ кривых".
Сегмент
Отрезок обыкновенный, задаётся двумя точками.
Сигнатура:
segment(pnt1, pnt2)
Полисегмент
Полисегмент - ломанная линия. Задаётся масивом точек. Установка флага closed
добавляет сегмент полилинии, идущий от точки конца к точке начала. pnts
- массив точек.
Сигнатура:
polysegment(pnts, closed=True/False)
Интерполяция по точкам
Инструмент для построения интерполированной кривой, проходящей через набаор точек pnts. С помощью необязательного параметра tangs в каждой точке можно задать направление, под которым кривая пройдёт через точку (нулевой вектор соответствует произвольному пересечению). Установка флага closed
добавляет замыкающий участок кривой.
Сигнатура:
interpolate(pnts, tangs=[], closed=False)
Дуга окружности по трём точкам
Данный метод представляет альтернативный к circle (см. Плоские примитивы) метод генерации дуги окружности по трем точкам.
Сигнатура:
circle_arc(p1, p2, p3)
Восходящая спираль
Восходящая спираль. Задается радиусом r, высотой h и шагом витка step. При установке опции left, меняет правую навивку на левую. При установке необязательно параметра angle, радиус меняется со сменой высоты по коническому закону.
Сигнатура:
helix(r, h, step, angle=angle, left=True/False)
Кривая Безье
Кривая Безье (wiki). Задаётся массивом опорных точек и массивом весов (опционально). Если веса не заданы, все веса считаются равными единице.
Сигнатура:
bezier(pnts)
bezier(pnts, weights)
BSpline
Создать BSpline прямым заданием параметров.
Сигнатура:
bspline(pnts, knots, muls, degree, periodic=False/True)
bspline(pnts, knots, weights, muls, degree, periodic=False/True, check_rational=False/True)
default:
periodic=False
check_rational=True
Скруглённый полисегмент
В отличие от полисегмента, создаёт участки окружности в точках сопряжения сегментов. Переменная r задаёт радиус скруглений. Может использоваться вместе с операцией tube (см. кинематические поверхности). Опция closed позволяет замкнуть кривую с созданием скруглённого сегмента на стыке.
Сигнатура:
rounded_polysegment(pnts, r, closed=False)
Пример:
rounded_polysegment(
pnts=[(0,0,0), (20,0,0), (20,20,40), (-40,20,40), (-40,20,0)],
r=10)
Создание сложной кривой
Операция sew собирает сложную линию из массива частей wires.
В качестве элементов массива wires могут выступать объекты типов Edge и Wire (см. геометрические типы)
Требования. Части линии обязательно должны граничить друг с другом. Порядок следования не должен быть нарушен. Если аргумент sort установлен, алгоритм постарается автоматически отсортировать входящие линии в правильном порядке.
Сигнатура:
sew(wires, [sort=True])
Пример:
sew([
segment((0,0,0), (0,10,0)),
circle_arc((0,10,0),(10,15,0),(20,10,0)),
segment((20,0,0), (20,10,0)),
segment((20,0,0), (0,0,0))
])
Конструктор сложной кривой
Инструмент для последовательного конструирования участков кривой. Выполняя операции, конструирует рёбра от выходной точки предыдущего ребра. Каждая операция может быть выполнена в абсолютном и относительном режимах. В относительном режиме координаты опорных точек складываются с последней текущей координатой конструктора. Выбор режима осуществляется флагом rel. False - абсолютный, True - относительный. Если флаг не объявлен, используется значение defrel.
Аргументы конструктора: start - начальная точка defrel - режим по умолчанию
wb = wire_builder(start=(0,0,0), defrel=False)
Реинициализация:
Перезагрузка инструмента с новой точки. Сбрасывает список рёбер.
wb.restart(pnt, y=None, z=None)
wb.restart(point3(10,15,0))
wb.restart(10,15)
Построение отрезка:
Строит отрезок до точки pnt.
wb.segment(pnt, y=None, z=None, rel=None)
wb.line(b, y=None, z=None, rel=None)
wb.l(b, y=None, z=None, rel=None)
wire_builder(defrel=True).restart((0,10)).l(10,0).l(0,-10).close().doit() # рисуем квадрат
Построение дуги окружности по точкам:
wb.arc_by_points(a,b,rel=None)
Построение интерполяционной кривой по точкам:
curtang позволяет задать направление кривой в стартовой точке. Установка опции approx вычисляет curtang в значение направления кривой в конце прошлого участка.
wb.interpolate(pnts, tangs=None, curtang=(0,0,0), approx=False, rel=None)
Замыкание
сlose строит участок кривой до точки старта. approx_a, approx_b позволяют сделать интерполяцию в точках замыкания.
wb.close(approx_a=False, approx_b=False)