Render.ru

Скрипты,настройки и вопросы.

#1
Скрипты,настройки и вопросы.


Добрый день!!!
Хочу разместить здесь некоторые свои скрипты и настройки Maya.
Для меня они очень удобны, возможно и вам пригодятся.От вас мне интересно услышать предложения по их модернизации,свои варианты настроек и ,возможно, спасибы:)).

Так же по ходу дела будут возникать вопросы.У меня, например уже есть довольно длинный списочек.
Если можете - ответьте,если я найду ответы - выложу.
Если у вас есть вопросы - спрашивайте.Я не супер-профи(то есть я вообще пока не профи))),но постараюсь ответить.






Когда нажимаешь правой кнопкой мыши во вьюпорте,возникает маленькая маркинг менюшка:CompleteTool и SelectAll.
Вы часто ей пользуетесь?
Я - нет.
Что-бы это исправить делаем следующее:
Создаём два маркинг меню,лезем в C:\Documents and Settings\UserName(имя польз.)\My Documents\maya\8.0\prefs\markingMenus,открываем файлы с их названиями и копируем оттуда весь текст.
В папке C:\Documents and Settings\UserName(имя польз.)\My Documents\maya\scripts создаём MEL файл с именем buildObjectMenuItemsNow и вставляем в него этот текст(это просто чуть чуть изменённый майский скрипт "buildObjectMenuItemsNow"):


global proc buildObjectMenuItemsNow( string $parentName)
{
global int $gIsMarkingMenuOn;

if (`popupMenu -e -exists $parentName`) {
popupMenu -e -deleteAllItems $parentName;
if (`popupMenu -q -mm $parentName` != $gIsMarkingMenuOn) {
deleteUI {$parentName};
popupMenu -e -mm $gIsMarkingMenuOn $parentName;
}}






if (size(`ls -sl`)==0&&(`selectMode -q -o`)) {if (`popupMenu -e -exists $parentName`) {
popupMenu -e -deleteAllItems $parentName;
if (`popupMenu -q -mm $parentName` != $gIsMarkingMenuOn) {
popupMenu -e -mm $gIsMarkingMenuOn $parentName;
deleteUI {$parentName};
}}




setParent -menu $parentName;


//Сюда вставляем текст первого марк.меню(для вьюпорта)



setParent ..;
}
else
{if (`popupMenu -e -exists $parentName`) {
popupMenu -e -deleteAllItems $parentName;
if (`popupMenu -q -mm $parentName` != $gIsMarkingMenuOn) {
popupMenu -e -mm $gIsMarkingMenuOn $parentName;
deleteUI {$parentName};
}}
setParent -menu $parentName;



//А сюда текст для второго марк.меню(для тыка на обьекте)


setParent -m ..;


}
}




Удаляем абзацы начинающиеся со слов -label "ELFdefaultMenuItem" (Почему-то пишет что кнопки с настройками(квадратиками) в это меню нельзя.Кто знает почему и как это исправить - пишите).

Теперь при нажатии RMB во вьюпорте появляется удобное маркинг меню для открытия наиболее часто используемых окон(у меня),а если
ткнуть на обьекте - появится набор инструментов для моделирования(тоже у меня,Вы можете настроить что-нибудь другое)).Ура!!!
P.S.Что-бы всё работало как прежде - надо просто удалить или переименовать этот файл.




Перейдя с макса на Маю я долго скучал по хорошей возможности -"сохранению" выделения.То есть выделил вершины,подредактировал рёбра,проэкструдил полики, и вернулся к ранее выделенным вершинам.
Позавчера реализовал эту очень удобную возможность в Мае(честно говоря-это был мой первый собственноручно написанный скрипт))).

