Render.ru

Проблемы с пониманием МЕЛ

Ro

Знаток
Рейтинг
38
#1
В сцене выделено два объекта «nurbsSphere1» и «nurbsSphere2», вводим алгоритм, что бы во-первых получить имя первого объекта в одной переменной, второго во второй, во-вторых получить значение положения первого объекта на оси Х. проблема в том что две переменные он создает, как и положено- в первой переменной имя первого объекта, во второй- второго, но когда доходит до получения значения, он пишет, что каждая переменная содержит имя ни одного обьекта, а обоих (значение и первого и второго). Переменная же содержит только один объект, почему в ней значения и первого, и второго? Вот алгоритм и результаты:
string $list[]=`ls-sl`;
// Result: nurbsSphere1 nurbsSphere2 //
string $nsphere1 = $list[0];
// Result: nurbsSphere1 //
string $nsphere2 = $list[1];
// Result: nurbsSphere2 //
float $value1 = `getAttr $nsphere1.translateX`;
// Error: Cannot convert data of type float[] to type float. //
 

Ro

Знаток
Рейтинг
38
#3
хм, но ведь в переменной содержится имя только одного объекта, верно?
string $nsphere1 = $list[0];
// Result: nurbsSphere1 //
нет никаких намеков на второй объект, плюс к этому команда принт это переменной опять же выводит только один объект. и как самый главный аргумент - команда "select $nsphere2;" выбирает именно второй объект, а "select $nsphere1;" именно первый, и никаких проблем. Я понимаю что у этого есть простое объяснение (вроде как особенность команд getAttr, setAttr и т.д.), но вот это объяснение я и не могу найти.
 
Рейтинг
34
#4
float $value1 = `getAttr $nsphere1.translateX`;
// Error: Cannot convert data of type float[] to type float. //
Я не очень понимаю что у вас там происходит, из вашего лога видно, что всего лишь неправильно написано взятие значения атрибута. Вам бы к документации обратиться.
 

Ro

Знаток
Рейтинг
38
#5
всего лишь : ) а документация упорно отказывается давать ответы именно на этот вопрос. слишком мудреная ситуация. так как, если можно узнать, правильно написать взятие атрибута именно в данной ситуации?
 

xeash

Активный участник
Рейтинг
12
#6
float $value1 = `getAttr ($nsphere1 +".translateX") `;
Пользуйся на здоровье!
 

Ro

Знаток
Рейтинг
38
#7
увау! пасиба Xeash! маленький шаг в освоении МЕЛ, большой шаг в построении нужного скрипта! : )
 

Ro

Знаток
Рейтинг
38
#8
еще два вопроса к уважаемым знатокам : )
1. как исправить ситуацию с назначением атрибута
float $getx0t=`getAttr ($text0 +".translateX")`;
radioButton -label "centr" -onCommand "`setAttr ($text0+".translateX") ($getx1t)`";
// Error: Too many arguments. Expected 1, found 2. //
2. всегда при создании объекта "мышкой" в атрибут масштаба scale записывается значение 1. выходит что рядом два объекта могут быть совершенно разными по габаритам но с идентичным scale. это вроде называется абсолютное значение?
 

Ro

Знаток
Рейтинг
38
#10
м, черт, автоматически их поставил! но сути это не меняет- результат тот же. проблема в том, что если заменить переменную $text0 конкретно на имя объекта, все будет в ажуре. но мне то мел в данном случае для того и нужен, что бы компьютер сам вписывал имя
radioButton -label "centr" -onCommand "setAttr ($text0+".translateX") ($getx1t)"; - пишет что слишком много аргументов
radioButton -label "centr" -onCommand "setAttr (nurbsSphere1+".translateX") ($getx1t)"; - все замечательно работает
 

xeash

Активный участник
Рейтинг
12
#11
Приведи весь код скрипта, я не вижу чтобы ты объявил $text0, так будет проще найти ошибку...
 
Рейтинг
34
#12
скрипт в -onCommand "" не видит что у вас там понаписано снаружи, это проблема scoping, как и в любом другом языке.
 

