コード例 #1
0
 def CurveCtr(self, *args):
     ctrNum = cmds.intSliderGrp('ctrNum', q=True, value=True)
     selCurve = cmds.textField("curvename", q=True, text=True)
     selJnt = cmds.textField("jntname", q=True, text=True)
     global POCNodes
     self.doNumOffset(selCurve)
     print ctrNum, selCurve, selJnt
     try:
         if ctrNum < 1:
             return
         for i in range(0, ctrNum):
             print "im in for circle"
             jntCtrGrp = self.creatJntCtr(selCurve + "_Jnt" +
                                          str(i + self.numOffset))
             print jntCtrGrp
             POCNode = self.creatPointOnCurve(selCurve, jntCtrGrp + "_poc")
             self.POCNodes.append(POCNode)
             print "im out poc"
             print POCNode
             cmds.connectAttr(POCNode + ".position",
                              jntCtrGrp + ".translate")
             cmds.tangentConstraint(selCurve,
                                    jntCtrGrp,
                                    w=1,
                                    aimVector=(1, 0, 0),
                                    worldUpType="objectrotation",
                                    worldUpVector=(0, 1, 0),
                                    worldUpObject=selJnt)
             cmds.scaleConstraint(selJnt + "_Ctrl", jntCtrGrp, mo=True, w=1)
         self.changePosUI()
     except Exception as e:
         raise e
コード例 #2
0
ファイル: utils_mouth.py プロジェクト: adamfok/afok_toolset
def lip_setup(upperLipCurve, lowerLipCurve, upperLocators, lowerLocators, lipUp):

    upperLipCtrlCurve = utils.rebuild_to_ctrlCurve(upperLipCurve, spans=5, name='upperLipRCtrlCurve')
    lowerLipCtrlCurve = utils.rebuild_to_ctrlCurve(lowerLipCurve, spans=5, name='lowerLipRCtrlCurve')

    upperWireNode, upperWire, upperWireBase = utils.wire_deformer(upperLipCtrlCurve, upperLipCurve)
    lowerWireNode, lowerWire, lowerWireBase = utils.wire_deformer(lowerLipCtrlCurve, lowerLipCurve)
    
    upperWireMaster = utils.create_wires_master([upperWire, upperWireBase], name='upperLipRWireMaster_DELETE')
    lowerWireMaster = utils.create_wires_master([lowerWire, lowerWireBase], name='lowerLipRWireMaster_DELETE')    
    
    #upperLocators = utils.create_locators_on_cv(upperLipCurve)
    for loc in upperLocators : 
        utils.revit_locator_to_curve(loc, upperLipCurve)
        cmds.tangentConstraint(upperLipCurve, loc, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject=lipUp)
        cmds.select(clear=True)
        j = cmds.joint()
        g = cmds.group(j)
        pm.parentConstraint(loc, g, mo=False)        
    
    #lowerLocators = utils.create_locators_on_cv(lowerLipCurve)
    for loc in lowerLocators : 
        utils.revit_locator_to_curve(loc, lowerLipCurve)
        cmds.tangentConstraint(lowerLipCurve, loc, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject=lipUp)        
        cmds.select(clear=True)
        j = cmds.joint()
        g = cmds.group(j)
        pm.parentConstraint(loc, g, mo=False)

    return upperLipCurve, lowerLipCurve, upperLipCtrlCurve, lowerLipCtrlCurve
コード例 #3
0
 def tangentNormalAxisSet(self):  # stretch locator attatch and twist setting
     # import var "self.stPOCI_list" , "stCRV_loc"
     self.upLoc_list = list()
     self.twistLoc_list = list()
     for k in self.IKBodyJointList:
         locXform = cmds.xform(k , ws=True, q=True, t=True)
         upLoc = cmds.spaceLocator(n = k.replace(k.split('_')[-1], 'upVec_LOC') , p =(locXform[0],locXform[1],locXform[2]))[0]
         cmds.CenterPivot(upLoc)
         cmds.setAttr('%s.template' % upLoc, 1)
         twistLoc = cmds.spaceLocator(n = k.replace(k.split('_')[-1], 'twist_LOC') , p =(locXform[0],locXform[1],locXform[2]))[0]
         twistLocS = cmds.listRelatives(twistLoc , s=1)[0]
         cmds.parent(twistLoc , self.stCRV_loc[self.IKBodyJointList.index(k)])
         for j in self.XYZ:
             cmds.setAttr('%s.localPosition%s' %(twistLoc,j) , 0 )
             cmds.setAttr('%s.translate%s' %(twistLoc,j) , 0 )
             cmds.setAttr('%s.rotate%s' %(twistLoc,j) , 0 )
         cmds.setAttr('%s.template' % twistLoc, 1)
         cmds.setAttr('%s.ty' %upLoc , 20)
         self.upLoc_list.append(upLoc)
         self.twistLoc_list.append(twistLoc)
     for i in self.stCRV_loc:
         cmds.tangentConstraint(self.pathBody_crv,i,wut='object',wuo='%s' %self.upLoc_list[self.stCRV_loc.index(i)])
     for i in range(len(self.twistLoc_list)):
         cmds.parentConstraint(self.twistLoc_list[i],self.IKBodyJointList[i],mo=1)
     cmds.hide('templateJoint_GRP')
     self.twistBodySet()
     self.upVecLocControlSet()
コード例 #4
0
ファイル: tgpMechanix.py プロジェクト: eyalMDM/MDMthesis
 def pocCon(self,name,ctrl):
     #create pointOnCurve node
     pocNode=mc.createNode("pointOnCurveInfo",name="POC_{0}".format(name))
     #connect POC to connector curve and ctrl
     mc.connectAttr(self.conCurve+".worldSpace",pocNode+".inputCurve", force=True)
     mc.connectAttr(pocNode+".position", ctrl[0]+".translate", force=True)
     mc.connectAttr(ctrl[0]+".position", pocNode+".parameter", force=True)
     
     #tangent constrain to curve
     mc.tangentConstraint(self.conCurve,ctrl[0], aim=(0,1,0), upVector=(0,0,1), wut="vector", wu=(0,1,0))
コード例 #5
0
ファイル: constraint.py プロジェクト: auqeyjf/glTools
def targetAliasList(constraint):
	'''
	Return a list of targets (drivers) attribute aliases for the specified constraint node
	@param constraint: The constraint node whose targets will be returned
	@type constraint: str
	'''
	# Check Constraint
	if not isConstraint(constraint):
		raise Exception('Constraint "'+constraint+'" does not exist!!')
	
	# Get Target List
	targetList = []
	constraintType = mc.objectType(constraint)
	if constraintType == 'aimConstraint': targetList = mc.aimConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'geometryConstraint': targetList = mc.geometryConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'normalConstraint': targetList = mc.normalConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'orientConstraint': targetList = mc.orientConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'parentConstraint': targetList = mc.parentConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'pointConstraint': targetList = mc.pointConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'poleVectorConstraint': targetList = mc.poleVectorConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'scaleConstraint': targetList = mc.scaleConstraint(constraint,q=True,weightAliasList=True)
	elif constraintType == 'tangentConstraint': targetList = mc.tangentConstraint(constraint,q=True,weightAliasList=True)
	
	# Check Target List
	if not targetList: targetList = []
	
	# Return Result
	return targetList
コード例 #6
0
ファイル: constraint.py プロジェクト: bennymuller/glTools
def targetAliasList(constraint):
    """
    Return a list of targets (drivers) attribute aliases for the specified constraint node
    @param constraint: The constraint node whose targets will be returned
    @type constraint: str
    """
    # Check Constraint
    if not isConstraint(constraint):
        raise Exception('Constraint "' + constraint + '" does not exist!!')

    # Get Target List
    targetList = []
    constraintType = cmds.objectType(constraint)
    if constraintType == 'aicmdsonstraint':
        targetList = cmds.aicmdsonstraint(constraint,
                                          q=True,
                                          weightAliasList=True)
    elif constraintType == 'geometryConstraint':
        targetList = cmds.geometryConstraint(constraint,
                                             q=True,
                                             weightAliasList=True)
    elif constraintType == 'normalConstraint':
        targetList = cmds.normalConstraint(constraint,
                                           q=True,
                                           weightAliasList=True)
    elif constraintType == 'orientConstraint':
        targetList = cmds.orientConstraint(constraint,
                                           q=True,
                                           weightAliasList=True)
    elif constraintType == 'parentConstraint':
        targetList = cmds.parentConstraint(constraint,
                                           q=True,
                                           weightAliasList=True)
    elif constraintType == 'pointConstraint':
        targetList = cmds.pointConstraint(constraint,
                                          q=True,
                                          weightAliasList=True)
    elif constraintType == 'poleVectorConstraint':
        targetList = cmds.poleVectorConstraint(constraint,
                                               q=True,
                                               weightAliasList=True)
    elif constraintType == 'scaleConstraint':
        targetList = cmds.scaleConstraint(constraint,
                                          q=True,
                                          weightAliasList=True)
    elif constraintType == 'tangentConstraint':
        targetList = cmds.tangentConstraint(constraint,
                                            q=True,
                                            weightAliasList=True)

    # Check Target List
    if not targetList: targetList = []

    # Return Result
    return targetList
コード例 #7
0
    def CurveInfo(self,jntLable,curveSurface,curveSurfaceAim,numberGrp):
        curveSpace = mc.listRelatives(curveSurface)
        curveAimSpace = mc.listRelatives(curveSurfaceAim)
        curveMaxValue = mc.getAttr(curveSurface+'.maxValue')
        parentGrp = mc.createNode('transform',name =  jntLable +'_hyperbola_grp')
        aimGrp = mc.createNode('transform',name =  jntLable +'_aim_grp')
        pciGrp = mc.createNode('transform',name =  jntLable +'_pci_grp')
        mc.parent(aimGrp,pciGrp,parentGrp)

        for i in range(numberGrp):
            pciNode = mc.createNode('pointOnCurveInfo',name = jntLable +'_Pci' + str(i))
            aimPciNode = mc.createNode('pointOnCurveInfo',name = jntLable +'_AimPci'+  str(i))
            aimPciTransform = mc.createNode('transform',name = jntLable +'_AimPciGrp'+  str(i))
            mc.parent(aimPciTransform,aimGrp)
            pciTransform = mc.createNode('transform',name =  jntLable +'_PciGrp'+ str(i))
            mc.parent(pciTransform,pciGrp)

            jnt = mc.joint( name =jntLable +'_Jnt'+str(i))
            mc.select()
            mc.addAttr(jnt ,longName = 'parameter',at = 'double')
            mc.setAttr(jnt+'.parameter',edit=True,keyable = True)
            mc.connectAttr(jnt+'.parameter',pciNode+'.parameter')
            mc.connectAttr(jnt+'.parameter',aimPciNode+'.parameter')

            mc.connectAttr(curveSpace[0]+'.worldSpace[0]',pciNode+'.inputCurve')
            mc.connectAttr(pciNode+'.positionX',pciTransform+'.translateX')
            mc.connectAttr(pciNode+'.positionY',pciTransform+'.translateY')
            mc.connectAttr(pciNode+'.positionZ',pciTransform+'.translateZ')

            mc.connectAttr(curveAimSpace[0]+'.worldSpace[0]',aimPciNode+'.inputCurve')
            mc.connectAttr(aimPciNode+'.positionX',aimPciTransform+'.translateX')
            mc.connectAttr(aimPciNode+'.positionY',aimPciTransform+'.translateY')
            mc.connectAttr(aimPciNode+'.positionZ',aimPciTransform+'.translateZ')

            if curveMaxValue > 1 :
                cmd = ( int(curveMaxValue) * 0.1 * 10) / (numberGrp - 1 )
            elif curveMaxValue == 1:
                cmd =  1.0 / (numberGrp - 1)

            mc.setAttr(jnt+'.parameter',(cmd*i))
            mc.setAttr(jnt+'.parameter',(cmd*i))
            mc.tangentConstraint(curveSurface,pciTransform,weight=True,aimVector=(1,0,0),upVector=(0,1,0),worldUpType='object',worldUpObject = aimPciTransform )
コード例 #8
0
ファイル: tgpMechanix.py プロジェクト: eyalMDM/MDMthesis
    def pocCon(self, name, ctrl):
        #create pointOnCurve node
        pocNode = mc.createNode("pointOnCurveInfo",
                                name="POC_{0}".format(name))
        #connect POC to connector curve and ctrl
        mc.connectAttr(self.conCurve + ".worldSpace",
                       pocNode + ".inputCurve",
                       force=True)
        mc.connectAttr(pocNode + ".position",
                       ctrl[0] + ".translate",
                       force=True)
        mc.connectAttr(ctrl[0] + ".position",
                       pocNode + ".parameter",
                       force=True)

        #tangent constrain to curve
        mc.tangentConstraint(self.conCurve,
                             ctrl[0],
                             aim=(0, 1, 0),
                             upVector=(0, 0, 1),
                             wut="vector",
                             wu=(0, 1, 0))
コード例 #9
0
def rotateConstraint_modify0(*objects,**option):
    conObj = ''; aimObj = ''; #---------------------------------------------------------------------------
    aimType = ''; wut = 'vector'; wuo = ''; name = '' #    옵션 선언
    aim = [1,0,0]; u = [0,1,0]; wu = [0,1,0]#------------------------------------------------------------
    
    if len(objects) == 0: #------------------------------------------------------------------------
        conObj = cmds.ls(sl=1,tr=1)[0]
        aimObj = cmds.ls(sl=1,tr=1)[1] #        에임 오브젝트와 통제할 오브젝트를 변수에 저장
    else:
        conObj = objects[0]; aimObj = objects[1] #----------------------------------------------------
    for i in option: #---------------------------------------------------------------------------------------------------
        optionType = i; val = option[i]; 
        if optionType == 'aim' or optionType == 'aimVector':
            aim[0] = float(val[0]); aim[1] = float(val[1]); aim[2] = float(val[2])
        if optionType == 'u' or optionType == 'upVector':
            u[0] = float(val[0]); u[1] = float(val[1]); u[2] = float(val[2])                      #각종 옵션값을 사전에서 불러온다
        if optionType == 'wu' or optionType == 'worldUpVector':
            wu[0] = float(val[0]); wu[1] = float(val[1]); wu[2] = float(val[2])
        if optionType == 'atp' or optionType == 'aimType': aimType = val
        if optionType == 'wut' or optionType == 'worldUpType':wut = val;
        if optionType == 'wuo' or optionType == 'worldUpObject':wuo = val
        if optionType == 'n' or optionType == 'name': name = val#--------------------------------------------------------
    
    constraint = ''#------------------------------------------------------------------------------------------------
    if aimType == 'curvetangent':
        if wut == '' or wut == 'vector':
            constraint = cmds.tangentConstraint(conObj,aimObj,aim=aim,u=u)[0]                     #컨스트레인
        elif wut == 'object' or wut == 'objectrotation':
            constraint = cmds.tangentConstraint(conObj,aimObj,aim=aim,u=u,wu=wu,wut=wut,wuo=wuo)[0]
    else:
        if wut == '' or wut == 'vector':
            constraint = cmds.aimConstraint(conObj,aimObj,aim=aim,u=u)[0]
        elif wut == 'object' or wut == 'objectrotation':
            constraint = cmds.aimConstraint(conObj,aimObj,aim=aim,u=u,wu=wu,wut=wut,wuo=wuo)[0]#-----------------------
            
    return constraint
コード例 #10
0
def targetList(constraint):
    '''
	Return a list of targets (drivers) for the specified constraint node
	@param constraint: The constraint node whose targets will be returned
	@type constraint: str
	'''
    # Check Constraint
    if not isConstraint(constraint):
        raise Exception('Constraint "' + constraint + '" does not exist!!')

    # Get Target List
    targetList = []
    constraintType = mc.objectType(constraint)
    if constraintType == 'aimConstraint':
        targetList = mc.aimConstraint(constraint, q=True, tl=True)
    elif constraintType == 'geometryConstraint':
        targetList = mc.geometryConstraint(constraint, q=True, tl=True)
    elif constraintType == 'normalConstraint':
        targetList = mc.normalConstraint(constraint, q=True, tl=True)
    elif constraintType == 'orientConstraint':
        targetList = mc.orientConstraint(constraint, q=True, tl=True)
    elif constraintType == 'parentConstraint':
        targetList = mc.parentConstraint(constraint, q=True, tl=True)
    elif constraintType == 'pointConstraint':
        targetList = mc.pointConstraint(constraint, q=True, tl=True)
    elif constraintType == 'poleVectorConstraint':
        targetList = mc.poleVectorConstraint(constraint, q=True, tl=True)
    elif constraintType == 'scaleConstraint':
        targetList = mc.scaleConstraint(constraint, q=True, tl=True)
    elif constraintType == 'tangentConstraint':
        targetList = mc.tangentConstraint(constraint, q=True, tl=True)

    # Check Target List
    if not targetList: targetList = []

    # Return Result
    return targetList
コード例 #11
0
ファイル: constraints.py プロジェクト: BigBoss0390/openBBlib
def targetList(constraint):
    ''' Return a list of targets (drivers) for the specified constraint node
    :param constraint str: The constraint node whose targets will be returned
    :return: List of target drivers for specified constraint
    :rtype: list
    '''
    # Check Constraint
    if not isConstraint(constraint):
        raise Exception('Constraint {0} does not exist!!'.format(constraint))

    # Get Target List
    targetList = []
    constraintType = cmds.objectType(constraint)
    if constraintType == 'aimConstraint':
        targetList = cmds.aimConstraint(constraint, q=True, tl=True)
    elif constraintType == 'geometryConstraint':
        targetList = cmds.geometryConstraint(constraint, q=True, tl=True)
    elif constraintType == 'normalConstraint':
        targetList = cmds.normalConstraint(constraint, q=True, tl=True)
    elif constraintType == 'orientConstraint':
        targetList = cmds.orientConstraint(constraint, q=True, tl=True)
    elif constraintType == 'parentConstraint':
        targetList = cmds.parentConstraint(constraint, q=True, tl=True)
    elif constraintType == 'pointConstraint':
        targetList = cmds.pointConstraint(constraint, q=True, tl=True)
    elif constraintType == 'poleVectorConstraint':
        targetList = cmds.poleVectorConstraint(constraint, q=True, tl=True)
    elif constraintType == 'scaleConstraint':
        targetList = cmds.scaleConstraint(constraint, q=True, tl=True)
    elif constraintType == 'tangentConstraint':
        targetList = cmds.tangentConstraint(constraint, q=True, tl=True)

    # Check Target List
    if not targetList: targetList = []

    # Return Result
    return targetList
