Опрос

Что такое, по вашему мнению, «демократия»?













Подключения - Страница 3

15.01.2010 11:44 Администратор
Печать PDF
Рейтинг пользователей: / 0
ХудшийЛучший 
Индекс материала
Подключения
Страница 2
Страница 3

MFnDependencyNode nodeFn( transformNodeOj ); MPlug transPlg = nodeFn. findPlugC "translate" ); Теперь переменная transPlg ссылается на атрибут translate. Это составной атрибут, содержащий три дочерних атрибута: translateX, translateY и translateZ.

Для доступа к дочернему атрибуту воспользуйтесь функцией child класса MPlug. MObject transxAttr = nodeFn. attributef "translateX" ); MPlug transxPlg = transPlg. childC transxAttr ); Найти родителя дочернего подключения можно при помощи функции parent того же класса MPlug. MPlug parent = transxPlg.

parent(); Если вы не знаете точного количества и имен дочерних атрибутов, можете использовать функции numChildren и child класса MPlujj. Функция child является перегруженной, что позволяет ей принимать индекс П-TQ потомка. К примеру, для организации цикла по всем потомкам составного атрибута выполните следующие операторы: const unsigned int nChilds = transPlg.

numChildren(); unsigned int i; for( i=0; i< nchilds; mplug child = transplg. child(i); ... используйте дочернее подключение подключения-массивы атрибут-массив содержит ряд других атрибутов. эти, атрибуты носят название элементов массива. подключение, ссылающееся на массив, именуется подключением-массивом; подключение, ссылающееся на элемент, - подключениемэлементом. в следующем примере создается нестандартный узел, содержащий атрибутмассив scores. данный атрибут включает в себя последовательность целочисленных значений типа long. class mynode : public mpxnode static mstatus initlalize(); static mobject scoresattr; mobject mynode: : scoresattr; mstatus mynode: :initialize() с целью создания атрибута scores используется класс mfnnumericattribute. mfnnumericattribute numfn; scoresattr = numfn. create( "scores", "scrs", mfnnumericdata: : klong ); чтобы указать, что атрибут является массивом, вызовем функцию set array. numfn.setarray( true ); addattributef scoresattr ); return ms: :ksuccess; чтобы увидеть, какие элементы находятся в массиве, опишем следующую служебную функцию printarray. она выводит содержимое массива в окно редактора script editor. void printarray( mplug &arrayplug ) { mstring txt( " array..."); //"массив...unsigned int nelems = arrayplug. numelements(); unsigned int i=0; for( i=0; i < nelens; l-н- ) { mplug elemplg = arrayplug. elementbyphysicallndex(i); txt += " element #";// "элемент №txt += (int)i; txt += ": "; double value = 0.0; elemplg.getvaluet value ); txt += value; txt += " ("; txt += (int)elemplg.logicalindex(); txt += ")"; mglobal: :displaylnfo( txt ); рассмотрим самые важные фрагменты этой функции. первый шаг ее работы связан с подсчетом количества элементов массива. дря этого применяется тф,ункция numelements класса mplue. unsigned int nelems = arrayplug. numelements(); организуется цикл по элементам. for( i=0; i < nelems; организуется подключение к каждому элементу, для чего вызывается функция elementbyphysicallndex, входящая в класс mplug. ее результат- подключение к /-му элементу массива. mplug elemplg = arrayplug. elementbyphysicallndex(i); значение подключения элемента определяется при помощи функции getvalue класса mplug. double value = 0.0; elemplg.getvalue( value ); наряду с отображением значения элемента, на экран выводится его логический индекс. объяснение сути логических индексов последует чуть позднее. для нахождения логического индекса подключения вызывается функция logicallndex класса mplug. txt += (int)elemplg.logicallndex(); чтобы продемонстрировать добавление элементов в массив, воспользуемся следующими операторами. они позволяют создать узел mynode и добавлять элементы в массив scores. mobject mynodeobj = dgmod.createnode( mynode::id ); mfndependencynode depfn( mynodeobj ); при помощи функции f indplug создадим подключение к атрибуту scores. mplug scoresplg = depfn.findplug( "scores" ); элементы массивов имеют физические и логические индексы. физический индекс элемента - это его номер в реально существующем массиве. физические индексы массива лежат в диапазоне от 0 до numelements()-1. при удалении элемента массива физические индексы некоторых элементов могут изменяться. с другой стороны, логический индекс элемента не меняется никогда. логический индекс — это средство назначения элементу абсолютного, неизменяемого индекса, не зависящего от любых вставок или удалений, происходящих в реальном массиве. ссылаясь на элемент массива в языке mel, вы используете его логический индекс. mel не содержит средств получения физического индекса элемента. необходимость физических и логических индексов обусловлена тем, что соединения между атрибутами устанавливаются на основе их логических адресов. ввиду постоянства этих индексов вы можете не сомневаться, что удаление одного элемента массива не изменит логического индекса другого. в этом состоит их отличие от физических индексов, которые могут меняться. следующие примеры помогут сделать еще более понятным различие между обоими вариантами индексирования. подключение scoreplg связывается с ,;элементом, логический индекс которого равен 0. для этого используется функция elementbylogicallndex. mplug scoreplg; scoreplg = scoresplg.elementbylogicallndex(o); затем этот элемент принимает значение 46. scoreplg.setvalue( 46 ); далее содержимое массива выводится на экран. printarray( scoresplg ); результаты имеют вид: a r r a y . . . element 0: 46 (0) в массив добавлен один элемент. для создания элементов с заданным индексом предназначена функция elementbylogicallndex. если элемент с указанным логическим индексом уже есть, выполняется доступ к существующему элементу. физический и логический индексы первого элемента равны 0. теперь обратимся к элементу с логическим индексом 2. поскольку его еще нет. он будет создан. scoreplg = scoresplg. elenentbylogicalindex(2); установим значение элемента равным 12. scoreplg.setvalue( 12 ); выведем массив еще раз. printarray( scoresplg ); результаты имеют вид: a r r a y . . . element ff0: 46 (0) element k1: 12 (2) физический массив теперь содержит два элемента. как вы и могли ожидать, их физические индексы равны 0 и 1. однако логические индексы элементов имеют значения 0 и 2. коль скоро при обращении ко второму элементу использовался индекс 2, который был передан функции elementbylogicallndex, элемент получил логический индекс, равный двум. заметьте, что логический индекс 1 отсутствует. поскольку обращений к нему пока не последовало, такой элемент не был создан. логические индексы массива могут иметь пропуски, поэтому массив можно считать разреженным. несмотря на то что логические индексы являются разреженными, физические индексы отличаются непрерывностью. на следующем шаге обратимся к элементу с логическим индексом 1. scoreplg = scoresplg.elementbylogicallndex(l); установим значение элемента равным 93. scoreplg.setvalue( 93 ); затем выведем содержимое массива на экран. printarray( scoresplg ); результаты имеют вид: array. . . element #0: 46 (0) element #1: 93 (1) element #2: 12 (2) в массив добавлен элемент с физическим индексом 1 . используемый им логический индекс- это индекс, переданный функции elementbylogicallndex. обратите внимание на то, что элемент с логическим индексом 2 (значение 12) теперь имеет иной физический индекс. раньше он был равен 1, а теперь - 2. это еще раз показывает, что физический индекс элемента может изменяться, в то время как логический - никогда. чтобы снова подчеркнуть тот факт, что логический индекс не обязательно соответствует физическому, добавим еще один элемент. на этот раз он будет иметь логический индекс, намного превышающий любой другой. для обращения к этому элементу воспользуемся логическим индексом 25. scoreplg = scoresplg. elementbylogicalindex(25); элемент принимает значение 57. scoreplg. setvalue( 57 ); массив выводится на экран. printarray( scoresplg ); результаты имеют вид: array. . . element #0: 46 (0) element 1: 93 (1) element #2: 12 (2) element tt3: 57 (25) теперь массив состоит из четырех элементов. физические индексы лежат в диапазоне от 0 до numelements()-1. логические индексы в точности совпадают с выбранными для них значениями. в данный момент в массиве нет элементов с логическими индексами от 3 до 24. поскольку логические индексы не меняются, их использование является самым безопасным способом организации ссылок на элементы массива. считывание элементов по их логическим индексам производится при помощи функции elefoentbylogicallndex класса j^plug. если, как упоминалось ранее, элемент с данным логическим индексом существует, он считывается. если элемент не существует, он создается. следующий пример позволяет узнать значение элемента с логическим индексом 1. int value; scoreplg = scoresplg.elementbylogicallndex(l); scoreplg.getvalue( value); // значение 93 чтобы получить перечень всех логических индексов массива, воспользуйтесь функцией getexistingarrayattributelndices класса mpiug. она возвращает массив логических индексов всех существующих элементов (которые участвуют в соединениях либо имеют установленные значения). mintarray loglndlces; scoresplg.get?xistingarrayattributeindices( loglndices ); теперь массив loglndices содержит значения [о, 1, 2, 25 ]. что произойдет, если попытаться прочитать значение несуществующего элемента? следующий код содержит обращение к значению элемента с логическим индексом 10. mstatus stat; scoreplg = scoresplg,elementbylogicalindex( 10 ); scoreplg.getvalue( value ); hglobal: :displaylnfo( mstring("value: ") + value ); //"значение:результат его выполнения будет таков: // value: 0 если элемента, имеющего указанный логический индекс, нет, вы получите значение, принятое по умолчанию. это значит, что все логические индексы являются допустимыми. результатом обращения к несуществующему элементу станет умалчиваемое значение. если же элемент существует, результатом станет текущее значение этого элемента. вам может потребоваться определить родительское подключение-массив заданного подключения-элемента. с этой целью воспользуйтесь функцией array класса mpiug. hplug arrayplg = scoreplg.array(); подключение arrayplg теперь содержит ссылку на атрибут-массив scores.



Обновлено 15.01.2010 12:18

Добавить комментарий


Защитный код
Обновить

Поиск

В закладку

 
 

Авторизация



Погода