xeash

Активный участник
Рейтинг
12
#13
хм....будет лучше, если б Ro рассказал какой скрипт он хочет написать...
 

Ro

Знаток
Рейтинг
38
#14
Пишу скрипт с целью создать уже наконец диалоговое окно с командами, дающими управление положения объекта относительно другого объекта. проще говоря функция Align в 3dmax, которой мне безумно нехватает в майе
для осуществления функции нужно будет выделить два объекта, вызвать диалоговое окно, в котором и будет путем выбора рэдиобаттонов управление положением. это работающий вариант выравнивая по Х, только там нужно заменить nurbsSphere1 на переменную $text0, что бы полностьюавтоматизировать процесс. и сами формулы вычисления положения одного относительно другого там щас нерабочие : ) лень все формулы писать пока диалоговое окно не фурычит как должно


string $list[]=`ls-sl`;
string $text0=$list[0];
string $text1=$list[1];

float $getx0t=`getAttr ($text0 +".translateX")`;
float $getx0s=`getAttr ($text0 +".scaleX")`;
float $getx1t=`getAttr ($text1 +".translateX")`;
float $getx1s=`getAttr ($text1 +".scaleX")`;

string $okno = `window -title "Sostykovka"`;
columnLayout;
textFieldGrp -label "1 -" -text $text0;
textFieldGrp -label "2 -" -text $text1;

radioCollection;
radioButton -label "centr" -onCommand "setAttr nurbsSphere1.translateX ($getx1t)";
radioButton -label "levo" -onCommand "setAttr nurbsSphere1.translateX ($getx1t-$getx1s*2) ";
radioButton -label "centr" -onCommand "setAttr nurbsSphere1.translateX ($getx1t-$getx1s*4)";
radioButton -label "pravo" -onCommand "setAttr nurbsSphere1.translateX ($getx0t)";
showWindow $okno;
 

Ro

Знаток
Рейтинг
38
#15
скрипт в -onCommand "" не видит что у вас там понаписано снаружи, это проблема scoping, как и в любом другом языке.
Но она ведь видит переменную $getx1t, записаную "снаружи"? а как же можно обойти этот хитрый scoping?
radioButton -label "centr" -onCommand "setAttr nurbsSphere1.translateX ($getx1t)";
 
Рейтинг
34
#16
Нет, не видит. То что находится в кавычках - это вообще отдельный скрипт, который живёт сам по себе "внутри" диалогового окна, и к переменным определённым в вашем скрипте отношения не имеет.

radioButton
-label "centr"
-onCommand "float $getx0t = `getAttr ($text0+".tx")`;\
setAttr ($text0+".translateX") ($getx1t)`";

А вообще - загляните в меню "Modify -> Snap Align Objects".
 

Ro

Знаток
Рейтинг
38
#17
Пасиба и за то и за другое! : ) вопросов больше нет, хотя Мел-сценарий все равно продолжу- без Мела в майке ваще не прожить, а пока не начнешь делать свое- хрен че поймешь! будем изучать дальше : )
 
Рейтинг
34
#18
а пока не начнешь делать свое- хрен че поймешь! будем изучать дальше : )
Это очень правильная точка зрения. Скрипты знать очень полезно, равно как и всевозможные грабли, с ними связанные.
Также можно сделать маленькую библиотечку маленьких скриптов для повседневных ситуаций - от случайного назначения разных wireframe colors объектам, до простых итераторов, например для назначения констрейнтов большому количеству объектов.
 

Ro

Знаток
Рейтинг
38
#19
назрел глобальный вопрос- можно ли управлять положением отдельной частицы не изменяя положения других, выпущеных из эмитера? думается, МЕЛ или Экспрессион необходим?
 

Ro

Знаток
Рейтинг
38
#20
знатоков становится меньше :) еще один жуткий вопрос- можно ли в назначении имени одной переменной задать имя другой? например:
int $pervaya=1;
$vtoraya(и вот тут назначить $petvaya)= ...;
 
Сверху