2015-07-26 8 views
1

Я пишу менеджер проекта для Maya в PySide. Цель состоит в том, чтобы перемещаться по содержимому проектов для быстрой доступности. Поэтому я хотел бы, чтобы он автоматически обновлял новую директорию проекта. Насколько я знаю, в Maya ScriptJob нет события типа «Project Changed». Любые советы будут оценены!Проект изменения проекта Autodesk Maya (сигнал)

+0

Как вы настраиваете настройки? Через команду 'setProject' или пользовательский интерфейс Maya? – DrHaze

+0

На самом деле, можете ли вы добавить немного кода, который показывает нам, как вы его установили? – DrHaze

ответ

0

Вы правы, поскольку в команде Maya's scriptJob нет события «Project Changed», вам нужно немного взломать это. Следующий ответ подразумевает изменение файла Майи. Итак, если вам нужно развернуть диспетчер проектов на нескольких компьютерах, вам также придется развернуть модификации файлов Maya.

Возможно, было более простое решение, но не удалось выяснить, как эффективно его использовать с помощью существующих событий.

Примечание:

Я использую Maya 2014, поэтому изменить путь осуществляется в соответствии с вашей текущей версией.


Решение 1 - PyMel основе:

  • Goto 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 необходимо перезапустить поэтому изменения вступают в силу)

  • Выполнить этот код в редакторе сценариев:

    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 основе:

  • Goto 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 необходимо перезапустить поэтому изменения вступают в силу)

  • Выполнить этот код в редакторе сценариев:

    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)