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

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

Тема в разделе "Maya", создана пользователем DEL, 10 ноя 2008.

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

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

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

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

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Такие кавычки используются для того, чтобы запустить команду или процедуру и получить возвращаемую переменную. Можно еще использовать eval или запуск через (). В хелпе есть подробности.

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

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Спасибо большое. Наверно скоро будут еще вопросы ;)
     
  4. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Незачто. У нас "спасибо" нажимают)
     
  5. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Доброе время суток!
    Так, написал я такой блок для моего будущего скрипта :

    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


    Где я допустил ошибку?
     
  6. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Надо писать так
    Код:
    string $cont = `getAttr -x ($myObject+".ftn")`;
    print $cont;
    
     
  7. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Можно обьяснить почему надо поместить в скобки? С -х понятно но с скобками не очень.
     
  8. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    И еще : почему надо убрать [] ? Ведь цель это - поместить значения нескльких атрибутов в массив.
     
  9. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    из F1 =)
    Чтобы нормально записать несколько параметров в массив, надо использовать индексы насколько знаю
     
  10. Fabis

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

    С нами с:
    26.10.2006
    Сообщения:
    454
    Симпатии:
    0
    Баллы:
    16

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

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Нашел фот эту страницу. Думаю для тех, кто начинает изучать будет полезна : http://xyz2.net/mel/
     
  12. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Прошу почь мне в написании скрипта, потому, что я один уже несколько дней пытаюсь написать его но без успешно.
    Описание цели :
    Иногда 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

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

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

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    http://www.highend3d.com/maya/downloads/mel_scripts/rendering/misc/1012.html
     
  14. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.823
    Симпатии:
    417
    Баллы:
    2.787
    моск сломал... ничего не понимаю в скриптописании, но подобный скрипт есть на хайэнде... там все нормально работет.
     
  15. Fabis

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

    С нами с:
    26.10.2006
    Сообщения:
    454
    Симпатии:
    0
    Баллы:
    16
    string $nameonly = `match "[^/\\]*$" $cont`;
     
  16. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Я и в правду моск сломал в поисках, думал, что весь MEL Command Refernce перерыл :) . Оказывается она у мнея под носом.
     
  17. Fabis

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

    С нами с:
    26.10.2006
    Сообщения:
    454
    Симпатии:
    0
    Баллы:
    16
    Для поиска нужных команд рекомендую этот замечательный ресурс http://mayamel.tiddlyspot.com/. Вверху справа вводите в поле 'search' синонимы действия, которое должен выполнить скрипт: 'extract', 'match', 'strike off', etc. И что-нибудь да найдете.
     
  18. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Хотел поблагодарить, но кнопка Спасибо не работает :) . Действительно, ресурс очень нужный.Спасибо!
     
  19. DEL

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Столкнулся с другой проблемой. Закончил код. Он работает, но потом обнаружил, что работает только с тэст сценой которую я использовал во время написания скрипта. Сдругими сценами код не работает. Тоесть он исполняется но раоту, которую должна делать - сменить занчение в поле 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
     
  20. Styler

    Styler Мастер

    С нами с:
    19.08.2003
    Сообщения:
    669
    Симпатии:
    0
    Баллы:
    118
    все впорядке.... а textrFile() точно вызываешь? а больше этот скрипт нигде не лежит в путях?
     
Модераторы: Dark™, Skif

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