コード例 #12
0
ファイル: constraint.py プロジェクト: bennymuller/glTools
def targetList(constraint):
    """
    Return a list of targets (drivers) for the specified constraint node
    @param constraint: The constraint node whose targets will be returned
    @type constraint: str
    """
    # Check Constraint
    if not isConstraint(constraint):
        raise Exception('Constraint "' + constraint + '" does not exist!!')

    # Get Target List
    targetList = []
    constraintType = cmds.objectType(constraint)
    if constraintType == 'aicmdsonstraint':
        targetList = cmds.aicmdsonstraint(constraint, q=True, tl=True)
    elif constraintType == 'geometryConstraint':
        targetList = cmds.geometryConstraint(constraint, q=True, tl=True)
    elif constraintType == 'normalConstraint':
        targetList = cmds.normalConstraint(constraint, q=True, tl=True)
    elif constraintType == 'orientConstraint':
        targetList = cmds.orientConstraint(constraint, q=True, tl=True)
    elif constraintType == 'parentConstraint':
        targetList = cmds.parentConstraint(constraint, q=True, tl=True)
    elif constraintType == 'pointConstraint':
        targetList = cmds.pointConstraint(constraint, q=True, tl=True)
    elif constraintType == 'poleVectorConstraint':
        targetList = cmds.poleVectorConstraint(constraint, q=True, tl=True)
    elif constraintType == 'scaleConstraint':
        targetList = cmds.scaleConstraint(constraint, q=True, tl=True)
    elif constraintType == 'tangentConstraint':
        targetList = cmds.tangentConstraint(constraint, q=True, tl=True)

    # Check Target List
    if not targetList: targetList = []

    # Return Result
    return targetList
コード例 #13
0
ファイル: constraint.py プロジェクト: jonntd/glTools
def targetList(constraint):
	'''
	Return a list of targets (drivers) for the specified constraint node
	@param constraint: The constraint node whose targets will be returned
	@type constraint: str
	'''
	# Check constraint
	if not mc.objExists(constraint): raise UserInputError('Constraint '+constraint+' does not exist!!')
	constraintType = mc.objectType(constraint)
	# Get target list
	targetList = []
	if constraintType == 'aimConstraint': targetList = mc.aimConstraint(constraint,q=True,tl=True)
	elif constraintType == 'geometryConstraint': targetList = mc.geometryConstraint(constraint,q=True,tl=True)
	elif constraintType == 'normalConstraint': targetList = mc.normalConstraint(constraint,q=True,tl=True)
	elif constraintType == 'orientConstraint': targetList = mc.orientConstraint(constraint,q=True,tl=True)
	elif constraintType == 'parentConstraint': targetList = mc.parentConstraint(constraint,q=True,tl=True)
	elif constraintType == 'pointConstraint': targetList = mc.pointConstraint(constraint,q=True,tl=True)
	elif constraintType == 'poleVectorConstraint': targetList = mc.poleVectorConstraint(constraint,q=True,tl=True)
	elif constraintType == 'scaleConstraint': targetList = mc.scaleConstraint(constraint,q=True,tl=True)
	elif constraintType == 'tangentConstraint': targetList = mc.tangentConstraint(constraint,q=True,tl=True)
	# Check target list
	if not targetList: targetList = []
	# Return result
	return targetList
コード例 #14
0
ファイル: muscle.py プロジェクト: bennymuller/glTools
def build(attachments=4, sections=9, sectionsSpans=8, minRadius=0.0, maxRadius=1.0, startPt=[0.0, 0.0, 6.0],
          endPt=[0.0, 0.0, -6.0], prefix='muscle'):
    """
    Build muscle primitive based on the input argument values between the start and end points

    @param attachments: Number of attachments points
    @type attachments: int
    @param sections: Number of profile curves
    @type sections: int
    @param sectionSpans: Number of spans for profile curves
    @type sectionSpans: int
    @param minRadius: Minimum radius for muscle profile curves
    @type minRadius: float
    @param maxRadius: Maximum radius for muscle profile curves
    @type maxRadius: float
    @param startPt: Start point of the muscle
    @type startPt: list
    @param endPt: End point of the muscle
    @type endPt: list
    @param prefix: Name prefix for muscle primitive
    @type prefix: str

    @return: Muscle mesh
    @returnType: str
    """
    # Checks

    # Get start, end and distance values
    startPoint = glTools.utils.base.getMPoint(startPt)
    endPoint = glTools.utils.base.getMPoint(endPt)
    startEndOffset = endPoint - startPoint
    startEndDist = startEndOffset.length()
    startEndInc = startEndDist / (attachments - 1)

    # Calculate attachment point positions
    attachPoints = []
    for i in range(attachments):
        attachPoints.append(startPoint + (startEndOffset.normal() * startEndInc * i))
        # Start Tangent
        if not i:
            attachPoints.append(startPoint + (startEndOffset.normal() * startEndInc * 0.5))
        # End Tangent
        if i == (attachments - 2):
            attachPoints.append(startPoint + (startEndOffset.normal() * startEndInc * (i + 0.5)))
    attachPts = [[pt.x, pt.y, pt.z] for pt in attachPoints]
    # Resize attachments value to accomodate for tangent points
    attachments = len(attachPts)

    # ------------------------
    # - Build base hierarchy -
    # ------------------------

    # Create groups
    muscleGrp = cmds.createNode('transform', n=prefix + '_group')
    muscleAttachGrp = cmds.createNode('transform', n=prefix + '_attachment_group')
    muscleProfileGrp = cmds.createNode('transform', n=prefix + '_profile_group')

    # Build hierarchy
    cmds.parent(muscleAttachGrp, muscleGrp)
    cmds.parent(muscleProfileGrp, muscleGrp)

    # ----------------------
    # - Build Muscle Curve -
    # ----------------------

    # Build muscle base curve
    muscleCurve = cmds.rename(cmds.curve(d=1, p=attachPts, k=range(len(attachPts))), prefix + '_curve')
    cmds.rebuildCurve(muscleCurve, ch=0, rpo=1, rt=0, end=1, kr=0, kcp=1, kep=1, kt=1, s=0, d=1)
    muscleCurveShape = cmds.listRelatives(muscleCurve, s=True)[0]
    cmds.parent(muscleCurve, muscleAttachGrp)

    # Add muscle attributes
    cmds.addAttr(muscleCurve, ln='muscle', at='message')
    cmds.addAttr(muscleCurve, ln='muscleObjectType', dt='string')
    cmds.setAttr(muscleCurve + '.muscleObjectType', 'spline', type='string', l=True)

    # Connect curve to attachment locators
    attachLocators = glTools.utils.curve.locatorCurve(muscleCurve, locatorScale=0.1, freeze=False, prefix=prefix)
    # Rename attachment locators and add muscle attibutes
    for i in range(len(attachLocators)):
        # Add muscle attibutes
        cmds.addAttr(attachLocators[i], ln='muscle', at='message')
        cmds.addAttr(attachLocators[i], ln='muscleObjectType', dt='string')
        cmds.setAttr(attachLocators[i] + '.muscleObjectType', 'attachment', type='string', l=True)

        # Rename attachment locators
        if not i:
            attachLocators[i] = cmds.rename(attachLocators[i], prefix + '_attachStart_locator')
        elif i == 1:
            attachLocators[i] = cmds.rename(attachLocators[i], prefix + '_attachStartTangent_locator')
            cmds.setAttr(attachLocators[i] + '.muscleObjectType', l=False)
            cmds.setAttr(attachLocators[i] + '.muscleObjectType', 'attachmentTangent', type='string', l=True)
        elif i == (attachments - 2):
            attachLocators[i] = cmds.rename(attachLocators[i], prefix + '_attachEndTangent_locator')
            cmds.setAttr(attachLocators[i] + '.muscleObjectType', l=False)
            cmds.setAttr(attachLocators[i] + '.muscleObjectType', 'attachmentTangent', type='string', l=True)
        elif i == (attachments - 1):
            attachLocators[i] = cmds.rename(attachLocators[i], prefix + '_attachEnd_locator')
        else:
            attachLocators[i] = cmds.rename(attachLocators[i], prefix + '_attachMid' + str(i - 1) + '_locator')

    # Group attachment locators
    attachLocGroup = []
    [attachLocGroup.append(glTools.utils.base.group(loc)) for loc in attachLocators]
    cmds.parent(attachLocGroup, muscleAttachGrp)

    # Create spline rebuild curve
    splineCurve = cmds.rebuildCurve(muscleCurve, ch=1, rpo=0, rt=0, end=1, kr=0, kcp=0, kep=1, kt=1, s=5, d=3)
    splineRebuild = cmds.rename(splineCurve[1], prefix + '_spline_rebuildCurve')
    splineCurveShape = cmds.rename(cmds.listRelatives(splineCurve[0], s=True)[0], prefix + '_spline_curveShape')
    cmds.parent(splineCurveShape, muscleCurve, s=True, r=True)
    cmds.delete(splineCurve[0])

    # Create tangent rebuild curve
    tangentCurve = cmds.rebuildCurve(muscleCurve, ch=1, rpo=0, rt=0, end=1, kr=0, kcp=0, kep=1, kt=1, s=2, d=3)
    tangentRebuild = cmds.rename(tangentCurve[1], prefix + '_tangent_rebuildCurve')
    tangentCurveShape = cmds.rename(cmds.listRelatives(tangentCurve[0], s=True)[0], prefix + '_tangent_curveShape')
    cmds.parent(tangentCurveShape, muscleCurve, s=True, r=True)
    cmds.delete(tangentCurve[0])

    # Create curve visibility attributes
    cmds.addAttr(muscleCurve, ln='attachment', at='enum', en='Off:On:')
    cmds.setAttr(muscleCurve + '.attachment', k=False, cb=True)
    cmds.connectAttr(muscleCurve + '.attachment', muscleCurveShape + '.v')

    cmds.addAttr(muscleCurve, ln='spline', at='enum', en='Off:On:')
    cmds.setAttr(muscleCurve + '.spline', k=False, cb=True)
    cmds.connectAttr(muscleCurve + '.spline', splineCurveShape + '.v')

    cmds.addAttr(muscleCurve, ln='tangent', at='enum', en='Off:On:')
    cmds.setAttr(muscleCurve + '.tangent', k=False, cb=True)
    cmds.connectAttr(muscleCurve + '.tangent', tangentCurveShape + '.v')

    cmds.setAttr(muscleCurve + '.attachment', 0)
    cmds.setAttr(muscleCurve + '.spline', 1)
    cmds.setAttr(muscleCurve + '.tangent', 1)

    # Setup start tangent toggle
    cmds.addAttr(attachLocators[0], ln='tangentControl', at='enum', en='Off:On:')
    cmds.setAttr(attachLocators[0] + '.tangentControl', k=False, cb=True)
    cmds.connectAttr(attachLocators[0] + '.tangentControl', attachLocGroup[1] + '.v', f=True)
    startTangentBlend = cmds.createNode('blendColors', n=prefix + '_startTangent_blendColors')
    cmds.connectAttr(attachLocators[1] + '.worldPosition[0]', startTangentBlend + '.color1', f=True)
    cmds.connectAttr(attachLocators[2] + '.worldPosition[0]', startTangentBlend + '.color2', f=True)
    cmds.connectAttr(attachLocators[0] + '.tangentControl', startTangentBlend + '.blender', f=True)
    cmds.connectAttr(startTangentBlend + '.output', muscleCurve + '.controlPoints[1]', f=True)
    # Setup end tangent toggle
    cmds.addAttr(attachLocators[-1], ln='tangentControl', at='enum', en='Off:On:')
    cmds.setAttr(attachLocators[-1] + '.tangentControl', k=False, cb=True)
    cmds.connectAttr(attachLocators[-1] + '.tangentControl', attachLocGroup[-2] + '.v', f=True)
    endTangentBlend = cmds.createNode('blendColors', n=prefix + '_endTangent_blendColors')
    cmds.connectAttr(attachLocators[-2] + '.worldPosition[0]', endTangentBlend + '.color1', f=True)
    cmds.connectAttr(attachLocators[-3] + '.worldPosition[0]', endTangentBlend + '.color2', f=True)
    cmds.connectAttr(attachLocators[-1] + '.tangentControl', endTangentBlend + '.blender', f=True)
    cmds.connectAttr(endTangentBlend + '.output', muscleCurve + '.controlPoints[' + str(attachments - 2) + ']', f=True)

    # -------------------------------
    # - Build Muscle Profile Curves -
    # -------------------------------

    # Initialize profile list
    profileList = []
    profileGrpList = []
    profileFollowList = []

    # Iterate through profiles
    profileInc = 1.0 / (sections - 1)
    for i in range(sections):

        # Create profile curve
        profile = cmds.circle(ch=0, c=(0, 0, 0), nr=(0, 0, 1), sw=360, r=1, d=3, ut=0, tol=0.01, s=sectionsSpans,
                            n=prefix + '_profile' + str(i + 1) + '_curve')[0]
        profileList.append(profile)

        # Add muscle profile attribute
        cmds.addAttr(profile, ln='muscle', at='message')
        cmds.addAttr(profile, ln='muscleObjectType', dt='string')
        cmds.setAttr(profile + '.muscleObjectType', 'profile', type='string', l=True)

        # Group profile curve
        profileGrp = glTools.utils.base.group(profile)
        profileGrpList.append(profileGrp)

        # Skip start/end profiles
        if (not i) or (i == (sections - 1)): continue

        # Add curve parameter attribute
        cmds.addAttr(profile, ln='uValue', min=0.0, max=1.0, dv=profileInc * i)
        cmds.setAttr(profile + '.uValue', k=False, cb=True)

        # Create profile pointOnCurveInfo node
        profileCurveInfo = cmds.createNode('pointOnCurveInfo', n=prefix + '_profile' + str(i + 1) + '_pointOnCurveInfo')

        # Attach profile group to point on muscle spline curve
        cmds.connectAttr(splineCurveShape + '.worldSpace[0]', profileCurveInfo + '.inputCurve', f=True)
        cmds.connectAttr(profile + '.uValue', profileCurveInfo + '.parameter', f=True)
        cmds.connectAttr(profileCurveInfo + '.position', profileGrp + '.translate', f=True)

        # Create profile follow group
        profileFollowGrp = cmds.createNode('transform', n=prefix + '_profileFollow' + str(i + 1) + '_group')
        profileFollowList.append(profileFollowGrp)
        cmds.connectAttr(profileCurveInfo + '.position', profileFollowGrp + '.translate', f=True)

    cmds.parent(profileGrpList, muscleProfileGrp)
    cmds.parent(profileFollowList, muscleProfileGrp)

    # ------------------------------------
    # - Create profile orientation setup -
    # ------------------------------------

    oddProfile = sections % 2
    intProfile = int(sections * 0.5)
    midProfile = intProfile + oddProfile
    intIncrement = 1.0 / intProfile

    # Create mid profile orientConstraint
    if oddProfile:
        midPointObject = profileFollowList[midProfile - 2]
    else:
        midPointObject = cmds.createNode('transform', n=prefix + '_midPointFollow_group')
        cmds.parent(midPointObject, muscleProfileGrp)
    midOrientCon = cmds.orientConstraint([attachLocators[0], attachLocators[-1]], midPointObject,
                                       n=prefix + '_midPoint_orientConstraint')

    # Create intermediate profile orientConstraints
    for i in range(intProfile):

        # Skip start/end profiles
        if not i: continue

        # Create orientConstraints
        startMidOriCon = cmds.orientConstraint([attachLocators[0], midPointObject], profileFollowList[i - 1])[0]
        endMidOriCon = cmds.orientConstraint([attachLocators[-1], midPointObject], profileFollowList[-(i)])[0]
        startMidOriWt = cmds.orientConstraint(startMidOriCon, q=True, weightAliasList=True)
        endMidOriWt = cmds.orientConstraint(endMidOriCon, q=True, weightAliasList=True)

        # Set constraint weights
        cmds.setAttr(startMidOriCon + '.' + startMidOriWt[0], 1.0 - (intIncrement * i))
        cmds.setAttr(startMidOriCon + '.' + startMidOriWt[1], (intIncrement * i))
        cmds.setAttr(endMidOriCon + '.' + endMidOriWt[0], 1.0 - (intIncrement * i))
        cmds.setAttr(endMidOriCon + '.' + endMidOriWt[1], (intIncrement * i))

        # Add constraint weight attribute to profile
        cmds.addAttr(profileList[i], ln='twist', min=0, max=1, dv=1.0 - (intIncrement * i), k=True)
        cmds.addAttr(profileList[-(i + 1)], ln='twist', min=0, max=1, dv=1.0 - (intIncrement * i), k=True)

        # Connect twist attribite to constraint weights
        startMidOriRev = cmds.createNode('reverse', n=profileList[i].replace('_curve', '_reverse'))
        endMidOriRev = cmds.createNode('reverse', n=profileList[-(i + 1)].replace('_curve', '_reverse'))
        cmds.connectAttr(profileList[i] + '.twist', startMidOriRev + '.inputX', f=True)
        cmds.connectAttr(profileList[i] + '.twist', startMidOriCon + '.' + startMidOriWt[0], f=True)
        cmds.connectAttr(startMidOriRev + '.outputX', startMidOriCon + '.' + startMidOriWt[1], f=True)
        cmds.connectAttr(profileList[-(i + 1)] + '.twist', endMidOriRev + '.inputX', f=True)
        cmds.connectAttr(profileList[-(i + 1)] + '.twist', endMidOriCon + '.' + endMidOriWt[0], f=True)
        cmds.connectAttr(endMidOriRev + '.outputX', endMidOriCon + '.' + endMidOriWt[1], f=True)

    # Create Profile tangent constraints
    tangentConList = []
    for i in range(len(profileGrpList)):
        # Determine world up object
        if not i:
            # start profile
            worldUpObject = attachLocators[0]
        elif i == (len(profileGrpList) - 1):
            # end profile
            worldUpObject = attachLocators[-1]
        else:
            worldUpObject = profileFollowList[i - 1]
        # Create constraint
        tangentCon = cmds.tangentConstraint(tangentCurveShape, profileGrpList[i], aim=[0, 0, -1], u=[0, 1, 0],
                                          wu=[0, 1, 0], wut='objectrotation', wuo=worldUpObject)
        tangentConList.append(tangentCon)

    # -----------------------------
    # - Set profile radius values -
    # -----------------------------

    # Set default profile radius values
    radiusList = glTools.utils.mathUtils.distributeValue(midProfile, rangeStart=minRadius, rangeEnd=maxRadius)
    radiusList = [glTools.utils.mathUtils.smoothStep(i, minRadius, maxRadius, 0.5) for i in radiusList]
    for i in range(midProfile):
        cmds.setAttr(profileList[i] + '.scale', radiusList[i], radiusList[i], radiusList[i])
        cmds.setAttr(profileList[-(i + 1)] + '.scale', radiusList[i], radiusList[i], radiusList[i])

    # ----------------------------
    # - Generate Muscle Geometry -
    # ----------------------------

    # Loft mesh between profile curves
    loft = cmds.loft(profileList, u=0, c=0, d=3, ch=1, po=1)
    muscleMesh = cmds.rename(loft[0], prefix)
    muscleLoft = cmds.rename(loft[1], prefix + '_loft')
    muscleTess = cmds.listConnections(muscleLoft + '.outputSurface', s=False, d=True, type='nurbsTessellate')[0]
    muscleTess = cmds.rename(muscleTess, prefix + '_nurbsTessellate')
    cmds.parent(muscleMesh, muscleGrp)

    # Set nurbsTessellate settings
    cmds.setAttr(muscleTess + '.format', 2)
    cmds.setAttr(muscleTess + '.polygonType', 1)
    cmds.setAttr(muscleTess + '.uType', 1)
    cmds.setAttr(muscleTess + '.vType', 1)
    cmds.setAttr(muscleTess + '.uNumber', 20)
    cmds.setAttr(muscleTess + '.vNumber', 10)

    # Add muscle mesh attributes
    cmds.addAttr(muscleMesh, ln='precision', at='long', min=1, dv=5)
    cmds.setAttr(muscleMesh + '.precision', k=False, cb=True)
    cmds.addAttr(muscleMesh, ln='tangentPrecision', at='long', min=1, dv=2)
    cmds.setAttr(muscleMesh + '.tangentPrecision', k=False, cb=True)

    cmds.addAttr(muscleMesh, ln='uDivisions', at='long', min=4, dv=20)
    cmds.setAttr(muscleMesh + '.uDivisions', k=False, cb=True)
    cmds.addAttr(muscleMesh, ln='vDivisions', at='long', min=3, dv=10)
    cmds.setAttr(muscleMesh + '.vDivisions', k=False, cb=True)

    cmds.addAttr(muscleMesh, ln='restLength', at='float', min=0, dv=startEndDist)
    cmds.setAttr(muscleMesh + '.restLength', k=False, cb=True)
    cmds.addAttr(muscleMesh, ln='currentLength', at='float', min=0, dv=startEndDist)
    cmds.setAttr(muscleMesh + '.currentLength', k=True)
    cmds.addAttr(muscleMesh, ln='lengthScale', at='float', min=0, dv=1)
    cmds.setAttr(muscleMesh + '.lengthScale', k=True)

    cmds.addAttr(muscleMesh, ln='muscleMessage', at='message')
    cmds.addAttr(muscleMesh, ln='muscleSpline', at='message')
    cmds.addAttr(muscleMesh, ln='attachment', at='message', m=True)
    cmds.addAttr(muscleMesh, ln='profile', at='message', m=True)

    cmds.addAttr(muscleMesh, ln='muscleObjectType', dt='string')
    cmds.setAttr(muscleMesh + '.muscleObjectType', 'geo', type='string', l=True)

    # Connect muscle mesh attributes
    cmds.connectAttr(muscleCurve + '.message', muscleMesh + '.muscleSpline', f=True)
    for i in range(len(attachLocators)):
        cmds.connectAttr(attachLocators[i] + '.message', muscleMesh + '.attachment[' + str(i) + ']', f=True)
        cmds.connectAttr(muscleMesh + '.message', attachLocators[i] + '.muscle', f=True)
    for i in range(len(profileList)):
        cmds.connectAttr(profileList[i] + '.message', muscleMesh + '.profile[' + str(i) + ']', f=True)
        cmds.connectAttr(muscleMesh + '.message', profileList[i] + '.muscle', f=True)

    # Connect muscle mesh attributes to curve rebuild settings
    cmds.connectAttr(muscleMesh + '.precision', splineRebuild + '.spans', f=True)
    musclePreCondition = cmds.createNode('condition', n=prefix + '_precision_condition')
    cmds.setAttr(musclePreCondition + '.operation', 4)  # Less Than
    cmds.connectAttr(muscleMesh + '.precision', musclePreCondition + '.firstTerm', f=True)
    cmds.connectAttr(muscleMesh + '.tangentPrecision', musclePreCondition + '.secondTerm', f=True)
    cmds.connectAttr(muscleMesh + '.precision', musclePreCondition + '.colorIfTrueR', f=True)
    cmds.connectAttr(muscleMesh + '.tangentPrecision', musclePreCondition + '.colorIfFalseR', f=True)
    cmds.connectAttr(musclePreCondition + '.outColorR', tangentRebuild + '.spans', f=True)

    # Connect musle mesh attributes to nurbsTessellate settings
    cmds.connectAttr(muscleMesh + '.uDivisions', muscleTess + '.uNumber', f=True)
    cmds.connectAttr(muscleMesh + '.vDivisions', muscleTess + '.vNumber', f=True)

    # Setup length calculation
    muscleLenCurveInfo = cmds.createNode('curveInfo', n=prefix + '_length_curveInfo')
    cmds.connectAttr(splineCurveShape + '.worldSpace[0]', muscleLenCurveInfo + '.inputCurve', f=True)
    cmds.connectAttr(muscleLenCurveInfo + '.arcLength', muscleMesh + '.currentLength', f=True)
    muscleLenDiv = cmds.createNode('multiplyDivide', n=prefix + '_length_multiplyDivide')
    cmds.setAttr(muscleLenDiv + '.operation', 2)  # Divide
    cmds.setAttr(muscleLenDiv + '.input1', 1, 1, 1)
    cmds.setAttr(muscleLenDiv + '.input2', 1, 1, 1)
    cmds.connectAttr(muscleLenCurveInfo + '.arcLength', muscleLenDiv + '.input1X', f=True)
    cmds.connectAttr(muscleMesh + '.restLength', muscleLenDiv + '.input2X', f=True)
    cmds.connectAttr(muscleLenDiv + '.outputX', muscleMesh + '.lengthScale', f=True)

    # -----------
    # - Cleanup -
    # -----------

    # Parent start/end tangent locators
    cmds.parent(attachLocGroup[1], attachLocators[0])
    cmds.parent(attachLocGroup[-2], attachLocators[-1])

    # Parent start/end profiles
    cmds.parent(profileGrpList[0], attachLocators[0])
    cmds.setAttr(profileGrpList[0] + '.t', 0.0, 0.0, 0.0)
    cmds.setAttr(profileGrpList[0] + '.r', 0.0, 0.0, 0.0)
    cmds.setAttr(profileGrpList[0] + '.s', 1.0, 1.0, 1.0)

    cmds.parent(profileGrpList[-1], attachLocators[-1])
    cmds.setAttr(profileGrpList[-1] + '.t', 0.0, 0.0, 0.0)
    cmds.setAttr(profileGrpList[-1] + '.r', 0.0, 0.0, 0.0)
    cmds.setAttr(profileGrpList[-1] + '.s', 1.0, 1.0, 1.0)

    # Setup start/end profile scale compensation
    attachStartScaleCompNode = cmds.createNode('multiplyDivide', n=prefix + '_attachStart_multiplyDivide')
    cmds.setAttr(attachStartScaleCompNode + '.input1', 1, 1, 1)
    cmds.setAttr(attachStartScaleCompNode + '.operation', 2)
    cmds.connectAttr(attachLocators[0] + '.scale', attachStartScaleCompNode + '.input2', f=True)
    cmds.connectAttr(attachStartScaleCompNode + '.output', profileGrpList[0] + '.scale', f=True)
    attachEndScaleCompNode = cmds.createNode('multiplyDivide', n=prefix + '_attachEnd_multiplyDivide')
    cmds.setAttr(attachEndScaleCompNode + '.input1', 1, 1, 1)
    cmds.setAttr(attachEndScaleCompNode + '.operation', 2)
    cmds.connectAttr(attachLocators[-1] + '.scale', attachEndScaleCompNode + '.input2', f=True)
    cmds.connectAttr(attachEndScaleCompNode + '.output', profileGrpList[-1] + '.scale', f=True)

    # Lock transforms
    cmds.setAttr(muscleGrp + '.inheritsTransform', 0)
    cmds.setAttr(muscleGrp + '.t', l=True, cb=True)
    cmds.setAttr(muscleGrp + '.r', l=True, cb=True)
    cmds.setAttr(muscleGrp + '.s', l=True, cb=True)

    # Return result
    return muscleMesh
