Иерархические сборки.
При отображении сложной или анимированной сцены необъходимо работать с большим количеством связанных интерактивных объектов, перемещающихся друг относительно друга по определённым законам.
Для облегчения реализации такого поведения в zencad представлена библиотека zencad.assemble и её основное средство zencad.assemble.unit.
Сборочный юнит (zencad.assemble.unit).
Сборочный юнит - это объект, имеющий собственную локальную систему координат, относительно которой позиционируются связанные с этим юнитом интерактивные объекты и другие юниты. Юниты могут создавать структуру дерева, отсчитывая своё положение относительно положения юнита-предка (unit.parent). Если юнит не имеет предка, его положение отсчитывается от глобальной системы координат.
Юнит содержит имеет два объекта координатного преобразования - location и global_location.
- location - задаёт положение юнита относительно положения юнита предка. location может быть обновлён или непосредственно, или с помощью метода relocate.
- globallocation - это положение юнита относительно глобальной системы координат. globallocation используется при отрисовке объекта. globallocation строится на основе дерева unit.location и может быть обновлён с помощью метода locationupdate, relocate и, с помощью других операций.
Добавление объекта.
Создаёт и связывает с юнитом интерактивный объект на основе переданного геометрического объекта obj.
Если в качестве параметра передан интерактивный объект, юнит берёт его под управление. (Примечание: юнит управляет расположением интерактивного объекта).
Сигнатура:
Сигнатура:
u.add(obj, color=zencad.default_color)
Пример:
m = box(10)
i = interactive_object(box(10).right(20))
u.add(m)
u.add(i)
Добавление юнита-потомка.
Устанавливает объект u предком для объекта child. Теперь положение объектов в юните child (и его потомках) будет расчитываться с учётом положения объекта u.
Сигнатура:
u.link(child)
Пример:
***
Обновить глобальное расположение.
Обновить глобальное расположение объекта согласно данным о его текущем положении и объекту глобального положения предка. view - если объект отображен, перерисовать его, исходя из нового положения. deep - применить рекурсивно всех потомков объекта.
Сигнатура:
u.location_update(deep=True, view=True)
Изменить локальное положение.
Изменить текущее положение на объект location и применить процедуру location_update с опциями deep, view.
Сигнатура:
u.relocate(location, deep=True, view=True)
Отобразить на сцене.
Сигнатура:
u.bind_scene(scene, color=zencad.default_color, deep=True):
Добавить юнит в сцену scene. Все объекты, цвета которых не установлены, будут окрашены в default_color. Если deep, рекурсивно добавить в сцену все зависимые юниты.