API на Maya Python: Програмата не се затваря при изпълнение на скрипт

Имам кратък скрипт на Maya, който просто върти камерата непрекъснато в кръг. Проблемът е, че когато се опитам да стартирам скрипта, след като се изпълнява, не мога да затворя приложението, докато не убия скрипта. Използвам cmds.refresh(), но това само опреснява потребителския интерфейс и все още забавя други операции (като затваряне на програмата). Разбирам, че мога просто да убия скрипта на ръка, но бих искал да мога да го направя програмно чрез обратни извиквания или друго подобно нещо.

Ето как изглежда моят код в момента:

import sys
import time
import maya.cmds as cmds
import maya.api.OpenMayaUI as omui

view = omui.M3dView.active3dView()
currentCamera = view.getCamera()

while(True):
    cmds.orbit(currentCamera, ha = 1)
    view.setCamera(currentCamera)
    cmds.refresh()
    time.sleep(.01)

По принцип има ли нещо, което мога да поставя в while() вместо "True", което ще убие скрипта автоматично, когато отидете да затворите програмата? Или нещо, което бих могъл да правя съвсем различно?


person ClydeTheGhost    schedule 03.08.2015    source източник
comment
Къде е дефинирано camera? Имахте предвид currentCamera вместо това?   -  person matthewatabet    schedule 03.08.2015
comment
Да благодаря. Редактирано по подходящ начин.   -  person ClydeTheGhost    schedule 03.08.2015


Отговори (2)


Наистина не искате да while True: тук. Maya е доста старомодна относно нишките - докосването на видимата сцена или потребителския интерфейс от отделна нишка е не-не - така че не можете лесно да създадете поведението, което искате, без да поемете напълно сесията на Maya. За съжаление това ви дава поведението, което изпитвате.

Можете да опитате две основни стратегии:

Простото нещо е да използвате Maya scriptjob, който се задейства при събитието 'idle'. Това ще се опита да стартира само когато Maya не прави нищо друго и -- тъй като Maya го задейства вместо вас в основната нишка -- няма да причини проблеми. Това обаче ще се задейства само когато Maya не прави нищо друго -- така че ако потребителят прави нещо в потребителския интерфейс или сцената, вашият скрипт няма да се задейства. Нещо като:

def orbit_cam():
   cmds.orbit('persp', ha = .01)

cmds.scriptJob(e=('idle', orbit_cam))

Големият недостатък на това е, че нямате никакъв контрол върху честотата, с която се задейства скриптът: това зависи от Maya.

Втората опция е да създадете отделна нишка, за да стартирате скрипта според вашите собствени условия. Тук обаче ще трябва да внимавате, защото функциите, задействани от втората нишка, ще причинят сривове, освен ако не ги обвиете в извикване на maya.util.executeDeferred.

Повече информация: Как да използвате многонишковостта на python (maya) и Как да изпълните Maya MEL процедура на редовни интервали

person theodox    schedule 03.08.2015
comment
Благодаря, това свърши страхотна работа! Знаех, че Maya е докачлива за нишките, но използването му с executeDeferred го поправи. - person ClydeTheGhost; 04.08.2015

Можете да направите това с scriptJob, прикачен към събитието idle.

import time
import sys
import maya.cmds as cmds
import maya.api.OpenMayaUI as omui

view = omui.M3dView.active3dView()
currentCamera = view.getCamera()

def rotate_camera():
    cmds.orbit(currentCamera, ha = 1)
    view.setCamera(currentCamera)
    cmds.refresh()
    time.sleep(.01)

cmds.scriptJob(event=['idle', rotate_camera], killWithScene=True)

Това непрекъснато ще завърта камерата, като същевременно позволява на потребителя да излезе от приложението по всяко време или да взаимодейства с потребителския интерфейс. Имайте предвид, че вероятно ще искате обратно извикване, което изтрива заданието на скрипта, когато анимацията трябва да приключи.

person matthewatabet    schedule 03.08.2015