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

Mel ожидающий или mel срабатывающий

Тема в разделе "Maya", создана пользователем Ro, 6 мар 2012.

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

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    Добрый день, подскажите, пожалуйста, как сделать:
    1. Запускаем мел-команду, которая ждет и никак себя не выдает до тех пор, пока в сцене не появится объект pSphere1. Когда пользователь создает эту сферу, мел сразу сам пишет "Hello world!" и отключается.
    Или другой вариант, если первый не покатит:
    2. Мел-команда срабатывает каждый раз при любос действии пользователя - создание обьектов, редактирование, удаление и т.д. до тех пор, пока пользователь ее не отключит другой, специально обученной, командой
    Заранее благодарю
     
  2. sanctus

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

    С нами с:
    29.08.2006
    Сообщения:
    312
    Симпатии:
    0
    Баллы:
    16
  3. Dimonn

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

    С нами с:
    26.05.2009
    Сообщения:
    93
    Симпатии:
    13
    Баллы:
    8
    to sanctus

    хорошая команда!
     
  4. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    sanctus, благодарю. Только не нашел способа, что бы scriptJob выполнял действия пока не выполнено нужное условие, после чего он бы сам себя завершал. Для примера простой скрипт - выполняется scriptJob, которsq должен самозавершиться, когда пользователь выберет куб. Пишет, что не может закрыть сам себя
    polyCube;
    scriptJob -e "SelectionChanged" parcing;
    proc parcing(){
    string $selection2[] = `ls -sl`;
    if ($selection2[0] == "pCube1") scriptJob -ka;
    }
    sanctus, есть мнения, как это реализовать без нагромождения процессов?
     
  5. sanctus

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

    С нами с:
    29.08.2006
    Сообщения:
    312
    Симпатии:
    0
    Баллы:
    16
    дело в том что скриптджоб нужно удалять по его номеру.
    а номер ему выдается при созданиии, то есть в теле функции, вы не можете его заранее знать.
    обойти можно.

    посмотрите у меня в блоге в разделе загрузок старый автосейв, в нем кажется я писал подробные комменты.
     
  6. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    Python вам в помощ. делается это быстро и безболезнено.
     
  7. sanctus

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

    С нами с:
    29.08.2006
    Сообщения:
    312
    Симпатии:
    0
    Баллы:
    16
    пример в студию
     
  8. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    Если я правильно понял, то код будет выглядеть будет так :

    Код:
    import maya.cmds as cmds
    
    class ExampleClass:
        def __init__(self):
            
            self.createScriptJob()
            
        def createScriptJob(self):
            self.scriptJobNum = cmds.scriptJob(event=["SelectionChanged", self.myFunction], killWithScene=True)
            
        def deleteScriptJob(self):
            cmds.scriptJob(k = self.scriptJobNum, force=True)    
            
        def myFunction(self):
            
            selectedObject = []
            selectedObject = cmds.ls(selection=True)
            
            if not selectedObject: 
                return
                   
            if selectedObject[0] == "pSphere1":
                print "hello world"
                self.deleteScriptJob()
            
            
    object = ExampleClass()
    object.myFunction()
     
  9. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    Создайте сферу(pSphere1), куб и еще какие нибудь примитивы. Выделите примитивы по очереди, когда дойдете до сферы код выведет- "Hello World" После чего скриптДжоб удалится.
     
  10. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    myFunction() можно инициализировать вместе с createScriptJob()
     
  11. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    # Error: IndentationError: expected an indented block #
     
  12. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
  13. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    # Error: AttributeError: ExampleClass instance has no attribute 'scriptJobNum' #
     
  14. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    А вы уверены , что все правильно делаете? Потому, что я его протестил на двух разных компах и он работает. Иногда по пока непонятным причинам не видит булеан значение для флага selection команды ls, но это лечится повторным вводом кода.
     
  15. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    Вечером, когда вернусь с работы постараюсь снять скрин-видео и выложить его на ютубе.
     
  16. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
  17. Ro

    Ro Знаток

    С нами с:
    28.11.2007
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    28
    Выглядит здорово
     
  18. Cyberika

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

    С нами с:
    17.02.2012
    Сообщения:
    116
    Симпатии:
    9
    Баллы:
    13
    О, я польщен.
     
  19. sanctus

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

    С нами с:
    29.08.2006
    Сообщения:
    312
    Симпатии:
    0
    Баллы:
    16
    Отлично!
     
Модераторы: Dark™, Skif

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