Render.ru

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

DEL

Активный участник
Рейтинг
15
#21
Точно! Думаю нигде не лежит. только что пробовал на свеже-установленой майке на свежей винде, где ниразу мая не ставилась.
 

Fabis

Активный участник
Рейтинг
16
#22
вы пробовали вручную в поле пути к текстуре вбить "sourceimages\Water lilies.jpg" или просто "Water lilies.jpg" при уже назначенной текстуре, лежащей, скажем на рабочем столе? У меня безуспешно - он опять назначает абсолютный путь на рабочий стол, при том, что у меня уже назначен проект и картинка с аналогичным названием лежит в папке "sourceimages". Причем если назначить путь через браузер, то все нормально. Это какая-то проблема с обновлением путей, пока в качестве решения могу предложить вариант: скрипт собирает пути в массив, копирует все текстуры в папку "sourceimages" и переименовывает эти текстуры присваивая им префикс с именем проекта, к примеру, затем в соответствующие nodes вводит названия текстур с префиксом, таким образом в папке "sorceimages" будут те же текстуры просто с отличным от оригинала названием и обновление путей с абсолютного на относительный должно произойти.
 

Styler

Мастер
Рейтинг
117
#23
2 DEL

опиши порядок действий как ты инициируешь глобальную процедуру global proc textrFile()? Где она у тебя храниться? В файле? Или ты ее после загрузки копируешь этот скрипт в ScriptEditor, запускаешь а потом вызываешь textrFile())?
 

Styler

Мастер
Рейтинг
117
#24
2 DEL

может не работает потому что ты не выделяешь текстурные ноды?? Если хочешь что бы обрабатывалось не для выделенных а для всех в сцене, поменяй эту строчку

Код:
// получить список выделенных объектов
string $textureFiles[] = `ls -sl`;
на

Код:
// получить список всех объектов в сцене c типом "file"
string $textureFiles[] = `ls -type "file"`;
 

Миша Ершов

Модератор форума
Рейтинг
314
#25
DEL, вот я делал давно, смысл тот же в общем.

{
$txtrs = `ls -sl`;
for ($i = 0; $i<size($txtrs); $i++)
{
string $txtname = `getAttr ($txtrs[$i] + ".ftn")`;
$txtname = basename ($txtname, "");
setAttr ($txtrs[$i] + ".ftn") -type "string" ("textures//" + $txtname);
};
}

В вашем скрипте я не понял что значит строчка //extracts the name of texture file, есть же команда для этого специальная - basename.
И еще советую не юзать укороченный цикл for. Он выглядит чуток короче, но по функциональности и удобству сильно уступает нормальному for, да еще и вносит путаницу.
 

Styler

Мастер
Рейтинг
117
#26
И еще советую не юзать укороченный цикл for. Он выглядит чуток короче, но по функциональности и удобству сильно уступает нормальному for, да еще и вносит путаницу.
Не сочтите за трудность.. Обоснуйте. Есть конечно примеры, когда нужно по индексу обращаться.. Но в данном (и в большенстве) случаев зачем?
 

Миша Ершов

Модератор форума
Рейтинг
314
#27
На личном опыте. Писал довольно сложный менеджер проектов. Используя укороченный цикл for для казалось бы простых ситуаций, мне всегда приходилось потом переделывать весь цикл в полноценный for, так как функций обычного не хватало при последующем кодинге. К примеру с урезанным for поработать с двумя массивами одновременно уже не получается. Ну и конечно дело привычки и стиля программирования тоже. Некоторые любят себе проблем сами напридумывать :)
 

DEL

Активный участник
Рейтинг
15
#28
опиши порядок действий как ты инициируешь глобальную процедуру global proc textrFile()? Где она у тебя храниться? В файле? Или ты ее после загрузки копируешь этот скрипт в ScriptEditor, запускаешь а потом вызываешь textrFile())?
Да пробовал и так. Вызывая скрипт из директории scripts а также вставляя текст прямо в скрипт едитор.

В вашем скрипте я не понял что значит строчка //extracts the name of texture file, есть же команда для этого специальная - basename.
Этот код "вынимает" из пути файл.На пример :
string $path = "C:/AW/Maya5.0/bin/maya.exe";
string $filepart = `match "[^/\\]*$" $path`;
// Result: "maya.exe"
Думаю дело не в скрипте. Все куски кода работают по отдельности. Fabis оказался прав. Дело в том, что я пробовал проделать то же самое вручную.( удалить из поля File Name все до имени фаила) , но никак не получилось. Зато удется удалить весь путь.
Пока не знаю почему происходит, потому, что не у всех так. Например Styler смог без проблем запустить.
Можно попробовать так ка написал Fabis, но у меня есть другая идея. Если она дает удалить весь путь а до этого имая файла я сохранил в переменной $lastMbr, то возможно сделать это по очереди, тоесть вытащить фаил из пути поместить его в пееменную string $lastMbr = `match "[^/\\]*$" $blck`;, удалить весь путь setAttr -type "string" ($texField+".ftn") ""; а затем назначить значение , которое хранится в переменной $lastMbr. Kогда приду домой с работы продолжу тестровать.
Как ва кажется это будет работать?
 

Миша Ершов

Модератор форума
Рейтинг
314
#29
Нужно учитывать, что если вписать в поле пути "filename.jpg", то майка будет искать его не в папке sourceimages, а в корневой папке проекта.
Т.е. чтобы файл "Water lilies.jpg" нашелся в майке при вводе этого значения в поле вручную, его нужно поместить в корневой каталог проекта.
Вообще все пути в проекте идут относительно корневой папки.

