Примечание. Использование флагов -q и -е сильно напоминает работу с командами getAttr и setAttr для запроса или редактирования атрибутов объектов.
Имена элементов интерфейса Очевидно, что те поля в окне, значения которых мы захотим прочитать перед созданием кривой, должны иметь уникальные имена. Кроме того, следует добавить максимальные и минимальные границы для значений числовых полей Поэтому команды создания окна должны теперь выглядеть примерно так:
string $win_name = “CURVE_BUILDER”;
iffwindow -ex $win_name '==1) { deleteUI $win_name; }
window -t “Curve Builder" $win_name;
columnLayout;
intSliderGrp -I “Num Points” -field 1 -value 500 -min 4 -max 5000 NUMP; floatSliderGrp -I “Amplitude” -field 1 -value 3.0 -min 0 -max 10 AMP; floatSliderGrp -I “Frequency” -field 1 -value 2.0 -min 0 -max 10 FREQ; floatSliderGrp -I “Density” -field 1 -value 10.0 -min 0.01 -max 100 DENS; floatSliderGrp -I “X Speed” -field 1 -value 5.0 -min 0.01 -max 50 XSPEED; separator-style “none” -h 15;
gridLayout -numberOfColumns 2 -cellWidthHeight 192 32; button -I “Build Curve” -w 188 -c “curveBuilderProc “; button -I “Close” -w 188 -c (“deleteUI “+$win_name); showWindow $win_name; Обычно я использую прописные буквы для имен собственных элементов интерфейса, чтобы не перепутать их с уже имеющимися элементами.
Для взрослых. Более профессиональный подход заключается в использовании того имени, которое MAYA сама дает создаваемому элементу. Это имя всегда возвращается командой в режиме создания элемента. Его можно запомнить в переменную (возможно, глобальную) и использовать позже:
Siname = 'intSliderGrp -I ‘‘Num Points" -f 1 -value 500 -min 4 -max 5000';
// Result: CURVE_BLNLDER|columnLayout2|gridLayout3|intSliderGrp1 //
Если вышеприведенные команды создают окно без ошибок, то дело за малым - переделать незначительно процедуру построения кривой. Очевидно, что надо просто прочитать значения числовых полей из окна и «засунуть» их в нужные переменные.
global proc curveBuilderProc()
{
int $NumPoints=500;
float $Amp=3.0, $Freq=2.0, $Density=10.0, $xSpeed=5.0;
SNumPoints = 'intSliderGrp -q -value NUMP';
$Amp = 'floatSliderGrp -q -valueAMP';
SFreq = 'floatSliderGrp -q -value FREQ’;
$Density = 'floatSliderGrp -q -value DENS';
$xSpeed = ’ floatSliderGrp -q -value XSPEED'; if(objExists(“myCurve”)==1) { delete “myCurve"; } int $i;
for($i=0; $i<$NumPoints; $i=$i+1)
{
float $t=$i/$Density; float $x=$t/$xSpeed; float $y=$Amp * sin($t*$Freq); float $z=$Amp * cos($t*$Freq);
ff($i==0) { curve -p ($x) ($y) ($z) -n “myCurve”;} else { curve -p ($x) ($y) ($z) -a “myCurve"; }
}
}
Чтобы прочитать значения числовых полей, надо обратиться к ним с помощью тех же команд, что использовались при их создании, только с флагом -q, при этом запрашивать надо значение флага -value, содержащего числовое значение.
Совет. Добавьте самостоятельно поле для задания спепени кривой.
Посмотрим, как можно также обновлять свойства элементов в окне. Я напомню, что скрипты подобного типа довольно активно поедают память, особенно если у вас задана бесконечная очередь Undo. Чтобы контролировать расход памяти, добавим еще одно числовое поле, которое будет содержать количество свободной памяти и будет обновляться после каждого построения кривой. Команда, с помощью которой можно узнать у MAYA, сколько, по ее мнению, еще есть свободной памяти, называется memory.