コード例 #15
0
    def execute(self):

        sx = self.sx
        sy = self.sy
        sdv = self.sdv
        sdu = self.sdu
        tap = self.tap
        degs = self.degs
        subCurve = self.subCurve
        clean = self.clean
        do_uvs = self.do_uvs
        rbc = self.rbc
        cTol = self.cTol
        cSubd = self.cSubd

        if cmds.checkBox(self.aUACCB, q=True, v=True):
            useAltShape = True
        else:
            useAltShape = False

        multSel = cmds.ls(sl=True, fl=True, ap=True)
        if cmds.objectType(multSel[0]) == 'mesh':
            thisIsAMesh = True
        else:
            thisIsAMesh = False
        # Select curve type to extrude along - convert and store
        for x in multSel:
            print x
            if thisIsAMesh != True:
                cmds.select(x)
            else:
                cmds.select(multSel)

            objSel = cmds.ls(sl=True, fl=True, ap=True)
            if self.ko == 1:
                dupObj = cmds.duplicate(objSel)
                objSel = dupObj
            if len(objSel) > 1:
                print objSel
                if degs == 0:
                    curveDg = cmds.promptDialog(
                        t='Enter Degrees:',
                        m='Enter Degrees - ie. 1 for linear, 3 for curved')
                    objSel = cmds.polyToCurve(f=2,
                                              dg=int(
                                                  cmds.promptDialog(q=True,
                                                                    tx=True)))
                else:
                    objSel = cmds.polyToCurve(f=2,
                                              dg=int(degs),
                                              n='%s_curve' %
                                              objSel[0].split('.')[0])
            else:
                objType = cmds.listRelatives(objSel[0], f=True)
                if cmds.objectType(
                        objType[0]) != 'nurbsCurve' and cmds.objectType(
                            objType[0]) != 'bezierCurve':
                    cmds.error(
                        'Select the nurbs curve first, then the object to align'
                    )
                if cmds.objectType(objType[0]) == 'bezierCurve':
                    mm.eval("bezierCurveToNurbs;")
            # Create a nurbs curve for the extrusion
            if useAltShape:
                nurbsCir = self.objToUse
            else:
                nurbsCir = cmds.circle(n='extrudeCircle',
                                       d=3,
                                       r=1,
                                       nr=(0, 0, 1),
                                       sw=360,
                                       ch=True,
                                       s=8)
            objCV = cmds.ls('%s.ep[*]' % objSel[0], fl=True)

            noOfCV = len(objCV)
            firstCV = 0
            lastCV = noOfCV - 1
            cvNumberToUse = firstCV

            # Rebuild the curve to help with uniformity
            if self.rev == 1:
                cmds.reverseCurve(objSel[0], ch=0, rpo=1)

            if rbc == 1:
                try:
                    cmds.rebuildCurve(objSel[0],
                                      ch=0,
                                      rpo=1,
                                      rt=4,
                                      end=1,
                                      kr=0,
                                      kcp=0,
                                      kep=1,
                                      kt=0,
                                      s=cSubd,
                                      d=3,
                                      tol=cTol)
                    cmds.rebuildCurve(objSel[0],
                                      ch=0,
                                      rpo=1,
                                      rt=0,
                                      end=1,
                                      kr=0,
                                      kcp=0,
                                      kep=1,
                                      kt=0,
                                      s=cSubd,
                                      d=3,
                                      tol=cTol)
                except:
                    cmds.warning(
                        'Tolerance for rebuild likely to low, try a higher value or turn Rebuild Curve off'
                    )

            if do_uvs == 1:
                objShape = cmds.listRelatives(objSel[0], c=True, type='shape')
                mInfo = cmds.shadingNode('curveInfo',
                                         n='cMeasure',
                                         asUtility=True)
                cmds.connectAttr('%s.local' % objShape[0],
                                 '%s.inputCurve' % mInfo)
                curveLength = cmds.getAttr('%s.arcLength' % mInfo)
                cmds.delete(mInfo)

                self.uvRatio = float(
                    (((sx * sy) * 2.0) * math.pi) / curveLength)
                print "uvRatio:  " + str(self.uvRatio)

            # Create a tangent contraint to position nurbs circle to the first cv
            cvPos = cmds.xform('%s.ep[%d]' % (objSel[0], cvNumberToUse),
                               query=True,
                               ws=True,
                               t=True)
            cmds.xform(nurbsCir[0], ws=True, t=(cvPos[0], cvPos[1], cvPos[2]))
            fastCon = cmds.tangentConstraint(objSel[0],
                                             nurbsCir[0],
                                             aim=(0, 0, 1))
            cmds.delete(fastCon[0])

            # Extrude along curve and set attributes
            pipeExt = cmds.extrude(nurbsCir[0],
                                   objSel[0],
                                   n='%s_pipe' % objSel[0],
                                   ch=True,
                                   rn=subCurve,
                                   po=1,
                                   et=2,
                                   ucp=1,
                                   fpt=1,
                                   upn=1,
                                   rotation=0,
                                   scale=1,
                                   rsp=1)
            pipeTes = cmds.listConnections(pipeExt[1], type='nurbsTessellate')
            if subCurve != 0:
                pipeSubCurve = cmds.listConnections(pipeExt[1],
                                                    type='subCurve')

            cmds.setAttr('%s.format' % pipeTes[0], 2)
            cmds.setAttr('%s.polygonType' % pipeTes[0], 1)
            cmds.setAttr('%s.uType' % pipeTes[0], 2)
            cmds.setAttr('%s.vType' % pipeTes[0], 2)
            cmds.setAttr('%s.vNumber' % pipeTes[0], sdv)
            cmds.setAttr('%s.uNumber' % pipeTes[0], sdu)

            # Add attributes
            if clean == 0:
                cmds.addAttr(pipeExt[0], ln='________', k=True)
                cmds.setAttr('%s.________' % pipeExt[0], l=True)
                cmds.addAttr(pipeExt[0], ln='Ext_ScaleX', k=True, dv=sx)
                cmds.addAttr(pipeExt[0], ln='Ext_ScaleY', k=True, dv=sy)
                cmds.connectAttr('%s.Ext_ScaleX' % pipeExt[0],
                                 '%s.scaleX' % nurbsCir[0])
                cmds.connectAttr('%s.Ext_ScaleY' % pipeExt[0],
                                 '%s.scaleY' % nurbsCir[0])
                cmds.addAttr(pipeExt[0],
                             ln='Ext_DivisionV',
                             at='short',
                             k=True,
                             dv=sdv)
                cmds.connectAttr('%s.Ext_DivisionV' % pipeExt[0],
                                 '%s.vNumber' % pipeTes[0])
                cmds.addAttr(pipeExt[0],
                             ln='Ext_DivisionU',
                             at='short',
                             k=True,
                             dv=sdu)
                cmds.connectAttr('%s.Ext_DivisionU' % pipeExt[0],
                                 '%s.uNumber' % pipeTes[0])
                if subCurve != 0:
                    cmds.addAttr(pipeExt[0],
                                 ln='Ext_Length',
                                 k=True,
                                 dv=1,
                                 max=1,
                                 min=0)
                    cmds.connectAttr('%s.Ext_Length' % pipeExt[0],
                                     '%s.maxValue' % pipeSubCurve[1])
                cmds.addAttr(pipeExt[0], ln='Ext_Taper', k=True, dv=tap, min=0)
                cmds.connectAttr('%s.Ext_Taper' % pipeExt[0],
                                 '%s.scale' % pipeExt[1])
                cmds.addAttr(pipeExt[0], ln='Ext_Twist', k=True, dv=1)
                cmds.connectAttr('%s.Ext_Twist' % pipeExt[0],
                                 '%s.rotation' % pipeExt[1])
                cmds.addAttr(pipeExt[0], ln='Ext_ComponentPivot', k=True, dv=1)
                cmds.connectAttr('%s.Ext_ComponentPivot' % pipeExt[0],
                                 '%s.useComponentPivot' % pipeExt[1])

            curveGrpNode = cmds.createNode('transform', n='pipeCurves')
            cmds.parent(nurbsCir, curveGrpNode)
            cmds.parent(objSel, curveGrpNode)

            cmds.setAttr('%s.inheritsTransform' % curveGrpNode, 0)
            cmds.setAttr('%s.visibility' % curveGrpNode, 1)
            cmds.parent(curveGrpNode, pipeExt[0])
            cmds.select(pipeExt[0])
            if do_uvs == 1:
                cmds.polyLayoutUV(ps=0.2)
                cmds.polyEditUV(sv=1, su=self.uvRatio)
                cmds.polyEditUV(sv=0.95, su=0.95)
                cmds.select(pipeExt[0])
                CentreUVs()
                if clean == 1:
                    cmds.delete(ch=True)
                    cmds.delete(curveGrpNode)
                    cmds.select(pipeExt[0])
            if thisIsAMesh == True:
                print 'hello'
                break
