Открыть обратные вызовы Maya в Python или C++, запросить все обратные вызовы в памяти.

Здравствуйте, мне интересно, есть ли способ запросить все **Созданные пользователем callbacks в Maya? И таким же образом, могу ли я запросить, какие объекты или к ним подключены узлы. Я хочу каждый раз лучше управлять чистотой в памяти и не допускать потери в памяти каких-либо обратных вызовов.**

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
##########################################
class MayaSignals(object):
    def __init__(self):
        super(MayaSignals)       
        self.callback_list = []

    def setCallback(self, node):
        sel = OpenMaya.MSelectionList()
        sel.add(node)
        obj = OpenMaya.MObject()
        sel.getDependNode(0, obj)       
        idx = OpenMaya.MNodeMessage.addAttributeChangedCallback(obj, self.reading_node)
        self.callback_list.append(idx)

    def removeAllCallback(self):
        for idx,itm in enumerate(self.callback_list):
            print(idx, 'removed')
            OpenMaya.MMessage.removeCallback(itm)

    def reading_node(self, msg, plug, otherplug, *clientData):
        if msg & OpenMaya.MNodeMessage.kAttributeSet:
            print ('Attribute Changed On: %s' % plug.name())
        if msg & OpenMaya.MNodeMessage.kConnectionMade:
            print('Connection Created On: %s' % plug.name()) 
        if msg & maya.OpenMaya.MNodeMessage.kConnectionBroken:
            print ("Broken Connection On: %s" % plug.name())

################################################################################################        
node = cmds.ls(sl=True)[0]         #< ------ Node string type

#signal = MayaSignals()            # class to manage the callbacks
#signal.setCallback(node)
signal # # #                       # to keep the instance alive
signal.removeAllCallback()         # remove all into the array 


# ---------------------------------------------`-`---------------------------------------------- #

Здесь я создал пример, в котором я помечаю объект обратным вызовом и также печатаю что-то при выполнении некоторых условий. добавить в массив каждый идентификатор обратного вызова, чтобы удалить его позже.

Мне просто нужен свет, даже если он на C++. Я мог бы проверить документы о рекомендациях здесь.


person Nestor Colt    schedule 23.10.2017    source источник
comment
как только вы потеряете адрес обратного вызова, он исчезнет.   -  person user1767754    schedule 26.12.2017


Ответы (1)


Нет никакого способа делать то, что вы хотите. Самое близкое, что вы можете сделать, это использовать MMessage: :nodeCallbacks для получения идентификаторов обратного вызова, зарегистрированных для определенного узла.

person mayaknife    schedule 24.12.2017
comment
Пожалуйста, добавьте минимальное объяснение в сам ответ, так как предоставленная ссылка может оказаться недоступной в будущем. - person n4m31ess_c0d3r; 24.12.2017
comment
это будет работать, этот пост немного устарел, скажем, 3 месяца назад, но nodeCallbacks действительно работал для меня внутри рабочего процесса, чтобы каким-то образом поддерживать обратные вызовы на радаре. Спасибо, что поделились - person Nestor Colt; 02.01.2018