对选定的多个对象重复当前的 poly reduce 函数?
Repeat current poly reduce function on multiple objects that are selected?
我正在遍历多个对象,但在转到下一个对象之前循环停止了。
创建了一个有条件的循环。如果满足条件,它会调用 ReduceEdge() 函数。问题是它只会迭代一次,不会转到下一个对象并重复该过程。
global proc ReduceEdge()
{
polySelectEdgesEveryN "edgeRing" 2;
polySelectEdgesEveryN "edgeLoop" 1;
polyDelEdge -cv on;
}
string $newSel[] = `ls -sl`;
for($i = 0; $i < size($newSel); $i++)
{
select $newSel[$i];
int $polyEval[] = `polyEvaluate -e $newSel[$i]`;
int $temp = $polyEval[0];
for($k = 0; $k < $temp; $k++)
{
string $polyInfo[] = `polyInfo -fn ($newSel[$i] + ".f[" + $k + "]")`;
$polyInfo = stringToStringArray($polyInfo[$i]," ");
float $vPosX = $polyInfo[2];
float $vPosY = $polyInfo[3];
float $vPosZ = $polyInfo[4];
if($vPosX == 0 && $vPosY == 0 && $vPosZ == 1.0)
{
select ($newSel[$i] + ".e[" + $k + "]");
ReduceEdge();
}
}
}
预期结果:
如果我 select 4个圆柱体,它们的所有边缘将减少当前数量的一半。
实际结果:
当 4 个圆柱体被 selected 时,只有一个圆柱体减少到边缘的一半。其余保持不变。
既然我的评论对你有所帮助,我会尽量给出更详尽的解释。
您的第一个循环(使用 $i
)遍历您选择的每个对象。这很好。
您的第二个循环(使用 $k
)遍历循环中当前对象的边数。到目前为止,一切都很好。不过,我想知道循环面数是否更正确...
现在你要求对象 $i
索引 $k
处的面的所有面法线的数组,其中 string $polyInfo[] = `polyInfo -fn ($newSel[$i] + ".f[" + $k + "]")`;
.
如果您尝试打印 $polyInfo
中的大小和值,您会发现您有一个包含一个元素的数组,它是您刚才查询的特定面的面法线。因此,它将始终是元素 0,而不是 $i
,它会随着每次迭代而增加。
我制作了一个 Python/PyMEL 版本的脚本,您可能会喜欢。
import pymel.core as pm
import maya.mel as mel
def reduceEdge():
mel.eval('polySelectEdgesEveryN "edgeRing" 2;')
mel.eval('polySelectEdgesEveryN "edgeLoop" 1;')
pm.polyDelEdge(cv=True)
def reducePoly():
selection = pm.ls(sl=True)
for obj in selection:
for i, face in enumerate(obj.f):
normal = face.getNormal()
if (normal.x == 0.0 and normal.y == 0.0 and normal.z == 1.0):
pm.select(obj + '.e[' + str(i) + ']')
reduceEdge()
reducePoly()
我正在遍历多个对象,但在转到下一个对象之前循环停止了。
创建了一个有条件的循环。如果满足条件,它会调用 ReduceEdge() 函数。问题是它只会迭代一次,不会转到下一个对象并重复该过程。
global proc ReduceEdge()
{
polySelectEdgesEveryN "edgeRing" 2;
polySelectEdgesEveryN "edgeLoop" 1;
polyDelEdge -cv on;
}
string $newSel[] = `ls -sl`;
for($i = 0; $i < size($newSel); $i++)
{
select $newSel[$i];
int $polyEval[] = `polyEvaluate -e $newSel[$i]`;
int $temp = $polyEval[0];
for($k = 0; $k < $temp; $k++)
{
string $polyInfo[] = `polyInfo -fn ($newSel[$i] + ".f[" + $k + "]")`;
$polyInfo = stringToStringArray($polyInfo[$i]," ");
float $vPosX = $polyInfo[2];
float $vPosY = $polyInfo[3];
float $vPosZ = $polyInfo[4];
if($vPosX == 0 && $vPosY == 0 && $vPosZ == 1.0)
{
select ($newSel[$i] + ".e[" + $k + "]");
ReduceEdge();
}
}
}
预期结果: 如果我 select 4个圆柱体,它们的所有边缘将减少当前数量的一半。
实际结果:
当 4 个圆柱体被 selected 时,只有一个圆柱体减少到边缘的一半。其余保持不变。
既然我的评论对你有所帮助,我会尽量给出更详尽的解释。
您的第一个循环(使用 $i
)遍历您选择的每个对象。这很好。
您的第二个循环(使用 $k
)遍历循环中当前对象的边数。到目前为止,一切都很好。不过,我想知道循环面数是否更正确...
现在你要求对象 $i
索引 $k
处的面的所有面法线的数组,其中 string $polyInfo[] = `polyInfo -fn ($newSel[$i] + ".f[" + $k + "]")`;
.
如果您尝试打印 $polyInfo
中的大小和值,您会发现您有一个包含一个元素的数组,它是您刚才查询的特定面的面法线。因此,它将始终是元素 0,而不是 $i
,它会随着每次迭代而增加。
我制作了一个 Python/PyMEL 版本的脚本,您可能会喜欢。
import pymel.core as pm
import maya.mel as mel
def reduceEdge():
mel.eval('polySelectEdgesEveryN "edgeRing" 2;')
mel.eval('polySelectEdgesEveryN "edgeLoop" 1;')
pm.polyDelEdge(cv=True)
def reducePoly():
selection = pm.ls(sl=True)
for obj in selection:
for i, face in enumerate(obj.f):
normal = face.getNormal()
if (normal.x == 0.0 and normal.y == 0.0 and normal.z == 1.0):
pm.select(obj + '.e[' + str(i) + ']')
reduceEdge()
reducePoly()