コード例 #16
0
def traceArc(space='camera'):
    '''
    The main function for creating the arc.
    '''
    
    if space != 'world' and space != 'camera':
        OpenMaya.MGlobal.displayWarning('Improper space argument.')
        return
    
    global ML_TRACE_ARC_PREVIOUS_SELECTION
    global ML_TRACE_ARC_PREVIOUS_SPACE
    
    #save for reset:
    origTime = mc.currentTime(query=True)
    
    #frame range
    frameRange = utl.frameRange()
    start = frameRange[0]
    end = frameRange[1]
    
    #get neccesary nodes
    objs = mc.ls(sl=True, type='transform')
    if not objs:
        OpenMaya.MGlobal.displayWarning('Select objects to trace')
        return
    
    ML_TRACE_ARC_PREVIOUS_SELECTION = objs
    ML_TRACE_ARC_PREVIOUS_SPACE = space
    
    cam = None
    nearClipPlane = None
    shortCam = ''
    if space=='camera':
        cam = utl.getCurrentCamera()
    
        #the arc will be placed just past the clip plane distance, but no closer than 1 unit.
        nearClipPlane = max(mc.getAttr(cam+'.nearClipPlane'),1)
        
        shortCam = mc.ls(cam, shortNames=True)[0]
    
    topGroup = 'ml_arcGroup'
    worldGrp = 'ml_arcWorldGrp'
    localGrp = 'ml_localGrp_'+shortCam
    
    #create nodes
    if not mc.objExists(topGroup):
        topGroup = mc.group(empty=True, name=topGroup)
    
    parentGrp = topGroup
    if space=='world' and not mc.objExists(worldGrp):
        worldGrp = mc.group(empty=True, name=worldGrp)
        mc.setAttr(worldGrp+'.overrideEnabled',1)
        mc.setAttr(worldGrp+'.overrideDisplayType',2)
        mc.parent(worldGrp, topGroup)
        parentGrp = mc.ls(worldGrp)[0]
    
    if space == 'camera':
        camConnections = mc.listConnections(cam+'.message', plugs=True, source=False, destination=True)
        if camConnections:
            for cc in camConnections:
                if '.ml_parentCam' in cc:
                    localGrp = mc.ls(cc, o=True)[0]
        
        if not mc.objExists(localGrp):
            localGrp = mc.group(empty=True, name=localGrp)
            mc.parentConstraint(cam, localGrp)
            mc.setAttr(localGrp+'.overrideEnabled',1)
            mc.setAttr(localGrp+'.overrideDisplayType',2)
            mc.parent(localGrp, topGroup)
            
            mc.addAttr(localGrp, at='message', longName='ml_parentCam')
            mc.connectAttr(cam+'.message', localGrp+'.ml_parentCam')
            
        parentGrp = mc.ls(localGrp)[0]
    
    #group per object:
    group = list()
    points = list()
    
    for i,obj in enumerate(objs):
        sn = mc.ls(obj,shortNames=True)[0]
        name = sn.replace(':','_')
    
        points.append(list())
        groupName = 'ml_%s_arcGrp' % name
        if mc.objExists(groupName):
            mc.delete(groupName)
        
        group.append(mc.group(empty=True, name=groupName))
        
        group[i] = mc.parent(group[i],parentGrp)[0]
        mc.setAttr(group[i]+'.translate', 0,0,0)
        mc.setAttr(group[i]+'.rotate', 0,0,0)
    
    with utl.UndoChunk():
        with utl.IsolateViews():

            #helper locator
            loc = mc.spaceLocator()[0]
            mc.parent(loc,parentGrp)

            #frame loop:
            time = range(int(start),int(end+1))
            for t in time:
                mc.currentTime(t, edit=True)

                #object loop
                for i,obj in enumerate(objs):

                    objPnt = mc.xform(obj, query=True, worldSpace=True, rotatePivot=True)

                    if space=='camera':
                        camPnt = mc.xform(cam, query=True, worldSpace=True, rotatePivot=True)

                        objVec = euclid.Vector3(objPnt[0],objPnt[1],objPnt[2])
                        camVec = euclid.Vector3(camPnt[0],camPnt[1],camPnt[2])

                        vec = objVec-camVec
                        vec.normalize()
                        #multiply here to offset from camera
                        vec=vec*nearClipPlane*1.2
                        vec+=camVec

                        mc.xform(loc, worldSpace=True, translation=vec[:])

                        trans = mc.getAttr(loc+'.translate')
                        points[i].append(trans[0]) 

                    elif space=='world':
                        points[i].append(objPnt)

            mc.delete(loc)

            #create the curves and do paint effects
            mc.ResetTemplateBrush()
            brush = mc.getDefaultBrush()
            mc.setAttr(brush+'.screenspaceWidth',1)
            mc.setAttr(brush+'.distanceScaling',0)
            mc.setAttr(brush+'.brushWidth',0.005)

            for i,obj in enumerate(objs):

                #setup brush for path
                mc.setAttr(brush+'.screenspaceWidth',1)
                mc.setAttr(brush+'.distanceScaling',0)
                mc.setAttr(brush+'.brushWidth',0.003)

                #color
                for c in ('R','G','B'):
                    color = random.uniform(0.3,0.7)
                    mc.setAttr(brush+'.color1'+c,color)
                
                baseCurve = mc.curve(d=3,p=points[i])
                #fitBspline makes a curve that goes THROUGH the points, a more accurate path
                curve = mc.fitBspline(baseCurve, constructionHistory=False, tolerance=0.001)
                mc.delete(baseCurve)

                #paint fx
                mc.AttachBrushToCurves(curve)
                stroke = mc.ls(sl=True)[0]
                stroke = mc.parent(stroke,group[i])[0]

                mc.setAttr(stroke+'.overrideEnabled',1)
                mc.setAttr(stroke+'.overrideDisplayType',2)

                mc.setAttr(stroke+'.displayPercent',92)
                mc.setAttr(stroke+'.sampleDensity',0.5)
                mc.setAttr(stroke+'.inheritsTransform',0)
                mc.setAttr(stroke+'.translate',0,0,0)
                mc.setAttr(stroke+'.rotate',0,0,0)

                curve = mc.parent(curve,group[i])[0]
                mc.setAttr(curve+'.translate',0,0,0)
                mc.setAttr(curve+'.rotate',0,0,0)

                mc.hide(curve)

                #setup brush for tics
                if space=='camera':
                    mc.setAttr(brush+'.brushWidth',0.008)
                if space=='world':
                    mc.setAttr(brush+'.brushWidth',0.005)
                mc.setAttr(brush+'.color1G',0)
                mc.setAttr(brush+'.color1B',0)

                for t in range(len(points[i])):
                    frameCurve = None
                    if space=='camera':
                        vec = euclid.Vector3(points[i][t][0],points[i][t][1],points[i][t][2])
                        vec*=0.98
                        frameCurve = mc.curve(d=1,p=[points[i][t],vec[:]])

                    elif space=='world':
                        frameCurve = mc.circle(constructionHistory=False, radius=0.0001, sections=4)[0]
                        mc.setAttr(frameCurve+'.translate', points[i][t][0], points[i][t][1] ,points[i][t][2])
                        constraint = mc.tangentConstraint(curve, frameCurve, aimVector=(0,0,1), worldUpType='scene')
                        #mc.delete(constraint)

                    #check for keyframe
                    colorAttribute='color1G'
                    if mc.keyframe(obj, time=((t+start-0.5),(t+start+0.5)), query=True):
                        mc.setAttr(brush+'.color1R',1)
                    else:
                        mc.setAttr(brush+'.color1R',0)

                    mc.AttachBrushToCurves(curve)

                    stroke = mc.ls(sl=True)[0]
                    thisBrush = mc.listConnections(stroke+'.brush', destination=False)[0]

                    #setup keyframes for frame highlighting
                    mc.setKeyframe(thisBrush, attribute='color1G', value=0, time=(start+t-1, start+t+1))
                    mc.setKeyframe(thisBrush, attribute='color1G', value=1, time=(start+t,))

                    stroke = mc.parent(stroke,group[i])[0]

                    mc.hide(frameCurve)

                    mc.setAttr(stroke+'.displayPercent',92)
                    mc.setAttr(stroke+'.sampleDensity',0.5)

                    frameCurve = mc.parent(frameCurve,group[i])[0]

                    if space=='camera':
                        mc.setAttr(stroke+'.inheritsTransform',0)
                        mc.setAttr(stroke+'.pressureScale[1].pressureScale_Position', 1)
                        mc.setAttr(stroke+'.pressureScale[1].pressureScale_FloatValue', 0)
                        mc.setAttr(stroke+'.translate',0,0,0)
                        mc.setAttr(stroke+'.rotate',0,0,0)
                        mc.setAttr(frameCurve+'.translate',0,0,0)
                        mc.setAttr(frameCurve+'.rotate',0,0,0)

            mc.currentTime(origTime, edit=True)
            panel = mc.getPanel(withFocus=True)
            mc.modelEditor(panel, edit=True, strokes=True)
    
    mc.select(objs,replace=True)
