I have a useful mel,but it need perfect,can you help me?

各Maya用戶可在這裡交流問題和分享制作經驗

版主: h2o, stantang

I have a useful mel,but it need perfect,can you help me?

文章lianyifeng » 7日 9月 2008年, 17:06

發現有個很好用的mel,那就是splitEdge。舉個例子,在maya中
建立一個段數為5*5*5的box,到 線級別 裡選擇一個loop線循環,然後應用這個命令,這個box
就被分成了2塊。【第一個問題】但是這2塊是combine在一起的,還得用seperate命令將它們打散才可以成兩個
獨立的物體(比較麻煩,想要個應用splitEdge命令後不再用seperate命令就已經是
兩個獨立的物體);【第二個問題】並且seperate後兩個獨立物體是成組的,且它們的軸心分別不在各自獨立的中心,
感覺麻煩的很。
希望懂mel的各路豪俠幫個忙,改下這個mel,能夠解決上面的兩個問題(能夠解決第一個也好)。(麻煩把改後的
完整的mel貼出來,因為我以前也問過類似的問題,結果高手們以為我懂,只把 問題的mel語言列出來了,讓我自己放
,因為實在看不懂,不知道放哪裡,出了不少問題)

splitEdge.mel的全部內容是:

global proc splitEdge()
{
createSet tmpSplitEdges;
string $objSel[] = `ls -sl -o`;
ConvertSelectionToVertices;
ConvertSelectionToFaces;
$faces = sel();
ConvertSelectionToVertices;
selectSimpleNotBorderVertices;
ConvertSelectionToFaces;
select (stringIntersect($faces, sel()));
if (sizeSel() > 0)
{
triangulateAdv;
createSet tmpTriangEdges;
}
select tmpSplitEdges;
delete tmpSplitEdges;
$split = sel();
$splitVert = conv($split, "v");
ConvertSelectionToVertices;
ConvertSelectionToEdges;
select -d $split;
$merge = sel();

string $bordEdgesRemove[] = {};
for ($edge in $merge)
{
if (edgeBordness($edge))
$bordEdgesRemove[`size $bordEdgesRemove`] = $edge;
}
$merge = stringArrayRemove($bordEdgesRemove, $merge);
//removing border edges //select $merge
select $merge;

string $sets[] = splitEdgeSeparatedSets();

string $set;
string $facesSets[] = {};
for ($set in $sets)
{
//$set = $sets[0];
$faces = conv (stringToStringArray($set, " "), "f");
$facesSets[`size $facesSets`] = stringArrayToString ($faces, " ");
}
//creating lists of faces that will be merge

polySplitVertex $splitVert;
for ($set in $facesSets)
{
polyMergeVertex -d 0.0001 (stringToStringArray($set, " "));
polyMergeUV -d 0.0001 (conv(stringToStringArray($set, " "), "u"));
}
if (`objExists tmpTriangEdges`)
{
select tmpTriangEdges;
delete;
delete tmpTriangEdges;
}
delete -ch $objSel;
select -cl;
selectionMode($objSel[0], "edge");
}

global proc string[] splitEdgeSeparatedSets()
{
if (whatIsSel() != "e" || sizeSel() == 0)
return {};
string $edges[] = sel();
string $edgesCheckMain[] = $edges;
string $edgesSets[] = {};

for (;;)
{
if (`size $edgesCheckMain` == 0)
break;
string $edgesCheck[] = $edgesCheckMain;
string $edgesSet[] = {};
for (;;)
{
if (`size $edgesCheck` == 0)
break;
//select $edgesCheck[0];
$edgesSet[`size $edgesSet`] = $edgesCheck[0];
$edgesCheck = stringArrayRemove (conv (conv (conv (conv ({$edgesCheck[0]}, "f"), "v"), "f"), "e"), $edgesCheck);
//select $edgesCheck;
}
//select $edgesSet;
$edgesSets[`size $edgesSets`] = stringArrayToString($edgesSet, " ");
$edgesCheckMain = stringArrayRemove($edgesSet, $edgesCheckMain);
}
/* selecting sets
$count = 0;
select (stringToStringArray($edgesSets[$count], " "));
$count++;
*/
return $edgesSets;
}

global proc string[] conv(string $itemsForConv[], string $mode)
{
$itemsForConv = `ls -fl $itemsForConv`;

string $converted[] = {};
if ($mode == "v")
$converted = `polyListComponentConversion -tv $itemsForConv`;
else if ($mode == "e")
$converted = `polyListComponentConversion -te $itemsForConv`;
else if ($mode == "f")
$converted = `polyListComponentConversion -tf $itemsForConv`;
else if ($mode == "u")
$converted = `polyListComponentConversion -tuv $itemsForConv`;
else if ($mode == "vf")
$converted = `polyListComponentConversion -tvf $itemsForConv`;

else if ($mode == "vi")
$converted = `polyListComponentConversion -tv -in $itemsForConv`;
else if ($mode == "ei")
$converted = `polyListComponentConversion -te -in $itemsForConv`;
else if ($mode == "fi")
$converted = `polyListComponentConversion -tf -in $itemsForConv`;
else if ($mode == "ui")
$converted = `polyListComponentConversion -tuv -in $itemsForConv`;
else if ($mode == "vfi")
$converted = `polyListComponentConversion -tvf -in $itemsForConv`;
else
print "wrong argument";
$converted = `ls -fl $converted`;
return $converted;
}


