Пример #1
0
def clusterizeCurve(curve):
	curveNumber = getCurveCVNumber(curve)
	curveName = String.removeSuffix(curve)
	clusterName = (curveName + "Cluster")
	clusterList = []
	for x in range(curveNumber):
		clusterList.append( Control.createCluster( ( clusterName + str(x) ), ( curve + ".cv["+ str(x) +"]" ) ) )
	return clusterList
Пример #2
0
def createPoleVec(joints, ikHandle, position):
    """
        Creates pole vector for handle for three joints
    """
    if len(joints) != 3:
        cmds.error("Incorrect number of joints supplied to IkHandle.")
    
    # Create locator to act as pole vector
    locName = (String.removeSuffix(ikHandle) + "Pole_LOC")
    poleGrpName = (String.removeSuffix(ikHandle) + "Pole_GRP")
    poleVecName = (String.removeSuffix(ikHandle) + "Pole_PVC")
    
    loc = Lib.getFirst(cmds.spaceLocator(n = locName, p= (0,0,0) ))
    cmds.xform(loc, ws= True, t= (position[0], position[1], position[2]) )
    locGrp = cmds.group(loc, n= poleGrpName)
    cmds.poleVectorConstraint( loc , ikHandle, n= poleVecName, w=.1 )
    cmds.setAttr((loc + ".v"), 0)
    
    return locGrp
Пример #3
0
 def deleteModule(self):
     """
         Deletes module
     """
     if self.elementExists("rigList") == False:
         cmds.warning("No modules found in scene")
         return None
     
     selectedModule = Util.getFirst(self.queryInput("rigList"))
     selectedModule = String.removeSuffix(selectedModule.strip())
     self.rigInstance.deleteModule(selectedModule)
     self.loadModules({})
Пример #4
0
 def renameModule(self):
     """
         Will rename current module
     """
     if self.elementExists("rigList") == False:
         cmds.warning("No modules found in scene")
         return None
     
     selectedModule = Util.getFirst(self.queryInput("rigList"))
     selectedModule = String.removeSuffix(selectedModule.strip())
     self.createValueWindow("Enter new module name", "default","NWRig.renameModule(\""+selectedModule+"\", %)")
     self.loadModules({})
Пример #5
0
 def loadAttributes(self,type, module):
     """
         Will load attributes of module in gui
     """
     if type == "blueprint":
         moduleKey = "blueprintModuleName"
         frameKey = "blueprintAttributeframe"
         formKey = "blueprintAttributeForm"
         attributeVariable  = '.blueprintAttributes'
         attrElements = self.blueprintAttributeUIElements
         attributes = eval(module + attributeVariable)
     elif type == "rig":
         moduleKey = "rigModuleName"
         frameKey = "rigAttributeframe"
         formKey = "rigAttributeForm"
         attributeVariable  = '.rigAttributes'
         attrElements = self.rigAttributeUIElements
         attributes = self.rigInstance.Modules[String.removeSuffix(module)].rigAttributes
     else:
         cmds.error("type undefined for load attributes functions")
     
     if self.windowElements.has_key(moduleKey) == False:
         self.text({"key":moduleKey,'label': module,'parent':frameKey})
     else:
         self.editElement(moduleKey,label= module)
     
     # Clear attr
     for key in attrElements.keys():
         self.removeElement(key)
         del attrElements[key]
         if self.inputs.has_key(key):
             del self.inputs[key]
     if self.windowElements.has_key(formKey):
         self.removeElement(formKey)
     attrElements.clear()
     
     # Read module attributes
     for key in attributes.keys():
         attr = attributes[key]
         # save blueprint attr UI element
         textKey = (module + attr.name + 'text').replace(' ', '')
         attrKey = (module + attr.name).replace(' ','')
         self.text({'key':textKey,'label':attr.name,'parent':frameKey})
         self.textField({'key':attrKey,'label':attr.defaultValue,'parent':frameKey})
         # save to blueprintAttrbuteUIDict
         attrElements[textKey] = self.windowElements[textKey]
         attrElements[attrKey] = self.windowElements[attrKey]
         self.inputs[attrKey] = self.windowElements[attrKey]
     
     # arrange in UI
     self.createOrganisedForm(formKey,attrElements.keys(),frameKey )