Значит так.
В хоткей эдиторе,в категории User создаём хоткеи для режимов выделения:
Name:Vert_Sel
Command:
setSelectMode components Components; selectType -smp 1 -sme 0 -smf 0 -smu 0 -pv 1 -pe 0 -pf 0 -puv 0;
global string $LastVert[];
global string $LastEdge[];
global string $LastFace[];
global string $LastObj[];
global int $LastComp;
if ($LastComp==4) $LastFace=(`ls -sl`);else
if ($LastComp==3) $LastEdge=`ls -sl`;else
if ($LastComp==2) $LastVert=`ls -sl`;else
if ($LastComp==1) $LastObj=`ls -hl`;
select -cl;
if (`size $LastVert`>0) select $LastVert;
$LastComp=2;
print $LastVert;
print $LastEdge;
print $LastComp;

Name:Edge_Sel
Command:
if ($LastComp==4) $LastFace=(`ls -sl`);else
if ($LastComp==3) $LastEdge=`ls -sl`;else
if ($LastComp==2) $LastVert=`ls -sl`;else
if ($LastComp==1) $LastObj=`ls -hl`;
select -cl;
if (`size $LastEdge`>0) select $LastEdge;
$LastComp=3;
print $LastVert;
print $LastEdge;
print $LastComp;

Name:Face_Sel
Command:
if ($LastComp==3) $LastEdge=`ls -sl`;else
if ($LastComp==2) $LastVert=`ls -sl`;else
if ($LastComp==1) $LastObj=`ls -hl`;
select -cl;
if (`size $LastFace`>0) select $LastFace;
$LastComp=4;
print $LastVert;
print $LastEdge;
print $LastComp;

Name:Obj_Sel
Command:
if ($LastComp==1) $LastObj=`ls -hl`;
select -cl;changeSelectMode -object;
if (`size $LastObj`>0) select $LastObj;
$LastComp=1;
print $LastVert;
print $LastEdge;
print $LastComp;

Вешаем их на удобные клавиши(у меня это не F8-F11,а 1,2,3,4),нажимаем Save, и всё работает(Это самый приятный момент.Знаете,как я обрадовался?)))!!!

А вот пример "липкого" хоткея (всем рекомендую сборник мастерклассов "Maya F1",скрипт оттуда):
Name:Stickey_q_press
Command:
global string $Stickey_Ctx;
$Stickey_Ctx=`currentCtx`;

global string $Stickey_Sel[];
$Stickey_Sel=`ls -sl`;

global string $Stickey_HL[];
$Stickey_HL=`ls -hl`;

setToolTo polySplitContext;

Name:Stickey_q_release
Command:
global string $Stickey_Ctx;
global string $Stickey_Sel[];
global string $Stickey_HL[];
setToolTo $Stickey_Ctx;
select $Stickey_Sel;
hilite $Stickey_HL;
if (`size $Stickey_HL`>0)
changeSelectMode -component;

Теперь выделяем обьект,жмём на "q",сплитим нашу модельку,отпускаем.Моделька разрезалась!(Обалдеть!Это тоже работает!Сразу чувствуешь себя таким умным-умным:))))



А теперь вопросы:
Где в Мае аналог максовскому Cap и Bridge для полигонов.Или как их сделать.
Способы Определения и "назначения" положения курсора.
У меня на мыши 5 кнопок,а использую только три основных.Как узнать названия для остальных двух?

И чуть-чуть не в тему(не создавать же для этого вопроса отдельный форум.А узнать ответ интересно):
Графические планшеты делают в виде чувствительной к нажатию "доски"(не знаю как она называется) и "ручки".Скажите, почему нельзя сделать просто мышь в виде ручки? И удобнее,и рисовать такой можно где угодно,и,наверное,дешевле.
Уже который день мучаюсь:))) Может пора бежать в патентное бюро и начать делать состояние на этом гениальном изобритении? :)))))))



У-ф-ф! Вроде всё написал!Слава Богу! :)))
 

Fabis

