Render.ru

вопросы по MEL

VARVAR13

Активный участник
Рейтинг
8
Код:
setAttr defaultRenderGlobals.currentRenderer -type "string" mentalRay
юзайте команду whatIs, иногда помогает)
 

Фанк80

Пользователь сайта
Рейтинг
2
Только учусь работать с Mel. Заранее извиняюсь за такие глупые вопросы.
Имеется выражение
Код:
lambert3.colorG = 0.5*sin(time*8) + 0.5;
Получается зелёный цвет в RGB со временем будет меняться от 0 до 255. Как мне ограничить эту амплитуду? К примеру с 50 до 200. Я понимаю, что синус можно сжать и получить более меньшую амплитуду, но это очень тонкая работа и тяжело будет подобрать с 50 до 200.

Может существует более просто выражение или как к моему дописать min\max значения?
 

gimmick

Активный участник
Рейтинг
5
Задача заключается в том, чтобы инициализировать scriptJob каждый раз при загрузке сцены в т.ч. и при загрузке её в виде референса.
Насколько я понимаю, для этого необходимо создать scriptNode, которой и будет создаваться соответствующий scriptJob, при каждом открытии сцены.

Проблема в том, что при загрузке сцены в виде референса у объектов в названиях появляются неймспейсы, из-за чего код scriptJob'а не может выполниться, поскольку обращается к объектам без неймспейсов.
Эта проблема могла бы решиться, если бы существовал способ из самой scripеNode'ы определять её собственный неймспейс. В этом собственно и вопрос.

Пожалуйста, подскажите.


P/S разумеется, можно выбирать объекты по маске типа "*:myScriptNode", а потом отделять в найденных строках неймспейс. Но этот способ представляется неизящным, поскольку теоретически в сцену могут быть подтянуты несколько экземпляров одного и того же референса, следовательно, подобный выбор может возвращать целый массив имён.
 

Владимир Забелин

Активный участник
Рейтинг
17
а ты обращайся с неймспейсом:) я навскидку не помню, но суть в том, что твой при референсировании твой скрипт джоб тоже получает неймспейс. и ты всегда можешь его спросить. поэтому начинай свой скрипт джоб с определения нэймспейса.
 

gimmick

Активный участник
Рейтинг
5
при референсировании твой скрипт джоб тоже получает неймспейс
Владимир, кажется, здесь имеется в виду не скрипт-джоб, а именно скрипт-нода. Поскольку скрипт джоб, насколько я понимаю, не сохраняется вместе со сценой.
И для того, чтобы его инициализировать при каждом новом открытии сцены, в сцене нужно создать специальную скрипт-ноду. Содержащийся в ней скрипт, выполняясь при каждом открытии сцены, и будет создавать требуемый скрипт-джоб.
Или я неправильно представляю себе механику работы со скрипт-джобами?

т.е. в этом и вопрос: как из самой скрипт-ноды вычислить её же неймспейс? (не прибегая к перебору объектов по маске *:scriptNodeName (т.е. по известной части имени) )

ну или в более общем случае - как узнать имя скрипт-ноды в ней самой?
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
Тут несколько способов можно предложить:
  1. Сменить контекст через namespace -set {неймспейс}; namespace -rel true; вначале скрипт ноды, тогда скрипт будет выполняться в рамках области референс сцены, т.е. неймспейс указывать в коде нигде не надо в этом режиме.
    Код:
    if (`namespace -ex {имя_файла}`) {
    namespace -rel true;
    namespace -set {имя_файла};
    }
    
    ...код...
    
    namespace -rel false;
    namespace -set ":";
  2. Скрипт нода может считывать глобальную переменную. По ней можно передать имя созданного неймспейса.
  3. В скрипт ноде работать с объектами через ls -r true, но тогда надо гарантировать, что имена в референс сцене будут уникальными для всего проекта.
 

gimmick

