Команда polySeparate требует на входе полигоналный объект.
Результатом ее действий является несколько объектов (столько, сколько шелов было у исходного объекта).
Команда возвращает массив, в котором перечислены все созданные объекты плюс последним возвращается имя ноды separate.
Т. о., здесь две проблемы:
1) по выделенным фейсам узнать имя объекта. Это имя нужно передать в команду polySeparate. Это решается легко через listRelatives -p. При первом вызове она возвращает имя шейп-ноды (родителя фейсов), а при втором - имя трансформ-ноды.
2) из возвращенного командой polySeparate массива нужно выкинуть последний элемент и из оставшихся понять, какие и новых поверхностей являются отсепарейченными фейсами. Здесь я не придумал ничего лучшего, как возпользоваться историей создания. С помощью команды polyEvaluate можно вычислить площадь полигонального объекта. С помощью изменения атрибутов скейла ноды polyChipOff (выдеяющей выделенные фейсы в отдельный шелл), можно эту площадь превратить в 0. Т. о., я использовал следующий способ: в цикле пробегаю по всем созданным поверхностям и замеряю ее площадь в нормальных условиях и еще раз замеряю при установленном скейле ноды polyChipOff в 0. Если площади совпадают, значит геометрия не является выделенными фейсами. Если же площядь различна, то это - то, что надо, и я вклюачю данную геометрию в массив $a. Т. о., в конце скрипта, геометрия, произведенная из выделенных фейсов содержится в массиве $a.
Последняя команда скрипта вносит объекты из массива $a в слой layer1.
Понятно, что предложенный механизм будет работать не всегда. Но в большинстве случаев, думаю, он будет работать.
Может быть кто-то найдет более умный способ, но я с ходу придумал только такой.
Вот, что получилось:
string $a[] = `ls -sl`;
string $b[] = `listRelatives -p $a`;
string $c[] = `listRelatives -p $b`;
string $d[]=`polyChipOff -ch 1 -kft 1 -dup 0 -off 0 $a`;
string $e[]=`polySeparate -rs 1 -ch 1 $c`;
int $i,$j;
string $f;
float $ar1[],$ar2[];
$i=size($e);
clear $a;
$j=0;
for($f in $e)
{
if($i<=1)break;
$i--;
setAttr ($d[0]+".scaleX") 0;
setAttr ($d[0]+".scaleY") 0;
setAttr ($d[0]+".scaleZ") 0;
$ar1=`polyEvaluate -a $f`;
setAttr ($d[0]+".scaleX") 1;
setAttr ($d[0]+".scaleY") 1;
setAttr ($d[0]+".scaleZ") 1;
$ar2=`polyEvaluate -a $f`;
if($ar1[0]!=$ar2[0])
{
$a[$j]=$f;
$j++;
}
}
editDisplayLayerMembers -noRecurse layer1 $a;