Пример #6
0
 def mirrorBlueprint(self):
     """
         duplciates blueprint
     """
     if self.elementExists("rigList") == False:
         cmds.warning("No modules found in scene")
         return None
         
     selectedModule =self.queryInput("rigList")
     if not selectedModule:
         cmds.error("Select module to duplicate in rig menu.")
     selectedModule = Util.getFirst(selectedModule)
     selectedModule = String.removeSuffix(selectedModule.strip())
     self.createValueWindow("Enter new module name", "default","NWRig.mirrorModule(\""+selectedModule+"\", %, 'x')")
     self.loadModules({})
Пример #7
0
def constrain(*args , **kwargs):
    """
        constrains target, aim Constraint requires more flags
    """
    influenceNo = (len(args) -1)
    sources = args[:-1]
    target = args[influenceNo]
    defaultName = String.removeSuffix(target)
    
    functArgs = {"t":0, "r":0, "s":0, "all":0, "aim":0, "mo":0, "name": defaultName}
    functArgs =  dict(functArgs.items() + kwargs["args"].items())
    mainOff = functArgs["mo"]
    
    if functArgs["t"] == 1:
        constrain = cmds.pointConstraint( args, n = (functArgs["name"] + "_PNT"),  mo = mainOff )
    if functArgs["r"] == 1:
        constrain = cmds.orientConstraint( args, n = (functArgs["name"]+ "_ORC"),  mo = mainOff )
    if functArgs["s"] == 1:
        constrain = cmds.scaleConstraint(  args, n = (functArgs["name"]+ "_SCT"), mo = mainOff )
    if functArgs["all"] == 1:
        constrain = cmds.parentConstraint( args, n = (functArgs["name"]+ "_PCT"),  mo = mainOff )
    if functArgs["aim"] == 1:
        constrain = cmds.aimConstraint( args, n = (functArgs["name"]+ "_AIM"),  mo = mainOff )
    return constrain
