Добавим также кнопку, которая будет очищать очередь Undo, это банальная задача, надо только не забыть увеличить количество столбцов до трех в gridLayout.
Дополнительно добавим в окно галку, которая будет включать обновление экрана во время построения кривой. Галка добавляется командой checkBox, однако лучше использовать команду checkBoxGrp, так как она располагает метку слева от галки и лучше вписывается в дизайн нашего окна. Кроме того, она позволяет создавать до четырех галок одновременно, поэтому для задания значения галки (то есть для включения/выключения) надо использовать флаг -valuel, а не -value. В цикле для построения кривой должна быть проверка типа:
if{'checkBoxGrp -q -valuel REFR'==1) { refresh; }
Итак суперпостроитель процедурных кривых, оформленный в виде процедуры, выглядит следующим образом:
global proc updateMemoryField()
{
float $memArray[] = 'memory -freeMemory’; textFieldGrp -e -text ($memArray[0]+” MB”) FREEMEM;
}
//..............................
global proc curveBuilderProc()
{
int $NumPoints=500;
float $Amp=3.0, $Freq=2.0, $Density=10.0, $xSpeed=5.0;
$NumPoints = 'intSliderGrp -q -value NUMP';
$Amp = 'floatSliderGrp -q -valueAMP';
SFreq = 'floatSliderGrp -q -value FREQ';
$Density = 'floatSliderGrp -q -value DENS';
SxSpeed = 'floatSliderGrp -q -value XSPEED'; if(objExists(“myCurve”)==1) { delete “myCurve”; } int Si;
for($i=0; $i<$NumPoints; $i=$i+1)
{
float $t=$i/$Density;
float $x=$t/SxSpeed;
float $y=$Amp * sin($t*$Freq);
float $z=$Amp * cos($t*$Freq);
if($i==0) { curve -p ($x) ($y) ($z) -n “myCurve”;}
else { curve -p ($x) ($y) ($z) -a “myCurve"; }
iff checkBoxGrp -q -valuel REFR'==1) { refresh; }
}
updateMemoryField;
}
global proc curveBuilder() i
string Swin.name = “CURVE_BUILDER”; if(' window -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; checkBoxGrp -I “Refresh Screen” -valuel 0 REFR; textFieldGrp -I “Free memory” -text (“XXX MB”) -editable 0 FREEMEM; updateMemoryField; separator -style “none” -h 15;
gridLayout -numberOfColumns 3 -cellWidthHeight 128 32; button -I “Build Curve” -w 124 -c “curveBuilderProc”; button -I “Flush Undo” -w 124 -c “flushUndo; updateMemoryField;”; button -I “Close” -w 124 -c (“deleteUI “+$win_name); showWindow $win_name;
curveBuilder; // вызов процедуры
Так как внезапно обнаружилось, что команда memory возвращает массив чисел, то пришлось создать маленькую процедуру updateMemoryField, которая берет первый элемент этого массива и обновляет текстовое поле, содержащее количество свободной памяти. Эту процедуру удобно вызывать сразу после построения кривой, а также после нажатия кнопки Flush Undo.
Теперь, очевидно, следует сохранить получившийся скрипт как текстовый файл под названием curveBuilder.mel и вызывать его командой curveBuilder.