我有一个简短的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"当你关闭程序时会自动杀死脚本?或者我可以完全不同的做法?
答案 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) multithreading和How 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交互。请注意,您可能需要一个回调,在动画结束时删除脚本作业。