Активный участник
Рейтинг
16
#2
Насчет сохранения выделения есть скрипт на highend3d.
Насчет Cap в максе - давно с нее перешел, поэтому не помню что за инструмент, а Bridge - в меню Polygons>Edit mesh>Bridge.
Насчет планшета - очень важно чтобы вес пера был наименьшим, я вес пера wacoma после нескольких часов работы не чувствую - это самое главное. То есть само перо выполнено крайне просто, без питания. Все основное - в планшете. Плюс ко всему оптическая мышь не распознает угол наклона. Сами представьте, надо сделать наконечник одновременно пропускающий луч для определения перемещения и улавливающий уровни нажатия, также систему уровня по двум осям (наклон пера), так еще чтоб это все было беспроводным и максимально легким - такая вещь несомненно удобна, так как не ограничена форматами (А4, А3 и т.д.) Но раньше, я думаю, удобнее было начинать с простого и относительно дешевого варианта - планшета, также наверняка есть маркетинговый ход - человек видит за что платит (формат А3, скажем). А сейчас наверно это не супер новинка, учитывая что уже есть планшетные мониторы. Хотя кто знает, может и будет такая штука востребована, может - нет.
 

DLCool

Знаток
Рейтинг
25
#3
Мышки в виде ручки существуют у "Genius". Они идут в комплекте с "доской", но она не функциональна в относительном режиме(только кнопки на нее выведены разные и размечена она всячески + в комплекте линейки и лекала). Удобна для чертежников. Не реагирует на нажатие и наклон.
 

imha

Знаток
Рейтинг
20
#4
а на счет скриптов для удобства, тема то интересная!
афтор пеши исчё!
 

Слава Подчуфаров 35702

Пользователь сайта
Рейтинг
2
#5
Cap - это когда выделяешь border edge , тыкаешь на кнопку, и по ним создаётся один полигон.Впрочем штука не очень нужная, я так, из любопытства спросил.
А про этот Bridge я знаю.Там надо border edge выделять.А я хочу:выделил полики,нажал на кнопку и bridge построился.
Или так можно, а я просто ступил с настройками?

Чёрт! Обломалась моя идея стать мультимиллионером:)))

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

Если есть идеи - пишите, попробую реализовать.Предлагайте свои варианты.

2All: Кто-нибудь знает как переназначать глобальные переменные?То-есть например был интежер, а надо сделсть стринг.
 

Fabis

Активный участник
Рейтинг
16
#6
А, ну значит аналог Cap - это Fill Hole в Майе, а по поводу Bridge, то какая разница что выделять, полигоны или края. Принцип построения одинаков.
 

imha

Знаток
Рейтинг
20
#8
2 Fabis только в максе кэпится любой замкнутый контур(если я не ошипся), а в мае только те замкнутые контуры, вершины которых лежат в одной плоскости.

кстати на счет первого скрипта.
Когда нажимаешь правой кнопкой мыши во вьюпорте,возникает маленькая маркинг менюшка:CompleteTool и SelectAll.
Вы часто ей пользуетесь?
я вот часто ей пользуюсь например)) перепрыгиваю в режимы точечек, эджей, изопарм и т.д....

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

Fabis

Активный участник
Рейтинг
16
#9
Только что проверил - закрывается полигоном любой контур. в том числе и с вершинами не в одной плоскости.

я вот часто ей пользуюсь например)) перепрыгиваю в режимы точечек, эджей, изопарм и т.д....
Это когда правой кнопкой по объекту такое меню возникает. Автор видимо заместил меню ПКМ на пустом пространстве окна.
 
#10
В скрипте сохранения выделения обнаружил небольшой баг.Что-бы исправить мне надо научиться удалять глобальные переменные.

В представленном скрипте я заменил оба меню.
В майском скрипте "buildObjectMenuItemsNow", находящемся в /maya/scripts/others оператор if переключает меню "тыка на обьекте" и меню "тыка на пустом пространстве экрана".
После if идет 6-7 строчек создания меню тыка на экране.Разобраться в них и заменить на свои в принципе не сложно.
Если не получится - пишите,тогда в понедельник,максимум - во вторник выложу скрипт со всеми пояснениями.
 
#11
Когда я узнал что в Maya единственный способ остановить выполнение зациклившегося сценария - это аварийное завершение работы программы, мне стало малость обидно.Когда из-за этого я потерял второй сценарий подряд - прямо скажем неприятно.
Не знаю, может зря я считаю себя самым умным, и всем такой способ известен и без меня,но вдруг пригодится:
Вставляем это:

$startTimer=`timerX`;

перед циклом, а это:

$startTime=`timerX -startTime $startTimer`;
if ($startTime>5)
error "Script execute too long";

в цикл.
Это значит,что если скрипт будет выполнятся дольше 5-ти секунд ,произайдёт его остановка и на экран будет выведенна ошибка "Script execute too long".
Вот пример:

$startTimer=`timerX`;
int $i;
$i=0;
while($i<50)
{
sphere;
$startTime=`timerX -startTime $startTimer`;
print $startTime;
if ($startTime>1)
error "Script execute too long";
move 0 0 $i;
//$i++;
}


А вот исправление бага в моём скрипте сохранения выделения:
Создаём в C:\Documents and Settings\Slava\My Documents\maya\scripts файл doDelete.mel и вставляем в него следующий текст(опять же совсем чуть-чуть изменённый майский "doDelete") :

proc skinClusterPreDelete(string $objs[])
// If skin influence objects are deleted, remove them
// as influences so that the skin in that area will not pop to zero
// when the object is deleted.
{
// build list of skinClusters that can be ignored
//
string $skinNodesToSkip[];

for ($obj in $objs) {
// check if the object is a skin influence
//
string $skins[] = `listConnections -s 0 -d 1 -type skinCluster ($obj+".worldMatrix")`;
for ($skinNode in $skins) {
if (0 == AWNumberOfOccurrencesInStringArray($skinNode,
$skinNodesToSkip)) {
int $removeIt = 1;

// Check if the skin itself if also being deleted.
// If so, we don't need to remove the influence object.
//
string $skinGeom[] = `skinCluster -q -g $skinNode`;
if (size($skinGeom) > 0) {
if (AWNumberOfOccurrencesInStringArray($skinGeom[0],
$objs)) {
$skinNodesToSkip[size($skinNodesToSkip)] = $skinNode;
$removeIt = 0;
}
}

if ($removeIt) {
// Check if all the influences will be deleted.
// If so, we don't need to remove the influence object.
//
int $allInfsDeleted = 1;
string $infs[] = `skinCluster -q -inf $skinNode`;
for ($inf in $infs) {
if (0 == AWNumberOfOccurrencesInStringArray($inf,
$objs)) {
$allInfsDeleted = 0;
break;
}
}
if ($allInfsDeleted) {
$skinNodesToSkip[size($skinNodesToSkip)] = $skinNode;
$removeIt = 0;
}
}

if ($removeIt) {
skinCluster -e -removeInfluence $obj $skinNode;
}
}
}
}
}


global proc
doDelete()
{
if (size(`filterExpand -sm 31`)==0 && size(`filterExpand -sm 32`)==0 && size(`filterExpand -sm 34`)==0)
{
global string $LastVert[];
global string $LastEdge[];
global string $LastFace[];
global string $LastObj[];
global string $Clear[];
$LastVert=$Clear;
$LastEdge=$Clear;
$LastFace=$Clear;
$LastObj=$Clear;
}

string $sel[] = `ls -sl -dag`;
skinClusterPreDelete($sel);
if (size(`filterExpand -sm 32`)>0 && `getModifiers`!=1)//anee e-ai aua ?aaa? filterExpand -sm 32 aieuoa ioey e && SHIFT ia ca?ao`getModifiers`!=1, oi auiieiyaa iaea a iai?polyDelEdge -cv true ii oieuei aey ??aa? (`filterExpand -sm 32`)
polyDelEdge -cv true (`filterExpand -sm 32`);
delete;
}



До кучи ещё теперь при удалении рёбер они будут удаляться вместе с вершинами.Так удобне.Если хотите использовать старый делит - нажмите shift+delete.

P.s.Создавая эту тему я хотел не только продемострировать свои скрипты и настройки, но надеялся что и вы поделитесь своими.
Не обязательно так детально.Можете написать просто идею.Интересно же!
 

Andrey83

Пользователь сайта
Рейтинг
2
#12
Идея вот какая, как зделать так, что б при выделении рамкой выделялись только полностью поавшие в рамку рёбра. Да ещё и так как в Риноцерос4 - слева на право полностью попавшие в выделение, а справа на лево - все зацепленные рамкой.
 

