1

我正在 PySide 中为 Maya 编写项目经理。它的目的是浏览项目内容以便快速访问。所以我希望它自动重新扫描新设置的项目目录。据我所知,maya ScriptJob 命令中没有像“Project Changed”这样的事件。任何建议将不胜感激!

4

1 回答 1

0

你是对的,因为 Maya 的命令中没有任何“项目更改”事件scriptJob,所以你必须对此进行一些修改。以下答案暗示修改 Maya 的文件。因此,如果您需要在多台计算机上部署项目管理器,您还必须部署对 Maya 文件所做的修改。

可能有一个更简单的解决方案,但无法找到如何使用现有事件有效地做到这一点。

笔记:

我使用的是 Maya 2014,所以根据您的实际版本更改提供的路径。


解决方案 1 - 基于 PyMel:

  • C:\Program Files\Autodesk\Maya2014\Python\Lib\site-packages\pymel\core
  • system.py在您喜欢的编辑器中打开
  • 搜索Workspace班级(@547在我的system.py
  • 编辑chdir函数 ( @621):

    @classmethod
    def chdir(self, newdir):
       _OpenMaya.MUserEventMessage.postUserEvent('ProjectChanged')
       return cmds.workspace( dir=newdir )
    
  • 打开一个的Maya(需要重新启动Maya才能使修改生效)

  • 在脚本编辑器中运行此代码:

    import maya.OpenMaya as om
    #Register a new event (IE: Tell maya that this event really exists)
    om.MUserEventMessage.registerUserEvent('ProjectChanged')
    from pymel.all import *
    
    #This function will be called when the project will be changed
    #Do your real stuff inside
    def myCallbackFunction(data):
        print('Got a ChangedProject event!')
    
    #Tell Maya to run myCallbackFunction when ProjectCHanged occurs    
    callbackId = om.MUserEventMessage.addUserEventCallback('ProjectChanged', myCallbackFunction)
    
    #Whange your project directory:
    #   - The ProjectChanged signal will be sent
    #   - Maya will catch it and execute myCallbackFunction
    #   - This will print 'Got a ChangedProject event!'
    workspace.chdir(r"C:\Users\dhasselhoff\Documents\maya\projects\hookedonafeeling")
    
    • 如果要在完成后删除回调函数:om.MUserEventMessage.removeCallback(callbackId)

解决方案 2 - 基于 MEL:

  • C:\Program Files\Autodesk\Maya2014\scripts\others
  • setProject.mel在您喜欢的编辑器中打开
  • 编辑setProject函数 ( @359):

        ...
        // Restore the current directory. The project may have changed, but the cur dir
        // need not
        workspace -dir $oldCurrentDir;
        python("import maya.OpenMaya as om\nom.MUserEventMessage.postUserEvent('ProjectChanged')");
    }
    // Try to set it directly from the name given
    else
    {
        sp_setLocalWorkspaceWithoutPopupDialog $newProject;
        python("import maya.OpenMaya as om\nom.MUserEventMessage.postUserEvent('ProjectChanged')");
    }
    
  • 打开一个的Maya(需要重新启动Maya才能使修改生效)

  • 在脚本编辑器中运行此代码:

    import maya.OpenMaya as om
    #Register a new event (IE: Tell maya that this event really exists)
    om.MUserEventMessage.registerUserEvent('ProjectChanged')
    
    #This function will be called when the project will be changed
    #Do your real stuff inside
    def myCallbackFunction(data):
        print('Got a ChangedProject event!')
    
    #Tell Maya to run myCallbackFunction when ProjectCHanged occurs    
    callbackId = om.MUserEventMessage.addUserEventCallback('ProjectChanged', myCallbackFunction)
    
    #Whange your project directory:
    #   - The ProjectChanged signal will be sent
    #   - Maya will catch it and execute myCallbackFunction
    #   - This will print 'Got a ChangedProject event!'
    mel.eval('setProject("C:\Users\dhasselhoff\Documents\maya\projects\hookedonafeeling");')
    
    • 如果要在完成后删除回调函数:om.MUserEventMessage.removeCallback(callbackId)
于 2015-07-27T11:23:33.567 回答