1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем Pavel Bardin, 13 июл 2010.

Модераторы: Dark™, Skif
  1. Pavel Bardin

    Pavel Bardin Пользователь сайта

    С нами с:
    28.02.2008
    Сообщения:
    26
    Симпатии:
    0
    Баллы:
    2
    Здравствуйте уважаемые.
    Мне потребовалось написать простенький скрипт дабы автоматизировать процесс работы.
    Суть такова:
    Я выделаю фейсы и включаю скрипт.
    Он отдирает эти фейсы командой 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. //

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

    alex_alv Активный участник

    С нами с:
    23.04.2008
    Сообщения:
    150
    Симпатии:
    0
    Баллы:
    14
    Команда 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;
     
  3. Pavel Bardin

    Pavel Bardin Пользователь сайта

    С нами с:
    28.02.2008
    Сообщения:
    26
    Симпатии:
    0
    Баллы:
    2
    Спасибо. Все работает.
    Еще был вариант написать что то типа:

    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 содержит все объекты, и по этому есть трудности с запихиванием именно отодранного объекта в слой.

    Ваш вариант решает эту проблему.
     
Модераторы: Dark™, Skif

Поделиться этой страницей