Render.ru

Вопрос по синтаксису МЕЛ

DEL

Активный участник
Рейтинг
15
#1
Привет!
Вот уже 4 года использую MAYA, создавая разные вещи - от сложных персонажей до природных явлений и окружений. Не раз приходилось использовать и всемогущий MEL. Но использовал его редко и мало. Мне всегда хотелось изучить эту часть программы, но всякий раз, когда сталкивался с трудностями бросал все на полпути. До того, как снова посещала муза "Изучение MEL" все забывал. Думаю сейчас меня посетила очередная "муза" и думаю эта последняя, с помощю , которой я наконец смогу создать свой первый полноценный скрипт. В связи с этим возникли куча вопросов ответ на которых ожидаю узнать от участников этого форума.
И так первый вопрос:

Обьясните пожалуйста что значит `` , и в каких случаях их используют. Если не трудно приведите маленькй пример с коментариями.
Спасибо.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#2
Такие кавычки используются для того, чтобы запустить команду или процедуру и получить возвращаемую переменную. Можно еще использовать eval или запуск через (). В хелпе есть подробности.

string $l[];
$l = `ls -lights`; // возвращает имена источников света и записывает их в $l
 

DEL

Активный участник
Рейтинг
15
#5
Доброе время суток!
Так, написал я такой блок для моего будущего скрипта :

string $myFileNode[] = `ls -sl`;

for ($myObject in $myFileNode)
{

string $cont[] = `getAttr -x $myObject.ftn`;
print $cont;


}

Выделив файл-ноды и выполныв этот блок он мне выдает по 2(два) стринга для каждого атрибута.
Тоесть если путь для одного файла C:/projects/Test/sorceimages/file.jpg
а длля другого D:/projects/Test/sorceimages/file.jpg, он мне выдает :
C:/projects/Test/sorceimages/file.jpg
D:/projects/Test/sorceimages/file.jpg
C:/projects/Test/sorceimages/file.jpg
D:/projects/Test/sorceimages/file.jpg


Где я допустил ошибку?
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#6
Надо писать так
Код:
string $cont = `getAttr -x ($myObject+".ftn")`;
print $cont;
 

DEL

Активный участник
Рейтинг
15
#7
Можно обьяснить почему надо поместить в скобки? С -х понятно но с скобками не очень.
 

DEL

Активный участник
Рейтинг
15
#8
И еще : почему надо убрать [] ? Ведь цель это - поместить значения нескльких атрибутов в массив.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#9
When using an expression inside MEL command syntax you must surround the expression with parentheses, and not use unquoted strings:
из F1 =)
Чтобы нормально записать несколько параметров в массив, надо использовать индексы насколько знаю
 

Fabis

Активный участник
Рейтинг
16
#10
поместить значения нескльких атрибутов в массив

эта строка string $myFileNode[] = `ls -sl`; - уже вносит множество значений в массив, а эта string $cont = `getAttr -x ($myObject+".ftn")`; всего-навсего объявляет новую переменную, результаты для которой вычисляются столько раз, сколько $myObject в массиве $myFileNode.
 

DEL

Активный участник
Рейтинг
15
#11
Нашел фот эту страницу. Думаю для тех, кто начинает изучать будет полезна : http://xyz2.net/mel/
 

DEL

Активный участник
Рейтинг
15
#12
Прошу почь мне в написании скрипта, потому, что я один уже несколько дней пытаюсь написать его но без успешно.
Описание цели :
Иногда 3D художники работают в MAYA не утруждая себя настроить путь к проекту в котором работают и это потом создает проблему, а иногда бывает, что в сцене 20-30 а иногда и 50 разных текстур. Открывать каждую из них и менять путь это - потеря времени. Надо писать скрипт.

Теперь, как я намеревался написать.
схема такая :
Создать массив для фаилов
string $myFileNode[] = `ls -sl`;

for ($myObject in $myFileNode)
{

string $cont = `getAttr -x ($myObject+".ftn")`;
}

Дальше надо проделать такую операцию, котороя бы удалила из путей все кроме собственно имя текстуры, потому, что вписав в поле Image Name только имя текстуры MAYA автоматически найдет ее в папке sourceimages.
Таким образом копируя все текстуры разбросаные по всему Ж.диску в директорию sourceimages и применив наш скрипт решилась бы проблема.
Поискав немножко нашел команды ,котырые бы смогли помочь моей проблеме:

stringArrayRemove
stringArrayRemoveExact
stringArrayToString
stringToStringArray

Но безуспешно. Я даже не сумел проделть задуманую операцию с одной нодой.
Прошу помочь. Хотя бы указать - где искать выход! Может я ошибаюсь в подходе? Может совсем не нужно разбивать стринг?
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#14
моск сломал... ничего не понимаю в скриптописании, но подобный скрипт есть на хайэнде... там все нормально работет.
 

Fabis

Активный участник
Рейтинг
16
#17
Для поиска нужных команд рекомендую этот замечательный ресурс http://mayamel.tiddlyspot.com/. Вверху справа вводите в поле 'search' синонимы действия, которое должен выполнить скрипт: 'extract', 'match', 'strike off', etc. И что-нибудь да найдете.
 

DEL

Активный участник
Рейтинг
15
#18
Хотел поблагодарить, но кнопка Спасибо не работает :) . Действительно, ресурс очень нужный.Спасибо!
 

DEL

Активный участник
Рейтинг
15
#19
Столкнулся с другой проблемой. Закончил код. Он работает, но потом обнаружил, что работает только с тэст сценой которую я использовал во время написания скрипта. Сдругими сценами код не работает. Тоесть он исполняется но раоту, которую должна делать - сменить занчение в поле File Name не делает.

global proc textrFile(){
//lists all selected files
string $textureFiles[] = `ls -sl`;

for ($texField in $textureFiles)
{
// gets path from texturefileNode and stors it in $blck variable
string $blck = `getAttr -x ($texField+".ftn")`;

//extracts the name of texture file
string $lastMbr = `match "[^/\\]*$" $blck`;

// sets attribute FileTextureName
setAttr -type "string" ($texField+".ftn") $lastMbr;

}
}

Вот тэст сцена: http://rapidshare.com/files/172044129/MyScript.mb
 

Styler

Мастер
Рейтинг
117
#20
все впорядке.... а textrFile() точно вызываешь? а больше этот скрипт нигде не лежит в путях?
 
Сверху