示例#1
0
    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))
示例#2
0
 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 ) )
示例#3
0
    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)
示例#4
0
 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 )
示例#5
0
    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)
示例#6
0
 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 )
示例#7
0
    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 )
示例#8
0
    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 )
示例#9
0
    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)
示例#10
0
    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))
示例#11
0
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 )
示例#12
0
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
示例#13
0
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
示例#14
0
    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)
示例#15
0
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)
示例#16
0
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