3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Reply to this topicStart new topic
> Universal Delete Tool, требуется помощь
Bravlin
сообщение 16/05/2014, 18:31
Сообщение #16


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 24
Регистрация: 15/02/2014
Пользователь №: 99 421



А если мне нужно переменную из MEL процедуры передать в PY процедуру ?
Допустим у меня в глобальной процедуре есть переменная $NodeName
Я пробовал так:
Код
import maya.cmds as cmds
import maya.mel as mel
import connectEdgesSlide    
connectEdgesSlide = mel.eval('connectEdgesSlide;')
NodeName = mel.eval("$temp=$NodeName")
print NodeName


Я пробовал перекинуть эту переменную в MEL скрипте в глобальную переменную:
Код
global string $PyNodeName=$NodeName;

Но: "...Initialization of global variable "$PyNodeName" requires a constant value"

Сообщение отредактировал Bravlin - 16/05/2014, 19:30
Go to the top of the page
 
+Quote Post
VUX
сообщение 16/05/2014, 19:31
Сообщение #17


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



процедура должна возвращать значение.

Например:
1. mel код:
Код
global proc int MEL_PROC()
{
    return 123;
}


2. python код:
Код
print mel.eval('MEL_PROC')


3. Результат питоновского вызова:
Код
# Result: 123 #
Go to the top of the page
 
+Quote Post
Bravlin
сообщение 16/05/2014, 19:52
Сообщение #18


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 24
Регистрация: 15/02/2014
Пользователь №: 99 421



Я пробовал сделать через глобальную переменную
Код
global proc connectEdgesSlide()
{
global string $PyNodeName;
string $selection[] = `filterExpand -sm 32`;
string $Edges[] = OrderEdges($selection);
string $NodeName = SplitEdges($Edges);
addSlideAttr( $Edges, $NodeName );
$PyNodeName=$NodeName;
}

connectEdgesSlide = mel.eval('connectEdgesSlide;')
NodeName = mel.eval("$temp=$PyNodeName")
print NodeName
ошибок не выдал но и переменную не напечатал (или в неё не передал ничего)

И пробовал сделать через Return
Код
global proc connectEdgesSlide()
{
string $selection[] = `filterExpand -sm 32`;
string $Edges[] = OrderEdges($selection);
string $NodeName = SplitEdges($Edges);
addSlideAttr( $Edges, $NodeName );
return $NodeName;
}

connectEdgesSlide = mel.eval('connectEdgesSlide;')
This procedure has no return value. //
Go to the top of the page
 
+Quote Post
VUX
сообщение 16/05/2014, 19:57
Сообщение #19


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



замените
Код
global proc connectEdgesSlide()

на
Код
global proc string connectEdgesSlide()


Если мой простой пример в предыдущем ответе работает - значит должно возвращать smile.gif
Go to the top of the page
 
+Quote Post
VUX
сообщение 16/05/2014, 20:03
Сообщение #20


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



Если решили всетаки использовать питон то перепишите все функции на питоне. Поверьте, потом будет много путаницы.
Ошибочный код (изза не большого опыта в питоне) ложите сюда. Будем исправлять.

Или объясните что функция должна сделать, я напишу на питоне
Go to the top of the page
 
+Quote Post
Bravlin
сообщение 16/05/2014, 20:12
Сообщение #21


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 24
Регистрация: 15/02/2014
Пользователь №: 99 421



Да тут сложновато будет: там глобальных процедур 14 штук в mel скрипте. Не огромных но и не в 5-6 строк.
Потому и строю кастыли. Изначальный функционал (не моё авторство) следующий:
http://youtu.be/nOhqeYQSHm0
я хочю добавить туда ещё возможность слайдить центральный ейдж не залезая в chanelBox.


Код
global proc addSlideAttr( string $EdgeList[], string $NodeName )
{
int $sliceList[];
for ( $i = 0; $i < size($EdgeList)-1; $i++ )
{
if ( size(ArrayIntersector( edge2Face($EdgeList[$i]), edge2Face($EdgeList[$i+1]) )) == 1 ) {
$sliceList[$i] = 1;
} else {
$sliceList[$i] = 0;
}
}
int $list[];
$list[0] = 0;
for ( $i = 1; $i < size($EdgeList); $i++ )
{
if ( $sliceList[$i-1] == 1 )
{
$list[$i] = $list[$i-1];
} else {
$list[$i] = abs($list[$i-1]-1);
}
}
addAttr -ln Slide -min 0.0001 -max 0.9999 -dv 0.5 -at "float" $NodeName;
setAttr -k 1 ($NodeName+".Slide");
string $exp = "float $Slide = "+$NodeName+".Slide;\n";
for ( $i = 0; $i < (size($EdgeList)); $i++ )
{
$exp += $NodeName +".edge["+$i+"] = abs($Slide -"+$list[$i]+");\n";
}
expression -n ($NodeName+"Slide") -s $exp -o $NodeName -ae 1;
}