И еще по работе этого поля пути к текстуре. "Странно" оно работает потому, что если уже введен путь к текстуре, и мы пытаемся вручную ввести другой путь, но не правильный (каковым в примере Fabis'a является "Water lilies.jpg"), то майка не выдаст ошибки, а просто вернет старый правильный путь на место. Но это произойдет только в том случае, если имя файла в новом пути такое же как и имя файла в старом пути.
Примеры:
введено: "textures\sideleaf.jpg"
вводим: sideleaf.jpg
результат (если этой текстуры нет в корне проекта): возвращается старый правильный путь, без отчета об ошибке.

введено: "textures\sideleaf.jpg"
вводим: "filenew.jpg"
результат (если filenew.jpg нет в корне проекта): идет отчет об ошибке, остается в поле новое имя

В общем вся путаница из-за того, что не сделали у этого поля нормальный feedback.

Этот код "вынимает" из пути файл.На пример :
string $path = "C:/AW/Maya5.0/bin/maya.exe";
string $filepart = `match "[^/\\]*$" $path`;
// Result: "maya.exe"
Ну это я понял :) Я имел в виду неоправданное исполользование более сложной команды, когда в майке специально для этого есть basename.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#30
DEL, если в вкратце и обобщая все, что сказали до меня ;), то проверь есть ли все одноименные текстуры либо в папке Source Images, либо в другой, но тут придется в коде дописать вместо $lastMbr это: ("{имя другой папки}/"+ $lastMbr). Ну и проверь задан ли текущий проект =) Проверил - все работает.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#31
Тока есть глюк небольшой, чтобы программа считала Source Images без ввода имя папки в код, надо открыть и закрыть браузер папок за Image Name =)
 

Fabis

Активный участник
Рейтинг
16
#32
мы пытаемся вручную ввести другой путь, но не правильный (каковым в примере Fabis'a является "Water lilies.jpg"),
придется в коде дописать вместо $lastMbr это: ("{имя другой папки}/"+ $lastMbr)
Как я уже говорил ранее, я вводил вручную и через скрипт также относительный путь "sourceimages\Water lilies.jpg", учитывая корень проекта, проект уже создан и назначен сцене. Также я пробовал, как говорил DEL, скриптом или вручную удалить весь абсолютный путь (или вписать произвоьное, скажем "none"), а затем вторым заходом присвоить относительный путь для текстуры лежащей в папке souceimages проекта, с аналогичным названием, но эта редиска снова возвращает старый абсолютный путь. Как я уже говорил, обновление работает при несвпадении имен в папке sourceimages и папках указанных абсолютно в nodes. RGBam, да я это тоже говорил, что с участием браузера все работает корректно.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#33
Fabis, ну в майе 2009 относительный путь "sourceimages\..."(в код тоже вводим) как вручную так и через скрипт сразу нормально срабатывает без помощи открытия и закрытия браузера. Браузер понадобился только, чтобы заработал нормально исходный код для папки Source Images:
Код:
setAttr -type "string" ($texField+".ftn") $lastMbr;
 

Миша Ершов

Модератор форума
Рейтинг
314
#34
Ой, запутали совсем %-)
И времени тестить нету по новой. Буду лучше следить за поиском истины. Самому интересно. Я раньше пришел к выводу что там всё как я описал, и у меня всё работало прекрасно :)
 

Fabis

Активный участник
Рейтинг
16
#35
RGBam, оп-па, и в самом деле, если в майа 2009 ввести вместо абсолютного пути относительный, то есть "sourceimages\..." то обновляется все прекрасно, а в майе 2008 это не работает, при вводе нового относительного пути возвращает старый абсолютный путь :( Беда какая-то, причем последовательность действий была в обеих версиях одинаковая. Мистика какая-то, но скрипт-то должен быть универсальным иначе обидно будет...
 

DEL

Активный участник
Рейтинг
15
#37
Тааак, совсем запутался. Пару раз открыв и закрыв браузер папок и все заработало, причем код не менял. Ичто самое интересное при замене пути вместо имени фаила вставляет sourceimages\name.jpg . Это я дома. Завтра на работе попробую и отпишусь.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#38
Вообщем весь этот код оказался лишним. Есть замечательная команда dirmap. В ней надо указать два абсолютных пути к проектам (главное чтобы папки с текстурами и папки с др. файлами сходились), первый путь, описывающий чужую директорию проекта с другого компа, второй - текущую. И если какой то файл программа не найдет на новом компе, то она полезет его искать в другой директории, которую мы указали второй. Эта команда применима к любым путям насколько я понял.
Код:
dirmap -en true; \\включает данную возможность
dirmap -m "{чужая директория проекта}" "{новая директория проекта}";
Связь директорий сохраняется на файл сцены. Вот такое вот пироги =)
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#39
Забыл сказать, что директории могут быть любыми, не только проектными.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#40
Если текстуры разбросаны по разным папкам:

Код:
string $textureFiles[] = `ls -sl`;

dirmap -en true;

for ($texField in $textureFiles)
{

string $blck = `getAttr -x ($texField+".ftn")`;


string $direc = dirname ($blck);


dirmap -m $direc "{абсолютный путь новой папки с текстурами}"; 


};
 
Сверху