【问题标题】:Maya Python API: Program not closing when running scriptMaya Python API:运行脚本时程序未关闭
【发布时间】:2015-08-03 16:25:19
【问题描述】:

我有一个简短的 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”中放入的东西,当你关闭程序时会自动终止脚本?或者我可以做一些完全不同的事情?

【问题讨论】:

  • camera 在哪里定义?你的意思是currentCamera 吗?
  • 好的,谢谢。编辑得当。

标签: python maya perspectivecamera maya-api


【解决方案1】:

你真的不想在这里while True:。 Maya 在线程方面非常老式——从单独的线程中接触可见场景或 UI 是不行的——因此,如果不完全接管 Maya 会话,就无法轻松创建所需的行为。不幸的是,这会给您带来您正在经历的行为。

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

简单的事情是使用在“空闲”事件上触发的 Maya 脚本作业。这只会在 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

【讨论】:

  • 谢谢,效果很好!我知道 Maya 对线程很敏感,但是将它与 executeDeferred 一起使用修复了它。
【解决方案2】:

您可以通过将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 交互。请注意,您可能需要在动画结束时删除脚本作业的回调。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2019-06-25
    • 2020-07-30
    • 2011-02-23
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多