global proc string objectName(string $Comp)
{
string $result[];
tokenize $Comp "." $result;
return $result[0];
}


global proc int[] getIndexList(string $EdgesList[])
{
int $IndexList[];
for ( $i = 0; $i < size($EdgesList); $i++ )
{
$IndexList[$i] = getIndex($EdgesList[$i]);
}
return $IndexList;
}



global proc int getIndex(string $Component)
{
string $result[];
tokenize $Component "." $result;
tokenize $result[1] "[" $result;
tokenize $result[1] "]" $result;
int $index = $result[0];
return $index;
}



global proc string SplitEdges( string $EdgeList[] )
{
string $polySplit = "polySplit -ch on -s 1 ";
float $length = 0.5;
string $epFlag = "-ep";
int $loop = 0;
int $EdgeIndexList[] = getIndexList($EdgeList);
for ( $loop = 0; $loop < size($EdgeIndexList); $loop++ )
{
$polySplit = $polySplit + " " + $epFlag + " " + $EdgeIndexList[$loop] + " " + $length;
}
string $ObjectName = objectName($EdgeList[0]);
$polySplit = $polySplit + " " + $ObjectName;
string $NodeName[] = eval($polySplit);

return $NodeName[0];
}



global proc string inverseFacefromEdge( string $Face, string $Edge ) {
string $result;
string $FaceOfEdgeList[] = edge2Face($Edge);
if ($Face == $FaceOfEdgeList[0]  ) $result = $FaceOfEdgeList[1];
else $result = $FaceOfEdgeList[0];
return $result;
}


global proc int IsEdgeBorder( string $Edge ) {
string $result = 0;
string $faces[] = edge2Face($Edge);
if ( size($faces) < 2 ){ $result = 1;}
return $result;
}


global proc string[] inverseArray( string $list[])
{
string $result[];
for ( $i = size($list)-1; $i > - 1; --$i )
{
$result[ size($result) ] = $list[$i];
}
return $result;
}


global proc string[] face2Edge(string $theFace)
{
string $buffer[];
string $listEdge[] = `polyInfo -fe $theFace`;
tokenize $theFace "." $buffer;
string $ObjectName = $buffer[0];
int $nbEdge = tokenize($listEdge[0] ,$buffer);
$nbEdge -= 2;
string $listEdgeName[];
for ($i=2;$i<size($buffer);$i++)
{
$listEdgeName[$i-2] = ($ObjectName + ".e["+$buffer[$i]+"]");
}
return $listEdgeName;
}



global proc string[] ArrayIntersector(string $array1[] ,string $array2[] )
{
    string $myIntersector = `stringArrayIntersector`;
    stringArrayIntersector -edit -intersect $array1 $myIntersector;
    stringArrayIntersector -edit -intersect $array2 $myIntersector;
    string $result[]    = `stringArrayIntersector -query $myIntersector`;
    stringArrayIntersector -edit -reset $myIntersector;
    return $result;
}



global proc string NextEdgeOnFace( string $Face, string $Edge, string $EdgeList[] )
{
string $Result = "";

string $Edges[] = ArrayIntersector( face2Edge($Face), $EdgeList );

if ( size( $Edges ) == 2 ) {

if ( $Edges[0] == $Edge ){ $Result = $Edges[1];
} else {
$Result = $Edges[0]; }
}
return $Result;
}



global proc string[] edge2Face(string $theEdge)
{
string $buffer[];
string $listFace[] = `polyInfo -ef $theEdge`;
tokenize $theEdge "." $buffer;
string $ObjectName = $buffer[0];
int $nbFace = tokenize($listFace[0] ,$buffer);
$nbFace -= 2;
string $listFaceName[];
for ($i=2;$i<size($buffer);$i++)
{
$listFaceName[$i-2] = ($ObjectName + ".f["+$buffer[$i]+"]");
}
return $listFaceName;
}



global proc string[] OrderEdges( string $EdgeList[] )
{
string $faces[] = edge2Face($EdgeList[0]);
string $NewEdgeList[];
$NewEdgeList[0] = $EdgeList[0];

string $loopFace = $faces[0];
string $loopEdge = $EdgeList[0];

int $i = 1;
int $stop = 0;
int $loop = 0;

while ( $stop != 1 ){

$loopEdge = NextEdgeOnFace( $loopFace, $loopEdge, $EdgeList);
if ( $loopEdge == "" ) { $stop = 1; break;}
$NewEdgeList[$i++] = $loopEdge;
if ( IsEdgeBorder($loopEdge) ) { $stop = 1; break;}
if ( $loopEdge == $NewEdgeList[0] ) { $loop = 1; $stop = 1; break;}
$loopFace = inverseFacefromEdge( $loopFace, $loopEdge );

}

if ( size($faces) == 2 ) {
if ( $loop == 0 )
{
$loopFace = $faces[1];
$loopEdge = $EdgeList[0];
$NewEdgeList = inverseArray($NewEdgeList);
$stop = 0;

while ( $stop != 1 ) {
$loopEdge = NextEdgeOnFace( $loopFace, $loopEdge, $EdgeList);
if ( $loopEdge == "" ) { $stop = 1; break; }
$NewEdgeList[$i++] = $loopEdge;

if ( IsEdgeBorder($loopEdge) ) { $stop = 1; break; }

$loopFace = inverseFacefromEdge( $loopFace, $loopEdge );
}
}
}
return $NewEdgeList;
}



