1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем Ro, 3 дек 2007.

Модераторы: Dark™, Skif
  1. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    В сцене выделено два объекта «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. //
     
  2. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Оно вам прямо пишет что не так. В чём проблема-то?
     
  3. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    хм, но ведь в переменной содержится имя только одного объекта, верно?
    string $nsphere1 = $list[0];
    // Result: nurbsSphere1 //
    нет никаких намеков на второй объект, плюс к этому команда принт это переменной опять же выводит только один объект. и как самый главный аргумент - команда "select $nsphere2;" выбирает именно второй объект, а "select $nsphere1;" именно первый, и никаких проблем. Я понимаю что у этого есть простое объяснение (вроде как особенность команд getAttr, setAttr и т.д.), но вот это объяснение я и не могу найти.
     
  4. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Я не очень понимаю что у вас там происходит, из вашего лога видно, что всего лишь неправильно написано взятие значения атрибута. Вам бы к документации обратиться.
     
  5. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    всего лишь : ) а документация упорно отказывается давать ответы именно на этот вопрос. слишком мудреная ситуация. так как, если можно узнать, правильно написать взятие атрибута именно в данной ситуации?
     
  6. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    float $value1 = `getAttr ($nsphere1 +".translateX") `;
    Пользуйся на здоровье!
     
  7. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    увау! пасиба Xeash! маленький шаг в освоении МЕЛ, большой шаг в построении нужного скрипта! : )
     
  8. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    еще два вопроса к уважаемым знатокам : )
    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. это вроде называется абсолютное значение?
     
  9. Михаил Куркубет

    Михаил Куркубет Знаток

    С нами с:
    07.10.2002
    Сообщения:
    545
    Симпатии:
    0
    Баллы:
    24
    Насколько помню сетАттр без верхней ковычки пишется.
     
  10. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    м, черт, автоматически их поставил! но сути это не меняет- результат тот же. проблема в том, что если заменить переменную $text0 конкретно на имя объекта, все будет в ажуре. но мне то мел в данном случае для того и нужен, что бы компьютер сам вписывал имя
    radioButton -label "centr" -onCommand "setAttr ($text0+".translateX") ($getx1t)"; - пишет что слишком много аргументов
    radioButton -label "centr" -onCommand "setAttr (nurbsSphere1+".translateX") ($getx1t)"; - все замечательно работает
     
  11. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    Приведи весь код скрипта, я не вижу чтобы ты объявил $text0, так будет проще найти ошибку...
     
  12. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    скрипт в -onCommand "" не видит что у вас там понаписано снаружи, это проблема scoping, как и в любом другом языке.
     
  13. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    хм....будет лучше, если б Ro рассказал какой скрипт он хочет написать...
     
  14. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    Пишу скрипт с целью создать уже наконец диалоговое окно с командами, дающими управление положения объекта относительно другого объекта. проще говоря функция 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;
     
  15. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    Но она ведь видит переменную $getx1t, записаную "снаружи"? а как же можно обойти этот хитрый scoping?
    radioButton -label "centr" -onCommand "setAttr nurbsSphere1.translateX ($getx1t)";
     
  16. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Нет, не видит. То что находится в кавычках - это вообще отдельный скрипт, который живёт сам по себе "внутри" диалогового окна, и к переменным определённым в вашем скрипте отношения не имеет.

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

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

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    Пасиба и за то и за другое! : ) вопросов больше нет, хотя Мел-сценарий все равно продолжу- без Мела в майке ваще не прожить, а пока не начнешь делать свое- хрен че поймешь! будем изучать дальше : )
     
  18. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    а пока не начнешь делать свое- хрен че поймешь! будем изучать дальше : )
    Это очень правильная точка зрения. Скрипты знать очень полезно, равно как и всевозможные грабли, с ними связанные.
    Также можно сделать маленькую библиотечку маленьких скриптов для повседневных ситуаций - от случайного назначения разных wireframe colors объектам, до простых итераторов, например для назначения констрейнтов большому количеству объектов.
     
  19. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    назрел глобальный вопрос- можно ли управлять положением отдельной частицы не изменяя положения других, выпущеных из эмитера? думается, МЕЛ или Экспрессион необходим?
     
  20. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    знатоков становится меньше :) еще один жуткий вопрос- можно ли в назначении имени одной переменной задать имя другой? например:
    int $pervaya=1;
    $vtoraya(и вот тут назначить $petvaya)= ...;
     
Модераторы: Dark™, Skif

Поделиться этой страницей