global proc createSet(string $name)
{
if (`objExists $name`)
delete $name;
sets -name $name;
}


global proc int edgeBordness(string $edge)
{
if (`size (conv({$edge}, "f"))` == 1)
return 1;
else
return 0;
}


global proc string[] sel()
{
return `ls -sl -fl`;
}


global proc selectionMode(string $item, string $mask)
{
/*masks real
pv
pe
pfe
pf
puv
pvf

masks simple
v
e
f
u
vf
*/
if ($mask == "v")
$mask = "pv";
if ($mask == "e")
$mask = "pe";
if ($mask == "f")
$mask = "pf";
if ($mask == "u")
$mask = "puv";
if ($mask == "vf")
$mask = "pvf";

string $selectCmd;
if (`selectMode -q -object`)
{
hilite $item;
selectType -ocm -alc false;
$selectCmd = "selectType -ocm -" + $mask + " true;";
}
else
{
selectType -ocm -alc false;
$selectCmd = "selectType -" + $mask + " true;";
if (!`selectMode -q -preset`)
$selectCmd = $selectCmd + "hilite " + $item + ";";
}
eval $selectCmd;
}


global proc selectSimpleNotBorderVertices()
{
string $vertices[] = conv(`ls -sl`, "v");
string $objSel[] = `ls -sl -o`;
string $vertex;
string $simpleVertices[];
for ($vertex in $vertices)
{
//$vertex = $vertices[0];
$edges = conv({$vertex}, "e");
$faces = conv({$vertex}, "f");
if (`size $edges` <= 2 && `size $faces` > 1)
$simpleVertices[`size $simpleVertices`] = $vertex;
}
select $simpleVertices;
selectionMode($objSel[0], "v");
}


global proc int sizeSel()
{
$size = (size (`ls -sl -fl`));
return $size;
}



global proc string[] stringIntersect(string $string1[], string $string2[])
{
/*
$string1 = {"1", "2", "3"};
$string2 = {"2", "3", "4"};
*/
string $string1no[] = stringArrayRemove($string2, $string1);
string $string2no[] = stringArrayRemove($string1, $string2);

string $string1yes[] = stringArrayRemove($string1no, $string1);
string $string2yes[] = stringArrayRemove($string2no, $string2);

return $string1yes;
}


global proc triangulateAdv()
{
$sel = sel();
ConvertSelectionToFaces;
createSet tmpTrianFaces;
PolySelectConvert 2;
createSet tmpTrianEdges;
select tmpTrianFaces;
polyTriangulate -ch 1;
PolySelectConvert 2;
select -d tmpTrianEdges;
delete tmpTrianFaces;
delete tmpTrianEdges;
selectionMode($sel[0], "edge");
}


global proc string whatIsSel ()
{
string $allSel[] = `ls -sl -fl`;
string $sel = $allSel[0];

if (`size $sel` == 0)
return "0";
int $counter = 1;
for ($counter = 1; $counter < `size $sel`; $counter++)
{

if (`substring $sel $counter $counter` == "[")
{
break;
}
}

if (`size $sel` == $counter)
return "o";
else
{
if (`substring $sel ($counter - 1) ($counter - 1)` == "x")
return "v";
else if (`substring $sel ($counter - 1) ($counter - 1)` == "e")
return "e";
else if (`substring $sel ($counter - 1) ($counter - 1)` == "f")
return "f";
else if (`substring $sel ($counter - 1) ($counter - 1)` == "p")
return "u";
else
return "";
}
return "";
}
lianyifeng
討論區新秀
討論區新秀
 
文章: 2
註冊時間: 7日 9月 2008年, 16:58

Share On:

Share on Facebook Facebook Share on Twitter Twitter

文章lianyifeng » 7日 9月 2008年, 17:12

特別注意:mel內容中出現了 2個笑臉的圖標 ,我也不知道如何出現的, 將 笑臉圖標和它們前面的;一起刪除,就是那個mel的內容!
lianyifeng
討論區新秀
討論區新秀
 
文章: 2
註冊時間: 7日 9月 2008年, 16:58

文章mUser » 8日 9月 2008年, 09:57

謝謝 !!!
mUser
CGV討論區會員
CGV討論區會員
 
文章: 206
註冊時間: 25日 6月 2006年, 01:29

文章255 » 8日 9月 2008年, 20:20

你del了2個笑臉冇了for的內容咩會Syntax error-.-
255
討論區新秀
討論區新秀
 
文章: 74
註冊時間: 13日 11月 2007年, 22:52


回到 Autodesk Maya

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 9 位訪客