2017-10-23 1 views
0

Hallo, ich frage mich, ob es eine Möglichkeit ist, alle ** Benutzer abfragen Erstellt callbacks in Maya?, Und auf die gleiche Weise, wenn Ich kann abfragen, welche Objekte oder Knoten mit ihnen verbunden sind. Ich mag zu jeder Zeit die Sauberkeit im Speicher besser verwalten und keinen Rückruf im Speicher verloren lassen. **öffnen Maya Rückrufe in Python oder C++ Abfrage alle Rückrufe in Speicher

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 


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

Hier habe ich ein Beispiel, wo ich ein Objekts auf einen Callback-Tag und Druck etwas, wenn einige Bedingungen passieren auch. Fügen Sie jede Callback-ID zum Array hinzu, um sie später zu löschen.

Ich brauche nur ein Licht, auch wenn in C++ Ich konnte auf die Dokumente über die Empfehlungen hier überprüfen.

+0

Sobald Sie die Adresse des Rückrufs verlieren, ist es weg. – user1767754

Antwort

1

Es gibt keine Möglichkeit zu tun, was Sie wollen. Der nächste, den Sie erreichen können, ist die Verwendung von MMessage::nodeCallbacks, um die Callback-IDs abzurufen, die für einen bestimmten Knoten registriert sind.

+0

Bitte fügen Sie eine minimale Erklärung in der Antwort selbst hinzu, da der angebotene Link möglicherweise in Zukunft nicht mehr verfügbar ist. –

+0

das wird funktionieren, dieser Beitrag ist ein bisschen alt, sagen wir vor 3 Monaten, aber ein nodeCallbacks funktionierte tatsächlich für mich innerhalb des Workflows, um irgendwie die Rückrufe auf dem Radar zu erhalten. ich danke Ihnen für das Teilen –