Universal Delete Tool, требуется помощь |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Universal Delete Tool, требуется помощь |
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 |
|
|
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 #
|
|
|
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. // |
|
|
16/05/2014, 19:57
Сообщение
#19
|
|
Мастер Группа: Пользователи Сообщений: 1 070 Регистрация: 17/04/2007 Из: отТуда Пользователь №: 47 967 |
замените
Код global proc connectEdgesSlide() на Код global proc string connectEdgesSlide() Если мой простой пример в предыдущем ответе работает - значит должно возвращать |
|
|
16/05/2014, 20:03
Сообщение
#20
|
|
Мастер Группа: Пользователи Сообщений: 1 070 Регистрация: 17/04/2007 Из: отТуда Пользователь №: 47 967 |
Если решили всетаки использовать питон то перепишите все функции на питоне. Поверьте, потом будет много путаницы.
Ошибочный код (изза не большого опыта в питоне) ложите сюда. Будем исправлять. Или объясните что функция должна сделать, я напишу на питоне |
|
|
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 |
|
|
16/05/2014, 20:14
Сообщение
#22
|
|
Мастер Группа: Пользователи Сообщений: 1 070 Регистрация: 17/04/2007 Из: отТуда Пользователь №: 47 967 |
|
|
|
16/05/2014, 20:29
Сообщение
#23
|
|
Уже не новичок Группа: Пользователи Сообщений: 24 Регистрация: 15/02/2014 Пользователь №: 99 421 |
А ты глянь ссылку на видео специально записал что бы недопонимания не было.
|
|
|
16/05/2014, 20:35
Сообщение
#24
|
|
Мастер Группа: Пользователи Сообщений: 1 070 Регистрация: 17/04/2007 Из: отТуда Пользователь №: 47 967 |
|
|
|
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 |
|
|
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 |
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 26/04/2024 - 01:29 |