def symmetrize(self): """Inverse the transform of each element of the guide.""" if self.values["comp_side"] not in ["R", "L"]: mgear.log("Can't symmetrize central component", mgear.sev_error) return False for name, paramDef in self.paramDefs.items(): if paramDef.valueType == "string": self.setParamDefValue(name, string.convertRLName(self.values[name])) for name, t in self.tra.items(): self.tra[name] = transform.getSymmetricalTransform(t) for name, blade in self.blades.items(): self.blades[name] = vector.Blade( transform.getSymmetricalTransform(blade.transform)) return True
def duplicateSym(*args): """Duplicate one dag hierarchy to/from X/-X renaming "L" to "R" """ oSelection = pm.selected() if oSelection: oSel = oSelection[0] oTarget = pm.duplicate()[0] t = oSel.getTransformation() t = transform.getSymmetricalTransform(t) oTarget.setTransformation(t) # Quick rename pm.select(oTarget, hi=True) for x in pm.selected(): x.rename(string.convertRLName(x.name().split("|")[-1])) oTarget.rename(string.convertRLName(oSel.name())) else: pm.displayWarning("Select something before duplicate symmetry.")
def mirrorEmbedNodes(node, target=None, search="left", replace="right"): """mirror node position to target. Specifically for embed nodes Args: node (str): embed nodes target (str, optional): if none provided, it will be lft vs right search (str, optional): token to search for and replace replace (str, optional): replace token with """ node = pm.PyNode(node) if target: target_node = pm.PyNode(target) else: target_node = node.name().replace(search, replace) try: target_node = pm.PyNode(target_node) except Exception as e: print(e) return src_mat = node.getTransformation() target_mat = transform.getSymmetricalTransform(src_mat) target_mat.rotateTo([0, 0, 0]) target_node.setTransformation(target_mat)
def duplicate_sym(ui, dup_guides=None, skip_all=False, re_sym_all=False): name = ui.xgen_description_lineEdit.text() description = xgen_handler.get_description(name) if not description: return crv_guides = xgen_handler.get_connected_curve_guides(description) new_guides = [] if not dup_guides: dup_guides = pm.selected() for crv in dup_guides: if crv in crv_guides: if not crv.hasAttr("sym_guide"): crv.addAttr("sym_guide", at='message', multi=False) else: sym_cnx = crv.sym_guide.listConnections() if sym_cnx: if skip_all: continue if re_sym_all: pm.displayInfo( "Re symmetry guide {}".format(crv.name())) pm.delete(sym_cnx) else: dup_option = show_dup_sym_options(crv.name()) if dup_option == 1: # skip all skip_all = True continue elif dup_option == 2: # re sym pm.displayInfo( "Re symmetry guide {}".format(crv.name())) pm.delete(sym_cnx) elif dup_option == 3: # re sym all re_sym_all = True pm.displayInfo( "Re symmetry guide {}".format(crv.name())) pm.delete(sym_cnx) elif dup_option == 4: # cancel break else: # skip. Also if close the menu will skip continue # duplicate new_crv = pm.duplicate(crv)[0] # transform t = crv.getTransformation() t = transform.getSymmetricalTransform(t) new_crv.setTransformation(t) # create message connection pm.connectAttr(new_crv.sym_guide, crv.sym_guide, f=True) pm.connectAttr(crv.sym_guide, new_crv.sym_guide, f=True) # config new crv. curve.set_thickness(new_crv, ui.thickness_spinBox.value()) curve.lock_first_point(new_crv) # connect xgen_handler.connect_curve_to_xgen_guide(new_crv, description) new_guides.append(new_crv) else: pm.displayWarning( "Object {0} is not crv guide for {1} and can't be" " duplicated".format(crv.name(), name)) if new_guides: pm.select(new_guides) return new_guides