Как создать узлы в Xpresso и соединить их

Получаем тег Xpresso и корневой узел:

# Получаем активный объект в документе
my_object = doc.GetActiveObject()

# Получаем тег Xpresso, предполагается, что он уже прикреплен к объекту
xpresso_tag = my_object.GetTag(c4d.Texpresso)

# Получаем мастер узлов и корневой узел
node_master = xpresso_tag.GetNodeMaster()
root = node_master.GetRoot()

Создадим узел объекта и математический узел:

node1 = node_master.CreateNode(root, c4d.ID_OPERATOR_OBJECT, x=200, y=100)
node2 = node_master.CreateNode(root, c4d.ID_OPERATOR_MATH, x=400, y=100)

Другие типы узлов смотрим в документации, а их параметры ищем тут

У мат.оператора поменяем тип данных на целочисленный и тип функции на умножение. Для изменения этих параметров, сначала надо получить контейнер с настройками соответствующего узла:

bc = node2.GetOperatorContainer() # получаем контейнер мат.узла

bc[c4d.GV_DYNAMIC_DATATYPE] = c4d.DTYPE_LONG # меняем тип данных

bc[c4d.GV_MATH_FUNCTION_ID] = c4d.GV_MUL_NODE_FUNCTION # меняем функцию

node2.SetOperatorContainer(bc) # сохраняем изменения в узле

print(node2[c4d.GV_DYNAMIC_DATATYPE]) # можно вывести значение параметра

Обратите внимание: значение параметра можно прочитать обратившись к соответствующему свойству, но изменить его напрямую, присвоив значение нельзя (node2[c4d.GV_DYNAMIC_DATATYPE] = c4d.DTYPE_LONG - выдаст ошибку!)

Можно задать узлу своё название:

node2.SetName("My Math operator")

Теперь, добавляем порты и соединяем:

# Добавляем порты
node1.AddPort(c4d.GV_PORT_INPUT, c4d.ID_BASEOBJECT_REL_POSITION)
node1.AddPort(c4d.GV_PORT_OUTPUT, c4d.ID_BASEOBJECT_REL_POSITION)

# Получаем порты узлов
node1_out = node1.GetOutPorts()[0]
node2_in = node2.GetInPorts()[0]

# Соединяем порты
node1_out.Connect(node2_in)

# Обновляем документ
c4d.EventAdd()

Last updated