Полочная кнопка Maya MEL

Я новичок в MEL, и когда я изучал этот сценарий MEL, я обнаружил, что пользователь написал несколько строк, которые я совершенно не понимаю. И все же мне интересно узнать, почему этот человек сделал это..

В любом случае, может ли кто-нибудь объяснить, почему следующий код сначала указывает пустой MEL, а затем вызывает Python? Не проще ли просто поставить Python?

Я также пытался отключить команду и sourceType, и скрипт тоже работает нормально, просто я не понимаю, для чего в этом случае делают command и sourceType...

-command ""
-sourceType "mel"
-actionIsSubstitute 0
-commandRepeatable 1
("shelfBtn_"  + $parent + "_AOV");

python("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+"shelfBtn_" + $parent + "_AOV"+"')"); 

Кстати, $parent происходит от:

global proc apkg2dnc(string $parent)

Затем я попытался изменить код на следующий, он работает так же, как и выше, но...

-command ("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+"shelfBtn_" + $parent + "_AOV"+"')")
-sourceType "python"

Когда я попытался удалить скобки, мне было выдано сообщение об ошибке синтаксиса, указывающее на первый встреченный знак плюс +. Пытался добавить ; в конец строки, он по-прежнему выдает синтаксическую ошибку, на этот раз указывая в начале строки

-command "import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('" + "shelfBtn_" + $parent + "_AOV" + "')"
-sourceType "python"

Итак, играют ли скобки большую роль в том, как это читается в MEL?


person dissidia    schedule 19.03.2014    source источник


Ответы (1)


Ваши примеры искажены. В общем, вы не можете вырезать код из коммутаторов, как вы это делаете, потому что код теряет смысл. Переключает как:

-command ""

ссылаются на строку перед вызовом фактической команды mel (не путать с -command switch). В этом случае я бы предположил, что вся команда на самом деле:

shelfButton 
    -command ""
    -sourceType "mel"
    -actionIsSubstitute 0
    -commandRepeatable 1
    ("shelfBtn_"  + $parent + "_AOV");

Но это трудно понять. Код теряет всякий смысл, если вы опускаете вызываемую команду, и по большей части его нельзя понять таким образом, поскольку он не имеет смысла. Это как предложение без подлежащего, сказуемого и контекста.

С этим уточнением мы можем фактически ответить на вопрос. Зачем ставить пустую -команду? Да, она немного избыточна, но все же имеет смысл. Причина в том, что он не знает, чем заполнить кнопку. Вы можете опустить флаги command и source type, это не должно иметь значения. (есть шанс, что пропуск исходного типа будет слегка неправильным)

Следующая команда выполняет привязку:

python(...yada yada ... "('"+"shelfBtn_" + $parent + "_AOV"+"')"); 

Нет, я понятия не имею, что на самом деле делает aovMenu, но намерение довольно ясно, потому что он передает имя кнопки. Все, что находится внутри команды aovMenu, меняет команду кнопки. В конечном итоге это будет выглядеть так, как будто это работает, если вы поместите его в переключатель -command напрямую (потому что нажатие кнопки в первый раз заполнит кнопку). Но все же это было бы слегка неправильно.

Это довольно распространенный шаблон в программировании на майя. Что вы делаете, так это предварительно создаете кнопку, чтобы знать ее окончательное имя, чтобы вы могли связать два объекта, которые зависят друг от друга, с этим именем.

продолжает вызывать Python? Не проще ли просто установить Python?

Не совсем код был бы точно таким же. Так может быть проще, зависит от того, кто звонит. Вам все равно нужно будет загрузить кнопку, а затем вызвать функцию aovMenu. На самом деле это не какая-то другая форма вызова функции, созданной кем-то другим.

Дело в том, что код немного плохой, есть небольшая вероятность тонкой ошибки. Неважно, написано это на питоне или нет, важно, как ведет себя Maya. На самом деле вы не можете знать, что кнопка будет называться:

("shelfBtn_"  + $parent + "_AOV")

Потому что, если это имя существует, Maya переименует его ИЛИ, что еще хуже, назовет его таким же, как что-то еще, и теперь вам нужно использовать полное имя пути, иначе вероятность ошибки составит 50%. правильный способ сделать это будет таким:

$sButton = `shelfButton 
                -actionIsSubstitute 0
                -commandRepeatable 1
                 ("shelfBtn_"  + $parent + "_AOV")`;

python("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+$sButton+"')"); 
person joojaa    schedule 21.03.2014
comment
Спасибо за подробное объяснение, которое вы перечислили, и оно, безусловно, помогло мне лучше понять коды, особенно в части пустой команды MEL... Кстати, извините меня, если я пропустил, но знаете ли вы что происходит в команде python (проблема со скобками), которую я перечислил рядом с моим сообщением? - person dissidia; 21.03.2014
comment
Да, для того, чтобы сокращённая запись mel понимала, что текст, объединенный плюсом, — это всего лишь один элемент, он должен быть заключен в круглые скобки. - person joojaa; 21.03.2014