Render.ru

Ускоряя Maya, послесловие. Скрипты для ускорения работы в Maya.

тогда надо будет подумать. сейчас майки нет под рукой, но что-то у меня есть сомнения, что можно оставить выполняться скрипт при переходе в инструмент. Т.е. скрипт вызывает инструмент, и даже если скрипт еще не донца выполнен, майка об этом забудет и не вернет управление скрипту. Но это я так, на предположениях скорее, чем на реальности, надо бы проверить. Например, написать скрипт в 2 строчки: вызов инструмента и простой принт. Если после того, как отработает инструмент, в Script Editor появится сообщение из принта, значит, все можно. Если нет, то нет.

в самом плохом случае надо будет сделать 2 хоткея - один на кат, другой на фил. топорно, но точно можно, и будет работать
 

shacr0w

Активный участник
Рейтинг
15
Код:
CutPolygon;
{
	print ("\nHello World");
}
надеюсь я правильно написал код,
В таком варианте принт не срабатывает

в самом плохом случае надо будет сделать 2 хоткея - один на кат, другой на фил. топорно, но точно можно, и будет работать
так пока так и сижу на 2х кнопках

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

shacr0w

Активный участник
Рейтинг
15
Дмитрий, да результат такой же и без скобок.

мне кажется что часть проблемы в том что CutPolygon не имеет конца, то есть он остается активным после разреза. Хотя это только мои догадки.
 
догадка верная - с точки зрения скрипта никак нельзя понять, выполнился инструмент или нет. По сути, сначала майя выполняет скрипт, отдавая ему управление. Скрипт вызывает инструмент, и майя отдает управление инструменту, "забывая" про скрипт. Аналогичная ситуация происходит, например, при смене инструментов. Собственно, в этом и заключается разница между операцией и инструментом - операции можно спокойно вызывать пачками внутри одного скрипта (например, экструд по фискированным параметрам), а инструменты как бы вытесняют друг друга из-за того, что им требуется интерактивный перехват действий пользователя.
 
хотя есть надежда, но небольшая. Заключается она в том, что при выходе инструмент cut может потенциально вызывать какой-нибудь скрипт. Чтобы понять, происходит это или нет, надо включить Echo all commands, сделать cut и посмотреть, что будет написано в Script Editor. Потом разобрать написанно построчно с помощью команды whatIs в надежде обнаружить скрипт или namedCommand, в которую можно будет встроить операцию fillHole
 

shacr0w

Активный участник
Рейтинг
15
Дмитрий, в самом конце идут такие команды


Код:
whatIs "autoUpdateAttrEd";
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2013/scripts/others/showEditor.mel // 
whatIs "updateAnimLayerEditor";
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2013/scripts/startup/layerEditor.mel // 
whatIs "statusLineUpdateInputField";
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2013/scripts/startup/statusLine.mel //
можно ли их их менять, и правильно ли я понял если внести в них изменения на уровне добавления команды fillHole то она будет происходить всегда при появлении
Код:
autoUpdateAttrEd
updateAnimLayerEditor
statusLineUpdateInputField
или это можно ограничить скажет так фразой "только после CutPolygon"?
 
в таком раскладе есть два варианта:
1. попробовать зайти со стороны scriptJob
2. сделать костылик в общих скриптах

Про scriptJob все более-менее просто: надо почитать про команду в целом и посмотреть, нет ли каких-нибудь эвентов на тему смены инструмента. Если есть, надо будет написать обвязку, которая будет выставлять какой-нибудь флажок (глобальная переменная типа int) перед запуском cut, потом scriptJob будет проверять этот флажок и запускать fillHole, после чего будет сбрасывать флажок в исходное состояние. Совсем правильно в этом раскладе будет обвязать CutPolygon в свой кастомный tool с помощью команды scriptCtx. Это стоит сделать для того, чтобы четко разделить вызов обычного ката и кастомного.

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

Лекс Дарлог (DRL)

Активный участник
Рейтинг
14
Моя лепта:
FillHole всё равно в качестве инпута получает список эджей, к которым он применяется.
Так что, в любом случае: если подвинуть потом плоскость ката - изменятся id-шники эджей... в общем, печалька.

Я предлагаю разбить процесс на 2 части и посадить их на 2 хоткея:
1. кат фэйсез,
2. закрытие дыр.

Не так автоматизированно, зато гораздо предсказуемее.
В первой части делаем следующее:
- запоминаем название объекта
- запоминаем вообще все эджи меша во временный сет.
- заходим в кат тул.

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

В любом случае, non-destructive на меле сделать не получится. Только если писать свой тул (свою ноду).
 
DRL, будь внимательнее: про хоткее написали выше =)

PS non-destructive MEL - это круто. В более ранние годы сделал бы себе мотиватор, распечатал и повесил бы на стенку над рабочим местом.
 

shacr0w

Активный участник
Рейтинг
15
Дмитрий, нужно резануть, удалить часть, и закрыть дырку. я так понимаю версия DRL избавляет от повторного выделения объекта после катТулла, я прав?
 
да, прав.
если так, то действительно надо сначала разделить на две части, после чего, если все будет хорошо, вернутся к размышлениям на тему ускорения до одного клика
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
При условии, что объект изначально замкнут, можно использовать этот скрипт:
(Cut должен быть настроен на Delete Cut Faces)
Код:
scriptJob -ro true -e "SelectionChanged" run_wtf; 
global proc run_wtf() { 
global string $sel_obj[]; 
if(size($sel_obj)>0) {
    polyCloseBorder -ch 1 $sel_obj;
    select $sel_obj;
}
}; 

global string $sel_obj[]; 
$sel_obj = `ls -sl`; 
CutPolygon;
И запускать его снова по клавише G, если нужно повторить.
Какие-то нюансы может быть не учел, но, вроде, работает в рамках особенностей CutTool'a.
 

shacr0w

Активный участник
Рейтинг
15
Dark™ , это просто волшебно!!! спасибо тебе, громадное, спасибо всем кто помогал!
 

shacr0w

Активный участник
Рейтинг
15
всем привет!

написалось такая штука

Код:
evalDeferred("{\
if(!`objExists defold`){\
shadingNode -asShader blinn -n defold;\
setAttr defold.color 0.2 0.2 0.2;\
setAttr defold.specularColor 0.343 0.3 0.3 ;\
sets -renderable true -noSurfaceShader true -empty -name defoldSG;\
connectAttr -f defold.outColor defoldSG.surfaceShader;\
setDefaultShadingGroup defoldSG;}\
}");
призванная изменить дефоллтный шейдер на blinn. Сначала подумал, что все работает круто, но потом понял что изменяет он шедер только при открытии майки, а когда нажимаешь создать новую сцену не срабатывает.

Подскажите как исправить.
 

shacr0w

Активный участник
Рейтинг
15
я пробовал но почему то у меня не вышло
создал вот такой документ

Код:
global proc blinnSha() {
evalDeferred("{\if(!`objExists defold`){\
       shadingNode -asShader blinn -n defold;\
       setAttr defold.color 0.2 0.2 0.2;\
       setAttr defold.specularColor 0.343 0.3 0.3 ;\
       sets -renderable true -noSurfaceShader true -empty -name defoldSG;\
       connectAttr -f defold.outColor defoldSG.surfaceShader;\
       setDefaultShadingGroup defoldSG;}\
       }");
}
но когда добавляю scriptJob

Код:
scriptJob -e SceneOpened "blinnSha()";
не срабатывает или я что то не так делаю?
 
Сверху