Иерархические сборки.

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

Для облегчения реализации такого поведения в zencad представлена библиотека zencad.assemble и её основное средство zencad.assemble.unit.


Сборочный юнит (zencad.assemble.unit).

Сборочный юнит - это объект, имеющий собственную локальную систему координат, относительно которой позиционируются связанные с этим юнитом интерактивные объекты и другие юниты. Юниты могут создавать структуру дерева, отсчитывая своё положение относительно положения юнита-предка (unit.parent). Если юнит не имеет предка, его положение отсчитывается от глобальной системы координат.

Юнит содержит имеет два объекта координатного преобразования - location и global_location.


Добавление объекта.

Создаёт и связывает с юнитом интерактивный объект на основе переданного геометрического объекта 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, рекурсивно добавить в сцену все зависимые юниты.