Это надо сохранить под именем windowkivFaceSelect.mel, запихнуть в папку скриптов, загрузить в память Майки и вызывать кнопкой на полке с командой windowkivFaceSelect.
Могут быть косяки... запросто и много... звиняйте, если что :о)))
пришла домой, кое-что дописала, а проверить не на чем... ну уж повешу... такой... :о)))
=========================
// выделяет близкие к перпендикулярным к камере фейсы полигональных объектов
// выделить объект в нужном вьюпорте, по желанию нажать f, затем установить камеру в нужное место
// $perpend - аргумент от 0 до 1, отвечающий за то, какие фейсы будут выделены - чем ближе к 1, тем перпендикулярнее к камере
// $backF - если 2, то грани с противоположной стороны тоже будут выделены, если 1, то не будут
global proc windowkivFaceSelect ()
{
string $nameObject[] = `ls -sl`;
string $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 ($nameObj)" myCamButton;
button -label "Freeze Transformation" -align "right" -c "makeIdentity -apply true -t 1 -r 1 -s 1 $nameObj";
setParent ..;
button -label "Apply" -align "center" -c "kivFaceSelect ($nameObj)" myApButton;
button -label "Close Window" -align "center" -c "closeWin ($nameObj, $myWin, $nameAt, $attrOb)" myClButton;
showWindow myWindow;
}
}
global proc kivFaceSelect (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 (string $nameObj, string $myWin, string $nameAt, string $attrOb)
{
if (`window -exists $myWin`)
deleteUI $myWin;
if (`attributeExists $nameAt $nameObj`)
deleteAttr $attrOb;
}
// удаление введенных ранее доп. аттрибутов и закрытие программы
global proc frSel (string $nameObj)
{
select $nameObj;
FrameSelected;
}