def deleteLocalControler(self, target): if not cmds.objExists(target): return None transNode = cmds.listConnections(target, type='retargetTransNode') orientNode = cmds.listConnections(target, type='retargetOrientNode') if cmds.nodeType(target) == 'editMatrixByCurve': cmds.delete(target) else: targetP = fnc.getP(target) targetPShape = cmds.listRelatives(targetP, s=1)[0] if cmds.nodeType(targetPShape) == 'retargetLocator': cmds.delete(targetP) else: cmds.delete(target) if transNode: length = fnc.getLastIndex(transNode[0] + '.localData') + 1 for i in range(length): if not cmds.listConnections(transNode[0] + '.localData[%d].localMatrix' % i): mel.eval('removeMultiInstance %s[%d]' % (transNode[0] + '.localData', i)) if orientNode: length = fnc.getLastIndex(orientNode[0] + '.localData') + 1 for i in range(length): if not cmds.listConnections(orientNode[0] + '.localData[%d].localMatrix' % i): mel.eval('removeMultiInstance %s[%d]' % (orientNode[0] + '.localData', i))
def deleteLocalControler(self, target ): if not cmds.objExists( target ): return None transNode = cmds.listConnections( target, type='retargetTransNode' ) orientNode = cmds.listConnections( target, type='retargetOrientNode' ) if cmds.nodeType( target ) == 'editMatrixByCurve' : cmds.delete( target ) else: targetP = fnc.getP( target ) targetPShape = cmds.listRelatives( targetP, s=1 )[0] if cmds.nodeType( targetPShape ) == 'retargetLocator': cmds.delete( targetP ) else: cmds.delete( target ) if transNode: length = fnc.getLastIndex( transNode[0]+'.localData' )+1 for i in range( length ): if not cmds.listConnections( transNode[0]+'.localData[%d].localMatrix' % i ): mel.eval( 'removeMultiInstance %s[%d]' %( transNode[0]+'.localData', i ) ) if orientNode : length = fnc.getLastIndex( orientNode[0]+'.localData' )+1 for i in range( length ): if not cmds.listConnections( orientNode[0]+'.localData[%d].localMatrix' % i ): mel.eval( 'removeMultiInstance %s[%d]' %( orientNode[0]+'.localData', i ) )
def targetConnect(self, target, ctl, base): cmds.connectAttr(target + '.wm', base + '.arrow[1].aimMatrix') beforeMatrixDcmpNode = self.getBeforeMatrixDcmpNode(target) if beforeMatrixDcmpNode: fnc.tryConnect(beforeMatrixDcmpNode + '.ot', base + '.t') fnc.tryConnect(beforeMatrixDcmpNode + '.or', base + '.r') cmds.connectAttr(base + '.wm', base + '.arrow[0].aimMatrix') cmds.connectAttr(ctl + '.t', base + '.arrow[1].offset') retargetNodes = self.getRetargetNodes(target) for retargetNode in retargetNodes: fnc.clearArrayElement(retargetNode + '.localData') index = fnc.getLastIndex(retargetNode + '.localData') + 1 cmds.connectAttr( base + '.wm', retargetNode + '.localData[%d].localMatrix' % index) try: cmds.connectAttr( ctl + '.m', retargetNode + '.localData[%d].localInOffset' % index) except: cmds.connectAttr( ctl + '.m', retargetNode + '.localData[%d].localOffset' % index)
def targetConnect(self, target, ctl, base ): cmds.connectAttr( target+'.wm', base+'.arrow[1].aimMatrix' ) beforeMatrixDcmpNode = self.getBeforeMatrixDcmpNode( target ) if beforeMatrixDcmpNode: fnc.tryConnect( beforeMatrixDcmpNode+'.ot', base+'.t' ) fnc.tryConnect( beforeMatrixDcmpNode+'.or', base+'.r' ) cmds.connectAttr( base+'.wm', base+'.arrow[0].aimMatrix' ) cmds.connectAttr( ctl+'.t', base+'.arrow[1].offset' ) retargetNodes = self.getRetargetNodes( target ) for retargetNode in retargetNodes: fnc.clearArrayElement( retargetNode+'.localData' ) index = fnc.getLastIndex( retargetNode+'.localData' )+1 cmds.connectAttr( base+'.wm', retargetNode+'.localData[%d].localMatrix' % index ) try: cmds.connectAttr( ctl+'.m', retargetNode+'.localData[%d].localInOffset' % index ) except: cmds.connectAttr( ctl+'.m', retargetNode+'.localData[%d].localOffset' % index )
def targetConnect(self, target, ctl, base): cmds.connectAttr(target + '.wm', base + '.arrow[1].aimMatrix') cmds.connectAttr(base + '.wm', base + '.arrow[0].aimMatrix') cmds.connectAttr(ctl + '.t', base + '.arrow[1].offset') retargetNodes = self.getRetargetNodes(target) for retargetNode in retargetNodes: fnc.clearArrayElement(retargetNode + '.localData') index = fnc.getLastIndex(retargetNode + '.localData') + 1 cmds.connectAttr( ctl + '.wm', retargetNode + '.localData[%d].localMatrix' % index) if not cmds.attributeQuery('localMult', node=ctl, ex=1): selList = om.MSelectionList() selList.add(ctl) mObj = om.MObject() selList.getDependNode(0, mObj) nAttr = om.MFnNumericAttribute() aAttrX = nAttr.create("localMultX", "localMultX", om.MFnNumericData.kDouble, 1.0) nAttr.setMin(0.0) aAttrY = nAttr.create("localMultY", "localMultY", om.MFnNumericData.kDouble, 1.0) nAttr.setMin(0.0) aAttrZ = nAttr.create("localMultZ", "localMultZ", om.MFnNumericData.kDouble, 1.0) nAttr.setMin(0.0) aAttr = nAttr.create('localMult', 'localMult', aAttrX, aAttrY, aAttrZ) nAttr.setKeyable(True) nAttr.setStorable(True) modify = om.MDGModifier() modify.addAttribute(mObj, aAttr) modify.doIt() if not cmds.attributeQuery('localMultOrient', node=ctl, ex=1): cmds.addAttr(ctl, ln='localMultOrient', min=0, dv=1) cmds.setAttr(ctl + '.localMultOrient', e=1, k=1) try: cmds.connectAttr( ctl + '.localMult', retargetNode + '.localData[%d].localMult' % index) except: cmds.connectAttr( ctl + '.localMultOrient', retargetNode + '.localData[%d].localMult' % index)
def createSphere(self): sphereNode = cmds.createNode( "polySphere" ) cmds.setAttr( sphereNode+'.subdivisionsAxis', 32 ) cmds.setAttr( sphereNode+'.subdivisionsHeight', 16 ) fnc.clearArrayElement( self._node+'.arrow' ) elementNum = fnc.getLastIndex( self._node+'.arrow' )+1 cmds.connectAttr( sphereNode+'.output', self._node+'.arrow[%d].inputMesh' % elementNum )
def connect(self): retargetBlenderCons = cmds.listConnections( self._target, s=1, d=0, type='retargetBlender' ) if not retargetBlenderCons: return None retargetBlender = retargetBlenderCons[0] connectedIndex = self.getConnectedIndex( retargetBlender, self._namespace ) if connectedIndex == -1: return None if self.isCurveConnected( retargetBlender, self._namespace ): self.replaceSourceAndDestCurve( retargetBlender, self._namespace, self._sourceCrv, self._targetCrv ) return None retargetTrans = cmds.listConnections( retargetBlender+'.input[%d].transMatrix' % connectedIndex )[0] retargetOrient = cmds.listConnections( retargetBlender+'.input[%d].orientMatrix' % connectedIndex )[0] duTrans = cmds.duplicate( retargetTrans, inputConnections=1, n=self._target+'_duTransForLocalCrv' )[0] duOrient = cmds.duplicate( retargetOrient, inputConnections=1, n=self._target+'_duOrientForLocalCrv' )[0] combineMatrix = cmds.createNode( 'transRotateCombineMatrix', n=self._target+'_combineMtxForLocalCrv' ) cmds.connectAttr( duTrans+'.transMatrix', combineMatrix+'.inputTransMatrix' ) cmds.connectAttr( duOrient+'.orientMatrix', combineMatrix+'.inputRotateMatrix' ) multMatrix = cmds.createNode( 'multMatrix', n=self._target+'_multForLocalCrv' ) targetP = cmds.listRelatives( self._target, p=1 )[0] cmds.connectAttr( combineMatrix+'.outputMatrix', multMatrix+'.i[0]' ) cmds.connectAttr( targetP+'.wm', multMatrix+'.i[1]' ) sourceShape = cmds.listRelatives( self._sourceCrv, s=1 )[0] targetShape = cmds.listRelatives( self._targetCrv, s=1 )[0] sourceWorldShape = cmds.createNode( 'transformGeometry', n=self._target+'_sourceWorldShape' ) targetWorldShape = cmds.createNode( 'transformGeometry', n=self._target+'_targetWorldShape' ) cmds.connectAttr( self._sourceCrv+'.wm', sourceWorldShape+'.transform' ) cmds.connectAttr( self._targetCrv+'.wm', targetWorldShape+'.transform' ) cmds.connectAttr( sourceShape+'.local', sourceWorldShape+'.inputGeometry' ) cmds.connectAttr( targetShape+'.local', targetWorldShape+'.inputGeometry' ) editMtxByCurve = cmds.createNode( 'editMatrixByCurve', n=self._target+'_editMtx' ) cmds.connectAttr( sourceWorldShape+'.outputGeometry', editMtxByCurve+'.sourceCurve' ) cmds.connectAttr( targetWorldShape+'.outputGeometry', editMtxByCurve+'.destCurve' ) cmds.connectAttr( multMatrix+'.matrixSum', editMtxByCurve+'.sourceMatrix' ) cmds.connectAttr( targetP+'.wm', editMtxByCurve+'.upMatrix' ) cuIndex = fnc.getLastIndex( retargetTrans+'.localData' )+1 cmds.connectAttr( editMtxByCurve+'.outSourceMatrix', retargetTrans+'.localData[%d].localMatrix' % cuIndex ) cmds.connectAttr( editMtxByCurve+'.outOffsetMatrix', retargetTrans+'.localData[%d].localOffset' % cuIndex ) cmds.connectAttr( editMtxByCurve+'.outSourceMatrix', retargetOrient+'.localData[%d].localMatrix' % cuIndex ) cmds.connectAttr( editMtxByCurve+'.outOffsetMatrix', retargetOrient+'.localData[%d].localOutOffset' % cuIndex )
def targetConnect(self, target, ctl, base ): cmds.connectAttr( target+'.wm', base+'.arrow[1].aimMatrix' ) beforeMatrixNode = self.getBeforeMatrixNode( target ) if beforeMatrixNode: cmds.connectAttr( beforeMatrixNode+'.o', base+'.arrow[0].aimMatrix' ) cmds.connectAttr( ctl+'.t', base+'.arrow[1].offset' ) retargetNodes = self.getRetargetNodes( target ) for retargetNode in retargetNodes: fnc.clearArrayElement( retargetNode+'.localData' ) index = fnc.getLastIndex( retargetNode+'.localData' )+1 cmds.connectAttr( base+'.wm', retargetNode+'.localData[%d].localMatrix' % index ) try: cmds.connectAttr( ctl+'.m', retargetNode+'.localData[%d].localOutOffset' % index ) except: cmds.connectAttr( ctl+'.m', retargetNode+'.localData[%d].localOffset' % index ) if not cmds.attributeQuery( 'localMult', node=base, ex=1 ): selList = om.MSelectionList() selList.add( base ) mObj = om.MObject() selList.getDependNode( 0, mObj ) nAttr = om.MFnNumericAttribute() aAttrX = nAttr.create( "localMultX", "localMultX", om.MFnNumericData.kDouble, 1.0 ) nAttr.setMin( 0.0 ) aAttrY = nAttr.create( "localMultY", "localMultY", om.MFnNumericData.kDouble, 1.0 ) nAttr.setMin( 0.0 ) aAttrZ = nAttr.create( "localMultZ", "localMultZ", om.MFnNumericData.kDouble, 1.0 ) nAttr.setMin( 0.0 ) aAttr = nAttr.create( 'localMult','localMult', aAttrX, aAttrY, aAttrZ ) nAttr.setKeyable( True ) nAttr.setStorable( True ) modify = om.MDGModifier() modify.addAttribute( mObj, aAttr ) modify.doIt() if not cmds.attributeQuery( 'localMultOrient', node=base, ex=1 ): cmds.addAttr( base, ln='localMultOrient', min=0, dv=1 ) cmds.setAttr( base+'.localMultOrient', e=1, k=1 ) try: cmds.connectAttr( base+'.localMult', retargetNode+'.localData[%d].localMult' % index ) except: cmds.connectAttr( base+'.localMultOrient', retargetNode+'.localData[%d].localMult' % index )
def createSphere(self): sphereNode = cmds.createNode("polySphere") cmds.setAttr(sphereNode + '.subdivisionsAxis', 32) cmds.setAttr(sphereNode + '.subdivisionsHeight', 16) fnc.clearArrayElement(self._node + '.arrow') elementNum = fnc.getLastIndex(self._node + '.arrow') + 1 cmds.connectAttr(sphereNode + '.output', self._node + '.arrow[%d].inputMesh' % elementNum)
def create3Torus(self): axisList = ['axisX', 'axisY', 'axisZ'] fnc.clearArrayElement(self._node + '.shapes') elementNum = fnc.getLastIndex(self._node + '.shapes') + 1 for i in range(3): torus = cmds.createNode("polyTorus") cmds.setAttr(torus + '.sectionRadius', 0.05) cmds.setAttr(torus + '.subdivisionsHeight', 8) cmds.setAttr(torus + '.subdivisionsAxis', 32) cmds.setAttr(torus + '.' + axisList[i], .9) cmds.setAttr(torus + '.' + axisList[(i + 1) % 3], 0) cmds.setAttr(torus + '.' + axisList[(i + 2) % 3], 0) cmds.connectAttr( torus + '.output', self._node + '.shapes[%d].inputMesh' % (elementNum + i))
def disconnect( sourceWorldCtl, targetWorldCtl ): def deleteFollowWeightAttrs( tr ): udAttrs = cmds.listAttr( tr, k=1, ud=1 ) if not udAttrs: return None for attr in udAttrs: if attr[-5:] == 'CTL_w': cmds.deleteAttr( tr+'.'+attr ) def disconnectOutWeight( sourceNS, targetNS ): timeControl = timeCmd.getTimeControl( targetNS+'World_CTL', [sourceNS+'World_CTL'] )[0] if not timeControl: return None outWeights = cmds.listConnections( timeControl+'.outWeight', s=0, d=1, c=1, p=1 ) if not outWeights: return None outputs = outWeights[::2] inputs = outWeights[1::2] for i in range( len( outputs ) ): if inputs[i].find( targetNS ) == 0: cmds.disconnectAttr( outputs[i], inputs[i] ) def deleteDistRate( sourceNS, targetNS ): distRates = cmds.ls( sourceNS+'*_distRate' ) connectedAttrs = [] for distRate in distRates: cons = cmds.listConnections( distRate+'.message', d=1, s=0, p=1, c=1 ) if not cons: continue inputs = cons[1::2] outputs = cons[::2] for i in range( len( inputs ) ): cmds.disconnectAttr( outputs[i], inputs[i] ) connectedAttrs += inputs cmds.delete( distRate ) for connectedAttr in connectedAttrs: mel.eval( "removeMultiInstance %s" % connectedAttr ) localCtlInst = editTransform.localControler( sourceWorldCtl, targetWorldCtl ) localCtls = localCtlInst.getLocalControler() for localCtl in localCtls: localCtlInst.deleteLocalControler( localCtl ) sourceNS = sourceWorldCtl.replace( 'World_CTL', '' ) targetNS = targetWorldCtl.replace( 'World_CTL', '' ) disconnectOutWeight( sourceNS, targetNS ) deleteDistRate( sourceNS, targetNS ) retargetTrans = cmds.ls( sourceNS+'*', type='retargetTransNode' ) retargetOrient = cmds.ls( sourceNS+'*', type='retargetOrientNode' ) if retargetTrans: cmds.delete( retargetTrans ) if retargetOrient: cmds.delete( retargetOrient ) retargetBlenders = cmds.ls( targetNS+'*', type='retargetBlender' ) udAttrBlenders = cmds.ls( targetNS+'*', type='udAttrBlender' ) if udAttrBlenders: for udAttrBlender in udAttrBlenders: cons = cmds.listConnections( udAttrBlender, s=1, d=0, c=1, p=1 ) if not cons: cmds.delete( udAttrBlender ) continue outputs = cons[1::2] inputs = cons[::2] for i in range( len( outputs ) ): if outputs[i].find( sourceNS.replace( 'DGTR_','' ) ) == 0: cmds.disconnectAttr( outputs[i], inputs[i] ) fnc.clearArrayElement( udAttrBlender+'.input' ) if fnc.getLastIndex( udAttrBlender+'.input' ) == -1: cmds.delete( udAttrBlender ) if retargetBlenders: for retargetBlender in retargetBlenders: fnc.clearArrayElement( retargetBlender+'.input' ) if not cmds.listConnections( retargetBlender, s=1, d=0, type='retargetTransNode' ): trCons = cmds.listConnections( retargetBlender, s=0, d=1 ) if trCons: deleteFollowWeightAttrs( trCons[0] ) cmds.delete( retargetBlender ) multNodes = cmds.ls( sourceNS+'*', type='multiplyDivide' ) multNodes += cmds.ls( targetNS+'*', type='multiplyDivide' ) if multNodes: cmds.delete( multNodes )
def getConnectedRetargetWorldCtl( targetWorldCtl ): worldCtlList = getWorldCtlList() if targetWorldCtl in worldCtlList: worldCtlList.remove( targetWorldCtl ) retargetNSs = [] sourceNSs = [] for worldCtl in worldCtlList: sourceNSs.append( worldCtl.replace( 'World_CTL', '' ) ) if not sourceNSs: return None targetNS = targetWorldCtl.replace( 'World_CTL', '' ) targetCtls = cmds.ls( targetNS+'*_CTL', tr=1 ) for ctl in targetCtls: retargetBlenderCons = cmds.listConnections( ctl, type='retargetBlender', s=1, d=0 ) retargetUdAttrCons = cmds.listConnections( ctl, type='udAttrBlender', s=1, d=0 ) if retargetBlenderCons: retargetBlender = retargetBlenderCons[0] fnc.clearArrayElement( retargetBlender+'.input' ) inputLen = fnc.getLastIndex( retargetBlender+'.input' )+1 originName = ctl.replace( targetNS, '' ) for i in range( inputLen ): RTTrans = cmds.listConnections( retargetBlender+'.input[%d].transMatrix' % i ) if not RTTrans: continue RTTrans = RTTrans[0].split( '_RTTrans' )[0] RTNamespace = RTTrans.replace( originName, '' ) if RTNamespace in sourceNSs: retargetNSs.append( RTNamespace+'World_CTL' ) sourceNSs.remove( RTNamespace ) if retargetUdAttrCons: retargetUdAttr = retargetUdAttrCons[0] fnc.clearArrayElement( retargetUdAttr+'.input' ) inputLen = fnc.getLastIndex( retargetUdAttr+'.input' )+1 originName = ctl.replace( targetNS, '' ) for i in range( inputLen ): inputAnimNodes = cmds.listConnections( retargetUdAttr+'.input[%d].udAttr[0]' % i ) if not inputAnimNodes: continue udNamespace = inputAnimNodes[0].split( originName )[0]+'DGTR_' if udNamespace in sourceNSs: retargetNSs.append( udNamespace+'World_CTL' ) sourceNSs.remove( udNamespace ) return retargetNSs
def getTimeControl( targetWorldCtl, worldCtlList ): retargetNSs = [] sourceNSs = [] for worldCtl in worldCtlList: sourceNSs.append( worldCtl.replace( 'World_CTL', '' ) ) targetNS = targetWorldCtl.replace( 'World_CTL', '' ) targetCtls = cmds.ls( targetNS+'*_CTL', tr=1 ) for ctl in targetCtls: if not sourceNSs: break retargetBlenderCons = cmds.listConnections( ctl, type='retargetBlender', s=1, d=0 ) if retargetBlenderCons: retargetBlender = retargetBlenderCons[0] fnc.clearArrayElement( retargetBlender+'.input' ) inputLen = fnc.getLastIndex( retargetBlender+'.input' )+1 originName = ctl.replace( targetNS, '' ) for i in range( inputLen ): RTTrans = cmds.listConnections( retargetBlender+'.input[%d].transMatrix' % i ) if not RTTrans: continue RTTrans = RTTrans[0].split( '_RTTrans' )[0] RTNamespace = RTTrans.replace( originName, '' ) if RTNamespace in sourceNSs: timeControls = cmds.ls( RTNamespace.replace( 'DGTR_', '' )+'timeControl*' ) if not timeControls: "%s Motion File has no timeControl." % RTNamespace cuTimeControl = None for timeControl in timeControls: if cmds.nodeType( timeControl ) == 'timeControl': cuTimeControl = timeControl retargetNSs.append( cuTimeControl ) sourceNSs.remove( RTNamespace ) udAttrBlenderCons = cmds.listConnections( ctl, type='udAttrBlender', s=1, d=0 ) if udAttrBlenderCons: retargetUdAttr = udAttrBlenderCons[0] fnc.clearArrayElement( retargetUdAttr+'.input' ) inputLen = fnc.getLastIndex( retargetUdAttr+'.input' )+1 originName = ctl.replace( targetNS, '' ) for i in range( inputLen ): inputAnimNodes = cmds.listConnections( retargetUdAttr+'.input[%d].udAttr[0]' % i ) if not inputAnimNodes: continue udNamespace = inputAnimNodes[0].split( originName )[0]+'DGTR_' if udNamespace in sourceNSs: timeControls = cmds.ls( udNamespace.replace( 'DGTR_', '' )+'timeControl*' ) if not timeControls: "%S Motion File has no timeControl." % udNamespace cuTimeControl = None for timeControl in timeControls: if cmds.nodeType( timeControl ) == 'timeControl': cuTimeControl = timeControl retargetNSs.append( cuTimeControl ) sourceNSs.remove( udNamespace ) return retargetNSs
def connect(self): retargetBlenderCons = cmds.listConnections(self._target, s=1, d=0, type='retargetBlender') if not retargetBlenderCons: return None retargetBlender = retargetBlenderCons[0] connectedIndex = self.getConnectedIndex(retargetBlender, self._namespace) if connectedIndex == -1: return None if self.isCurveConnected(retargetBlender, self._namespace): self.replaceSourceAndDestCurve(retargetBlender, self._namespace, self._sourceCrv, self._targetCrv) return None retargetTrans = cmds.listConnections(retargetBlender + '.input[%d].transMatrix' % connectedIndex)[0] retargetOrient = cmds.listConnections(retargetBlender + '.input[%d].orientMatrix' % connectedIndex)[0] duTrans = cmds.duplicate(retargetTrans, inputConnections=1, n=self._target + '_duTransForLocalCrv')[0] duOrient = cmds.duplicate(retargetOrient, inputConnections=1, n=self._target + '_duOrientForLocalCrv')[0] combineMatrix = cmds.createNode('transRotateCombineMatrix', n=self._target + '_combineMtxForLocalCrv') cmds.connectAttr(duTrans + '.transMatrix', combineMatrix + '.inputTransMatrix') cmds.connectAttr(duOrient + '.orientMatrix', combineMatrix + '.inputRotateMatrix') multMatrix = cmds.createNode('multMatrix', n=self._target + '_multForLocalCrv') targetP = cmds.listRelatives(self._target, p=1)[0] cmds.connectAttr(combineMatrix + '.outputMatrix', multMatrix + '.i[0]') cmds.connectAttr(targetP + '.wm', multMatrix + '.i[1]') sourceShape = cmds.listRelatives(self._sourceCrv, s=1)[0] targetShape = cmds.listRelatives(self._targetCrv, s=1)[0] sourceWorldShape = cmds.createNode('transformGeometry', n=self._target + '_sourceWorldShape') targetWorldShape = cmds.createNode('transformGeometry', n=self._target + '_targetWorldShape') cmds.connectAttr(self._sourceCrv + '.wm', sourceWorldShape + '.transform') cmds.connectAttr(self._targetCrv + '.wm', targetWorldShape + '.transform') cmds.connectAttr(sourceShape + '.local', sourceWorldShape + '.inputGeometry') cmds.connectAttr(targetShape + '.local', targetWorldShape + '.inputGeometry') editMtxByCurve = cmds.createNode('editMatrixByCurve', n=self._target + '_editMtx') cmds.connectAttr(sourceWorldShape + '.outputGeometry', editMtxByCurve + '.sourceCurve') cmds.connectAttr(targetWorldShape + '.outputGeometry', editMtxByCurve + '.destCurve') cmds.connectAttr(multMatrix + '.matrixSum', editMtxByCurve + '.sourceMatrix') cmds.connectAttr(targetP + '.wm', editMtxByCurve + '.upMatrix') cuIndex = fnc.getLastIndex(retargetTrans + '.localData') + 1 cmds.connectAttr( editMtxByCurve + '.outSourceMatrix', retargetTrans + '.localData[%d].localMatrix' % cuIndex) cmds.connectAttr( editMtxByCurve + '.outOffsetMatrix', retargetTrans + '.localData[%d].localOffset' % cuIndex) cmds.connectAttr( editMtxByCurve + '.outSourceMatrix', retargetOrient + '.localData[%d].localMatrix' % cuIndex) cmds.connectAttr( editMtxByCurve + '.outOffsetMatrix', retargetOrient + '.localData[%d].localOutOffset' % cuIndex)
def disconnect(sourceWorldCtl, targetWorldCtl): def deleteFollowWeightAttrs(tr): udAttrs = cmds.listAttr(tr, k=1, ud=1) if not udAttrs: return None for attr in udAttrs: if attr[-5:] == 'CTL_w': cmds.deleteAttr(tr + '.' + attr) def disconnectOutWeight(sourceNS, targetNS): timeControl = timeCmd.getTimeControl(targetNS + 'World_CTL', [sourceNS + 'World_CTL'])[0] if not timeControl: return None outWeights = cmds.listConnections(timeControl + '.outWeight', s=0, d=1, c=1, p=1) if not outWeights: return None outputs = outWeights[::2] inputs = outWeights[1::2] for i in range(len(outputs)): if inputs[i].find(targetNS) == 0: cmds.disconnectAttr(outputs[i], inputs[i]) def deleteDistRate(sourceNS, targetNS): distRates = cmds.ls(sourceNS + '*_distRate') connectedAttrs = [] for distRate in distRates: cons = cmds.listConnections(distRate + '.message', d=1, s=0, p=1, c=1) if not cons: continue inputs = cons[1::2] outputs = cons[::2] for i in range(len(inputs)): cmds.disconnectAttr(outputs[i], inputs[i]) connectedAttrs += inputs cmds.delete(distRate) for connectedAttr in connectedAttrs: mel.eval("removeMultiInstance %s" % connectedAttr) localCtlInst = editTransform.localControler(sourceWorldCtl, targetWorldCtl) localCtls = localCtlInst.getLocalControler() for localCtl in localCtls: localCtlInst.deleteLocalControler(localCtl) sourceNS = sourceWorldCtl.replace('World_CTL', '') targetNS = targetWorldCtl.replace('World_CTL', '') disconnectOutWeight(sourceNS, targetNS) deleteDistRate(sourceNS, targetNS) retargetTrans = cmds.ls(sourceNS + '*', type='retargetTransNode') retargetOrient = cmds.ls(sourceNS + '*', type='retargetOrientNode') if retargetTrans: cmds.delete(retargetTrans) if retargetOrient: cmds.delete(retargetOrient) retargetBlenders = cmds.ls(targetNS + '*', type='retargetBlender') udAttrBlenders = cmds.ls(targetNS + '*', type='udAttrBlender') if udAttrBlenders: for udAttrBlender in udAttrBlenders: cons = cmds.listConnections(udAttrBlender, s=1, d=0, c=1, p=1) if not cons: cmds.delete(udAttrBlender) continue outputs = cons[1::2] inputs = cons[::2] for i in range(len(outputs)): if outputs[i].find(sourceNS.replace('DGTR_', '')) == 0: cmds.disconnectAttr(outputs[i], inputs[i]) fnc.clearArrayElement(udAttrBlender + '.input') if fnc.getLastIndex(udAttrBlender + '.input') == -1: cmds.delete(udAttrBlender) if retargetBlenders: for retargetBlender in retargetBlenders: fnc.clearArrayElement(retargetBlender + '.input') if not cmds.listConnections( retargetBlender, s=1, d=0, type='retargetTransNode'): trCons = cmds.listConnections(retargetBlender, s=0, d=1) if trCons: deleteFollowWeightAttrs(trCons[0]) cmds.delete(retargetBlender) multNodes = cmds.ls(sourceNS + '*', type='multiplyDivide') multNodes += cmds.ls(targetNS + '*', type='multiplyDivide') if multNodes: cmds.delete(multNodes)
def getConnectedRetargetWorldCtl(targetWorldCtl): worldCtlList = getWorldCtlList() if targetWorldCtl in worldCtlList: worldCtlList.remove(targetWorldCtl) retargetNSs = [] sourceNSs = [] for worldCtl in worldCtlList: sourceNSs.append(worldCtl.replace('World_CTL', '')) if not sourceNSs: return None targetNS = targetWorldCtl.replace('World_CTL', '') targetCtls = cmds.ls(targetNS + '*_CTL', tr=1) for ctl in targetCtls: retargetBlenderCons = cmds.listConnections(ctl, type='retargetBlender', s=1, d=0) retargetUdAttrCons = cmds.listConnections(ctl, type='udAttrBlender', s=1, d=0) if retargetBlenderCons: retargetBlender = retargetBlenderCons[0] fnc.clearArrayElement(retargetBlender + '.input') inputLen = fnc.getLastIndex(retargetBlender + '.input') + 1 originName = ctl.replace(targetNS, '') for i in range(inputLen): RTTrans = cmds.listConnections(retargetBlender + '.input[%d].transMatrix' % i) if not RTTrans: continue RTTrans = RTTrans[0].split('_RTTrans')[0] RTNamespace = RTTrans.replace(originName, '') if RTNamespace in sourceNSs: retargetNSs.append(RTNamespace + 'World_CTL') sourceNSs.remove(RTNamespace) if retargetUdAttrCons: retargetUdAttr = retargetUdAttrCons[0] fnc.clearArrayElement(retargetUdAttr + '.input') inputLen = fnc.getLastIndex(retargetUdAttr + '.input') + 1 originName = ctl.replace(targetNS, '') for i in range(inputLen): inputAnimNodes = cmds.listConnections(retargetUdAttr + '.input[%d].udAttr[0]' % i) if not inputAnimNodes: continue udNamespace = inputAnimNodes[0].split(originName)[0] + 'DGTR_' if udNamespace in sourceNSs: retargetNSs.append(udNamespace + 'World_CTL') sourceNSs.remove(udNamespace) return retargetNSs