Пример #8
0
def createAxisContols(name, args):
        """
            creates a Control with sub Controls limited to move only in one axis each
        """
        ret = {}
        X=[]
        Y=[]
        Z=[]
        functArgs = {"axis":"xyz", "size":1}
        functArgs =  dict(functArgs.items() + args.items())
        child=None
        
        xName = String.removeSuffix(name) + "X"
        yName = String.removeSuffix(name) + "Y"
        zName = String.removeSuffix(name) + "Z"
        
        topGrp = cmds.group(name=(name+"_GRP"),em=True)
        ctlGrp = cmds.group(name=(name+"Ctl_GRP"),em=True)
        
        if "x" in functArgs["axis"]:
            X = Control.arrowCtl( xName, functArgs )
            Attribute.lockHide(X[0], {"all":1, "h":1, "l":1})
            Attribute.setColour(X[0], "red")
            cmds.setAttr(( X[0] + ".tx"), lock=False, cb = True , k = True )
            child = Transform.getShape(X[0])
            cmds.rotate(0,-90,0, (child+".cv[0:7]"))
        if "y" in functArgs["axis"]:
            Y = Control.arrowCtl( yName, functArgs )
            Attribute.lockHide(Y[0], {"all":1, "h":1, "l":1})
            Attribute.setColour(Y[0], "green")
            cmds.setAttr(( Y[0] + ".ty"), lock=False, cb = True , k = True )
            child = Transform.getShape(Y[0])
            cmds.rotate(90,0,0, (child+".cv[0:7]"))
        if "z" in functArgs["axis"]:
            Z = Control.arrowCtl( zName, functArgs )
            Attribute.lockHide(Z[0], {"all":1, "h":1, "l":1})
            Attribute.setColour(Z[0], "blue")
            cmds.setAttr(( Z[0] + ".tz"), lock=False, cb = True , k = True )
            child = Transform.getShape(Z[0])
            cmds.rotate(180,0,0, (child+".cv[0:7]"))        
            
        #connect Control to group to negate movement
        XNeg = cmds.createNode("multDoubleLinear", n=(name+"X_PMA"))
        cmds.setAttr((XNeg + ".input2"), -1)
        YNeg = cmds.createNode("multDoubleLinear", n=(name+"Y_PMA"))
        cmds.setAttr((YNeg + ".input2"), -1)
        ZNeg = cmds.createNode("multDoubleLinear", n=(name+"Z_PMA"))
        cmds.setAttr((ZNeg + ".input2"), -1)
        
        cmds.connectAttr((X[0]+".tx"),(XNeg+".input1"), f=True)
        cmds.connectAttr((Y[0]+".ty"),(YNeg+".input1"), f=True)
        cmds.connectAttr((Z[0]+".tz"),(ZNeg+".input1"), f=True)
        
        cmds.connectAttr((XNeg+".output"),(X[1]+".tx"), f=True)
        cmds.connectAttr((YNeg+".output"),(Y[1]+".ty"), f=True)
        cmds.connectAttr((ZNeg+".output"),(Z[1]+".tz"), f=True)
        
        #connect Control to ctls to top grp
        cmds.connectAttr((X[0]+".tx"),(ctlGrp+".tx"), f=True)
        cmds.connectAttr((Y[0]+".ty"),(ctlGrp+".ty"), f=True)
        cmds.connectAttr((Z[0]+".tz"),(ctlGrp+".tz"), f=True)
        
        cmds.parent(ctlGrp, topGrp)
        
        if "x" in functArgs["axis"]:
            cmds.parent(X[1], ctlGrp)
        if "y" in functArgs["axis"]:
            cmds.parent(Y[1], ctlGrp)
        if "z" in functArgs["axis"]:
            cmds.parent(Z[1], ctlGrp)
            
        ret["xctl"] = X
        ret["yctl"] = Y
        ret["zctl"] = Z  
        ret["grp"] = [topGrp, ctlGrp]
        return ret
