def midPosVec(**kwargs): """ Returns the mid point from selected positions(objects or components) """ selected_items = kwargs.get("objects", []) if not selected_items: selected_items = pm.ls(selection=True, flatten=True) if not isinstance(selected_items, list): print "please provide objects list" pm.displayInfo("please provide objects list") return None number_of_items = len(selected_items) position_vector = [] final_vector = OpenMaya.MVector(0, 0, 0) for index in range(number_of_items): pos = pm.xform(selected_items[index], query=True, worldSpace=True, translation=True) vec = OpenMaya.MVector(pos[0], pos[1], pos[2]) position_vector.append(vec) for vector_index in range(len(position_vector)): final_vector = final_vector + position_vector[vector_index] final_vector = final_vector / len(position_vector) mid_position = [final_vector.x, final_vector.y, final_vector.z] return mid_position
def jnt_along_loop(): import splitLoops #reload(splitLoops) loops = splitLoops.split_loop() if not loops: pm.displayInfo("please select only edge loops") return None else: verts = loops[1] loops = loops[0] #print loops #print verts pos = [] for i in range(len(loops)): pos.append(CustomScripts.midPos(selected_items=verts[i])) print pos jnt_lst = [] for p in pos: print p jnt = pm.joint(position=p) jnt_lst.append(jnt) if len(jnt_lst) > 1: pm.joint(jnt_lst[pos.index(p) - 1], edit=True, orientJoint='xyz', secondaryAxisOrient='yup', zeroScaleOrient=True) return None
def curve_through_points(**kwargs): selection_points = kwargs.get("selection_points", None) curve_degree = kwargs.get("curve_degree", 3) curve_name = kwargs.get("curve_name", "Curve") if not selection_points: selection_points = pm.ls(selection=True) if not selection_points: pm.displayInfo("Please select reference points") return None if len(selection_points) < curve_degree + 1: pm.displayInfo("please select more than " + str(curve_degree + 1) + " points") return None points_locations = [] for point in selection_points: points_locations.append( pm.xform(point, query=True, translation=True, worldSpace=True)) pm.select(clear=True) current_curve = pm.curve(degree=curve_degree, worldSpace=True, point=points_locations) pm.rename(current_curve, curve_name) return current_curve
def jnt_at_mid_vertex_orient(**kwargs): sel = pm.ls(orderedSelection=True, flatten=True) if not sel: pm.displayInfo("Please select vertex") return None obj_pos_map = {} for comp in sel: if not isinstance(comp, pm.MeshVertex): pm.displayInfo("Please select only vertex") return None mid_pos = 0 for comp in sel: comp.node() transform_node = pm.listTransforms(comp.node())[0] if transform_node not in obj_pos_map.keys(): vrts = CustomScripts.get_vrts(sel_obj=[transform_node])[0] pos = CustomScripts.midPos(selected_items=vrts) obj_pos_map[transform_node] = pos mid_pos = pos else: mid_pos = obj_pos_map[transform_node] comp_pos = pm.pointPosition(comp, world=True) pm.select(clear=True) jnt1 = pm.joint(position=mid_pos) jnt2 = pm.joint(position=comp_pos) pm.joint(jnt1, edit=True, orientJoint='xyz', secondaryAxisOrient='yup', zeroScaleOrient=True) pm.select([jnt1, jnt2]) CustomScripts.CopyJntOri() return None
def jnt_at_mid_vertex_orient(**kwargs): sel = pm.ls(orderedSelection=True, flatten=True) if not sel: pm.displayInfo("Please select vertex") return None obj_pos_map = {} for comp in sel: if not isinstance(comp, pm.MeshVertex): pm.displayInfo("Please select only vertex") return None mid_pos = 0 for comp in sel: #vertex_position = pm.pointPosition(comp, world=True) #component_pos.append(vertex_position) shape_node = comp.node() transform_node = pm.listTransforms(comp.node())[0] if transform_node not in obj_pos_map.keys(): vrts = CustomScripts.get_vrts(sel_obj=[transform_node])[0] print vrts pos = CustomScripts.midPos(selected_items=vrts) obj_pos_map[transform_node] = pos mid_pos = pos else: mid_pos = obj_pos_map[transform_node] print obj_pos_map comp_pos = pm.pointPosition(comp, world=True) pm.select(clear=True) jnt1 = pm.joint(position=mid_pos) jnt2 = pm.joint(position=comp_pos) pm.joint(jnt1, edit=True, orientJoint='xyz', secondaryAxisOrient='yup', zeroScaleOrient=True) pm.select([jnt1, jnt2]) CustomScripts.CopyJntOri() #obj_list[comp] = transform_node #if transform_node not in obj_list: # obj_list.append(transform_node) #vrts = CustomScripts.get_vrts(sel_obj = obj_list) #pos = [] #for vrt in vrts: # pos.append(CustomScripts.midPos(selected_items = vrt)) #for p in component_pos: # pm.select(clear=True) # jnt1 = pm.joint(position=p) # jnt2 = pm.joint(position = component_pos[pos.index(p)]) # pm.joint(jnt1, edit=True, orientJoint='xyz', # secondaryAxisOrient='yup', zeroScaleOrient=True) # pm.select(clear=True) # pm.select([jnt1, jnt2]) # CustomScripts.CopyJntOri() # pm.select(clear=True) return None
def jnt_at_object_mid(**kwargs): sel = pm.ls(orderedSelection=True, flatten=True) for tran in sel: if not isinstance(tran, pm.Transform): pm.displayinfo("Please select only transform nodes") return None if not sel: pm.displayInfo("please select transform object") pos = [] for obj in sel: pos.append(CustomScripts.midPos(selected_items=obj)) pm.select(clear=True) for p in pos: pm.joint(position=p) pm.select(clear=True) return None
def cycle( tool ) : getCmd = "pm.manip%sContext( '%s', q=True, mode=True )" % ( tool, tool ) currentIndex = eval(getCmd) indexList = sorted(validIndexes[tool]) nextIndex = 0 for i, index in enumerate( indexList ) : if( index == currentIndex ) : nextIndex = indexList[ (i+1) % len(indexList) ] break elif( index > currentIndex ) : nextIndex = index break setCmd = "pm.manip%sContext( '%s', e=True, mode=%s )" % ( tool, tool, nextIndex ) eval(setCmd) pm.displayInfo( '%s Tool : %s' % ( tool, nextIndex ) )
def cycle( tool ) : tool = tool.capitalize() getCmd = "pm.manip%sContext( '%s', q=True, mode=True )" % ( tool, tool ) currentIndex = eval(getCmd) indexList = sorted(validIndexes[tool]) nextIndex = 0 for i, index in enumerate( indexList ) : if( index == currentIndex ) : nextIndex = indexList[ (i+1) % len(indexList) ] break elif( index > currentIndex ) : nextIndex = index break setCmd = "pm.manip%sContext( '%s', e=True, mode=%s )" % ( tool, tool, nextIndex ) eval(setCmd) pm.displayInfo( '%s Tool : %s' % ( tool, nextIndex ) )
def call_fun(name, base_joint, dense_chain_val, dense_divisions, curve_opn, curve_name, simplify_curve, spans_num, stretch, scale_connect, num_ctrl_jnt, glbl_scl_chk, glbl_scl_attr): #print name, "\n", base_joint, "\n", dense_chain_val, "\n", dense_divisions #print curve_opn, "\n", curve_name, "\n", simplify_curve #print spans_num, "\n", stretch, "\n", scale_connect #print ctrl_jnt_flag, "\n", num_ctrl_jnt if name == "" or base_joint == "": pm.displayInfo("ik name and/or joint name input missing") return None default = 1 if spans_num < 1: spans_num = default print "Spans set to 1" pm.displayInfo("Spans set to 1") if dense_divisions < 1: dense_divisions = default print "divisions set to 1" pm.displayInfo("divisions set to 1") if num_ctrl_jnt < 0: num_ctrl_jnt = 0 curve_flag = True if curve_opn == "UseCurve": curve_flag = False if not curve_flag: if curve_name == "": pm.displayInfo("please enter the curve name to be used") return None import IK_Spline #reload(IK_Spline) IK_Spline.setup_ik_spline(ik_name=name, joint_chain=base_joint, dense_chain=dense_chain_val, dense_chain_divisions=dense_divisions, auto_curve=curve_flag, use_curve=curve_name, auto_simplify_curve=simplify_curve, number_of_spans=spans_num, stretch_exp=stretch, scale_stretch=scale_connect, num_control_joints=num_ctrl_jnt, global_scale_check=glbl_scl_chk, global_scale_attr=glbl_scl_attr) return None
def setup_ik_spline(**kwargs): curve = kwargs.get("curve", None) joint_chain = kwargs.get("joint_chain", None) auto_curve = kwargs.get("auto_curve", True) use_curve = kwargs.get("use_curve", None) spans = kwargs.get("number_of_spans", 4) ctrl_jnts = kwargs.get("num_control_joints", 3) ik_name = kwargs.get("ik_name", "ikHandle") scale_stretch = kwargs.get("scale_stretch", False) create_dense_chain = kwargs.get("dense_chain", False) dense_division = kwargs.get("dense_chain_divisions", 3) auto_simplify = kwargs.get("auto_simplify_curve", False) stretch_exp = kwargs.get("stretch_exp", False) global_scale_check = kwargs.get("global_scale_check", False) global_scale_attr = kwargs.get("global_scale_attr", None) pm.select(joint_chain, hierarchy=True) joint_chain = pm.ls(selection=True) if not isinstance(joint_chain[0], pm.Joint): pm.displayInfo("selection should be of type joint") return None if len(joint_chain) < 2: pm.displayInfo("Chain should consist of more than one joint") return None if (global_scale_check): if (global_scale_attr is None): pm.displayInfo("Please input global scale attribute") return None else: obj = global_scale_attr.split(".")[0] global_attr = global_scale_attr.split(".")[1] check_global_attr = pm.attributeQuery(global_attr, node=obj, exists=True) if not check_global_attr: pm.displayInfo("Invalid global scale attribute") return None start_jnt = joint_chain[0] end_joint = joint_chain[-1] if create_dense_chain: rep_chain = pm.duplicate(joint_chain) start_jnt = rep_chain[0] end_joint = rep_chain[-1] dense_chain(joints=rep_chain, joints_inbetween=dense_division) rep_chain.append(end_joint) for index in range(len(joint_chain)): pm.parentConstraint(rep_chain[index], joint_chain[index], maintainOffset=False) #pm.scaleConstraint(rep_chain[index], joint_chain[index], maintainOffset=False) pm.connectAttr( str(rep_chain[index]) + ".scale", str(joint_chain[index]) + ".scale") pm.select(start_jnt, hierarchy=True) new_chain = pm.ls(selection=True) crv = "" #print "START", start_jnt #print "END",end_joint if auto_curve: ik_handle, eff, crv = pm.ikHandle(startJoint=start_jnt, createCurve=auto_curve, solver="ikSplineSolver", numSpans=spans, endEffector=end_joint, simplifyCurve=auto_simplify) else: crv = pm.PyNode(use_curve) ik_handle, eff = pm.ikHandle(startJoint=start_jnt, curve=use_curve, solver="ikSplineSolver", endEffector=end_joint, createCurve=False) crv.inheritsTransform.set(0) pm.rename(ik_handle, ik_name + "IK_Handle") pm.rename(crv, ik_name + "IK_Curve") ik_curve_shp = crv.getShape() crv_info_node = pm.createNode("curveInfo") pm.connectAttr(ik_curve_shp + ".worldSpace", crv_info_node + ".inputCurve") ''' if stretch_exp: if create_dense_chain: stretch_expression(joints = new_chain, curve_info_node = crv_info_node, connect_scale = scale_stretch, expression_name = ik_name+"_stretch_expression") else: stretch_expression(joints = joint_chain, curve_info_node = crv_info_node, connect_scale = scale_stretch, expression_name = ik_name+"_stretch_expression") ''' if ctrl_jnts: if ctrl_jnts == 1: print "Minimum 2 joints needed as controllers" print "skipping control joint creation process" pm.displayInfo("Minimum 2 joints needed as controllers") else: ctrl_jnts = joints_along_curve(number_of_joints=ctrl_jnts, curve=crv, bind_curve_to_joint=True) pm.select(clear=True) ctr_jnt_gp = pm.group(ctrl_jnts, name="control_joints") #print "JNT NAME", ctr_jnt_gp if stretch_exp: pm.addAttr(ctrl_jnts[-1], longName="Stretch", attributeType="enum", enumName="off:on", keyable=True) print "ATTRIBUTE TO", str(ctrl_jnts[-1]) if create_dense_chain: stretch_expression(joints=new_chain, curve_info_node=crv_info_node, connect_scale=scale_stretch, expression_name=ik_name + "_stretch_expression", ctrl_attr=str(ctrl_jnts[-1]) + ".Stretch", glbl_scl_stat=global_scale_check, glbl_scl_attr=global_scale_attr) else: stretch_expression(joints=joint_chain, curve_info_node=crv_info_node, connect_scale=scale_stretch, expression_name=ik_name + "_stretch_expression", ctrl_attr=str(ctrl_jnts[-1]) + ".Stretch", glbl_scl_stat=global_scale_check, glbl_scl_attr=global_scale_attr) final_group = pm.group(name=ik_name + "_ik_group", empty=True) pm.parent(joint_chain[0], final_group) pm.parent(crv, final_group) pm.parent(ik_handle, final_group) if ctrl_jnts > 1: pm.parent(ctr_jnt_gp, final_group) if create_dense_chain: pm.select(clear=True) dense_grp = pm.group(start_jnt, name="dense_chain_group") pm.parent(dense_grp, final_group) return None
import pymel.all as pm def delayed_setup() : import th_panel th_panel.ui.create() pm.displayInfo("------ userSetup.py -------") # pm.mayautils.executeDeferred( delayed_setup )