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
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
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({})
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({})
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 )
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({})
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
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
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 )