Пример #9
0
def matrixConstraint(parent , child, mainOff, args):
    """
        Constraints object by a matrix Constraint
    """
    # Check plugin is loaded 
    if cmds.pluginInfo("decomposeMatrix",q= True,l=True) == 0:
        cmds.loadPlugin ("decomposeMatrix")
    functArgs = {"t":1, "r":1, "s":1, "all":0, "mo":0}
    functArgs =  dict(functArgs.items() + args.items())
    mainOff = functArgs["mo"]

    name = String.removeSuffix(child)
    
    matrixDecom = cmds.createNode( 'decomposeMatrix', n= (name + "decomMatrix") )
    offset  = None
    
    # contraint == parent world * inverse child parent
    matrixMulti1 = cmds.createNode( 'multMatrix', n=( name + "matrixMult1") )    
    
    # don't forget to freeze pivots if they are offset shit gets real
    cmds.xform( child, cp = True )
    
    offsetMat = cmds.createNode( "fourByFourMatrix", n= (name + "offsetMat" ) ) 
    matrixMulti2 = cmds.createNode( 'multMatrix', n= (name +  "matrixMult2") )

    if mainOff == 1:
        #parentCon = cmds.parentConstraint(child ,offset )
        #cmds.delete(parentCon)
        m = cmds.xform( child, q=True, ws=True, m=True  )
        cmds.setAttr( (offsetMat +".i00"), m[0])
        cmds.setAttr( (offsetMat +".i01"), m[1])
        cmds.setAttr( (offsetMat +".i02"), m[2])
        cmds.setAttr( (offsetMat +".i03"), m[3])
        cmds.setAttr( (offsetMat +".i10"), m[4])
        cmds.setAttr( (offsetMat +".i11"), m[5])
        cmds.setAttr( (offsetMat +".i12"), m[6])
        cmds.setAttr( (offsetMat +".i13"), m[7])
        cmds.setAttr( (offsetMat +".i20"), m[8])
        cmds.setAttr( (offsetMat +".i21"), m[9])
        cmds.setAttr( (offsetMat +".i22"), m[10])
        cmds.setAttr( (offsetMat +".i23"), m[11])
        cmds.setAttr( (offsetMat +".i30"), m[12])
        cmds.setAttr( (offsetMat +".i31"), m[13])
        cmds.setAttr( (offsetMat +".i32"), m[14])
        cmds.setAttr( (offsetMat +".i33"), m[15])
    
    # offset == child original world matrix * inverse parent matrix
    cmds.connectAttr( (offsetMat +  ".output"), (matrixMulti2 + ".matrixIn[0]"), f= True ) 
    cmds.connectAttr( (parent + ".worldInverseMatrix"), (matrixMulti2 + ".matrixIn[1]"), f= True )
        
    m = cmds.getAttr( (matrixMulti2 + ".matrixSum") )
        
    cmds.setAttr( (offsetMat +".i00"), m[0])
    cmds.setAttr( (offsetMat +".i01"), m[1])
    cmds.setAttr( (offsetMat +".i02"), m[2])
    cmds.setAttr( (offsetMat +".i03"), m[3])
    cmds.setAttr( (offsetMat +".i10"), m[4])
    cmds.setAttr( (offsetMat +".i11"), m[5])
    cmds.setAttr( (offsetMat +".i12"), m[6])
    cmds.setAttr( (offsetMat +".i13"), m[7])
    cmds.setAttr( (offsetMat +".i20"), m[8])
    cmds.setAttr( (offsetMat +".i21"), m[9])
    cmds.setAttr( (offsetMat +".i22"), m[10])
    cmds.setAttr( (offsetMat +".i23"), m[11])
    cmds.setAttr( (offsetMat +".i30"), m[12])
    cmds.setAttr( (offsetMat +".i31"), m[13])
    cmds.setAttr( (offsetMat +".i32"), m[14])
    cmds.setAttr( (offsetMat +".i33"), m[15])
    
    # Order of matrixs is VERY important if offset is applied last the child will not rotate around
    # the parent's origin as it's the parent pivot will not be multiplied properly
    cmds.connectAttr( (offsetMat + ".output"), (matrixMulti1 + ".matrixIn[0]"), f= True )
    cmds.connectAttr( (parent + ".worldMatrix"), (matrixMulti1 + ".matrixIn[1]"), f= True )
    cmds.connectAttr( (child + ".parentInverseMatrix"), (matrixMulti1 + ".matrixIn[2]"), f= True )
    
    # make child rotate around parent instead of copy it's rotation
    orc = cmds.createNode( "orientConstraint", n= (removeSuffix(child) + "Const_ORC"), p= child  )
    
    #final connect
    cmds.connectAttr( (matrixMulti1 + ".matrixSum") , (matrixDecom + ".inputMatrix") , f= True )
    
    # output rotation -> orient target[0] target rotation
    cmds.connectAttr( ( matrixDecom +".or") , ( orc + ".tg[0].tr") , f= True )
    # child rotation order -> orient Constraint rotation order
    cmds.connectAttr( ( child +".ro") , ( orc + ".cro") , f= True )
    
    # orient target[0] target rptation order == 0
    cmds.setAttr( ( orc +".tg[0].tro"), 0 )   
    
    # A orient const can be used to preserve clean join rotations if desired
    #cmds.connectAttr( ( orc + ".cr" ) , ( child + ".r" ) , f= True )
    if functArgs["r"] == 1 or functArgs["all"]:
        cmds.connectAttr( ( matrixDecom + ".outputRotate") , (child  + ".rotate"), f= True )
    if functArgs["t"] == 1 or functArgs["all"]:
        cmds.connectAttr( (matrixDecom + ".outputTranslate") , (child  + ".translate"), f= True)
    if functArgs["s"] == 1 or functArgs["all"]:
        cmds.connectAttr( ( matrixDecom + ".outputScale") , (child  + ".scale"), f= True )
    if functArgs["r"] == 1 or functArgs["all"]:
        cmds.connectAttr( ( matrixDecom + ".outputShear") , (child  + ".shear"), f= True )