问题描述
我想让Maya相机绕网格旋转,而用户在我自己的脚本界面上选择处理该网格。
所以我有一段时间绕着摄像机旋转,但是在发生这种情况时无法与用户界面进行交互。
无论如何,还是要“分享”,还是将焦点放在第二个抽取中才能与用户界面进行交互? 我尝试使用cmds.evaldeferred(),但是没有运气...
从技术上讲,当脚本完成工作时,Maya窗口小部件界面立即可用...
我正在尝试用一个摄像头小轨道完成这项工作,并通过鼠标移动事件重新启动它...时变事件...但是怎么办呢...就像一个守护程序在运行在后台...不知道我怎么能达到这样的目标。
某些代码:
import maya.cmds as cmds
#declares global variable
global orbitCam
#just something to see in the scene
cmds.polyCube()
#function to stop camera orbit
def stopOrbiting():
global orbitCam
orbitCam = False
#simplest ui
cmds.window("testwindow")
cmds.formlayout("flo",parent="testwindow")
#button that calls stopOrbit function
cmds.button("pushMeIfYouCan",parent="flo",label="pushMeIfYouCan",c="stopOrbiting()")
cmds.showWindow("testwindow")
#condition for the while
orbitCam=True
#while itself
while orbitCam:
cmds.orbit("persp",ra=(0.2,0.1))
在摄像机运行时,有什么方法可以按下按钮并与小部件交互?
解决方法
好吧,根据我在问题下发布的链接中mhlester提供的解决方案(并考虑到theodox的一个很好的回答,作为一个不错的选择,谢谢你们,伙计们),我要回答我自己的问题,提供另一个新的详细解释,也许将来会对某人有所帮助。
首先,Maya的“ scriptjob”命令实用程序将一个脚本(或一个函数)存储在内存中,具有一个触发器来开始执行该功能,并且一旦注册并触发,Maya便要执行该功能。必须完全不执行任何操作,因此,Maya必须处于空闲状态。 这样,Maya永远不会因scriptJob而崩溃,崩溃或挂起。基本上,ScriptJob是一种...在后台运行的“守护程序”。
好处是,可以限制每秒的最大次数,因此,如果您关心它,甚至可以保持系统的更新和正常工作。
一旦启动scriptJob(或将其注册在Maya内存中),它可能会被杀死,不再运行,显然,如果我们想再次开始工作,则可以再次注册。
在Maya中存在一个内部scriptJobs列表,如果忘记了将该scriptJob存储在变量中,则可以在其中找到scriptjob,可以在其中找到“ scriptJob ID”,只是一个整数,可以用来杀死工作。
按照第一个理论,现在让我们看一些代码:
此行将注册一个新的守护程序(maya scriptjob),其引用将存储在“ activeDaemon”变量中,它将使用一些参数调用一个名为“ camDaemon”的函数:
activeDaemon = registerDaemon(0.04,BackgroundFunction,ArgumentsForBackgroundFunction)
此处的意义不仅在于启动带有条件的守护程序,还在于存储守护程序ID以便能够使用以下命令杀死它:
cmds.scriptJob(kill=activeDaemon)
如果我们忘记存储守护程序(scriptjob)id,则可以使用此命令来监视Maya的所有scriptJobs列表:
cmds.scriptJob(listJobs=True)
我们需要在列表中找到事件为“ idle”的最后一个id,很可能我们可以击中并结束守护进程将其杀死。
现在让我们看一下“ registerDaemon”功能(MhLester的所有绝对功劳):
def registerDaemon(seconds,backgroundFunction,*args,**kwargs):
def updateNow():
now = time.time()
if now - updateNow.then > seconds:
updateNow.then = now
backgroundFunction(*args,**kwargs)
updateNow.then = time.time()
return cmds.scriptJob(event=("idle",updateNow))
registerDaemon定义了一个内部函数(updateNow),该函数在作为参数传递的backgroundFunction处“自动”调用,包括该“ backgroundFunction”参数。只是。一个函数A定义了一个调用函数C的函数B。它使用第一个参数在注册守护程序时指定的每秒钟调用它,因此,如果我们希望每秒执行25次,则1seg / 25fps = 0.04是正确的值。
要使用此功能,我们必须使用以下命令在模块中导入模块时间:
import time
最后,它将在将其注册到Maya内存的同时返回scriptJob id,并向事件“ idle”和向调用我们真正希望在后台执行的函数(C)的函数(B)进行注册。这样,我们可以控制机器的温度,而不会使CPU变得不必要。最后一行非常完整,至少对我来说很棒。
这时,除了在Maya内存中注册我们要在后台运行的函数外,别无其他(获取您想要在后台运行的代码,放入函数中并在脚本编辑器中执行一次)
def backgroundFunction():
print "this message shows in idle time by a daemon (Maya scriptjob)"
当然,文档(Maya scriptJob documentation)中包含更多的事件或条件列表,但基础是此。