2015-08-03 5 views
0

У меня есть короткий скрипт Maya, который просто поворачивает камеру непрерывно по кругу. Проблема в том, что когда я пытаюсь запустить скрипт, после его запуска я не могу закрыть приложение, пока не убью скрипт. Я использую cmds.refresh(), но только обновляет пользовательский интерфейс и все еще задерживает другие операции (например, закрытие программы). Я понимаю, что могу просто убить скрипт вручную, но я хотел бы сделать это программно через обратные вызовы или другое подобное.Maya Python API: программа не закрывается при запуске скрипта

Вот что мой код выглядит как прямо сейчас:

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) 

В основном там что-то я могу поставить в то время как() вместо «True», который будет убивать скрипт автоматически, когда вы идете, чтобы закрыть программу ? Или что-то, что я мог бы сделать совсем по-другому?

+0

Где 'camera' определено? Возможно, вы имели в виду 'currentCamera'? – matthewatabet

+0

Да, спасибо. Отредактировано соответствующим образом. –

ответ

1

Вы действительно не хотите while True: здесь. Майя довольно старомодна в том, что касается нитей - прикосновение к видимой сцене или пользовательский интерфейс из отдельного потока - это не-нет, поэтому вы не можете легко создать такое поведение, которое вы хотите, без полного перехода на сеанс майя. К сожалению, это дает вам поведение, которое вы испытываете.

Вы можете попробовать две основные стратегии:

Простая вещь, чтобы использовать майю scriptjob что огонь на «холостом ходу» события. Это будет работать только тогда, когда Майя ничего не делает, и, поскольку Майя запускает его для вас в основном потоке, это не вызовет никаких проблем. Однако это будет срабатывать только тогда, когда Майя ничего не сделает, поэтому, если пользователь что-то делает в пользовательском интерфейсе или на сцене, ваш сценарий не будет срабатывать. Что-то вроде:

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

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

Большой недостаток состоит в том, что вы не имеете никакого контроля над частотой, с которой скрипт срабатывает: вот до майя.

Второй вариант - создать отдельный поток для запуска сценария на ваших собственных условиях. Однако вы должны быть осторожны, потому что функции, запущенные из второго потока, будут вызывать сбои, если вы не завернете их в вызове maya.util.executeDeferred.

Более фон: How to use python (maya) multithreading и How to execute a Maya MEL procedure at regular intervals

+0

Спасибо, это сработало отлично! Я знал, что Майя была трогательна в потоковом использовании, но использовала его с помощью executeDeferred. –

0

Вы можете сделать это с помощью 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) 

Это постоянно будет вращать камеру, позволяя пользователю выйти из приложения в любое время или взаимодействовать с пользовательским интерфейсом. Обратите внимание, что вам, вероятно, понадобится обратный вызов, который удаляет задание сценария, когда анимация должна закончиться.