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

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

Тема в разделе "Maya", создана пользователем DEL, 29 янв 2009.

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

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Пишу код, который создает связку костей. Хотел написать так, что бы при создании иметь опцию , которая удаляет из связки одну кость. Дело в том, что создав окно создается 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;
    }
     
  2. DEL

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

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

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

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

    С нами с:
    26.10.2006
    Сообщения:
    454
    Симпатии:
    0
    Баллы:
    16
    Эх, давно я не работал с моим любимым 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;
    }

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

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

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Спасибо вам 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.
     
Модераторы: Dark™, Skif

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