global proc string connectEdgesSlide()
{
string $selection[] = `filterExpand -sm 32`;
string $Edges[] = OrderEdges($selection);
string $NodeName = SplitEdges($Edges);
addSlideAttr( $Edges, $NodeName );
return $NodeName;
}


Сообщение отредактировал Bravlin - 16/05/2014, 20:24
Go to the top of the page
 
+Quote Post
VUX
сообщение 16/05/2014, 20:14
Сообщение #22


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



Цитата(Bravlin @ 16/05/2014, 20:12) *
Да тут сложновато будет: там глобальных процедур 14 штук в mel скрипте. Не огромных но и не в 5-6 строк.
Потому и строю кастыли.


а если словами ? Что требуется от конечной функции - что там с еджами должно слайдится ?
Go to the top of the page
 
+Quote Post
Bravlin
сообщение 16/05/2014, 20:29
Сообщение #23


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 24
Регистрация: 15/02/2014
Пользователь №: 99 421



А ты глянь ссылку на видео специально записал что бы недопонимания не было.
Go to the top of the page
 
+Quote Post
VUX
сообщение 16/05/2014, 20:35
Сообщение #24


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



Цитата(Bravlin @ 16/05/2014, 20:29) *
А ты глянь ссылку на видео специально записал что бы недопонимания не было.


уже вижу
Go to the top of the page
 
+Quote Post
Bravlin
сообщение 17/05/2014, 07:58
Сообщение #25


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 24
Регистрация: 15/02/2014
Пользователь №: 99 421



отрабатывает через глоабльную переменную:
Код
MEL:
global proc string connectEdgesSlide()
{
global string $PyNodeName;
string $selection[] = `filterExpand -sm 32`;
string $Edges[] = OrderEdges($selection);
string $NodeName = SplitEdges($Edges);
addSlideAttr( $Edges, $NodeName );
$PyNodeName=$NodeName;
return $NodeName;
}

Код
PY:
import maya.cmds as cmds
import maya.mel as mel
PyconnectEdgesSlide = mel.eval('connectEdgesSlide;')
VarEdgeSlide = mel.eval("$TempVar=$PyNodeName")
print VarEdgeSlide

в переменную VarEdgeSlide ложится значение.

но не смотря на это я не очень понял как организовывать взаимодействие с внешними mel скриптами.
то-есть используя UserSetup.mel я подгружаю к основным модулям maya ещё и глобальные процедуры из внешних mel скриптов
и в дальнейшем в .py скрипте мне можно их дёргать из import maya.mel as mel

а если мне требуется подгрузить не прописаный в usersetup.mel внешний mel скрипт ?
как из него мне дёргать глобальные процедуры ?


Сообщение отредактировал Bravlin - 17/05/2014, 08:03
Go to the top of the page
 
+Quote Post
VUX
сообщение 17/05/2014, 13:50
Сообщение #26


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 070
Регистрация: 17/04/2007
Из: отТуда
Пользователь №: 47 967



Не хочу углубляться в дебри взаимодействия мела и пистона. Вместо этого я накидал вам инструмент.

По поводу скрипта который вы показали. Наверное он не будет корректно работать на разных топологиях.
Например создайте куб без разбиений (1х1х1). Попробуйте выделить 2 еджа одного фейса. Не верхнего а, например, того что смотрит в ось Z.
Или сфера в которой топология такова, что есть вертикальный стык и после еджа, например, 619-го сразу идет 0-ой.
Некорректная работа получается изза использования ноды polySplit. Я изучил разные поведения этой ночью и у меня получилось такое:
http://pastebin.com/YRevwCZU

Возможности:
1. Нужно выделить минимум 2 еджа
2. Можно выделять не подрад и в хаотичном порядке, после оно конвертируется в ринг
3. Во время тулза можно выделять другие еджи\лупы\ринги и двигать их
4. Отображается контрол для управления снаппингом. ( -1=отключить снаппинг, 0-прилипать только к себе, >1 - прилипать к поинтам в данном количестве по обе стороны еджа )
5. В функцию можно передавать дефолтное значения для снаппинга. Комуто нравится со снапом к себе, комуто без - например в органике.
6. Вывод подсказок

Пример:
http://youtu.be/zhtX3EmtD08

Сообщение отредактировал VUX - 17/05/2014, 14:24
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






2 страниц V  < 1 2
Fast ReplyReply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28/03/2024 - 23:30