Повторить текущую функцию поли уменьшения на нескольких выбранных объектов? - PullRequest
0 голосов
/ 07 января 2019

Я перебираю несколько объектов, но цикл останавливается перед переходом к следующему объекту.

Создан цикл с условием. Если условие выполнено, вызывается функция 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();
        }
    }
}

Ожидаемые результаты: Если я выберу 4 цилиндра, все их ребра уменьшатся вдвое по сравнению с текущим.

Фактические результаты:
Когда выбрано 4 цилиндра, только один уменьшает до половины ребер. Остальные остаются прежними.

1 Ответ

0 голосов
/ 08 января 2019

Поскольку мой комментарий действительно помог вам, я постараюсь дать более подробное объяснение.

Ваш первый цикл (с $i) повторяется для каждого объекта в вашем выборе. Это хорошо.

Ваш второй цикл (с $k) перебирает количество ребер для текущего объекта в цикле. Все идет нормально. Хотя мне интересно, будет ли правильнее цикл числа лиц ...

Теперь вы запрашиваете массив всех нормалей лица лица по индексу $k у объекта $i, с 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()
...