Активный участник
Рейтинг
5
1. Первый способ кажется наиболее пригодным для применения, хотя и подразумевает то, что имя подгружаемого файла известно (фактически известен сам неймспейс). Для того чтобы выполнялся инициализируемый в скрипт-ноде скриптДжоб, он должен содержать эту же конструкцию.

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

2. Способ с глобальной переменной, предполагает присутствие другой скрип-ноды, запускающей скриптджоб, ведущего учёт подгружаемых референсов. Недостатки те же, что и в первом способе.

3. Способ с пространством имён без референсов, слишком неуниверсален, поскольку теоретически в сцене могут быть несколько экземпляров одного и того же исходника.

Так или иначе, спасибо.
 

Dark™

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

Способ с глобальной переменной, предполагает присутствие другой скрип-ноды, запускающей скриптджоб, ведущего учёт подгружаемых референсов. Недостатки те же, что и в первом способе.
Без этого никак в этом методе.

А вообще, конечно, лучше видеть краткий финальный код для лучшей оценки.
 

gimmick

Активный участник
Рейтинг
5
Тестировал первый способ на сцене со следующей скрипт-нодой:

Код:
if (`namespace -ex "scriptJobTest"`){
	namespace -rel true;
	namespace -set "scriptJobTest";
}

scriptJob -killWithScene -attributeChange pCube1.translate  "if (`namespace -ex \"scriptJobTest\"`){namespace -rel true;namespace -set \"scriptJobTest\";} float $s = `getAttr pCube1.sx`; setAttr pCube1.scale ($s*2) ($s*2) ($s*2); namespace -rel false; namespace -set \":\";" ;//это продолжение предыдущей строки

namespace -rel false;
namespace -set ":";
Сцена называется scriptJobTest.ma, в ней находится полигональный куб pCube1. Скрипт джоб увеличивает ширину, высоту и глубину куба при любом его перемещении.

Всё работает правильно в сцене-исходнике и в сцене куда исходник подгружен референсом.

Но если мы сохраним сцену исходник как файл с другим именем (подгрузить исходник сам в себя референсом невозможно) и подгрузим сам исходник референсом, то просле изменения положения куба без неймспейса в названии увеличиваться будет куб с неймспейсом.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
Если имя неймспейса в коде каждого файла делать равным имени этого же файла, то все будет работать.
Другое дело, если создавать множество референсов из одного файла. Тогда надо каждому референсу жестко указывать его namespace при создании, например через file -r, а в скриптноде референса получать его через команду referenceQuery -ns -shn {имя_файла.mb};
Вообщем, что-то придумать можно. Например, не обязательно скрипт ноду исполнять при открытии, ее можно запускать из главного проекта, проходясь по списку всех созданных референсов.
 

SteadFast

Пользователь сайта
Рейтинг
2
Всем привет) Подскажите способ как можно через mel выделить в reference editor какой нибудь реф выбранный во viewPort или outliner если этот реф вложен в другой.
Как выделить невложенный реф я уже нашел: sceneEditor -edit -selectItem 0 $gReferenceEditorPanel;
Но вот проблема с раскрытием этой стрелочки в reference editor и как найти индекс всех рефов?
 

Anuar

Пользователь сайта
Рейтинг
2
Всем Доброго времени суток. У меня такой вопрос. Можно ли скрипт написаный на Mel запустить не запуская maya ui? и если можно то как?
Заранее спасибо
 

Anuar

Пользователь сайта
Рейтинг
2
Спасибо за ответ)). Разобрался. Запустил командой maya -prompt. Сначала cmd писал "maya не является внутренней или внешней командой ...". Настроил переменные среды в параметре path добавил "C:\Program Files\Autodesk\Maya2013\bin"
и заработало. Пишу на случай если еще кто-то будет искать.
Дальше сделал так. Сохранил меловский скрипт в файле Test.mel. И создал батник со строчкой maya -prompt -script D:/Test.mel. Всё работает. Вопрос теперь в другом. Можно это как-то организовать в одном файле? Может кто знает?
 
Сверху