对选定的多个对象重复当前的 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()