Maya Python API:程序在运行脚本时不关闭

时间:2015-08-03 16:25:20

标签: python maya perspectivecamera maya-api

我有一个简短的Maya脚本,只是将相机连续旋转一圈。问题是,当我尝试运行脚本时,一旦它运行,我就无法关闭应用程序直到我杀死脚本。我使用cmds.refresh()但只刷新UI并仍然延迟其他操作(如关闭程序)。我知道我可以手动杀死脚本,但我希望能够通过回调或其他类似的东西以编程方式进行。

这是我的代码现在的样子:

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"当你关闭程序时会自动杀死脚本?或者我可以完全不同的做法?

2 个答案:

答案 0 :(得分:1)

你真的不想while True:在这里。 Maya在线程方面非常古老 - 从一个单独的线程触摸可见场景或UI是一个禁忌 - 因此,如果不完全接管Maya会话,您就无法轻松创建所需的行为。不幸的是,它会为您提供您正在经历的行为。

您可以尝试两种基本策略:

简单的事情是使用可以触发'idle'事件的maya scriptjob。只有在Maya没有做任何其他事情时才会尝试运行 - 因为Maya会在主线程中为你发射它 - 不会造成任何问题。但是,只有当Maya没有做任何其他事情时才会触发 - 因此,如果用户在UI或场景中执行某些操作,则脚本将不会触发。类似的东西:

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

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

这样做的一大缺点是你无法控制脚本触发的频率:这取决于Maya。

第二个选项是创建一个单独的线程来根据您自己的条件触发脚本。但是你必须要小心,因为从第二个线程触发的函数会导致崩溃,除非你将它们包装在maya.util.executeDeferred的调用中。

更多背景资料:How to use python (maya) multithreadingHow to execute a Maya MEL procedure at regular intervals

答案 1 :(得分: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)

这将持续旋转相机,同时允许用户随时退出应用程序或与UI交互。请注意,您可能需要一个回调,在动画结束时删除脚本作业。