Как вызвать обратный вызов при ссылке на файл в сцене - PullRequest
0 голосов
/ 26 апреля 2020

В Maya я хочу запустить определенный обратный вызов после того, как на новый файл ссылаются. Я хочу сделать это в python.

В соответствии с документами это должно быть возможно: https://help.autodesk.com/view/MAYAUL/2018/ENU/?guid=__py_ref_class_open_maya_1_1_m_scene_message_html

Но когда я регистрирую обратные вызовы для kAfterLoadReference или kAfterLoadReferenceAndRecordEdits, функция никогда не срабатывает. Я подключил отладчик и установил точку останова, а функция обратного вызова даже не была введена. Я пробовал обе функции addCallback и addReferenceCallback.

kAfterImport работает как положено. Я что-то упускаю здесь очевидное, или что-то действительно сломано?

проверено в Майя 2018, 2019 и 2020

#create a new file called cube.ma, has a cube in it
TEST_SCENE_NAME = 'cube.ma'

cmds.file(new=1, f=1)
cmds.polyCube()
cmds.file(rn=TEST_SCENE_NAME)
cmds.file(s=1, f=1, type='mayaAscii')
cmds.file(new=1, f=1)

#register callbacks
import maya.api.OpenMaya as om2

def onReferenceLoad(clientData=None):
    print '#'*20
    print 'This is a callback'
    print '#'*20

id1 = om2.MSceneMessage.addReferenceCallback(om2.MSceneMessage.kAfterLoadReferenceAndRecordEdits, onReferenceLoad)
id2 = om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterLoadReferenceAndRecordEdits, onReferenceLoad)

id3 = om2.MSceneMessage.addReferenceCallback(om2.MSceneMessage.kAfterLoadReference, onReferenceLoad)
id4 = om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterLoadReference, onReferenceLoad)

id5 = om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterImportReference, onReferenceLoad)
id6 = om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterImport, onReferenceLoad)

#would expect this to trigger the callback method 5 times, doesn't trigger at all
print 'Referencing the test file'
cmds.file(TEST_SCENE_NAME, r=1, type='mayaAscii')

#correctly triggers the one callback registered
print 'Importing the test file'
cmds.file(TEST_SCENE_NAME, i=1)

#unregister callbacks
om2.MSceneMessage.removeCallbacks([id1,id2,id3,id4,id5,id6])

1 Ответ

2 голосов
/ 27 апреля 2020

Я также ничего не получаю при создании или импорте ссылки с этими обратными вызовами, но этот должен дать вам то, что вы ожидаете:

om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterCreateReference, onReferenceLoad)

Это сработает, когда новый ссылка создана или когда она загружена из незагруженного состояния.

...