コード例 #17
0
def completeAntenna(num_jnt,num_ctr,hairSystem,sliding,length,twist):
  lenComplist = len(completeList)
  for i in range(lenComplist):
     del completeList[0]
  num_crv = len(MakeAtna_returnV) 
  method = ''
  createJntLst = []
    
  #------------------ Get Hair System Type
  hairSys_on = 0
  if hairSystem == 'New':
      hairSys_on = 1
  elif hairSystem == '':
      hairSys_on = 0
  else:
      hairSys_on = -1
      
  for i in cmds.ls(type='hairSystem'):
      if hairSystem == i or hairSystem == cmds.listRelatives(i,p=1)[0]:
          hairSys_on = 2


  if hairSys_on == -1:
    cmds.warning("'%s'는 존제하지 않는 Object입니다." % hairSystem)
  else:      
    
    for i in MakeAtna_returnV: #------choose method
        if len(i) == 6:
            cmds.delete(i[5])#----delete expression
            method = 'avp'
        else:
            method = 'cv'

    getPosShp = 0.0
    if method == 'avp':
       print MakeAtna_returnV[0][0][1], len(MakeAtna_returnV[0][1])
       getPosShp = cmds.getAttr(MakeAtna_returnV[0][0][1]+'.posShp')/len(MakeAtna_returnV[0][1])
       print getPosShp
    
    for i in MakeAtna_returnV:
        aim = i[4][0]
        up = i[4][1]
        mainName = i[1][0].partition('_')[0]
        #--------Set controler joint initial setting 
        for j in i[1]:   
            cmds.setAttr(j+'.tx',l=0)
            cmds.setAttr(j+'.ty',l=0)
            cmds.setAttr(j+'.tz',l=0)
            cmds.setAttr(j+'.rx',l=0)
            cmds.setAttr(j+'.ry',l=0)
            cmds.setAttr(j+'.rz',l=0)
            cmds.setAttr(j+'.dla',0)

            if method == 'avp':
                cmds.deleteAttr(j,at='ip')
            cmds.parent(j,w=1)
            
        for j in i[2]: 
            cmds.delete(j)  #----------------- Delete null group
        
        #----------Set constrainted orient to current orientation    
        for j in range(len(i[1])-1): 
            tempLoc = cmds.spaceLocator()[0]
            tempOri = cmds.orientConstraint(i[1][j],tempLoc)
            cmds.delete(tempOri)
            tempAim = cmds.aimConstraint(i[1][j+1],i[1][j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=tempLoc)
            cmds.delete(tempAim,tempLoc)
            cmds.parent(i[1][j+1],i[1][j])
        
        ##-------- BindCurve And JointCurve Set
        attachJointCurve ='' 
        bindCurve =''
        posShp = 0.0
        conJoint = i[1]
        if method == 'avp':
            dupleObj = cmds.duplicate(i[0][1],n=mainName+'_bindCurve')[0]
            cmds.deleteAttr(dupleObj+'.posShp')
            posShp = cmds.getAttr(i[0][1]+'.posShp')
            attachJointCurve = cmds.rebuildCurve( dupleObj, n=mainName+'_jntAtCurve', ch=1, rpo=0, rt=0 ,end=0, kr=0, kcp=1, kep=0, kt=0, s=0, d=3, tol=0.01 )[0]
            cmds.delete(i[0][0],i[0][1],i[0][2])
            bindCurve = dupleObj
        else:
            dupleObj = cmds.duplicate(i[0][0],n=mainName+'_bindCurve')[0]
            spans = cmds.getAttr(cmds.listRelatives(dupleObj,s=1)[0]+'.spans')
            attachJointCurve = cmds.rebuildCurve( dupleObj, n=mainName+'_jntAtCurve', ch=1, rpo=0, rt=0 ,end=1, kr=0, kcp=0, kep=0, kt=0,s=spans*3, tol=0.01 )[0]
            cmds.delete(i[0][1],i[0][0])
            bindCurve = dupleObj
            
        #--------------- Create Normal Base for Normal Constraint       
        normalBase = cmds.polyPlane(w=1,h=1,sx=1,sy=1,n=mainName+'_normalBase')[0]
        for j in range(1,len(i[1])-1):
            cmds.polyExtrudeEdge(normalBase+'.e['+str(j*3)+']',lty=1)
        cmds.DeleteHistory(normalBase)
        
        def inr(a):
            return (a+1)%3
        def inrb(a):
            return (a+2)%3
        
        axisElse = [0,0,0]  #--------- Get Third Axis
        
        for j in range(3):
            if aim[j] == 1 and up[inr(j)] == 1:
                axisElse[inrb(j)] = 1;
            if aim[j] == 1 and up[inr(j)] == 0:
                axisElse[inr(j)] = -1;
            if aim[j] == -1 and up[inr(j)] == 0:
                axisElse[inr(j)] = 1;
            if aim[j] == -1 and up[inr(j)] == 1:
                axisElse[inrb(j)] = -1;
            print j,inr(j),inrb(j)
        print 'aim     :',aim
        print 'up      :',up
        print 'axisElse:',axisElse

        for j in range(len(i[1])):
            tmLoc = cmds.spaceLocator()
            cmds.parent(tmLoc,conJoint[j])
            cmds.move(axisElse[0],axisElse[1],axisElse[2],tmLoc,ls=1)
            locPos = cmds.xform(tmLoc,q=1,ws=1,piv=1)
            cmds.move(locPos[0],locPos[1],locPos[2],normalBase+'.vtx['+str(j*2+1)+']',ws=1)
            cmds.move(-axisElse[0],-axisElse[1],-axisElse[2],tmLoc,ls=1)
            locPos = cmds.xform(tmLoc,q=1,ws=1,piv=1)
            cmds.move(locPos[0],locPos[1],locPos[2],normalBase+'.vtx['+str(j*2)+']',ws=1)
            cmds.delete(tmLoc)
       
        bindObj = []
        bindObj.append(conJoint[0])
        bindObj.append(normalBase)
        cmds.skinCluster(bindObj)
        bindObj = []
        bindObj.append(conJoint[0])
        bindObj.append(bindCurve)
        cmds.skinCluster(bindObj)
        cmds.setAttr(bindCurve+'.v', 0)
        
        cmds.select(attachJointCurve)
        startHair = ''
        currentHair = ''
        restHair = ''
        if hairSys_on != 0:
          if hairSys_on == 1:
            beforeHair = cmds.ls(type='hairSystem')      
            createHair('')
            afterHair = cmds.ls(type='hairSystem')
            for k in beforeHair:
                afterHair.remove(k)
            hairSystem = afterHair[0]
            hairSys_on = 2
          elif hairSys_on == 2:
            createHair(hairSystem)
          cmds.select(attachJointCurve); import maya.mel as mel ;mel.eval('setSelectedHairCurves "start" "rest"')
          cmds.select(attachJointCurve); mel.eval('convertHairSelection "currentCurves"'); currentHair = cmds.ls(sl=1)[0]
          mel.eval('convertHairSelection "restCurves"'); restHair = cmds.ls(sl=1)[0]
          mel.eval('convertHairSelection "startCurves"'); startHair = cmds.ls(sl=1)[0]; attachJointCurve = currentHair
          mel.eval('displayHairCurves "all" 1'); blendShape1 = cmds.blendShape(startHair,restHair,tc=0)[0]
          cmds.setAttr(blendShape1+'.'+startHair,1)
          
        #---------------- Create Current Joint    
        
        jntPntL = []; jntPntChildL = []; subLocL = []; jntL = []; jntGL = []
        infoL = []; pntInfoL = []; pntRotL = []
        if hairSys_on == 0:
          for j in range(num_jnt):
            cmds.select(d=1)
            jnt = cmds.joint(rad = 2, n=mainName+'_cuJoint'+str(j))
            cmds.setAttr(jnt+'.dla',1)
            cmds.addAttr(jnt,ln='infoPos',sn='ip',at='double',min=0,max=num_jnt-1,dv=j)
            cmds.setAttr(jnt+'.ip',e=1,k=1)
            jntG = cmds.group(jnt,n=jnt+'_p')
            info = cmds.createNode('pointOnCurveInfo', n=mainName+'_info'+str(j))
            subLoc = cmds.spaceLocator(n=mainName+'_subLoc'+str(j))[0]
            cmds.scale(.1,.1,.1,subLoc)
            subLocL.append(subLoc); jntL.append(jnt); jntGL.append(jntG); infoL.append(info)

            cmds.connectAttr(attachJointCurve+'.worldSpace[0]', info+'.inputCurve')
            cmds.pointConstraint(subLoc,jntG)
            normalCon = cmds.normalConstraint(normalBase,jntG,aim=up,u=aim,wut='vector')[0]
            cmds.connectAttr(info+'.tangent',normalCon+'.wu')
            cmds.connectAttr(info+'.position',subLoc+'.translate')
            prRt = 0; sRt = 0; editP = 0
            if posShp >= 0:
                sRt = posShp/num_jnt + 1
                editP = (j/float(num_jnt-1))**sRt
            else:
                sRt = 1-posShp/num_jnt
                editP = 1-abs(j/float(num_jnt-1)-1)**sRt
            import maya.mel as mel
            prRt = mel.eval( 'linstep(0,1,%s)' % editP ) * (num_jnt-1)
            cmds.setAttr(info+'.parameter', prRt/(num_jnt-1))
        else:
          for j in range(num_jnt):
            cmds.select(d=1)
            jnt = cmds.joint(rad = 2, n=mainName+'_cuJoint'+str(j))
            cmds.setAttr(jnt+'.dla',1)
            cmds.addAttr(jnt,ln='infoPos',sn='ip',at='double',min=0,max=num_jnt-1,dv=j)
            cmds.setAttr(jnt+'.ip',e=1,k=1)
            jntG = cmds.group(jnt,n=jnt+'_p')
            info = cmds.createNode('pointOnCurveInfo', n=mainName+'_info'+str(j))
            pntInfo = cmds.createNode('pointOnCurveInfo', n=mainName+'_pntInfo'+str(j))
            cmds.setAttr(info+'.top', 1)
            subLoc = cmds.spaceLocator(n=mainName+'_subLoc'+str(j))[0]; cmds.scale(.1,.1,.1,subLoc)
            jntPntChild = cmds.spaceLocator(n=mainName+'_pntChild'+str(j))[0]
            jntPnt = cmds.group(n=mainName+'_jntPnt'+str(j));
            pntRot= cmds.createNode('plusMinusAverage', n=mainName+'_pntRot'+str(j))
            cmds.connectAttr(jntPntChild+'.rotate', pntRot+'.input3D[0]')
            subLocL.append(subLoc); jntL.append(jnt); jntGL.append(jntG); infoL.append(info)
            jntPntChildL.append(jntPntChild); jntPntL.append(jntPnt); pntInfoL.append(pntInfo); pntRotL.append(pntRot)

            cmds.connectAttr(startHair+'.worldSpace[0]', pntInfo+'.inputCurve')
            cmds.connectAttr(attachJointCurve+'.worldSpace[0]', info+'.inputCurve')
            cmds.pointConstraint(subLoc,jntG)
            normalCon = cmds.normalConstraint(normalBase,jntPntChild,aim=up,u=aim,wut='vector')[0]
            cmds.connectAttr(pntInfo+'.tangent',normalCon+'.wu')
            cmds.connectAttr(info+'.position',subLoc+'.translate')
            cmds.connectAttr(pntInfo+'.position', jntPnt+'.translate')
            prRt = 0; sRt = 0; editP = 0
            if posShp >= 0:
                sRt = posShp/num_jnt + 1
                editP = (j/float(num_jnt-1))**sRt
            else:
                sRt = 1-posShp/num_jnt
                editP = 1-abs(j/float(num_jnt-1)-1)**sRt
            import maya.mel as mel
            prRt = mel.eval( 'linstep(0,1,%s)' % editP ) * (num_jnt-1)
            cmds.setAttr(info+'.parameter', prRt/(num_jnt-1))
            cmds.setAttr(pntInfo+'.parameter', prRt/(num_jnt-1))
            
          normalCon = cmds.normalConstraint(normalBase,jntGL[0],aim=up,u=aim,wut='vector')[0]
          jntPntNormalCon = cmds.normalConstraint(normalBase,jntPntL[0],aim=up,u=aim,wut='vector')[0]
          cmds.connectAttr(infoL[0]+'.tangent',normalCon+'.wu')
          cmds.connectAttr(pntInfoL[0]+'.tangent',jntPntNormalCon+'.wu')
          for j in range(1,num_jnt):
            cmds.tangentConstraint(attachJointCurve,jntGL[j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=jntGL[j-1])
            cmds.tangentConstraint(startHair,jntPntL[j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=jntPntL[j-1])
            
       
        if len(completeList) < len(jntL)*num_crv: completeList.extend(jntL) #------------- Out joint list
        
        #--------------- Grouping
        subLocG = cmds.group(subLocL,n=subLocL[0])
        deformGrp = cmds.group(attachJointCurve,bindCurve,normalBase,subLocG, n=mainName+'_deformGrp')
        cmds.setAttr(deformGrp+'.v', 0 )
        transformGrp = cmds.group(em=1, n=mainName+'_trGrp')
        parentCon = cmds.parentConstraint(conJoint[0],transformGrp )[0]
        cmds.delete(parentCon)
        cmds.parent(jntGL,conJoint[0],transformGrp)
          #------------ Grouping in hairSystem
        if hairSys_on != 0:
          print hairSystem
          jntPntG = cmds.group(jntPntL, n=mainName+'_jntPntG')
          cmds.parent(jntPntG,deformGrp)
        
        #-------------- Attribute Setting
        conJointFirst = conJoint[0]
        conJointSecond = conJoint[1]; cmds.setAttr(conJointSecond+'.template', 1)
        conJointFirst_sliding = conJointFirst + '.sliding'
        conJointFirst_length = conJointFirst + '.scale_length'
        
        if sliding == 1:
         cmds.addAttr(conJointFirst,ln='sliding',at='double')
         cmds.setAttr(conJointFirst_sliding,e=1,k=1)
        if length == 1:
         cmds.addAttr(conJointFirst,ln='scale_length',at='double',min=0,max=num_jnt,dv=num_jnt)
         cmds.setAttr(conJointFirst_length,e=1,k=1)
        
        #----------- Set Expression String   
        exString = 'float $ip[];\n\n'
        for k in range(num_jnt):
            exString += '$ip[%s] = %s/%s;\n' % (k, jntL[k]+'.infoPos',num_jnt-1)
        exString += '\n'
         
        if length == 1:
         exString += 'float $numJnt = %s;\n' % num_jnt
         exString += 'float $length = %s/%s;\n\n' % (conJointFirst_length, num_jnt)
        
        if sliding == 1:
         exString += 'float $ep[];\n'
         exString += 'float $sliding = %s;\n' % conJointFirst_sliding
         exString += 'float $sRate;\n\n'
         exString += 'if($sliding >= 0)\n{\n'
         exString += '$sRate=$sliding/%s+1;\n' % num_jnt
         for k in range(num_jnt):
             exString += '$ep[%s] = pow($ip[%s],$sRate);\n' % (k,k)
         exString += '}\nelse\n{\n'
         exString += '$sRate= 1 - $sliding/%s;\n' % num_jnt
         for k in range(num_jnt):
             exString += '$ep[%s] = 1-pow(1-$ip[%s],$sRate);\n' % (k,k)
         exString += '}\n\n'
         
        if length == 1 and sliding == 1:
         for k in range(num_jnt):
             exString += '%s.parameter = linstep(0,1,$ep[%s])*$length;\n' % (infoL[k], k)
        elif length == 1:
         for k in range(num_jnt):
             exString += '%s.parameter = $ip[%s]*$length;\n' % (infoL[k], k)
        elif sliding == 1:
         for k in range(num_jnt):
             exString += '%s.parameter = linstep(0,1,$ep[%s]);\n' % (infoL[k], k)
        else:
         for k in range(num_jnt):
             exString += '%s.parameter = $ip[%s];\n' % (infoL[k], k)
            
        cmds.expression(s=exString,n=mainName+'_ex') #--------- expression
        
        #-------------- Twist Attr Adding
        
        if hairSys_on != 0:
         if twist == 0:
           for j in range(num_jnt):
             cmds.connectAttr(pntRotL[j]+'.output3D', jntL[j]+'.jo')
             
        if twist == 1:
         cmds.addAttr(conJointFirst,ln='twist',at='double')
         cmds.setAttr(conJointFirst+'.twist',e=1,k=1)
         for j in range(num_jnt):
             cmds.addAttr(jntL[j],ln='twistDetail',at='double',dv=j/float(num_jnt-1)*10)
             cmds.setAttr(jntL[j]+'.twistDetail',e=1,k=1)
             twistMult = cmds.createNode('multiplyDivide',n= jntL[j]+'_twistMult')
             cmds.connectAttr(conJointFirst+'.twist', twistMult+'.input1X')
             cmds.connectAttr(jntL[j]+'.twistDetail', twistMult+'.input2X')
             rAxis = '.jo'
             if aim[0] == 1 or aim[0] == -1:rAxis += 'x'
             if aim[1] == 1 or aim[1] == -1:rAxis += 'y'
             if aim[2] == 1 or aim[2] == -1:rAxis += 'z'
             
             if hairSys_on == 0:
              cmds.connectAttr(twistMult+'.outputX', jntL[j]+rAxis)
             else:
              cmds.connectAttr(twistMult+'.outputX', pntRotL[j]+'.input3D[1].input3D%s' % (rAxis.replace('.jo','')) )
              cmds.connectAttr(pntRotL[j]+'.output3D', jntL[j]+'.jo')

        #-------------- Add Controler 
        ctrer = []; ctrGG = []; ctrSubLocG = []; getPosShp = ''
          
        curveSh = cmds.listRelatives(bindCurve,s=1)[0]
        exString_in =''
        for j in range(num_ctr):
            ctrer.append( cmds.circle(n=mainName+'_ctr'+str(j),normal=aim)[0] )
            cmds.addAttr( ctrer[j], ln='rollS', at='double', min=0,max=num_jnt,dv= num_jnt/2.0)
            cmds.setAttr( ctrer[j]+'.rollS', e=1,k=1)
            cmds.addAttr( ctrer[j], ln='rollE', at='double', min=0,max=num_jnt,dv=j*num_jnt/float(num_ctr))
            cmds.setAttr( ctrer[j]+'.rollE', e=1,k=1)
            ctrG = cmds.group( ctrer[j], n = mainName+'ctrG'+str(j) )
            info = cmds.createNode('pointOnCurveInfo', n=bindCurve+'_info'+str(j))
            cmds.setAttr(info+'.top',1)
            cmds.connectAttr( curveSh+'.worldSpace[0]', info+'.inputCurve')
            cmds.connectAttr( info+'.position', ctrG+'.translate')
            mult = cmds.createNode( 'multiplyDivide', n= mainName+'_ctr_posMult'+str(j) )
            cmds.connectAttr( ctrer[j]+'.rollE', mult+'.input1X')
            cmds.setAttr( mult+'.input2X', 1.0/len(conJoint) )
            cmds.connectAttr( mult+'.outputX',info+'.parameter' )
            subLoc = cmds.spaceLocator( n=mainName+'_ctr_subLoc'+str(j) )[0]
            cmds.connectAttr( info+'.position', subLoc+'.translate' )
            cmds.pointConstraint( subLoc, ctrG )
            normalCon = cmds.normalConstraint( normalBase,ctrG,aim=up,u=aim,wut='vector' )[0]
            cmds.connectAttr( info+'.tangent', normalCon+'.wu')
            
            ctrGG.append(ctrG); ctrSubLocG.append(subLoc)
        if len(ctrGG) != 0: cmds.parent(ctrGG,transformGrp)
        if len(ctrSubLocG) != 0: cmds.parent(ctrSubLocG,deformGrp)
        
        exString  = ''
        rotDirection = ''
        
        for j in range(3):
            if aim[j] == -1:
                rotDirection = '-1*'
            
        for j in range(len(ctrer)):
            exString += 'float $rollE%s = %s.rollE;\n' % (j, ctrer[j])
            exString += 'float $rollS%s = %s.rollS + $rollE%s;\n' % (j, ctrer[j], j)
            exString += 'int $irolE%s = $rollE%s;\n' % (j,j)
            exString += 'int $irolS%s = $rollS%s;\n' % (j,j)
            exString += 'float $rolev%s = $rollE%s - $irolE%s;\n' % (j,j,j)
            exString += 'float $rolsv%s = $rollS%s - $irolS%s;\n\n' % (j,j,j)
            exString += 'float $rx%s = %s%s.rotateX;\n' % (j, rotDirection, ctrer[j])
            exString += 'float $ry%s = %s%s.rotateY;\n' % (j, rotDirection, ctrer[j])
            exString += 'float $rz%s = %s%s.rotateZ;\n\n' % (j, rotDirection, ctrer[j])
            exString += 'float $outRate%s[];\n\n' % j
            exString += 'int $num_jnt%s = %s;\n\n' % (j,len(conJoint))
            exString += 'for($i = 0; $i < $num_jnt%s; $i++)\n{\n' % j
            exString += ' if($rollE%s > $i)\n   $outRate%s[$i] = 0;' % (j,j)
            exString += ' if($rollE%s > $i && $rollE%s < $i+1)\n   $outRate%s[$i] = 1-$rolev%s;\n' % (j,j,j,j)
            exString += ' if($rollE%s <= $i)\n   $outRate%s[$i] = 1;\n\n' % (j,j)
            exString += ' if($rollS%s > $i)\n   $outRate%s[$i] *= 1;\n' % (j,j)
            exString += ' if($rollS%s > $i && $rollS%s < $i+1)\n   $outRate%s[$i] *= $rolsv%s;\n' % (j,j,j,j)
            exString += ' if($rollS%s <= $i)\n   $outRate%s[$i] *= 0;\n}\n\n' % (j,j)
        
        rotList = ['rx','ry','rz']
        
        for rot in rotList:
          for j in range(len(conJoint)):
            ra = rot.replace('r','ra')
            exString += '%s.%s = ' % (conJoint[j],ra)
            for k in range(len(ctrer)):
              if k == len(ctrer)-1:
               exString += '%s*$outRate%s[%s]*$%s%s;\n' % (aim[0]+aim[1]+aim[2],k,j,rot,k)
              else:
               exString += '%s*$outRate%s[%s]*$%s%s+' % (aim[0]+aim[1]+aim[2],k,j,rot,k)
          exString+= '\n'
        
        if len(ctrer) != 0: cmds.expression(s=exString, name = mainName+'_ctrEx')
  cmds.select(cl=1)
コード例 #18
0
	def execute(self):

		sx = self.sx
		sy = self.sy
		sdv = self.sdv
		sdu = self.sdu
		tap = self.tap
		degs = self.degs
		subCurve = self.subCurve
		clean = self.clean
		do_uvs = self.do_uvs
		rbc = self.rbc
		cTol = self.cTol
		cSubd = self.cSubd
		
		if cmds.checkBox(self.aUACCB, q=True, v=True):
			useAltShape = True
		else:
			useAltShape = False
		
		multSel = cmds.ls(sl=True,fl=True, ap=True)
		if cmds.objectType(multSel[0]) == 'mesh':
			thisIsAMesh = True
		else:
			thisIsAMesh = False
		# Select curve type to extrude along - convert and store
		for x in multSel:
			print x
			if thisIsAMesh != True:
				cmds.select(x)
			else:
				cmds.select(multSel)
				
			objSel = cmds.ls(sl=True,fl=True, ap=True)
			if self.ko == 1:
				dupObj = cmds.duplicate(objSel)
				objSel = dupObj
			if len(objSel) > 1:
				print objSel
				if degs == 0:
					curveDg = cmds.promptDialog(t='Enter Degrees:', m='Enter Degrees - ie. 1 for linear, 3 for curved')
					objSel = cmds.polyToCurve(f=2, dg=int(cmds.promptDialog(q=True, tx=True)))
				else:
					objSel = cmds.polyToCurve(f=2, dg=int(degs), n='%s_curve' %objSel[0].split('.')[0])
			else:
				objType = cmds.listRelatives(objSel[0], f=True)
				if cmds.objectType(objType[0]) != 'nurbsCurve' and cmds.objectType(objType[0]) != 'bezierCurve':
				    cmds.error('Select the nurbs curve first, then the object to align')
				if cmds.objectType(objType[0]) == 'bezierCurve':
					mm.eval("bezierCurveToNurbs;")
			# Create a nurbs curve for the extrusion
			if useAltShape:
				nurbsCir = self.objToUse
			else:	
				nurbsCir = cmds.circle(n='extrudeCircle', d=3, r=1, nr=(0,0,1), sw=360, ch=True, s=8)
			objCV = cmds.ls('%s.ep[*]' %objSel[0], fl=True)
			
			noOfCV = len(objCV)
			firstCV = 0
			lastCV = noOfCV - 1
			cvNumberToUse=firstCV
			
			# Rebuild the curve to help with uniformity
			if self.rev == 1:
				cmds.reverseCurve(objSel[0], ch=0, rpo=1)
			
			if rbc == 1:
				try:
					cmds.rebuildCurve(objSel[0], ch=0,rpo=1,rt=4,end=1,kr=0, kcp=0, kep=1, kt=0, s=cSubd, d=3, tol=cTol)
					cmds.rebuildCurve(objSel[0], ch=0,rpo=1,rt=0,end=1,kr=0, kcp=0, kep=1, kt=0, s=cSubd, d=3, tol=cTol)
				except:
					cmds.warning('Tolerance for rebuild likely to low, try a higher value or turn Rebuild Curve off')
			
			if do_uvs == 1:
				objShape = cmds.listRelatives(objSel[0], c=True, type='shape')
				mInfo = cmds.shadingNode('curveInfo', n='cMeasure', asUtility=True)
				cmds.connectAttr('%s.local' %objShape[0], '%s.inputCurve' %mInfo)
				curveLength = cmds.getAttr('%s.arcLength' %mInfo)
				cmds.delete(mInfo)
				
				self.uvRatio = float((((sx * sy)*2.0) * math.pi) / curveLength)
				print "uvRatio:  " + str(self.uvRatio)
				
			
			# Create a tangent contraint to position nurbs circle to the first cv
			cvPos = cmds.xform('%s.ep[%d]' %(objSel[0],cvNumberToUse), query=True, ws=True, t=True)
			cmds.xform(nurbsCir[0], ws=True, t=(cvPos[0],cvPos[1],cvPos[2]))
			fastCon = cmds.tangentConstraint(objSel[0], nurbsCir[0], aim=(0,0,1))
			cmds.delete(fastCon[0])
			
			# Extrude along curve and set attributes
			pipeExt = cmds.extrude(nurbsCir[0], objSel[0], n='%s_pipe' %objSel[0], ch=True, rn=subCurve, po=1, et=2, ucp=1, fpt=1,upn=1, rotation=0, scale=1,rsp=1) 
			pipeTes = cmds.listConnections(pipeExt[1], type='nurbsTessellate')
			if subCurve != 0:
				pipeSubCurve = cmds.listConnections(pipeExt[1], type='subCurve')
			
			cmds.setAttr('%s.format' %pipeTes[0],2)
			cmds.setAttr('%s.polygonType' %pipeTes[0],1)
			cmds.setAttr('%s.uType' %pipeTes[0],2)
			cmds.setAttr('%s.vType' %pipeTes[0],2)
			cmds.setAttr('%s.vNumber' %pipeTes[0],sdv)
			cmds.setAttr('%s.uNumber' %pipeTes[0],sdu)
			
			# Add attributes
			if clean == 0:
				cmds.addAttr(pipeExt[0], ln='________', k=True)
				cmds.setAttr('%s.________' %pipeExt[0], l=True)
				cmds.addAttr(pipeExt[0], ln='Ext_ScaleX', k=True, dv=sx)
				cmds.addAttr(pipeExt[0], ln='Ext_ScaleY', k=True, dv=sy)
				cmds.connectAttr('%s.Ext_ScaleX' %pipeExt[0], '%s.scaleX' %nurbsCir[0])
				cmds.connectAttr('%s.Ext_ScaleY' %pipeExt[0], '%s.scaleY' %nurbsCir[0])
				cmds.addAttr(pipeExt[0], ln='Ext_DivisionV', at='short', k=True, dv=sdv)
				cmds.connectAttr('%s.Ext_DivisionV' %pipeExt[0], '%s.vNumber' %pipeTes[0])
				cmds.addAttr(pipeExt[0], ln='Ext_DivisionU', at='short', k=True, dv=sdu)
				cmds.connectAttr('%s.Ext_DivisionU' %pipeExt[0], '%s.uNumber' %pipeTes[0])
				if subCurve != 0:
					cmds.addAttr(pipeExt[0], ln='Ext_Length', k=True, dv=1, max=1, min=0)
					cmds.connectAttr('%s.Ext_Length' %pipeExt[0], '%s.maxValue' %pipeSubCurve[1])
				cmds.addAttr(pipeExt[0], ln='Ext_Taper', k=True, dv=tap, min=0)
				cmds.connectAttr('%s.Ext_Taper' %pipeExt[0], '%s.scale' %pipeExt[1])
				cmds.addAttr(pipeExt[0], ln='Ext_Twist', k=True, dv=1)
				cmds.connectAttr('%s.Ext_Twist' %pipeExt[0], '%s.rotation' %pipeExt[1])
				cmds.addAttr(pipeExt[0], ln='Ext_ComponentPivot', k=True, dv=1)
				cmds.connectAttr('%s.Ext_ComponentPivot' %pipeExt[0], '%s.useComponentPivot' %pipeExt[1])

			curveGrpNode = cmds.createNode('transform', n='pipeCurves')
			cmds.parent(nurbsCir, curveGrpNode)
			cmds.parent(objSel, curveGrpNode)
	
			cmds.setAttr('%s.inheritsTransform' %curveGrpNode, 0)
			cmds.setAttr('%s.visibility' %curveGrpNode, 1)
			cmds.parent(curveGrpNode, pipeExt[0])
			cmds.select(pipeExt[0])
			if do_uvs == 1:
				cmds.polyLayoutUV(ps=0.2)
				cmds.polyEditUV(sv=1, su=self.uvRatio)
				cmds.polyEditUV(sv=0.95, su=0.95)
				cmds.select(pipeExt[0])
				CentreUVs()
				if clean == 1:
					cmds.delete(ch=True)
					cmds.delete(curveGrpNode)
					cmds.select(pipeExt[0])
			if thisIsAMesh == True:
				print 'hello'
				break					
コード例 #19
0
#from ObjectScatter import *
import ObjectScatter
reload(ObjectScatter)


import maya.cmds as cmds
import random

points = [ cmds.pointPosition('curve1.cv[%i]'%i) for i in range(cmds.getAttr('curve1.spans') + cmds.getAttr('curve1.degree')) ]
tangent = [ cmds.pointOnCurve('curve1', pr=(1.0/23)*i, t=True) for i in range(23) ]

for pos in points:
	cmds.select(cmds.polyCone(r=0.2, h=0.2)[0])
	cmds.move(pos[0], pos[1], pos[2])
	cmds.select(['curve1', cmds.ls(sl=True)[0]]) 
	cmds.tangentConstraint(aimVector=(0,1,0), upVector=(1,0,1), worldUpType="vector",worldUpVector=(0,1,0))


new = cmds.polyCube()[0]
cmds.rotate(0, random.uniform(0, 360), 0)
cmds.move(random.uniform(0,8), 0, 0, os=True)


# UI
winName = "Object Scatter"
if(cmds.window(winName, exists=True)):
        cmds.deleteUI(winName)

window = cmds.window( title=winName, iconName=winName, widthHeight=(512, 512), maximizeButton=False )
cmds.columnLayout( adjustableColumn=True )
cmds.button( label='Vertex Paint', command=lambda x: (cmds.PaintVertexColorToolOptions(), cmds.select(all=True)) )
コード例 #20
0
def build(attachments=4,
          sections=9,
          sectionsSpans=8,
          minRadius=0.0,
          maxRadius=1.0,
          startPt=[0.0, 0.0, 6.0],
          endPt=[0.0, 0.0, -6.0],
          prefix='muscle'):
    '''
	Build muscle primitive based on the input argument values between the start and end points

	@param attachments: Number of attachments points
	@type attachments: int
	@param sections: Number of profile curves
	@type sections: int
	@param sectionSpans: Number of spans for profile curves
	@type sectionSpans: int
	@param minRadius: Minimum radius for muscle profile curves
	@type minRadius: float
	@param maxRadius: Maximum radius for muscle profile curves
	@type maxRadius: float
	@param startPt: Start point of the muscle
	@type startPt: list
	@param endPt: End point of the muscle
	@type endPt: list
	@param prefix: Name prefix for muscle primitive
	@type prefix: str

	@return: Muscle mesh
	@returnType: str
	'''
    # Checks

    # Get start, end and distance values
    startPoint = glTools.utils.base.getMPoint(startPt)
    endPoint = glTools.utils.base.getMPoint(endPt)
    startEndOffset = endPoint - startPoint
    startEndDist = startEndOffset.length()
    startEndInc = startEndDist / (attachments - 1)

    # Calculate attachment point positions
    attachPoints = []
    for i in range(attachments):
        attachPoints.append(startPoint +
                            (startEndOffset.normal() * startEndInc * i))
        # Start Tangent
        if not i:
            attachPoints.append(startPoint +
                                (startEndOffset.normal() * startEndInc * 0.5))
        # End Tangent
        if i == (attachments - 2):
            attachPoints.append(startPoint +
                                (startEndOffset.normal() * startEndInc *
                                 (i + 0.5)))
    attachPts = [[pt.x, pt.y, pt.z] for pt in attachPoints]
    # Resize attachments value to accomodate for tangent points
    attachments = len(attachPts)

    # ------------------------
    # - Build base hierarchy -
    # ------------------------

    # Create groups
    muscleGrp = mc.createNode('transform', n=prefix + '_group')
    muscleAttachGrp = mc.createNode('transform',
                                    n=prefix + '_attachment_group')
    muscleProfileGrp = mc.createNode('transform', n=prefix + '_profile_group')

    # Build hierarchy
    mc.parent(muscleAttachGrp, muscleGrp)
    mc.parent(muscleProfileGrp, muscleGrp)

    # ----------------------
    # - Build Muscle Curve -
    # ----------------------

    # Build muscle base curve
    muscleCurve = mc.rename(
        mc.curve(d=1, p=attachPts, k=range(len(attachPts))), prefix + '_curve')
    mc.rebuildCurve(muscleCurve,
                    ch=0,
                    rpo=1,
                    rt=0,
                    end=1,
                    kr=0,
                    kcp=1,
                    kep=1,
                    kt=1,
                    s=0,
                    d=1)
    muscleCurveShape = mc.listRelatives(muscleCurve, s=True)[0]
    mc.parent(muscleCurve, muscleAttachGrp)

    # Add muscle attributes
    mc.addAttr(muscleCurve, ln='muscle', at='message')
    mc.addAttr(muscleCurve, ln='muscleObjectType', dt='string')
    mc.setAttr(muscleCurve + '.muscleObjectType',
               'spline',
               type='string',
               l=True)

    # Connect curve to attachment locators
    attachLocators = glTools.utils.curve.locatorCurve(muscleCurve,
                                                      locatorScale=0.1,
                                                      freeze=False,
                                                      prefix=prefix)
    # Rename attachment locators and add muscle attibutes
    for i in range(len(attachLocators)):
        # Add muscle attibutes
        mc.addAttr(attachLocators[i], ln='muscle', at='message')
        mc.addAttr(attachLocators[i], ln='muscleObjectType', dt='string')
        mc.setAttr(attachLocators[i] + '.muscleObjectType',
                   'attachment',
                   type='string',
                   l=True)

        # Rename attachment locators
        if not i:
            attachLocators[i] = mc.rename(attachLocators[i],
                                          prefix + '_attachStart_locator')
        elif i == 1:
            attachLocators[i] = mc.rename(
                attachLocators[i], prefix + '_attachStartTangent_locator')
            mc.setAttr(attachLocators[i] + '.muscleObjectType', l=False)
            mc.setAttr(attachLocators[i] + '.muscleObjectType',
                       'attachmentTangent',
                       type='string',
                       l=True)
        elif i == (attachments - 2):
            attachLocators[i] = mc.rename(attachLocators[i],
                                          prefix + '_attachEndTangent_locator')
            mc.setAttr(attachLocators[i] + '.muscleObjectType', l=False)
            mc.setAttr(attachLocators[i] + '.muscleObjectType',
                       'attachmentTangent',
                       type='string',
                       l=True)
        elif i == (attachments - 1):
            attachLocators[i] = mc.rename(attachLocators[i],
                                          prefix + '_attachEnd_locator')
        else:
            attachLocators[i] = mc.rename(
                attachLocators[i],
                prefix + '_attachMid' + str(i - 1) + '_locator')

    # Group attachment locators
    attachLocGroup = []
    [
        attachLocGroup.append(glTools.utils.base.group(loc))
        for loc in attachLocators
    ]
    mc.parent(attachLocGroup, muscleAttachGrp)

    # Create spline rebuild curve
    splineCurve = mc.rebuildCurve(muscleCurve,
                                  ch=1,
                                  rpo=0,
                                  rt=0,
                                  end=1,
                                  kr=0,
                                  kcp=0,
                                  kep=1,
                                  kt=1,
                                  s=5,
                                  d=3)
    splineRebuild = mc.rename(splineCurve[1], prefix + '_spline_rebuildCurve')
    splineCurveShape = mc.rename(
        mc.listRelatives(splineCurve[0], s=True)[0],
        prefix + '_spline_curveShape')
    mc.parent(splineCurveShape, muscleCurve, s=True, r=True)
    mc.delete(splineCurve[0])

    # Create tangent rebuild curve
    tangentCurve = mc.rebuildCurve(muscleCurve,
                                   ch=1,
                                   rpo=0,
                                   rt=0,
                                   end=1,
                                   kr=0,
                                   kcp=0,
                                   kep=1,
                                   kt=1,
                                   s=2,
                                   d=3)
    tangentRebuild = mc.rename(tangentCurve[1],
                               prefix + '_tangent_rebuildCurve')
    tangentCurveShape = mc.rename(
        mc.listRelatives(tangentCurve[0], s=True)[0],
        prefix + '_tangent_curveShape')
    mc.parent(tangentCurveShape, muscleCurve, s=True, r=True)
    mc.delete(tangentCurve[0])

    # Create curve visibility attributes
    mc.addAttr(muscleCurve, ln='attachment', at='enum', en='Off:On:')
    mc.setAttr(muscleCurve + '.attachment', k=False, cb=True)
    mc.connectAttr(muscleCurve + '.attachment', muscleCurveShape + '.v')

    mc.addAttr(muscleCurve, ln='spline', at='enum', en='Off:On:')
    mc.setAttr(muscleCurve + '.spline', k=False, cb=True)
    mc.connectAttr(muscleCurve + '.spline', splineCurveShape + '.v')

    mc.addAttr(muscleCurve, ln='tangent', at='enum', en='Off:On:')
    mc.setAttr(muscleCurve + '.tangent', k=False, cb=True)
    mc.connectAttr(muscleCurve + '.tangent', tangentCurveShape + '.v')

    mc.setAttr(muscleCurve + '.attachment', 0)
    mc.setAttr(muscleCurve + '.spline', 1)
    mc.setAttr(muscleCurve + '.tangent', 1)

    # Setup start tangent toggle
    mc.addAttr(attachLocators[0], ln='tangentControl', at='enum', en='Off:On:')
    mc.setAttr(attachLocators[0] + '.tangentControl', k=False, cb=True)
    mc.connectAttr(attachLocators[0] + '.tangentControl',
                   attachLocGroup[1] + '.v',
                   f=True)
    startTangentBlend = mc.createNode('blendColors',
                                      n=prefix + '_startTangent_blendColors')
    mc.connectAttr(attachLocators[1] + '.worldPosition[0]',
                   startTangentBlend + '.color1',
                   f=True)
    mc.connectAttr(attachLocators[2] + '.worldPosition[0]',
                   startTangentBlend + '.color2',
                   f=True)
    mc.connectAttr(attachLocators[0] + '.tangentControl',
                   startTangentBlend + '.blender',
                   f=True)
    mc.connectAttr(startTangentBlend + '.output',
                   muscleCurve + '.controlPoints[1]',
                   f=True)
    # Setup end tangent toggle
    mc.addAttr(attachLocators[-1],
               ln='tangentControl',
               at='enum',
               en='Off:On:')
    mc.setAttr(attachLocators[-1] + '.tangentControl', k=False, cb=True)
    mc.connectAttr(attachLocators[-1] + '.tangentControl',
                   attachLocGroup[-2] + '.v',
                   f=True)
    endTangentBlend = mc.createNode('blendColors',
                                    n=prefix + '_endTangent_blendColors')
    mc.connectAttr(attachLocators[-2] + '.worldPosition[0]',
                   endTangentBlend + '.color1',
                   f=True)
    mc.connectAttr(attachLocators[-3] + '.worldPosition[0]',
                   endTangentBlend + '.color2',
                   f=True)
    mc.connectAttr(attachLocators[-1] + '.tangentControl',
                   endTangentBlend + '.blender',
                   f=True)
    mc.connectAttr(endTangentBlend + '.output',
                   muscleCurve + '.controlPoints[' + str(attachments - 2) +
                   ']',
                   f=True)

    # -------------------------------
    # - Build Muscle Profile Curves -
    # -------------------------------

    # Initialize profile list
    profileList = []
    profileGrpList = []
    profileFollowList = []

    # Iterate through profiles
    profileInc = 1.0 / (sections - 1)
    for i in range(sections):

        # Create profile curve
        profile = mc.circle(ch=0,
                            c=(0, 0, 0),
                            nr=(0, 0, 1),
                            sw=360,
                            r=1,
                            d=3,
                            ut=0,
                            tol=0.01,
                            s=sectionsSpans,
                            n=prefix + '_profile' + str(i + 1) + '_curve')[0]
        profileList.append(profile)

        # Add muscle profile attribute
        mc.addAttr(profile, ln='muscle', at='message')
        mc.addAttr(profile, ln='muscleObjectType', dt='string')
        mc.setAttr(profile + '.muscleObjectType',
                   'profile',
                   type='string',
                   l=True)

        # Group profile curve
        profileGrp = glTools.utils.base.group(profile)
        profileGrpList.append(profileGrp)

        # Skip start/end profiles
        if (not i) or (i == (sections - 1)): continue

        # Add curve parameter attribute
        mc.addAttr(profile, ln='uValue', min=0.0, max=1.0, dv=profileInc * i)
        mc.setAttr(profile + '.uValue', k=False, cb=True)

        # Create profile pointOnCurveInfo node
        profileCurveInfo = mc.createNode('pointOnCurveInfo',
                                         n=prefix + '_profile' + str(i + 1) +
                                         '_pointOnCurveInfo')

        # Attach profile group to point on muscle spline curve
        mc.connectAttr(splineCurveShape + '.worldSpace[0]',
                       profileCurveInfo + '.inputCurve',
                       f=True)
        mc.connectAttr(profile + '.uValue',
                       profileCurveInfo + '.parameter',
                       f=True)
        mc.connectAttr(profileCurveInfo + '.position',
                       profileGrp + '.translate',
                       f=True)

        # Create profile follow group
        profileFollowGrp = mc.createNode('transform',
                                         n=prefix + '_profileFollow' +
                                         str(i + 1) + '_group')
        profileFollowList.append(profileFollowGrp)
        mc.connectAttr(profileCurveInfo + '.position',
                       profileFollowGrp + '.translate',
                       f=True)

    mc.parent(profileGrpList, muscleProfileGrp)
    mc.parent(profileFollowList, muscleProfileGrp)

    # ------------------------------------
    # - Create profile orientation setup -
    # ------------------------------------

    oddProfile = sections % 2
    intProfile = int(sections * 0.5)
    midProfile = intProfile + oddProfile
    intIncrement = 1.0 / intProfile

    # Create mid profile orientConstraint
    if oddProfile:
        midPointObject = profileFollowList[midProfile - 2]
    else:
        midPointObject = mc.createNode('transform',
                                       n=prefix + '_midPointFollow_group')
        mc.parent(midPointObject, muscleProfileGrp)
    midOrientCon = mc.orientConstraint([attachLocators[0], attachLocators[-1]],
                                       midPointObject,
                                       n=prefix + '_midPoint_orientConstraint')

    # Create intermediate profile orientConstraints
    for i in range(intProfile):

        # Skip start/end profiles
        if not i: continue

        # Create orientConstraints
        startMidOriCon = mc.orientConstraint(
            [attachLocators[0], midPointObject], profileFollowList[i - 1])[0]
        endMidOriCon = mc.orientConstraint(
            [attachLocators[-1], midPointObject], profileFollowList[-(i)])[0]
        startMidOriWt = mc.orientConstraint(startMidOriCon,
                                            q=True,
                                            weightAliasList=True)
        endMidOriWt = mc.orientConstraint(endMidOriCon,
                                          q=True,
                                          weightAliasList=True)

        # Set constraint weights
        mc.setAttr(startMidOriCon + '.' + startMidOriWt[0],
                   1.0 - (intIncrement * i))
        mc.setAttr(startMidOriCon + '.' + startMidOriWt[1], (intIncrement * i))
        mc.setAttr(endMidOriCon + '.' + endMidOriWt[0],
                   1.0 - (intIncrement * i))
        mc.setAttr(endMidOriCon + '.' + endMidOriWt[1], (intIncrement * i))

        # Add constraint weight attribute to profile
        mc.addAttr(profileList[i],
                   ln='twist',
                   min=0,
                   max=1,
                   dv=1.0 - (intIncrement * i),
                   k=True)
        mc.addAttr(profileList[-(i + 1)],
                   ln='twist',
                   min=0,
                   max=1,
                   dv=1.0 - (intIncrement * i),
                   k=True)

        # Connect twist attribite to constraint weights
        startMidOriRev = mc.createNode('reverse',
                                       n=profileList[i].replace(
                                           '_curve', '_reverse'))
        endMidOriRev = mc.createNode('reverse',
                                     n=profileList[-(i + 1)].replace(
                                         '_curve', '_reverse'))
        mc.connectAttr(profileList[i] + '.twist',
                       startMidOriRev + '.inputX',
                       f=True)
        mc.connectAttr(profileList[i] + '.twist',
                       startMidOriCon + '.' + startMidOriWt[0],
                       f=True)
        mc.connectAttr(startMidOriRev + '.outputX',
                       startMidOriCon + '.' + startMidOriWt[1],
                       f=True)
        mc.connectAttr(profileList[-(i + 1)] + '.twist',
                       endMidOriRev + '.inputX',
                       f=True)
        mc.connectAttr(profileList[-(i + 1)] + '.twist',
                       endMidOriCon + '.' + endMidOriWt[0],
                       f=True)
        mc.connectAttr(endMidOriRev + '.outputX',
                       endMidOriCon + '.' + endMidOriWt[1],
                       f=True)

    # Create Profile tangent constraints
    tangentConList = []
    for i in range(len(profileGrpList)):
        # Determine world up object
        if not i:
            # start profile
            worldUpObject = attachLocators[0]
        elif i == (len(profileGrpList) - 1):
            # end profile
            worldUpObject = attachLocators[-1]
        else:
            worldUpObject = profileFollowList[i - 1]
        # Create constraint
        tangentCon = mc.tangentConstraint(tangentCurveShape,
                                          profileGrpList[i],
                                          aim=[0, 0, -1],
                                          u=[0, 1, 0],
                                          wu=[0, 1, 0],
                                          wut='objectrotation',
                                          wuo=worldUpObject)
        tangentConList.append(tangentCon)

    # -----------------------------
    # - Set profile radius values -
    # -----------------------------

    # Set default profile radius values
    radiusList = glTools.utils.mathUtils.distributeValue(midProfile,
                                                         rangeStart=minRadius,
                                                         rangeEnd=maxRadius)
    radiusList = [
        glTools.utils.mathUtils.smoothStep(i, minRadius, maxRadius, 0.5)
        for i in radiusList
    ]
    for i in range(midProfile):
        mc.setAttr(profileList[i] + '.scale', radiusList[i], radiusList[i],
                   radiusList[i])
        mc.setAttr(profileList[-(i + 1)] + '.scale', radiusList[i],
                   radiusList[i], radiusList[i])

    # ----------------------------
    # - Generate Muscle Geometry -
    # ----------------------------

    # Loft mesh between profile curves
    loft = mc.loft(profileList, u=0, c=0, d=3, ch=1, po=1)
    muscleMesh = mc.rename(loft[0], prefix)
    muscleLoft = mc.rename(loft[1], prefix + '_loft')
    muscleTess = mc.listConnections(muscleLoft + '.outputSurface',
                                    s=False,
                                    d=True,
                                    type='nurbsTessellate')[0]
    muscleTess = mc.rename(muscleTess, prefix + '_nurbsTessellate')
    mc.parent(muscleMesh, muscleGrp)

    # Set nurbsTessellate settings
    mc.setAttr(muscleTess + '.format', 2)
    mc.setAttr(muscleTess + '.polygonType', 1)
    mc.setAttr(muscleTess + '.uType', 1)
    mc.setAttr(muscleTess + '.vType', 1)
    mc.setAttr(muscleTess + '.uNumber', 20)
    mc.setAttr(muscleTess + '.vNumber', 10)

    # Add muscle mesh attributes
    mc.addAttr(muscleMesh, ln='precision', at='long', min=1, dv=5)
    mc.setAttr(muscleMesh + '.precision', k=False, cb=True)
    mc.addAttr(muscleMesh, ln='tangentPrecision', at='long', min=1, dv=2)
    mc.setAttr(muscleMesh + '.tangentPrecision', k=False, cb=True)

    mc.addAttr(muscleMesh, ln='uDivisions', at='long', min=4, dv=20)
    mc.setAttr(muscleMesh + '.uDivisions', k=False, cb=True)
    mc.addAttr(muscleMesh, ln='vDivisions', at='long', min=3, dv=10)
    mc.setAttr(muscleMesh + '.vDivisions', k=False, cb=True)

    mc.addAttr(muscleMesh, ln='restLength', at='float', min=0, dv=startEndDist)
    mc.setAttr(muscleMesh + '.restLength', k=False, cb=True)
    mc.addAttr(muscleMesh,
               ln='currentLength',
               at='float',
               min=0,
               dv=startEndDist)
    mc.setAttr(muscleMesh + '.currentLength', k=True)
    mc.addAttr(muscleMesh, ln='lengthScale', at='float', min=0, dv=1)
    mc.setAttr(muscleMesh + '.lengthScale', k=True)

    mc.addAttr(muscleMesh, ln='muscleMessage', at='message')
    mc.addAttr(muscleMesh, ln='muscleSpline', at='message')
    mc.addAttr(muscleMesh, ln='attachment', at='message', m=True)
    mc.addAttr(muscleMesh, ln='profile', at='message', m=True)

    mc.addAttr(muscleMesh, ln='muscleObjectType', dt='string')
    mc.setAttr(muscleMesh + '.muscleObjectType', 'geo', type='string', l=True)

    # Connect muscle mesh attributes
    mc.connectAttr(muscleCurve + '.message',
                   muscleMesh + '.muscleSpline',
                   f=True)
    for i in range(len(attachLocators)):
        mc.connectAttr(attachLocators[i] + '.message',
                       muscleMesh + '.attachment[' + str(i) + ']',
                       f=True)
        mc.connectAttr(muscleMesh + '.message',
                       attachLocators[i] + '.muscle',
                       f=True)
    for i in range(len(profileList)):
        mc.connectAttr(profileList[i] + '.message',
                       muscleMesh + '.profile[' + str(i) + ']',
                       f=True)
        mc.connectAttr(muscleMesh + '.message',
                       profileList[i] + '.muscle',
                       f=True)

    # Connect muscle mesh attributes to curve rebuild settings
    mc.connectAttr(muscleMesh + '.precision', splineRebuild + '.spans', f=True)
    musclePreCondition = mc.createNode('condition',
                                       n=prefix + '_precision_condition')
    mc.setAttr(musclePreCondition + '.operation', 4)  # Less Than
    mc.connectAttr(muscleMesh + '.precision',
                   musclePreCondition + '.firstTerm',
                   f=True)
    mc.connectAttr(muscleMesh + '.tangentPrecision',
                   musclePreCondition + '.secondTerm',
                   f=True)
    mc.connectAttr(muscleMesh + '.precision',
                   musclePreCondition + '.colorIfTrueR',
                   f=True)
    mc.connectAttr(muscleMesh + '.tangentPrecision',
                   musclePreCondition + '.colorIfFalseR',
                   f=True)
    mc.connectAttr(musclePreCondition + '.outColorR',
                   tangentRebuild + '.spans',
                   f=True)

    # Connect musle mesh attributes to nurbsTessellate settings
    mc.connectAttr(muscleMesh + '.uDivisions', muscleTess + '.uNumber', f=True)
    mc.connectAttr(muscleMesh + '.vDivisions', muscleTess + '.vNumber', f=True)

    # Setup length calculation
    muscleLenCurveInfo = mc.createNode('curveInfo',
                                       n=prefix + '_length_curveInfo')
    mc.connectAttr(splineCurveShape + '.worldSpace[0]',
                   muscleLenCurveInfo + '.inputCurve',
                   f=True)
    mc.connectAttr(muscleLenCurveInfo + '.arcLength',
                   muscleMesh + '.currentLength',
                   f=True)
    muscleLenDiv = mc.createNode('multiplyDivide',
                                 n=prefix + '_length_multiplyDivide')
    mc.setAttr(muscleLenDiv + '.operation', 2)  # Divide
    mc.setAttr(muscleLenDiv + '.input1', 1, 1, 1)
    mc.setAttr(muscleLenDiv + '.input2', 1, 1, 1)
    mc.connectAttr(muscleLenCurveInfo + '.arcLength',
                   muscleLenDiv + '.input1X',
                   f=True)
    mc.connectAttr(muscleMesh + '.restLength',
                   muscleLenDiv + '.input2X',
                   f=True)
    mc.connectAttr(muscleLenDiv + '.outputX',
                   muscleMesh + '.lengthScale',
                   f=True)

    # -----------
    # - Cleanup -
    # -----------

    # Parent start/end tangent locators
    mc.parent(attachLocGroup[1], attachLocators[0])
    mc.parent(attachLocGroup[-2], attachLocators[-1])

    # Parent start/end profiles
    mc.parent(profileGrpList[0], attachLocators[0])
    mc.setAttr(profileGrpList[0] + '.t', 0.0, 0.0, 0.0)
    mc.setAttr(profileGrpList[0] + '.r', 0.0, 0.0, 0.0)
    mc.setAttr(profileGrpList[0] + '.s', 1.0, 1.0, 1.0)

    mc.parent(profileGrpList[-1], attachLocators[-1])
    mc.setAttr(profileGrpList[-1] + '.t', 0.0, 0.0, 0.0)
    mc.setAttr(profileGrpList[-1] + '.r', 0.0, 0.0, 0.0)
    mc.setAttr(profileGrpList[-1] + '.s', 1.0, 1.0, 1.0)

    # Setup start/end profile scale compensation
    attachStartScaleCompNode = mc.createNode('multiplyDivide',
                                             n=prefix +
                                             '_attachStart_multiplyDivide')
    mc.setAttr(attachStartScaleCompNode + '.input1', 1, 1, 1)
    mc.setAttr(attachStartScaleCompNode + '.operation', 2)
    mc.connectAttr(attachLocators[0] + '.scale',
                   attachStartScaleCompNode + '.input2',
                   f=True)
    mc.connectAttr(attachStartScaleCompNode + '.output',
                   profileGrpList[0] + '.scale',
                   f=True)
    attachEndScaleCompNode = mc.createNode('multiplyDivide',
                                           n=prefix +
                                           '_attachEnd_multiplyDivide')
    mc.setAttr(attachEndScaleCompNode + '.input1', 1, 1, 1)
    mc.setAttr(attachEndScaleCompNode + '.operation', 2)
    mc.connectAttr(attachLocators[-1] + '.scale',
                   attachEndScaleCompNode + '.input2',
                   f=True)
    mc.connectAttr(attachEndScaleCompNode + '.output',
                   profileGrpList[-1] + '.scale',
                   f=True)

    # Lock transforms
    mc.setAttr(muscleGrp + '.inheritsTransform', 0)
    mc.setAttr(muscleGrp + '.t', l=True, cb=True)
    mc.setAttr(muscleGrp + '.r', l=True, cb=True)
    mc.setAttr(muscleGrp + '.s', l=True, cb=True)

    # Return result
    return muscleMesh
コード例 #21
0
def traceArc(space='camera'):
    '''
    The main function for creating the arc.
    '''

    if space not in ('world','camera'):
        OpenMaya.MGlobal.displayWarning('Improper space argument.')
        return

    global ML_TRACE_ARC_PREVIOUS_SELECTION
    global ML_TRACE_ARC_PREVIOUS_SPACE

    globalScale = 1
    if mc.optionVar(exists='ml_arcTracer_brushGlobalScale'):
        globalScale = mc.optionVar(query='ml_arcTracer_brushGlobalScale')

    #save for reset:
    origTime = mc.currentTime(query=True)

    #frame range
    frameRange = utl.frameRange()
    start = frameRange[0]
    end = frameRange[1]

    #get neccesary nodes
    objs = mc.ls(sl=True, type='transform')
    if not objs:
        OpenMaya.MGlobal.displayWarning('Select objects to trace')
        return

    ML_TRACE_ARC_PREVIOUS_SELECTION = objs
    ML_TRACE_ARC_PREVIOUS_SPACE = space

    cam = None
    nearClipPlane = None
    shortCam = ''
    if space=='camera':
        cam = utl.getCurrentCamera()

        #the arc will be placed just past the clip plane distance, but no closer than 1 unit.
        nearClipPlane = max(mc.getAttr(cam+'.nearClipPlane'),1)

        shortCam = mc.ls(cam, shortNames=True)[0]

    topGroup = 'ml_arcGroup'
    worldGrp = 'ml_arcWorldGrp'
    localGrp = 'ml_localGrp_'+shortCam

    #create nodes
    if not mc.objExists(topGroup):
        topGroup = mc.group(empty=True, name=topGroup)

    parentGrp = topGroup
    if space=='world' and not mc.objExists(worldGrp):
        worldGrp = mc.group(empty=True, name=worldGrp)
        mc.setAttr(worldGrp+'.overrideEnabled',1)
        mc.setAttr(worldGrp+'.overrideDisplayType',2)
        mc.parent(worldGrp, topGroup)
        parentGrp = mc.ls(worldGrp)[0]

    if space == 'camera':
        camConnections = mc.listConnections(cam+'.message', plugs=True, source=False, destination=True)
        if camConnections:
            for cc in camConnections:
                if '.ml_parentCam' in cc:
                    localGrp = mc.ls(cc, o=True)[0]

        if not mc.objExists(localGrp):
            localGrp = mc.group(empty=True, name=localGrp)
            mc.parentConstraint(cam, localGrp)
            mc.setAttr(localGrp+'.overrideEnabled',1)
            mc.setAttr(localGrp+'.overrideDisplayType',2)
            mc.parent(localGrp, topGroup)

            mc.addAttr(localGrp, at='message', longName='ml_parentCam')
            mc.connectAttr(cam+'.message', localGrp+'.ml_parentCam')

        parentGrp = mc.ls(localGrp)[0]

    #group per object:
    group = []

    for i,obj in enumerate(objs):
        sn = mc.ls(obj,shortNames=True)[0]
        name = sn.replace(':','_')

        groupName = 'ml_{}_arcGrp'.format(name)
        if mc.objExists(groupName):
            mc.delete(groupName)

        group.append(mc.group(empty=True, name=groupName))

        group[i] = mc.parent(group[i],parentGrp)[0]
        mc.setAttr(group[i]+'.translate', 0,0,0)
        mc.setAttr(group[i]+'.rotate', 0,0,0)

    with utl.UndoChunk():

        #determine the method to run. Test fast against accurate.
        #If fast is the same, continue with fast method.
        #Otherwise revert to accurate method.

        mc.currentTime(start)
        fastPoints = arcDataFast([objs[0]], parentGrp, start+1, start+1, space, nearClipPlane, cam)
        accuratePoints = arcDataAccurate([objs[0]], parentGrp, start+1, start+1, space, nearClipPlane, cam)

        points = None
        #if they're equivalent, continue with fast:
        if [int(x*1000000) for x in fastPoints[0][0]] == [int(x*1000000) for x in accuratePoints[0][0]]:
            points = arcDataFast([objs[0]], parentGrp, start, end, space, nearClipPlane, cam)
        else:
            points = arcDataAccurate([objs[0]], parentGrp, start, end, space, nearClipPlane, cam)

        #create the curves and do paint effects
        mc.ResetTemplateBrush()
        brush = mc.getDefaultBrush()
        mc.setAttr(brush+'.screenspaceWidth',1)
        mc.setAttr(brush+'.distanceScaling',0)
        mc.setAttr(brush+'.brushWidth',0.005)

        for i,obj in enumerate(objs):

            #setup brush for path
            globalScale
            mc.setAttr(brush+'.globalScale', globalScale)
            mc.setAttr(brush+'.screenspaceWidth',1)
            mc.setAttr(brush+'.distanceScaling',0)
            mc.setAttr(brush+'.brushWidth',0.003)

            #color
            for c in ('R','G','B'):
                color = random.uniform(0.3,0.7)
                mc.setAttr(brush+'.color1'+c,color)

            baseCurve = mc.curve(d=3,p=points[i])
            #fitBspline makes a curve that goes THROUGH the points, a more accurate path
            curve = mc.fitBspline(baseCurve, constructionHistory=False, tolerance=0.001, name='ml_arcTracer_curve_#')
            mc.delete(baseCurve)

            #paint fx
            mc.AttachBrushToCurves(curve)
            stroke = mc.ls(sl=True)[0]
            mc.rename(mc.listConnections(stroke+'.brush', destination=False)[0], 'ml_arcTracer_brush_#')

            stroke = mc.parent(stroke,group[i])[0]

            mc.setAttr(stroke+'.overrideEnabled',1)
            mc.setAttr(stroke+'.overrideDisplayType',2)

            mc.setAttr(stroke+'.displayPercent',92)
            mc.setAttr(stroke+'.sampleDensity',0.5)
            mc.setAttr(stroke+'.inheritsTransform',0)
            mc.setAttr(stroke+'.translate',0,0,0)
            mc.setAttr(stroke+'.rotate',0,0,0)

            curve = mc.parent(curve,group[i])[0]
            mc.setAttr(curve+'.translate',0,0,0)
            mc.setAttr(curve+'.rotate',0,0,0)

            mc.hide(curve)

            #setup brush for tics
            if space=='camera':
                mc.setAttr(brush+'.brushWidth',0.008)
            if space=='world':
                mc.setAttr(brush+'.brushWidth',0.005)
            mc.setAttr(brush+'.color1G',0)
            mc.setAttr(brush+'.color1B',0)

            for t in range(len(points[i])):
                frameCurve = None
                if space=='camera':
                    vec = utl.Vector(points[i][t][0],points[i][t][1],points[i][t][2])
                    vec*=0.98
                    frameCurve = mc.curve(d=1,p=[points[i][t],vec[:]])

                elif space=='world':
                    frameCurve = mc.circle(constructionHistory=False, radius=0.0001, sections=4)[0]
                    mc.setAttr(frameCurve+'.translate', points[i][t][0], points[i][t][1], points[i][t][2])
                    constraint = mc.tangentConstraint(curve, frameCurve, aimVector=(0,0,1), worldUpType='scene')
                    #mc.delete(constraint)

                #check for keyframe
                colorAttribute='color1G'
                if mc.keyframe(obj, time=((t+start-0.5),(t+start+0.5)), query=True):
                    mc.setAttr(brush+'.color1R',1)
                else:
                    mc.setAttr(brush+'.color1R',0)

                mc.AttachBrushToCurves(curve)

                stroke = mc.ls(sl=True)[0]
                thisBrush = mc.listConnections(stroke+'.brush', destination=False)[0]
                thisBrush = mc.rename(thisBrush, 'ml_arcTracer_brush_#')

                #setup keyframes for frame highlighting
                mc.setKeyframe(thisBrush, attribute='color1G', value=0, time=(start+t-1, start+t+1))
                mc.setKeyframe(thisBrush, attribute='color1G', value=1, time=(start+t,))

                stroke = mc.parent(stroke,group[i])[0]

                mc.hide(frameCurve)

                mc.setAttr(stroke+'.displayPercent',92)
                mc.setAttr(stroke+'.sampleDensity',0.5)

                frameCurve = mc.parent(frameCurve,group[i])[0]

                if space=='camera':
                    mc.setAttr(stroke+'.inheritsTransform',0)
                    mc.setAttr(stroke+'.pressureScale[1].pressureScale_Position', 1)
                    mc.setAttr(stroke+'.pressureScale[1].pressureScale_FloatValue', 0)
                    mc.setAttr(stroke+'.translate',0,0,0)
                    mc.setAttr(stroke+'.rotate',0,0,0)
                    mc.setAttr(frameCurve+'.translate',0,0,0)
                    mc.setAttr(frameCurve+'.rotate',0,0,0)

        mc.currentTime(origTime, edit=True)
        panel = mc.getPanel(withFocus=True)
        try:
            mc.modelEditor(panel, edit=True, strokes=True)
        except:
            pass

    mc.select(objs,replace=True)
    mc.refresh()
コード例 #22
0
    def pathCurveSet(self, plusLength):
        self.nearParam_list = list()
        self.getLength_list = list()
        self.pathCrv_attLoc_list = list()
        self.upPathLoc_list = list()

        cmds.addAttr('root_CON', ln='run', at='double', dv=0)
        cmds.setAttr('root_CON.run', e=True, k=True)
        cmds.createNode('transform', n='pathSet_GRP', p='noneTransform_GRP')
        cvStartPos = self.customBodyJointsPos[0]
        setLength = self.disDMS + plusLength
        curvePos = [0, cvStartPos[1], setLength]
        pathSet_crv = cmds.curve(p=[cvStartPos, curvePos], d=1)

        cmds.rebuildCurve(pathSet_crv, d=3, s=10)
        self.pathSet_crv = cmds.rename(pathSet_crv, 'pathSet_CRV')
        self.pathSet_crvShp = cmds.listRelatives(self.pathSet_crv, s=1)[0]
        pathSet_CIF = cmds.createNode('curveInfo', n='pathSet_CIF')

        for i in self.FKNull:
            nearDCM = cmds.createNode('decomposeMatrix')
            nearestNode = cmds.createNode('nearestPointOnCurve')
            arcLengthDMS = cmds.arcLengthDimension('%s.u[0]' %
                                                   self.pathSet_crv)
            curveShape = cmds.listRelatives(self.pathSet_crv, s=1)[0]
            cmds.connectAttr('%s.worldMatrix[0]' % i,
                             '%s.inputMatrix' % nearDCM)
            cmds.connectAttr('%s.worldSpace[0]' % curveShape,
                             '%s.inputCurve' % nearestNode)
            cmds.connectAttr('%s.outputTranslate' % nearDCM,
                             '%s.inPosition' % nearestNode)
            nearParam = cmds.getAttr('%s.parameter' % nearestNode)
            self.nearParam_list.append(nearParam)
            cmds.setAttr('%s.uParamValue' % arcLengthDMS, nearParam)
            getLength = cmds.getAttr('%s.arcLength' % arcLengthDMS)
            self.getLength_list.append(getLength)
            cmds.delete(nearDCM, nearestNode, arcLengthDMS)
            #return getLength
            print '%s.param = "%s"' % (i, nearParam)
            print '%s.length = "%s"' % (i, getLength)
            #return getLength,nearParam
            pathCrv_attLoc = cmds.spaceLocator(
                n=self.FKNull[self.FKNull.index(i)] + '_attatch_LOC')[0]
            self.pathCrv_attLoc_list.append(pathCrv_attLoc)
            cmds.setAttr('%s.template' % pathCrv_attLoc, 1)
            cmds.hide(pathCrv_attLoc)
            adl = cmds.createNode('addDoubleLinear',
                                  n=pathCrv_attLoc.replace(
                                      pathCrv_attLoc.split('_')[-1], 'ADL'))
            clp = cmds.createNode('curveLength2ParamU',
                                  n=pathCrv_attLoc.replace(
                                      pathCrv_attLoc.split('_')[-1], 'CLP'))
            poci = cmds.createNode('pointOnCurveInfo',
                                   n=pathCrv_attLoc.replace(
                                       pathCrv_attLoc.split('_')[-1], 'POCI'))
            cmds.connectAttr('root_CON.run', '%s.input2' % adl)
            cmds.setAttr('%s.input1' % adl, getLength)
            cmds.connectAttr('%s.output' % adl, '%s.inputLength' % clp)
            cmds.connectAttr('%s.worldSpace[0]' % self.pathSet_crvShp,
                             '%s.inputCurve' % clp)
            cmds.connectAttr('%s.worldSpace[0]' % self.pathSet_crvShp,
                             '%s.inputCurve' % poci)
            cmds.connectAttr('%s.outputParamU' % clp, '%s.parameter' % poci)
            cmds.connectAttr('%s.position' % poci,
                             '%s.translate' % pathCrv_attLoc)

        # reverse variable
        pathCrv_attLoc_list_rev_range = list()
        self.pathCrv_attLoc_list_rev = list(
        )  # pathCurve attatch Locator list reverse variable
        FKNull_rev_range = list()
        self.FKNull_rev = list()  # fk null reverse variable
        for j in self.pathCrv_attLoc_list:
            pathCrv_attLoc_list_rev_range.append(
                self.pathCrv_attLoc_list.index(j))
        pathCrv_attLoc_list_rev_range.reverse()
        for i in pathCrv_attLoc_list_rev_range:
            self.pathCrv_attLoc_list_rev.append(self.pathCrv_attLoc_list[i])
        for j in self.FKNull:
            FKNull_rev_range.append(self.FKNull.index(j))
        FKNull_rev_range.reverse()
        for i in FKNull_rev_range:
            self.FKNull_rev.append(self.FKNull[i])

        for k in self.pathCrv_attLoc_list_rev:  # controller upVec set and < pathCrv_attLoc connect to FKNull >
            locXform = cmds.xform(k, ws=True, q=True, t=True)
            upPathLoc = cmds.spaceLocator(
                n=k.replace(k.split('_')[-1], 'upVec_LOC'),
                p=(locXform[0], locXform[1], locXform[2]))[0]
            self.upPathLoc_list.append(upPathLoc)
            cmds.CenterPivot(upPathLoc)
            cmds.setAttr('%s.template' % upPathLoc, 1)
            cmds.setAttr('%s.ty' % upPathLoc, 20)
            temp_MMX = cmds.createNode('multMatrix',
                                       n=k.replace(k.split('_')[-1], 'MMX'))
            temp_DCM = cmds.createNode('decomposeMatrix',
                                       n=k.replace(k.split('_')[-1], 'DCM'))
            if self.pathCrv_attLoc_list_rev.index(k) is 0:
                cmds.connectAttr('%s.worldMatrix[0]' % k,
                                 '%s.matrixIn[0]' % temp_MMX)
                cmds.connectAttr('root_CON.worldInverseMatrix[0]',
                                 '%s.matrixIn[1]' % temp_MMX)
                cmds.connectAttr('%s.matrixSum' % temp_MMX,
                                 '%s.inputMatrix' % temp_DCM)
                cmds.connectAttr(
                    '%s.outputTranslate' % temp_DCM, '%s.translate' %
                    self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
                cmds.connectAttr(
                    '%s.outputRotate' % temp_DCM, '%s.rotate' %
                    self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
            elif self.pathCrv_attLoc_list_rev.index(k) is not 0:
                cmds.connectAttr('%s.worldMatrix[0]' % k,
                                 '%s.matrixIn[0]' % temp_MMX)
                cmds.connectAttr(
                    '%s.worldInverseMatrix[0]' % self.pathCrv_attLoc_list_rev[
                        self.pathCrv_attLoc_list_rev.index(k) - 1],
                    '%s.matrixIn[1]' % temp_MMX)
                cmds.connectAttr('%s.matrixSum' % temp_MMX,
                                 '%s.inputMatrix' % temp_DCM)
                cmds.connectAttr(
                    '%s.outputTranslate' % temp_DCM, '%s.translate' %
                    self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
                cmds.connectAttr(
                    '%s.outputRotate' % temp_DCM, '%s.rotate' %
                    self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
        # IKSub_loc_list , for curveVis locator
        self.IKSub_loc_list = list()
        for i in self.IKSubCon:
            IKSub_loc = cmds.spaceLocator(
                n=i.replace(i.split('_')[-1], 'LOC'))[0]
            cmds.parentConstraint(i, IKSub_loc, mo=0)
            self.IKSub_loc_list.append(IKSub_loc)
            cmds.parent(IKSub_loc, 'upVecVisCurve_GRP')
            cmds.toggle(IKSub_loc, template=True)
            cmds.hide(IKSub_loc)
        self.IKSub_loc_list.reverse()
        # set upvec con
        self.upVecPathLocControlSet()
        # tangent constraint
        for i in self.pathCrv_attLoc_list:
            cmds.tangentConstraint(
                self.pathSet_crv,
                i,
                aim=[0.0, 0.0, 1.0],
                u=[0.0, 1.0, 0.0],
                wut='object',
                wuo='%s' %
                self.upPathLoc_list[self.pathCrv_attLoc_list_rev.index(i)])
        # set root matrix
        self.addRootMatrix()
        # set node hierachy structure
        self.setNodeHierachy_second()
コード例 #23
0
ファイル: core.py プロジェクト: pecktd/pkrig
def tangentConstraint( *args , **kwargs ) :
	# tangentConstraint command
	return Constraint( mc.tangentConstraint( *args , **kwargs )[0] )
コード例 #24
0
def tangentConstraint(*args, **kwargs):
    # tangentConstraint command
    return Constraint(mc.tangentConstraint(*args, **kwargs)[0])
コード例 #25
0
def creat_anntena_base( selObj, jnt_str, jntOri, jointMethod, num_of_jnt ):
 objectCondition = 0
 for i in range(len(MakeAtna_returnV)):
     del MakeAtna_returnV[0]
 for i in selObj:
     shape = cmds.listRelatives(i,s=1)
     for j in shape:
         if cmds.objectType(j) != 'nurbsCurve':
             objectCondition = 1

 if objectCondition == 1:
     cmds.warning('Select Only Curve Object')
 else:
     returnTotal = []
     for i in selObj:
         returni =[]
         jnt_main_name = jnt_str+str(selObj.index(i))
         info_name = jnt_str +str(selObj.index(i)) + '_info' 
         cmds.setAttr(i+'.visibility',0)
         
         i = cmds.rebuildCurve( i, ch=0, rpo=1, rt=3 ,end=1, kr=2, kcp=1, kep=0, kt=0, tol=0.01 )[0]
         rebuildBase = ''
         if jointMethod==1:
             rebuildBase = cmds.rebuildCurve( i, ch=0, rpo=0, rt=0 ,end=1, kr=2, kcp=1, kep=0, kt=0, d=1, tol=0.01 )[0]
             num_of_jnt = cmds.getAttr(rebuildBase+'.spans') + 1
         else:
             rebuildBase = cmds.rebuildCurve( i, ch=0, rpo=0, rt=0 ,end=1, kr=2, kcp=0, kep=0, kt=0, s=num_of_jnt-1, d=1, tol=0.01 )[0]
             cmds.delete(i)
             i = cmds.rebuildCurve( rebuildBase, ch=0, rpo=0, rt=0 ,end=1, kr=1, kcp=0, kep=0, kt=0, s=0, d=3, tol=0.01 )[0]
             cmds.setAttr( i+'.v', 0)
         returni.append([i])
         returni[0].append(rebuildBase)
                                          
         jntMainLst = []
         for j in range(num_of_jnt):
             cmds.select(d=1)
             jntMainLst.append( cmds.joint(n = (jnt_main_name+'_conJoint'+str(j))) )    
         returni.append(jntMainLst)
             
         xyzDic = { 'x' : [1,0,0], 'y' : [0,1,0], 'z' : [0,0,1] }
         
         aim =  xyzDic[ jntOri[1] ]
         up =  xyzDic[ jntOri[2] ] 
         
         if jntOri[0] == '-':
          for k in range(3):
             aim[k] = aim[k]*(-1)
         
         jntGrpLst = []
         infoLst = []
         crvShp = cmds.listRelatives( rebuildBase, s=1 )[0]
         posLst = []
         for j in jntMainLst:
             index = jntMainLst.index(j)
             j = cmds.group(em=1)
             jntGrpLst.append(j)
             cmds.parent( jntMainLst[index], j )
             info = cmds.createNode( 'pointOnCurveInfo', n=info_name+str(index) )
             infoLst.append(info)
             cmds.connectAttr( crvShp+'.worldSpace[0]', info+'.inputCurve' )
             cmds.connectAttr( info+'.position', j+'.translate' )
             cmds.setAttr( info+'.parameter', jntGrpLst.index(j) )
             posLst.append( cmds.xform(j,q=1,ws=1,piv=1)[:3] )
             jc = cmds.listRelatives( j, c=1, type='joint' )[0]
             if jointMethod == 0:
                  cmds.addAttr( jc, ln='infoPos', sn='ip', at='double', min=0, max=num_of_jnt-1 )
                  cmds.setAttr( jc+'.ip', e=1, k=1 )
                  cmds.setAttr( jc+'.ip', jntGrpLst.index(j) )
                  cmds.setAttr( info+'.parameter', jntGrpLst.index(j) )       
         returni.append(jntGrpLst)
         
         ep = ''
         if jointMethod == 0:
             ep = cmds.curve(ep=posLst)
             cmds.setAttr(ep+'.v',0)
             returni[0].append(ep)
             ep = cmds.rebuildCurve( ep, ch=0, rpo=1, rt=3 ,end=1, kr=2, kcp=1, kep=0, kt=0, tol=0.01 )[0]
             epShape= cmds.listRelatives(ep,s=1)[0]
             for j in infoLst:
                 cmds.connectAttr( epShape+'.worldSpace[0]', j+'.inputCurve',f=1 )
             clusterObj = []
             clusterObj.extend(jntMainLst)
             clusterObj.append(rebuildBase)
             cmds.skinCluster(clusterObj)
         else:
             clusterObj = []
             clusterObj.extend(jntMainLst)
             clusterObj.append(i)
             cmds.skinCluster(clusterObj)
                 
         if jointMethod == 0:
             cmds.tangentConstraint( ep, jntGrpLst[0], aim=aim, u=up, wu=up, wut='scene' )  
         else:
             cmds.tangentConstraint( rebuildBase, jntGrpLst[0], aim=aim, u=up, wu=up, wut='scene' )
                 
         for j in range(1,num_of_jnt):
             if jointMethod == 0:
                 cmds.tangentConstraint( ep, jntGrpLst[j], aim=aim, u=up, wu=up, wut='objectrotation', wuo=jntMainLst[j-1] )  
             else:
                 cmds.tangentConstraint( rebuildBase, jntGrpLst[j], aim=aim, u=up, wu=up, wut='objectrotation', wuo=jntMainLst[j-1] )
                     
         returni.append(infoLst)
         axis = [aim,up]
         returni.append(axis)
         for j in jntMainLst:
             cmds.setAttr( j+'.dla', 1 )
             cmds.setAttr( j+'.jox', 0 )
             cmds.setAttr( j+'.joy', 0 )
             cmds.setAttr( j+'.joz', 0 )
             cmds.setAttr( j+'.tx', lock=1 )
             cmds.setAttr( j+'.ty', lock=1 )
             cmds.setAttr( j+'.tz', lock=1 )
             cmds.setAttr( j+'.r'+jntOri[2], lock=1 )
             cmds.setAttr( j+'.r'+jntOri[3], lock=1 )
         
         
         
         #------------------ expression ----------------#
         if jointMethod == 0:
           cmds.addAttr(rebuildBase,ln='posShp',at='double')
           cmds.setAttr(rebuildBase+'.posShp',e=1,k=1)
           
           sliderAttr = rebuildBase+'.posShp'
         
           exString  = 'float $sRate;\n'
           exString += 'float $ep[];\n'
           exString += 'if (%s >= 0)\n' % sliderAttr
           exString += '{\n'
           exString += '$sRate=%s/%s+1;\n' % (sliderAttr,num_of_jnt)
         
           for j in range(num_of_jnt):
               exString += '$ep[%s]=pow((%s.infoPos/%s),$sRate);\n' % (j,returni[1][j],num_of_jnt-1)
           exString += '}\n'
           exString += 'else\n'
           exString += '{\n'
           exString += '$sRate=1-%s/%s;\n' % (sliderAttr,num_of_jnt)
           for j in range(num_of_jnt):
               exString += '$ep[%s]=1-pow(1-(%s.infoPos/%s),$sRate);\n' % (j,returni[1][j],num_of_jnt-1)
           exString += '}\n'
           for j in range(num_of_jnt):
               exString += '%s.parameter = linstep(0,1,$ep[%s])*%s;\n' % (returni[3][j],j,num_of_jnt-1)

           exName = i+'_jointPosShape'
           cmds.expression(name=exName,s=exString,ae=1,uc='all')
           returni.append(exName)
         
         returnTotal.append(returni)
 
 MakeAtna_returnV.extend(returnTotal)