def ar_multiPointConstraint(maintainOffset, sel=None): """ @ point constraint all selected item with last selected object. Args: maintainOffset (bool): set maintain offset on or off. sel (list): objects has to be constraint. Returns: bool. """ if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage('warning', 'no objects selected...') return False if maintainOffset: for i in range(len(sel) - 1): parentObj = sel[len(sel) - 1] cmds.pointConstraint(parentObj, sel[i], mo=True) else: for i in range(len(sel) - 1): parentObj = sel[len(sel) - 1] cmds.pointConstraint(parentObj, sel[i]) ar_qui.ar_displayMessage('success', 'constraint done') return True
def ar_addScrunch(attribute, controllers, axis='ry'): """ @ add scrunch connections on controllers upper group. Args: attribute (str): attribute with object name. controllers (list): list of one finger controllers in order of start to end. axis (str): sample of axis, 'rx' or 'ry' or 'rz'. Returns: bool. """ for a in range(len(controllers)): controllers[a] = pm.PyNode(controllers[a]) if a == 0: pma = pm.createNode('plusMinusAverage', ss=True, n='pma_' + controllers[a]) pm.connectAttr(attribute, pma + '.input1D[0]', f=True) md = pm.createNode('multiplyDivide', ss=True, n='md_' + controllers[a]) pm.connectAttr(pma + '.output1D', md + '.input1X', f=True) cmds.setAttr(md + '.input2X', -1) parentGrp = controllers[a].getParent() pm.connectAttr(md + '.outputX', parentGrp + '.' + axis, f=True) else: pma = pm.createNode('plusMinusAverage', ss=True, n='pma_' + controllers[a]) pm.connectAttr(attribute, pma + '.input1D[0]', f=True) parentGrp = controllers[a].getParent() pm.connectAttr(pma + '.output1D', parentGrp + '.' + axis, f=True) ar_qui.ar_displayMessage( 'success', '---- "%s" ---- connections done.....' % attribute) return True
def connectLipSetup(self): if not _hierarchyChecker(self.namespaceName): pm.windows.confirmDialog( title='Hierarchy Error', message= 'Hierarchy has some error please\nplease opens script editor for details.', button=['Yes', 'No'], defaultButton='Yes', cancelButton='No', dismissString='No') ar_qui.ar_displayDialogue('error', 'Hierarchy is not proper.') ar_qui.ar_displayMessage('error', 'Hierarchy is not proper.') return False # connect all rivet to "self.face_geo" geometry. for each in self.lipCtrlGrps: allHist = pm.listHistory(each, pdo=True) for hist in allHist: if hist.nodeType() == 'pointOnCurveInfo': crvFrmMshEdg = hist.inputCurve.connections( )[0].create.connections()[0] inputShape = self.face_geo.getShapes(ni=True)[0] inputShape.worldMesh[0].connect(crvFrmMshEdg.inputMesh, f=True) # add blendshape. for each in self.lip_geos: ar_blendshape.ar_addBlendShape(each, self.face_geo, value=1)
def ar_addFingerAttributeConnections(attribute, controllers, axis='rx'): """ @ add twist connections on controllers upper group. Args: attribute (str): attribute with object name. controllers (list): list of one finger controllers in order of start to end. axis (str): sample of axis, 'rx' or 'ry' or 'rz'. Returns: bool. """ for a in range(len(controllers)): controllers[a] = pm.PyNode(controllers[a]) parentGrp = controllers[a].getParent() # if connection is in translate and translate is in minus then add multiply divide, # and reverse its connections. if axis.startswith('t'): offGroup = pm.PyNode('FKOffset' + controllers[a][2:]) if offGroup.tx.get() < 0: mdnNode = pm.createNode('multiplyDivide', ss=True, n='mdn_' + controllers[a] + '_Reverse') pm.connectAttr(attribute, mdnNode + '.input1X') pm.connectAttr(mdnNode + '.outputX', parentGrp + "." + axis) mdnNode.input2X.set(-1) else: pm.connectAttr(attribute, parentGrp + "." + axis) else: pm.connectAttr(attribute, parentGrp + "." + axis) ar_qui.ar_displayMessage( 'success', '---- "%s" ---- connections done.....' % attribute) return True
def ar_identifyInpOutShapes(source): """ @ identify shapes who has inputs and output connection. Args: source (str): transform of object. Returns: inpShape, outShape. """ # get inputs from source. source = pm.PyNode(source) inpShape = str() outShape = str() sourceShapes = source.getShapes() if len(sourceShapes) == 2: for each in sourceShapes: if each.isIntermediateObject(): outShape = each else: inpShape = each else: ar_qui.ar_displayMessage( 'warning', 'source mesh has more than two shapes or only one shape...') return False return str(inpShape), str(outShape)
def ar_zeroOut(sel=None): """ @ zeroOut all the selected objects. Args: sel (list): objects for zero out. Returns: groups. """ if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage('warning', 'Please select at least on object...') else: groups = list() for i in range(len(sel)): name = sel[i] + 'ZERO' if cmds.objExists(name): ar_qui.ar_displayMessage( 'error', '%s is already exist please rename it and zeroOut again..' % name) return False else: grp = cmds.group(em=True, w=True, n=name) par = cmds.listRelatives(sel[i], p=True) cmds.delete(cmds.parentConstraint(sel[i], grp)) cmds.parent(sel[i], grp) if not par: pass else: cmds.parent(grp, par[0]) groups.append(grp) return groups
def ar_addPlacementController(): """ @ add placement Controller in asp rig. Returns: controller. """ if not pm.objExists('Group'): ar_qui.ar_displayMessage('error', 'Group Not Found..') return False if not pm.objExists('Main'): ar_qui.ar_displayMessage('error', 'Main Controller not Found..') return False mainCtl = pm.PyNode('Main') ctlGroup = pm.createNode('transform', n='PlacementExtra_C', ss=True) ctl = pm.modeling.circle(nr=[0, 1, 0], r=1, ch=False, n='Placement_C')[0] pm.parent(ctl, ctlGroup) allCvs = pm.ls(mainCtl + '.cv[*]', fl=True) for i, each in enumerate(allCvs): pm.setAttr(ctl + '.cv[' + str(i) + '].xValue', pm.xform(each, q=True, ws=True, t=True)[0]) pm.setAttr(ctl + '.cv[' + str(i) + '].yValue', pm.xform(each, q=True, ws=True, t=True)[1]) pm.setAttr(ctl + '.cv[' + str(i) + '].zValue', pm.xform(each, q=True, ws=True, t=True)[2]) ctl.s.set(1.2, 1.2, 1.2) pm.makeIdentity(ctl, apply=True, t=1, r=1, s=1, n=0, pn=1) # parenting. pm.parent(ctlGroup, 'Group') pm.parent(mainCtl, ctl) ar_gen.ar_overrideColor(15, sel=[ctl]) pm.select(cl=True) return ctl
def ar_findDuplicates(): """ @ brief Check for nodes with duplicate name and add them to errors node. Returns: bool. """ duplicateNames = list() for node in pm.ls(): if "|" in str(node): if not node.isInstanced(): duplicateNames.append(str(node)) else: if len(pm.ls(node)) > 1: duplicateNames.append(str(node)) if not duplicateNames: ar_qui.ar_displayMessage('success', 'No duplicates in scene...') return True pm.select(cl=True) if pm.objExists('SET_duplicate_names'): pm.delete('SET_duplicate_names') pm.sets(n='SET_duplicate_names', em=True).union(duplicateNames) ar_qui.ar_displayMessage( 'success', '%s duplicate objects has been found and put in the "SET_duplicate_names".' % len(duplicateNames)), return False
def ar_getInfluenceJoint(sel=None): """ @ select influence objects from selected skinned object. Args: sel (list): single object but in list. Returns: infObj. """ if not sel: sel = pm.ls(sl=True) if len(sel) == 1: skc = list() [ skc.append(str(each)) for each in pm.listHistory(sel[0], pdo=True) if each.nodeType() == 'skinCluster' ] if len(skc) == 1: infObj = cmds.skinCluster(skc[0], q=True, inf=True) return infObj else: ar_qui.ar_displayMessage( 'error', 'selected object has found multiple skin clusters...') return False else: ar_qui.ar_displayMessage('warning', 'Please select one skinned object...') return False
def ar_bakeShapeUsingWrap(baseGeo, newGeo): """ @ bake blendshape using wrap deformer. Args: baseGeo (str, PyNode): base geometry transform. newGeo (str, PyNode): edited shape transform. Returns: newShape. """ oldGeo = pm.PyNode(baseGeo) newGeo = pm.PyNode(newGeo) # find blendshape node. bShpNode = ar_find.ar_findInputNodeType(oldGeo, 'blendShape')[0] bShpNode = pm.PyNode(bShpNode) # set all weight at zero. for i in range(bShpNode.getWeightCount()): bShpNode.setWeight(i, 0) # create targets. for each in pm.listAttr(bShpNode + '*.w', k=True, m=True): # duplicate new geometry. dupNewGeo = pm.duplicate(newGeo, rr=True, n=each)[0] pm.select(dupNewGeo, oldGeo) pm.runtime.CreateWrap() # on blendShape. pm.setAttr(bShpNode + '.' + each, 1) pm.runtime.DeleteHistory(dupNewGeo) pm.delete(oldGeo + 'Base') pm.setAttr(bShpNode + '.' + each, 0) ar_qui.ar_displayMessage('success', '% shape created' % each)
def ar_addFkProxy(axis, sel=None): """ create fk proxy setup. will add it soon. :param axis: list ([1,0,0]) :param sel: list (joint) :return: fkproxy chain """ if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage('success', 'No selections is present.') ar_qui.ar_displayMessage('success', '%s this tool will be coming soon...' % axis)
def controllerConn(ctlType, passUI): """ @ controller and replace shape of current objects connection. Args: ctlType (string): enter controller type like 'cube', 'sphere', etc. passUI (QCheckBox): pass the QCheckBox for replace controller on or off query. Returns: bool. """ with ar_qui.ar_undoChunkOpen('controller maker'): myObj = pm.ls(sl=True) ctl = ar_controllers.Ar_CtlShapes('controller') ctlTyp = { 'cube': ctl.ar_cubeCtl, 'sphere': ctl.ar_sphereCtl, 'diamond': ctl.ar_diamondCtl, 'cone': ctl.ar_coneCtl, 'arrowBall': ctl.ar_arrowBallCtl, 'arrow1': ctl.ar_arrow1Ctl, 'arrow4': ctl.ar_arrow4Ctl, 'circle': ctl.ar_circleCtl } if myObj: for each in myObj: pm.select(cl=True) newCtl = ctlTyp[ctlType]() ar_gen.ar_matchPositionOrientation(sel=[newCtl, each]) if passUI.shapeReplace_cb.isChecked(): if not each: ar_qui.ar_displayMessage( 'error', 'please select object to replace the shape.') return False oldShape = each.getShape() if oldShape: oldShapeName = oldShape.name() pm.delete(oldShape) else: oldShapeName = each + 'Shape' newShape = newCtl.getShape() pm.select(each, r=True) mel.eval("parent -r -s " + newShape) newShape.rename(oldShapeName) pm.delete(newCtl) pm.select(each) return True else: pm.select(cl=True) ctlTyp[ctlType]() return True
def ar_aimConstraintParent(aimValue, objValue, sel=None, freeze=True): """ @ do create aimConstraint according to ui based axis and delete constraint, @ then parent first selected object and freeze transformation. Args: aimValue (list): [1,0,0] objValue (list): [1,0,0] sel (list): two objects selection order is aimObject and then main object. freeze (bool): maintain offset set to on or off. Returns: bool. """ if not sel: sel = cmds.ls(sl=True) if len(sel) != 2: ar_qui.ar_displayMessage('error', 'please select two objects...') return False cmds.select(cl=True) # create locator and snap on selection one. loc = cmds.spaceLocator(n='TempLocatorForObjectUpOrientation') cmds.delete(cmds.parentConstraint(sel[1], loc[0])) if objValue == [1, 0, 0]: cmds.move(3, 0, 0, loc[0], r=True, os=True, wd=True) if objValue == [0, 1, 0]: cmds.move(0, 3, 0, loc[0], r=True, os=True, wd=True) if objValue == [0, 0, 1]: cmds.move(0, 0, 3, loc[0], r=True, os=True, wd=True) cmds.delete( cmds.aimConstraint(sel[0], sel[1], o=[0, 0, 0], w=True, aim=aimValue, u=objValue, wut="object", wuo=loc[0])) # parent joint. cmds.parent(sel[0], sel[1]) if freeze: cmds.makeIdentity(sel[1], a=True, t=1, r=1, s=1, n=0, pn=1) cmds.setAttr(sel[0] + '.jointOrientX', 0) cmds.setAttr(sel[0] + '.jointOrientY', 0) cmds.setAttr(sel[0] + '.jointOrientZ', 0) # delete locator. cmds.delete(loc[0]) cmds.select(sel[1]) ar_qui.ar_displayMessage('success', 'constraint done') return True
def ar_removeNamespace(namespaceName): """ @ remove namespace of passed argument. Args: namespaceName (str): namespace without colon ex (MSH). Returns: bool. """ allNameSpaces = pm.listNamespaces() for each in allNameSpaces: if each == ':' + namespaceName: pm.namespace(rm=each[1:], mnr=True) ar_qui.ar_displayMessage('success', 'namespace successfully removed.') return True
def selectInfluenceObjConn(): """ @ getInfluenceJoint UI Connections. Returns: none. """ with ar_qui.ar_undoChunkOpen('selectInfluenceObj'): sel = cmds.ls(sl=True) if sel: infObj = ar_skin.ar_getInfluenceJoint(sel) cmds.select(infObj, r=True) ar_qui.ar_displayMessage( 'success', '%s influence objects is selected..' % len(infObj)) else: ar_qui.ar_displayMessage('warning', 'your selection is empty')
def ar_getSelection(sel=None): """ @ get selection from maya. Args: sel (list): selection list from maya. Returns: sel. """ if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage( 'warning', 'Selection is empty please select something...') return False return sel
def ar_addFk(axis, sel=None): """ @ create fk controller chain on selected joint. Args: axis (list): axis example [1,0,0]. sel (list): joints. Returns: controller. """ # get selection. if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage('warning', 'Please select at least one joint.') return False for x in range(len(sel)): chain = cmds.ls(sel[x], dag=True, typ='joint') controller = [] for i in range(len(chain)): if i != len(chain) - 1: cmds.select(cl=True) offGrp = cmds.joint(n='FKOffset' + chain[i]) grp = cmds.group(n='FKExtra' + chain[i], em=True) ctrl = cmds.circle(ch=False, n='FK' + chain[i], nr=axis) cmds.select(cl=True) fkxGrp = cmds.joint(n='FKX' + chain[i]) cmds.parent(ctrl[0], grp) cmds.parent(fkxGrp, ctrl[0]) cmds.parent(grp, offGrp) cmds.delete(cmds.parentConstraint(chain[i], offGrp)) cmds.makeIdentity(offGrp, a=True, t=1, r=1, s=1, n=0, pn=1) cmds.parentConstraint(fkxGrp, chain[i]) controller.append(fkxGrp) if i != 0: cmds.parent(offGrp, controller[i - 1]) else: cmds.select(cl=True) fkxGrp = cmds.joint(n='FKX' + chain[i]) cmds.delete(cmds.parentConstraint(chain[i], fkxGrp)) cmds.parent(fkxGrp, controller[i - 1]) cmds.parentConstraint(fkxGrp, chain[i]) ar_qui.ar_displayMessage('success', 'done add fk controllers.') return controller
def ar_getClosestVertex(geo, obj): """ @ get closest vertex of obj. Args: geo (str): geometry. obj (str): object. Returns: closestVert. """ geo = pm.PyNode(geo) obj = pm.PyNode(obj) pos = obj.getRotatePivot(space='world') try: selectionList = OpenMaya.MSelectionList() selectionList.add(geo.name()) nodeDagPath = OpenMaya.MDagPath() selectionList.getDagPath(0, nodeDagPath) except RuntimeError: ar_qui.ar_displayMessage( 'error', 'OpenMaya.MDagPath() failed on %s' % geo.name()) return False mfnMesh = OpenMaya.MFnMesh(nodeDagPath) pointA = OpenMaya.MPoint(pos.x, pos.y, pos.z) pointB = OpenMaya.MPoint() space = OpenMaya.MSpace.kWorld util = OpenMaya.MScriptUtil() util.createFromInt(0) idPointer = util.asIntPtr() mfnMesh.getClosestPoint(pointA, pointB, space, idPointer) idx = OpenMaya.MScriptUtil(idPointer).asInt() faceVerts = [geo.vtx[i] for i in geo.f[idx].getVertices()] closestVert = None minLength = None for v in faceVerts: thisLength = (pos - v.getPosition(space='world')).length() if minLength is None or thisLength < minLength: minLength = thisLength closestVert = v return closestVert
def ar_fillListInLineEdit(lineEdit, sel=None): """ @ add selection list in line edit. Args: lineEdit (str): line edit name. sel (list): object has to be add in line edit. Returns: bool. """ if not sel: sel = cmds.ls(sl=True) if not sel: ar_qui.ar_displayMessage('error', 'Please select only one object') return False lineText = ",".join(sel) lineEdit.setText(lineText) return True
def ar_noneOrient(sel=None): """ @ set zero orientation of all selected joints. Args: sel (list): objects. Returns: bool. """ if not sel: sel = cmds.ls(sl=True, type='joint') if not sel: ar_qui.ar_displayMessage('warning', 'no joints in selection...') return False for i in range(len(sel)): cmds.setAttr(sel[i] + '.jointOrientX', 0) cmds.setAttr(sel[i] + '.jointOrientY', 0) cmds.setAttr(sel[i] + '.jointOrientZ', 0) return True
def ar_parentHirarchy(sel=None): """ @ parent objects using selection order. Args: sel (list): object order like child to parent. Returns: bool. """ if not sel: sel = cmds.ls(sl=True) if len(sel) < 2: ar_qui.ar_displayMessage('warning', 'Please select two or more item...') else: for i in range(len(sel) - 1): cmds.parent(sel[i], sel[i + 1]) cmds.select(sel[len(sel) - 1]) return True
def ar_fillLineEdit(lineEdit, sel=None): """ @ add selection in window line edit. Args: lineEdit (str): line edit name. sel (list): object has to be add in line edit. Returns: bool. """ if not sel: sel = pm.ls(sl=True) if not sel: ar_qui.ar_displayMessage('error', 'Please select only one object') return False elif len(sel) > 1: ar_qui.ar_displayMessage('error', 'more than one objects selected.') return False lineEdit.setText(str(sel[0])) return True
def ar_copySkinOnMultiObjects(source, target): """ @ copy skin weight from source object to selected objects. Args: source (str): skinned source object. target (list): object has to be copy. Returns: bool. """ if not target: ar_qui.ar_displayMessage( 'warning', 'Please specify target objects to copy skin weight') return False for each in target: cmds.copySkinWeights(source, each, nm=True, sa='closestPoint', ia='oneToOne') return True
def ar_removeFromDeformerInvertedVertex(deformer, sel=None): """ @ invert(all vertex - sel vertex) your selected vertex and remove from deformer set. Args: deformer (str): deformer name. sel (list): vertex list with flatten. Returns: bool. """ deformerNd = pm.PyNode(deformer) if not sel: sel = pm.ls(sl=True, fl=True) # query geometry from selection. geo = pm.ls(sel[0], o=True)[0] deformerSet = deformerNd.deformerSet() allVert = pm.ls(geo + '.vtx[*]', fl=True) unwantedVert = list(set(allVert) - set(sel)) # remove from deformer set. pm.sets(deformerSet, rm=unwantedVert) ar_qui.ar_displayMessage('success', 'selected vertex is only affect with %s deformer.' % deformer)
def ar_getHighlightedAttribute(sel=None): """ @ get channel box highlighted attribute. Args: sel (list): attribute selection. Returns: selected channel. """ if not sel: sel = pm.ls(sl=True) if len(sel) != 1: ar_qui.ar_displayMessage('warning', 'Please select only one object') return False # get highlighted attribute from channel box. channel = pm.windows.channelBox('mainChannelBox', q=True, sma=True) if not channel or len(channel) != 1: ar_qui.ar_displayMessage('warning', 'Please select one attribute to load...') return False return channel[0]
def ar_transferRivet(source, dest): """ @ transfer loft CurveFromMeshEdge connection from source to destination geometry. Args: source (str): source shape node. dest (str): destination shape node. Returns: crvFrmMshEdg. """ source = pm.PyNode(source) dest = pm.PyNode(dest) allConnections = source.connections() crvFrmMshEdg = list() for each in allConnections: if each.nodeType() == 'curveFromMeshEdge': crvFrmMshEdg.append(each) for each in crvFrmMshEdg: # noinspection PyTypeChecker pm.connectAttr('{0}.worldMesh[0]'.format(dest), '{0}.inputMesh'.format(each), f=True) ar_qui.ar_displayMessage('success', 'all rivet transfer done.') return crvFrmMshEdg
def ar_addBlendShape(source, target, value=0): """ @ add blendshape in target. Args: source (str, PyNode): transform of source geometry. target (str, PyNode): transform of target geometry. value (float): addBlendShapeValue Returns: face_blend. """ source = pm.PyNode(source) target = pm.PyNode(target) # get existing blendshape if exist. blendShape = [] allHist = target.history(pdo=True) for each in allHist: if each.nodeType() == 'blendShape': blendShape.append(each) # add blendshape. if not blendShape: face_blend = pm.blendShape(source, target, foc=True, n='BS_' + target)[0] weightCount = face_blend.getWeightCount() face_blend.setWeight(weightCount - 1, value) elif len(blendShape) == 1: face_blend = blendShape[0] weightCount = face_blend.getWeightCount() pm.blendShape(face_blend, edit=True, t=(target, weightCount + 1, source, 1.0)) face_blend.setWeight(weightCount + 1, value) else: ar_qui.ar_displayMessage( 'error', 'geometry have more than one blenshapes found...') return False return face_blend
def ar_asIKCtlOriChange(joint, controller): """ @ change ik controller orientation as local (getting joint orientation for reference). Args: joint (str): this parameter is use only for orientation reference. controller (str): ik controller. Returns: controller. """ cmds.select(cl=True) tempLoc = cmds.spaceLocator() tempLoc1 = cmds.spaceLocator() cmds.select(cl=True) cmds.delete(cmds.parentConstraint(joint, tempLoc)) cmds.delete(cmds.parentConstraint(joint, tempLoc1)) cmds.parent(tempLoc, 'IKOffset' + controller[2:]) listParents = cmds.listRelatives(controller, c=True) for i in range(1, len(listParents)): cmds.parent(listParents[i], tempLoc[0]) cmds.delete(cmds.parentConstraint(tempLoc1, 'IKExtra' + controller[2:])) for i in range(1, len(listParents)): cmds.parent(listParents[i], controller) cmds.delete(tempLoc, tempLoc1) cmds.select(cl=True) # Add Hand Ik Extra Group Rotation value In Build Pose. GetAttrs = cmds.getAttr('buildPose.udAttr') qExtra = cmds.xform('IKExtra' + controller[2:], q=True, os=True, ro=True) newAttrs = GetAttrs.replace('xform -os -t 0 0 0 -ro 0 0 0 %s;' % ('IKExtra' + controller[2:]), 'xform -os -t 0 0 0 -ro %f %f %f %s;' % ( qExtra[0], qExtra[1], qExtra[2], 'IKExtra' + controller[2:])) cmds.setAttr('buildPose.udAttr', newAttrs, type="string") cmds.select(controller, r=True) ar_qui.ar_displayMessage('success', '{0} orientation changed... '.format(controller)) return controller
def ar_jointsOnSelection(sel=None): """ @ joints on selected items. Args: sel (list): objects. Returns: allJoints. """ if not sel: sel = cmds.ls(sl=True, fl=True) if not sel: ar_qui.ar_displayMessage('warning', 'Please select at least one object...') return False allJoints = list() for i in range(len(sel)): cmds.select(cl=True) pos = cmds.xform(sel[i], q=True, ws=True, piv=True) rot = cmds.xform(sel[i], q=True, ws=True, ro=True) jnt = cmds.joint(p=[pos[0], pos[1], pos[2]]) cmds.xform(jnt, ws=True, ro=[rot[0], rot[1], rot[2]]) allJoints.append(jnt) cmds.select(allJoints, r=True)
def ar_browConnect(face_geo, face_geo_top_node, face_geo_main, namespacesName='XXX:'): """ @ import brow rig and attach with rig. Args: face_geo (str): geometry from imported file. face_geo_top_node (str): upper group of face geometry. face_geo_main (str): face geometry of main rig. namespacesName (str): namespace with colon. Returns: bool. """ face_geo = pm.PyNode(namespacesName + face_geo) face_geo_top_node = pm.PyNode(namespacesName + face_geo_top_node) face_geo_main = pm.PyNode(face_geo_main) # import eyebrow setup. ctlOffsetGroups = [ 'browInnerAttach_R', 'browOuterAttach_R', 'browInnerAttach_L', 'browOuterAttach_L', 'browHalfAttach_R', 'browHalfAttach_L' ] # for import pm.parent(namespacesName + 'Brow_Controllers', 'ControlsSetup') # parent Rivet Curves. crvs = pm.listRelatives(namespacesName + 'ctlCurveMainGroup', c=True) pm.parent(crvs, 'ClusterSetup') # connection with old Brs. for each in ctlOffsetGroups: pm.connectAttr('Brs.r', namespacesName + each + '.r', f=True) pm.connectAttr('Brs.s', namespacesName + each + '.s', f=True) # parent face motion follow head. childs = pm.listRelatives(namespacesName + 'FaceDeformationFollowHead', c=True) filtChilds = [] for each in childs: if type(each) == pm.nodetypes.PointConstraint: pass elif type(each) == pm.nodetypes.OrientConstraint: pass else: filtChilds.append(each) pm.parent(filtChilds, 'FaceDeformationFollowHead') # delete unwanted. deleteArray = [ 'Main', 'ctlCurveMainGroup', 'Brs', 'FaceDeformationFollowHead' ] for each in deleteArray: pm.delete(namespacesName + each) # make hierarchy. eyeBrowExtraSystem = pm.createNode('transform', n='EyeBrowExtraSystem') pm.parent(face_geo, namespacesName + 'Head_M', eyeBrowExtraSystem) pm.delete(face_geo_top_node) face_geo.rename('BrowRigBlendshape_geo') ar_blendshape.ar_addBlendShape(face_geo, face_geo_main, value=1) # transfer rivet. shapes = face_geo.listRelatives(s=True) for each in shapes: if not each.isIntermediate(): ar_rivet.ar_transferRivet(each, face_geo_main) ar_namespaces.ar_removeNamespace(namespacesName[:-1]) # lock and parent eyeBrowExtraSystem. eyeBrowExtraSystem.v.set(0) eyeBrowExtraSystem.v.lock() if not pm.objExists('ExtraSystem'): pm.createNode('transform', n='ExtraSystem') pm.parent(eyeBrowExtraSystem, 'ExtraSystem') ar_qui.ar_displayMessage('success', 'brow connection is done....') return True