Render.ru

MEL Еще один вопрос - checkBox

DEL

Активный участник
Рейтинг
15
#1
Пишу код, который создает связку костей. Хотел написать так, что бы при создании иметь опцию , которая удаляет из связки одну кость. Дело в том, что создав окно создается checkBox, значения, которой помещаются в переменную. Потом идет процедура которая дает выбрать какую из действий выполнить исходя из значений переменной checkBox. Есть кнопка которой назначена команда исполнить эту процедуру.Но kоманды помещенные в процедуру не работают таким образом. Они исполняются только тогда когда создано окно и выполнить их надо не как одну процедуру а выделв все кманды вместе и нажав Ctrl+Enter. Тоесть код работает если : сначала выполнить crearUI; createJchain; delJchain; а затем выделить
содержимое Borar(); и ставя галку нажимать Ctrl+Enter. В противном случает мая говорит, что $mychkBx не декларирован.
Как сделать так,что бы обе процедуры пользовались $mychkBx?


global proc crearUI(){

if (`window -exists myWindow`)
deleteUI myWindow;
window -title "new window" -widthHeight 300 200 myWindow;
columnLayout;
string $mychkBx = `checkBox -label "delete joint"`;
button -label "delete" -c "Borar";
showWindow myWindow;
}

proc Borar(){


if(`checkBox -q -v $mychkBx`)
{
createJchain;
}
else
{
createJchain;
delJchain;
}}

global proc createJchain()
{

select -d;
joint -p 0 0 0 ;
joint -p 0 4 0 ;
joint -e -zso -oj xyz joint1;
joint -p 0 8 -1 ;
joint -e -zso -oj xyz joint2;

}

global proc delJchain(){

select joint3;
Unparent;
delete joint2;
select joint3;
select -tgl joint1;
parent;
select -cl;
}
 

DEL

Активный участник
Рейтинг
15
#2
Видимо, я не очень хорошо обяснил суть проблемы, потому , что этот вопрос я задал на другом форуме, на заграничном, и ответ был но несовсем то что хотелось прочитать :(
Суть в том, что бы создать такой пользовательский интерфейс, который бы давал возможность создавать связку костей. Нужно создать также галку, чтобы при активонй галке, нажав кнопку создавалось связка из 3 костей. А когда галка не активна то из 2 костей.
Но есть одно но. При созндании связки из 2 костей, обязателно надо создать первую связку(из 3 костей) а потом выдрать среднюю и соеденить оставшиеся.
Значительно легче было бы сделать это если бы связка из 2 костей создавалась заново а не выдергиванием средней кости, но это очень важно.

Если ктото хочет помочь но снова не понял вопрос , то не стесняйтесь спрашивайте . :)
Заранее благодарю.
 

Fabis

Активный участник
Рейтинг
16
#3
Эх, давно я не работал с моим любимым MEL'ом. Но я все еще помню, что переменная работает внутри процедуры, у вас с процедуре Borar переменная $mychkBx не объявлена и ни на какую функцию не ссылается. Но у checkBox, как и у menuItem есть параметр parent, который позволяет ссылаться на конкретное меню/чекбокс при запросе -q. Поэтому попробуйте вот так:

global proc crearUI(){

if (`window -exists myWindow`)
deleteUI myWindow;
window -title "new window" -widthHeight 300 200 myWindow;
columnLayout;
string $mychkBx = `checkBox -label "delete joint" Menu`;
button -label "delete" -c "Borar";
showWindow myWindow;
}

proc Borar(){


if(`checkBox -q -v -p Menu`)
{
createJchain;
}
else
{
createJchain;
delJchain;
}}

global proc createJchain()
{

select -d;
joint -p 0 0 0 ;
joint -p 0 4 0 ;
joint -e -zso -oj xyz joint1;
joint -p 0 8 -1 ;
joint -e -zso -oj xyz joint2;

}

global proc delJchain(){

select joint3;
Unparent;
delete joint2;
select joint3;
select -tgl joint1;
parent;
select -cl;
}

У меня код работает в соответствии с вашим описанием. ;)
 

DEL

Активный участник
Рейтинг
15
#4
Спасибо вам Fabis. Я тоже нашел ответ но думаю, что ваш вариант более корректен с точки зрения програмирования, тоесть програмист никогда бы не написал так ка сделал я :).

global proc crearUI()
{
global string $mychkBx;

if (`window -exists myWindow`)
deleteUI myWindow;
window -title "new window" -widthHeight 300 200 myWindow;
columnLayout;
string $mychkBx = `checkBox -label "delete joint" Menu`;
button -label "delete" -c "Borar";
showWindow myWindow;
}

proc Borar()
{
global string $mychkBx;
if(`checkBox -q -v $mychkBx`)
{
createJchain;
}
else
{
createJchain;
delJchain;
}
}

global proc createJchain()
{

select -d;
joint -p 0 0 0 ;
joint -p 0 4 0 ;
joint -e -zso -oj xyz joint1;
joint -p 0 8 -1 ;
joint -e -zso -oj xyz joint2;

}

global proc delJchain(){

select joint3;
Unparent;
delete joint2;
select joint3;
select -tgl joint1;
parent;
select -cl;
}

Как видите я обьявил $mychkBx как глобальную переменую в обоеих процедурах. Есть еще вариант - это обьявуть ту же самую глобальную переменную только в процедуре Borar но создать пользовательский интерфейс без процеудуры, на прямую - source.
 
Сверху