c4d.DescID в Cinema 4D Python API используется для идентификации параметров объекта. Он состоит из одного или нескольких уровней, каждый из которых представлен c4d.DescLevel. Каждый уровень идентифицирует определенный параметр или подпараметр объекта.
Конструктор c4d.DescID принимает один или несколько объектов c4d.DescLevel в качестве аргументов. Каждый объект c4d.DescLevel создается с идентификатором параметра и, возможно, типом данных и группой.
Вот пример использования c4d.DescID для идентификации пользовательских данных:
В этом примере мы создаем c4d.DescID, который идентифицирует первые пользовательские данные типа Long. Обратите внимание, что c4d.ID_USERDATA используется для идентификации пользовательских данных, c4d.DTYPE_SUBCONTAINER указывает, что это контейнер для других параметров, и c4d.DTYPE_LONG указывает, что параметр является целым числом.
Вы можете использовать c4d.DescID для доступа к параметрам объекта с помощью метода __getitem__() или __setitem__() объекта. Например, если у вас есть объект obj и desc_id, как определено выше, вы можете получить или установить значение пользовательских данных следующим образом:
# Получить значение пользовательских данныхvalue = obj[desc_id]# Установить значение пользовательских данныхobj[desc_id]=10
Обратите внимание, что c4d.DescID и c4d.DescLevel являются частью системы описаний Cinema 4D, которая используется для идентификации и работы с параметрами объекта. Это включает в себя встроенные параметры, такие как положение и вращение объекта, а также пользовательские данные и параметры, определенные плагинами
Есть пример кода от разработчиков в котором хорошо объясняется какие параметры принимает объект c4d.DescID и их значение:
import c4ddefmain():ifnotisinstance(op, c4d.BaseObject):raiseRuntimeError("Please select an object.")# --- Доступ к элементу описания ---# Самая простая форма указания положения объекта.# Константа(символ) это просто (целое) число.print (c4d.ID_BASEOBJECT_REL_POSITION)# выведет число 903# Мы можем прочитать параметр узла в Python с помощью синтаксиса скобок.# Передавая число или символ.print (op[903])print (op[c4d.ID_BASEOBJECT_REL_POSITION])# Мы также могли бы использовать другие интерфейсы доступа, такие как C4DAtom.Get/SetParameter или BaseContainer,# но я собираюсь их здесь игнорировать.# Однако мы также можем обернуть это число в DescID следующим образом. descId = c4d.DescID(c4d.ID_BASEOBJECT_REL_POSITION)# будет делать то же самое, что и предыдущий вызов# op[c4d.ID_BASEOBJECT_REL_POSITION]print (op[descId])# DescID формально создаются из DescLevels, то, что мы сделали выше,# было всего лишь сокращением для этого. DescLevel просто оборачивает число.# Итак, мы можем указать c4d.DescID(c4d.ID_BASEOBJECT_REL_POSITION) также следующим образом. descLevel = c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION) descId = c4d.DescID(descLevel)print (op[descId])# Однако DescLevels может передавать больше информации, чем просто идентификатор,# они также могут хранить тип данных и создателя этого идентификатора.# Позиция является вектором, поэтому мы можем это указать.# 0 в конце означает отсутствие создателя descLevel = c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION, c4d.DTYPE_VECTOR, 0) descId = c4d.DescID(descLevel)print (op[descId])# Итак, подведем итог: эти пять идентификаторов более или менее эквивалентны,# они, по крайней мере, будут возвращать одно и то же значение параметра.## 903# c4d.ID_BASEOBJECT_REL_POSITION# c4d.DescID(c4d.ID_BASEOBJECT_REL_POSITION)# c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION))# c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION,# c4d.DTYPE_VECTOR, 0))# --- Доступ к компоненту элемента описания ---# До сих пор мы имели доступ только к вектору в целом.# Но есть некоторые типы данных, которые состоят из подкомпонентов,# например BaseContainer или Vector. Вот почему DescID может состоять из трех идентификаторов,# где каждый уровень (DescLevel) дополнительно определяет,# к какой части параметра мы хотим получить доступ.print (c4d.VECTOR_X)# выведет 1000# Чтобы получить доступ к компоненту X вектора положения, мы можем сделать этоprint (op[903, 1000])print (op[c4d.ID_BASEOBJECT_REL_POSITION, c4d.VECTOR_X])# Как и раньше, это можно сделать более подробно с помощью DescID# a. dLvlVector = c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION) dLvlVectorX = c4d.DescLevel(c4d.VECTOR_X) descId = c4d.DescID(dLvlVector, dLvlVectorX)print (op[descId])# b. dLvlVector = c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION, c4d.DTYPE_VECTOR, 0) dLvlVectorX = c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0) descId = c4d.DescID(dLvlVector, dLvlVectorX)print (op[descId])# Используя числа вместо констант код выглядит короче но менее понятен:## descId = c4d.DescID(c4d.DescLevel(c4d.ID_USERDATA, 5, 0),# c4d.DescLevel(1, 1, 0))## более многословная форма была бы такой::## descId = c4d.DescID(# c4d.DescLevel(c4d.ID_USERDATA, c4d.DTYPE_SUBCONTAINER, 0),# c4d.DescLevel(1, c4d.DTYPE_GROUP, 0))## Это просто сложный способ выражения (700, 1) или в символической# форме (c4d.ID_USERDATA, 1). Это просто означает первый элемент# в контейнере пользовательских данных. Однако в некоторых местах,# например в описаниях или узлах xpresso, Cinema требуется эта очень# подробная форма, поскольку все остальные являются просто сокращенной# формой для удобства пользователя.if__name__=='__main__':main()