def _apiAttrChanged(self, msg, mplug, other_mp, clientdata): #print('AttrChanged', msg, mplug.info(), msg & _1_ConnAndArrayChangeBits, not self._inputChangeProcNode) if (msg & _1_ConnAndArrayChangeBits) and not self._inputChangeProcNode: # コネクション変更かマルチアトリビュートの増減があった時。 tkns = mplug.info().split('.') if tkns[1].split('[')[0] == 'input': self._inputChangeProcNode = tkns[0] cmds.evalDeferred(self._inputChangedProc) # Copy Tab したアトリビュートエディタは、フレームの閉じるボタンで閉じれば消滅するが、 # ウィンドウ内の Close ボタンで閉じると vis=False 状態で残ってしまう。(maya 2017 win64 調べ) # New Scene したら削除されるようだが、それまでの間も不要な API コールバックが残り続けるのを避けるため、 # ジョブが呼ばれた際に vis をチェックして kill する。 # オブジェクト自体はウィンドウが削除されるまで残ってしまうが、まあ良いとする。 if not _isUIVisible(self.root): #print('KILL APICB & node reference', self.root) if self._cid_attrChanged: _1_MNodeMessage.removeCallback(self._cid_attrChanged) self._cid_attrChanged = None self._mnode = None if self._jid_nodeDeleted: try: cmds.scriptJob(k=self._jid_nodeDeleted, f=True) #print('KILL nodeDeleted JOB', self.root) except: pass self._jid_nodeDeleted = None
def _killApiattrChanged(self): u""" ノード削除時、UI 削除時に API コールバックを kill する。 """ if self._cid_attrChanged: #print('KILL APICB', self.root) _1_MNodeMessage.removeCallback(self._cid_attrChanged) self._cid_attrChanged = None self._jid_nodeDeleted = None # nodeDeleted ジョブは自動削除されるので ID をクリアしておく。 self._mnode = None
def clearCBs(self, event=None): try: print "removing scriptjob" cmds.scriptJob(kill=self.layerChangedJob, force=True) for cache in self.ABCViewerNode.values(): cache.setSelection("") print "removing callbacks" MMessage.removeCallback(self.newNodeCBMsgId) MMessage.removeCallback(self.delNodeCBMsgId) MNodeMessage.removeCallback(self.NodeNameMsgId) except: pass
def clearCBs(self, event=None): try: print "removing scriptjob" cmds.scriptJob( kill=self.layerChangedJob, force=True) for cache in self.ABCViewerNode.values(): cache.setSelection("") print "removing callbacks" MMessage.removeCallback( self.newNodeCBMsgId ) MMessage.removeCallback( self.delNodeCBMsgId ) MNodeMessage.removeCallback( self.NodeNameMsgId ) except: pass
def setNode(self, node): mnode = api2_mnode(node) if not self._mnode or self._mnode != mnode: if self._cid_attrChanged: #print('KILL APICB', self.root) _1_MNodeMessage.removeCallback(self._cid_attrChanged) self._mnode = mnode #print('NEW APICB', self.root) self._cid_attrChanged = _1_MNodeMessage.addAttributeChangedCallback( api1_mnode(node), self._apiAttrChanged) self._jid_nodeDeleted = cmds.scriptJob( p=self.path, rp=True, nd=(node, self._killApiattrChanged)) self._inputChangeProcNode = node self._inputChangedProc() return True return False
def addCBs(self, event=None): try: print "adding callbacks" self.renderLayer.currentIndexChanged.connect(self.layerChanged) self.NodeNameMsgId = MNodeMessage.addNameChangedCallback( MObject(), self.nameChangedCB ) self.newNodeCBMsgId = MDGMessage.addNodeAddedCallback( self.newNodeCB ) self.delNodeCBMsgId = MDGMessage.addNodeRemovedCallback( self.delNodeCB ) print "adding scriptjob" self.layerChangedJob = cmds.scriptJob( e= ["renderLayerManagerChange",self.setCurrentLayer]) except: pass
def addCBs(self, event=None): try: print "adding callbacks" self.renderLayer.currentIndexChanged.connect(self.layerChanged) self.NodeNameMsgId = MNodeMessage.addNameChangedCallback( MObject(), self.nameChangedCB) self.newNodeCBMsgId = MDGMessage.addNodeAddedCallback( self.newNodeCB) self.delNodeCBMsgId = MDGMessage.addNodeRemovedCallback( self.delNodeCB) print "adding scriptjob" self.layerChangedJob = cmds.scriptJob( e=["renderLayerManagerChange", self.setCurrentLayer]) except: pass