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

скрипт по хитрому выделению фейсов для Vinc`a

Тема в разделе "Maya", создана пользователем -, 6 окт 2004.

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

    Вот типа альфа-версия скрипта от Кивиуса...
    кое-как, но работает ;)

    Всё, что ниже черты запишите в файл windowkivFaceSelect.mel
    вызов по команде windowkivFaceSelect

    ------------------------------------------------------------------------

    global proc windowkivFaceSelect()
    {
    global string $nameObj;
    global string $nameAt;
    global string $attrOb;
    global string $myWin;

    string $nameObject[];
    $nameObject = `ls -sl`;
    $nameObj = $nameObject[0];

    string $nameAt = "perpend";
    string $attrOb = ($nameObj + "." + $nameAt);
    string $myWin = "myWindow";

    if (`attributeExists $nameAt $nameObj`) deleteAttr $attrOb;

    // создание окна
    if (`window -exists myWindow`) deleteUI myWindow;
    if (!`window -exists myWindow`)
    {
    window -title "Select Faces To Camera" -w 310 myWindow;
    columnLayout -adjustableColumn true -rs 10;
    text -label $nameObj - align "center";
    addAttr -ln perpend -at double -min 0 -max 1 -dv 0.6 $nameObj;
    attrFieldSliderGrp -label "Perpendicular" -min 0.0 -max 1.0 -attribute ($attrOb) mySlider;
    checkBox -label "Select Back Faces" mycheckBox;
    rowLayout -numberOfColumns 2 -columnWidth2 260 300;
    button -label "Set Camera to Object" -align "left" -c "frSel" myCamButton;
    button -label "Freeze Transformation" -align "right" -c "makeIdentity -apply true -t 1 -r 1 -s 1";
    setParent ..;
    button -label "Apply" -align "center" -c "kivFaceSelect" myApButton;
    button -label "Close Window" -align "center" -c "closeWin" myClButton;
    showWindow myWindow;
    }
    }


    global proc kivFaceSelect()
    {
    global string $nameObj;

    select -clear;
    select $nameObj;
    float $perpend = `getAttr ($nameObj + ".perpend")`;
    int $backF = `checkBox -q -value mycheckBox`;

    // проверка правильности введенных аргументов

    if ($perpend < 0 || $perpend > 1)
    {
    error "The first argument is wrong. Check the perpendicular poly faces is from 0 to 1";
    }
    else
    {
    if ($backF == 0 || $backF == 1)
    {
    // собственно скрипт
    string $nameCam;
    print $nameCam;

    // получение имени камеры окна вьюпорта в фокусе

    string $panel = `getPanel -wf`;
    if ("modelPanel" == `getPanel -to $panel`)
    {
    $nameCam = `modelEditor -q -camera $panel`;
    }

    // проверка на Freeze Transformation объекта

    float $xTOb = `getAttr ($nameObj + ".tx")`;
    float $yTOb = `getAttr ($nameObj + ".ty")`;
    float $zTOb = `getAttr ($nameObj + ".tz")`;
    float $xROb = `getAttr ($nameObj + ".rx")`;
    float $yROb = `getAttr ($nameObj + ".ry")`;
    float $zROb = `getAttr ($nameObj + ".rz")`;
    float $xSOb = `getAttr ($nameObj + ".sx")`;
    float $ySOb = `getAttr ($nameObj + ".sy")`;
    float $zSOb = `getAttr ($nameObj + ".sz")`;

    if ( ($xTOb != 0) || ($yTOb != 0) || ($zTOb != 0) || ($xROb != 0) || ($yROb != 0) || ($zROb != 0) || ($xSOb != 1) || ($ySOb != 1) || ($zSOb != 1))
    {
    warning "For the correct faces selection selected object needs Freeze Transformation";
    }

    float $perpendBack;
    $perpendBack = -1*$perpend;

    //нахождение нормали камеры
    vector $vecVOb;
    vector $vecVCam;
    vector $vecCam;
    float $positionOb[3] = `camera -q -wci $nameCam`;
    float $positionCam[3] = `xform -worldSpace -query -translation $nameCam`;
    $vecVOb = <<$positionOb[0], $positionOb[1], $positionOb[2]>>;
    $vecVCam = <<$positionCam[0], $positionCam[1], $positionCam[2]>>;
    $vecCam = $vecVOb - $vecVCam;
    $vecCam = `unit $vecCam`;

    //получение вектора нормали полигонов
    $fmy = `polyInfo -fn $nameObj`;
    int $countP = size ($fmy);
    for ($i=0; $i<$countP; $i=$i+1)
    {
    string $ObFace = $nameObj + ".f[" + $i + "]";
    string $fmyn = $fmy[$i];
    $ds = size ($fmyn);
    $st = `substring ($fmyn) 21 $ds`;
    vector $vecP = $st;
    $vecP = `unit $vecP`;

    // проверка на параллельность-перпендикулярность векторов нормали и камеры
    float $checkVec = dot ($vecCam, $vecP);

    // выделение фейсов, отвечающих нужным требованиям
    if (($checkVec <= $perpendBack) || ( ($checkVec >= $perpend) && ($backF == 1))) select -add $ObFace;
    }

    // перевод маски выделения в режим фейсов
    // doMenuComponentSelection($nameObj, "facet");

    // чистка массивов
    clear ($positionOb);
    clear ($positionCam);
    }
    else
    {
    error "The second argument is wrong. Selection of the front faces is 0, of the front and back faces is 1";
    }

    }
    }



    // удаление введенных ранее доп. аттрибутов и закрытие программы

    global proc closeWin()
    {
    global string $nameObj;
    global string $nameAt;
    global string $attrOb;
    global string $myWin;

    if (`window -exists $myWin`) deleteUI $myWin;
    if (`attributeExists $nameAt $nameObj`) deleteAttr $attrOb;
    }


    // удаление введенных ранее доп. аттрибутов и закрытие программы

    global proc frSel()
    {
    global string $nameObj;

    select $nameObj;
    FrameSelected;
    }
     
  2. kivius

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

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    Спасибо за потраченное время (а оно либо деньги, либо здоровье! :о))) ) и нечеловеческий труд по розыску косяков в чужом скрипте... в своем-то ни фига не разберешься... Как бы на полном серьёзе... :о)))
     
  3. Guest

    Спасибо в стакан не нальешь! ;-))) (шутка)
    Ты эта... скрипт до ума доводи, типа зубы не заговаривай ;-)))
     
  4. Guest

    Ну ты Кивиус и упрямая птица... Я же тебе говорю что кучу всего лишнего написано, а ты не веришь...
     
  5. Guest

    HawK, не занудствуй!
    Как говорится, не нравится не ешь :о)
    А если уж совсем противно на чужой скрипт смотреть, покажи свой!
     
  6. Guest

    Своего нет, могу написать, если интересно:)) Ну просто правда много всего ненуууужного. Мне ведь не жалко, не с зависти это, уж поверь...
     
  7. Guest

    Дык! верю! =)
    Я сам писать начал, только вот времени не хватает :(
    Завидую я Кивиусу, как у нее сил хватает и днем и ночью за компом сидеть?
    Так вот, если уж есть силы и время, напиши... это будет интересно не мне одному.
     
  8. Guest

    Ок, напишем, только если Кивиус не против будет:)
     
  9. kivius

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

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    Кивиус когда-то был против чего-то?.. :о))) не помню, таблеток так и не принимаю... А я упрямая, это правда, упрямая, вредная, занудная... и проч. перечислять, страницы не хватит :о)))
     
  10. Guest

    Работает!!!!!!!!!!!
    :о))
    Точнее в первый раз почему-то несработало, но дальше все как часы, пасибо наиагромнейшее!!
     
  11. Guest

    Ладно, вот набросок того что имел ввиду я. Процедурка работает на выделенных компонентах. Она отсортировывает из выбранных компонентов те угол между их ориентацией и нормалью камеры которых, находится в конкретном диапазоне. В процедуре две переменных. Первая это максимальный угол, а вторая это back face culling, 1 или 0, соответственно да или нет.


    global proc HKSelectPerpendicularFaces(float $Angle, int $Culling)
    {
    float $Angle; int $Culling;

    $Panel = `getPanel -wf`;
    string $Cam = `modelPanel -q -camera $Panel`;
    $pos = `xform -q -t -ws $Cam`;
    $Aim = `camera -q -wci $Cam`;
    float $Axis[3];
    $Axis[0] = ($Aim[0] - $pos[0]);
    $Axis[1] = ($Aim[1] - $pos[1]);
    $Axis[2] = ($Aim[2] - $pos[2]);
    polySelectConstraint -m 2 -t 0x0008 -o 2 -oa $Axis[0] $Axis[1] $Axis[2] -ob 0 $Angle;
    if($Culling)
    polySelectConstraint -m 2 -t 0x0008 -vp $pos[0] $pos[1] $pos[2] -va 90 -v 1;
    polySelectConstraint -dis;
    }

    HKSelectPerpendicularFaces( 60, 1);
     
  12. Guest

    странно, что $Angle и $Culling объявляются сначала в заголовке процедуры

    global proc HKSelectPerpendicularFaces(float $Angle, int $Culling)

    а потом как локальные переменные в теле процедуры...

    float $Angle; int $Culling;

    что-то здесь не так....
     
  13. Guest

    Это не странно, так должно быть. Если нет скажи что именно "не так" :)
     
Модераторы: Dark™, Skif

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