Render.ru

Помогите дописать простенький скрипт

Pavel Bardin

Пользователь сайта
Рейтинг
2
#1
Здравствуйте уважаемые.
Мне потребовалось написать простенький скрипт дабы автоматизировать процесс работы.
Суть такова:
Я выделаю фейсы и включаю скрипт.
Он отдирает эти фейсы командой Extract, затем запихивает результат в нужный мне слой.
Вот мои наработки:

string $b[];
string $a[] = `ls -sl`;
polyChipOff -ch 1 -kft 1 -dup 0 -off 0 $a;
polyPerformAction ("polySeparate -rs 1", "o", 0);
polySeparate $b;
Error: Invalid selection : polySeparate needs exactly 1 polygonal object or polygonal faces from one object. //

Прошу помощи. Спасибо.
 

alex_alv

Активный участник
Рейтинг
11
#2
Команда 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;
 

Pavel Bardin

Пользователь сайта
Рейтинг
2
#3
Спасибо. Все работает.
Еще был вариант написать что то типа:

string $a[]=`ls -sl`;
string $b[]=`ls -sl -o`;
polyChipOff -ch 1 -kft 1 -dup 0 -off 0 $a;
string $c[]=`polySeparate $b`;
select $c[1];
editDisplayLayerMembers -noRecurse layer1 `ls -sl`;

Но тут массив $c содержит все объекты, и по этому есть трудности с запихиванием именно отодранного объекта в слой.

Ваш вариант решает эту проблему.
 
Сверху