Andrey83

Пользователь сайта
Рейтинг
2
#13
А ещё я хотел бы окно из иконок, как на шелфе, набросать туда нужных кнопок и прикрутить например к средней кнопке мыши, а на каждую кнопу, как миниму по 2 команды(первой кнопкай мыши - одна команда, второй другая...) я такую штуку опять же в Риноцеросе ипользую. Там ещё можна размер иконок задавать в пикселях, и прям в пограме иконки рисовать....
 

Вложения

#14
Всем привет!
Решил возобновить тему.На предыдущие сообщения не ответил потому что....ну короче мне слабО.

Есть такая идея:
Каждый раз когда мне надо создать в гиперграфе узел...ну скажем multiplyDivide, мне приходится открывать гипершейдер и искать там его.
А в Houdini можно сделать так: после нажатия кнопки таб появляется окошко со списком всех доступных узлов. Просто выбираешь и жмешь enter.
Мне кажется это удобно, и реализовать вполне возможно.

Напишите пожалуйста, это кому-нибудь кроме меня нужно?
А может можно сделать как-то удобнее?
Ну и конечно я буду задавать сдесь вопросы возникающие по ходу.
Вот например:
Что-бы получить список всех доступных нод я использовал комманду listNodeTypes $nodeType;
Проблема в том что я незнаю как узнать весь список типов нод существующих в Maya.Минут сорок хелп мучал.Често.
Подскажите, плиз.
Или это делается другим способом?

P.S.
В любом случае, не молчите.Напишите что-нибудь. А то я боюсь что занимаюсь фигнёй и это давно реализованно в Maya.



А это версия 0.00005 beta(откройте гиперграф,нажмите на кнопку Input And Output Connections, и запустите скрипт):
int $i;
string $nodeTypes[];
string $nodes[],$tabs[],$tab;
string $layName;
$nodeTypes[0]="shader";
$nodeTypes[1]="utility";
$nodeTypes[2]="other";
window;
$layName=`columnLayout -adjustableColumn true`;
tabLayout;
for ($nodeType in $nodeTypes)
{
$i++;
$tab=`columnLayout $nodeType`;
$nodes=`listNodeTypes $nodeType`;
for ($node in $nodes)
{
button -l $node -command ("createNode "+$node);
}
setParent..;
//tabLayout -edit -tabLabel $tab="$nodeType";
}
showWindow;
 

ymesh

Пользователь сайта
Рейтинг
2
#15
Попробуй запустить:
Код:
string $n, $nodes[] = `listNodeTypes "/" `;	
for( $n in $nodes ) 
   print( "\t" + $n + "\n" );
 
#17
Спасибо большое! То что надо!
Пока руки не доходят сделать.Попозже выложу.
У меня ещё два вопроса(я стараюсь не наглеть, но где найти ответы на эти вопросы - не знаю.А очень надо):
1.У меня в мае 2009 не работает прога для отправки скриптов из текстовых редакторов в maya.Mapy называется.
Кто знаеткак можно прикрутить текстовый редактор к мая(любыми способами) помогите, плиз.

2.Как можно заменить ноду с большим количеством входящих и исходящих связей на другую.Что-бы не пересвязывать в ручную.
Это мне для флюид эффектс надо.Хочу настроить жидкость в 2D контейнере(так быстрее), а потом её настройки перекинуть на 3D контейнер.
Не переписывать же мне их вручную?

Помогите, плиз.
 
#18
Я вот тут подумал...
Вобщем мне не обязательно "прикручивать" текстовый редактор к мае.... В конце концов,какая разница,нажимать 2 хоткея или один.
Подскажите,пожалуйста, как сделать аналог меловского "source" в phyton?
Я бы кинул его на полку и загружал бы скрипт двумя тыками.И был бы счастлив :)
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#19
Код:
import {имя файла} 
reload ({имя файла})
без расширения из maya/scripts или из PYTHONPATH.
 
Сверху