From 99f0b95485774670410e4498f4e5429c70394265 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Wed, 20 Oct 2021 10:18:49 -0700 Subject: [PATCH 1/8] Added skeleton with baked segment scale compensate --- python-scripts/gt_auto_biped_rigger.py | 235 ++++++++++++++++++++++++- 1 file changed, 232 insertions(+), 3 deletions(-) diff --git a/python-scripts/gt_auto_biped_rigger.py b/python-scripts/gt_auto_biped_rigger.py index 3b17c837..7a8c14cd 100644 --- a/python-scripts/gt_auto_biped_rigger.py +++ b/python-scripts/gt_auto_biped_rigger.py @@ -97,8 +97,14 @@ Added debugging warning to GUI for when debugging mode is activated (Replaces script title next to help) Changed the "followName" attribute data type for the pole vector controls to float so interpolation is possible + 1.7.5 - 2021-10-19 + Added option to generate secondary skeleton used for game engines (no Segment Scale Compensate) + Added option to create lines between pole vectors and their targets + To do: + Add option to mirror pose + Move functions to a module (this script is getting to big) Create ribbon setup for the spine ( add switch to the master control ) Add more roll joints (upper part of the arm, legs, etc) Add option to auto create proxy geo @@ -134,7 +140,7 @@ script_name = "GT Auto Biped Rigger" # Version: -script_version = "1.7.4" +script_version = "1.7.5" # Python Version python_version = sys.version_info.major @@ -151,14 +157,16 @@ left_ctrl_color = (0, .3, 1) # Red right_ctrl_color = (1, 0, 0) # Soft Blue automation_ctrl_color = (.6,.2,1) # Purple +create_real_time_skeleton = True # Debugging Vars -debugging = False # Activate Debugging Mode +debugging = True # Activate Debugging Mode debugging_auto_recreate = True # Auto deletes proxy/rig before creating debugging_display_lra = False # Display LRA for all joints after generating -debugging_auto_breathing = True # Auto activates breathing Time +debugging_auto_breathing = False # Auto activates breathing Time debugging_import_proxy = True # Auto Imports Proxy debugging_import_path = 'C:\\template.json' # Path to auto import + debugging_bind_rig = True # Auto Binds Rig debugging_bind_geo = 'body_geo' # Name of the geo to bind debugging_bind_heatmap = False #If not using heatmap, then closest distance @@ -1018,6 +1026,217 @@ def add_sine_attributes(obj, sine_prefix='sine', tick_source_attr='time1.outTime return [(obj + '.' + output_attr), None] +def get_inverted_hierarchy_tree(obj_list, return_short_name=True): + ''' + Receives a list (usually a Maya selection) and returns a sorted version of it + starting with objects at the bottom of the hierarchy then working its way up to + the top parents. It extracts the number of "|" symbols in the full path to the file + to determine its position in the hierarchy before sorting it. + + Parameters: + obj_list (list): A list of strings with the name of the Maya elements (Usually a maya selection) + return_short_name (optional, bool): Determines if the return list will return the full path or just the short name. + + Returns: + inverted_hierarchy_tree (list) : A list containing the same elements, but sorted from lowest child to top parent. + + ''' + # Find hierarchy position and create pair + sorted_pairs = [] + for obj in obj_list: + if cmds.objExists(obj): + long_name = cmds.ls(obj, l=True) or [] + number_of_parents = len(long_name[0].split('|')) + sorted_pairs.append((long_name[0], number_of_parents)) + + sorted_pairs.sort(key=lambda x:x[1], reverse=True) + + # Extract elements and return them + inverted_hierarchy_tree = [] + for pair in sorted_pairs: + if return_short_name: + short_name = '' + split_path = pair[0].split('|') + if len(split_path) >= 1: + short_name = split_path[len(split_path)-1] + inverted_hierarchy_tree.append(short_name) + else: + inverted_hierarchy_tree.append(pair[0]) + return inverted_hierarchy_tree + + + +def mimic_segment_scale_compensate_behaviour(joints_with_ssc, joints_no_ssc): + ''' + Mimics the behaviour of segment scale compensate tranform system present in Maya + transfering the baked values to a secondary joint chain. + The secondary skeleton is compatible with real time engines as it calculates and bakes + scale values directly into the joints. + + + ''' + # Check if lists are identical, name length and names? + + scale_compensate_multiply_prefix = "ssc_scale_multiplier_" + scale_compensate_divide_prefix = "ssc_scale_divide_" + + for index in range(len(joints_no_ssc)): + if index != len(joints_no_ssc)-1: # Don't apply it to the last one as it doesn't have children + + joint_parent = cmds.listRelatives(joints_no_ssc[index], parent=True) + + scale_compensate_multiply_node = scale_compensate_multiply_prefix + joints_no_ssc[index] + scale_compensate_multiply_node = cmds.createNode('multiplyDivide', name=scale_compensate_multiply_node) + + cmds.connectAttr(scale_compensate_multiply_node + '.output', joints_no_ssc[index] + '.scale', f=True) + cmds.connectAttr(joints_with_ssc[index] + '.scale', scale_compensate_multiply_node + '.input2', f=True) + + scale_compensate_divide_node = scale_compensate_divide_prefix + joint_parent[0] + if not cmds.objExists(scale_compensate_divide_node): + scale_compensate_divide_node = cmds.createNode('multiplyDivide', name=scale_compensate_divide_node) + cmds.setAttr(scale_compensate_divide_node + '.operation', 2) + cmds.setAttr(scale_compensate_divide_node + '.input1X', 1) + cmds.setAttr(scale_compensate_divide_node + '.input1Y', 1) + cmds.setAttr(scale_compensate_divide_node + '.input1Z', 1) + + try: + if not cmds.isConnected( joint_parent[0] + '.scale', scale_compensate_divide_node + '.input2' ): + cmds.connectAttr(joint_parent[0] + '.scale', scale_compensate_divide_node + '.input2', f=True) + if not cmds.isConnected( scale_compensate_divide_node + '.output', scale_compensate_multiply_node + '.input1' ): + cmds.connectAttr(scale_compensate_divide_node + '.output', scale_compensate_multiply_node + '.input1', f=True) + except: + pass + + # Try to connect hierarchy divide nodes + for index in range(len(joints_no_ssc)): + if index != len(joints_no_ssc)-1: # Ignore top parent + joint_parent = cmds.listRelatives(joints_no_ssc[index], parent=True) or [] + + try: + cmds.connectAttr(scale_compensate_divide_prefix + joint_parent[0] + '.output', scale_compensate_divide_prefix + joints_no_ssc[index] + '.input1', f=True) + except: + pass + + +def get_short_name(obj): + ''' + Get the name of the objects without its path (Maya returns full path if name is not unique) + + Parameters: + obj (string) - object to extract short name + ''' + if obj == '': + return '' + split_path = obj.split('|') + if len(split_path) >= 1: + short_name = split_path[len(split_path)-1] + return short_name + +def generate_no_ssc_skeleton(new_suffix='game'): + ''' + Uses other functions to build a secondary skeleton that doesn't rely + on Maya's segment scale compensate system. It insteads bakes the scale + on to the children joints. + + Dependencies: + get_short_name() + mimic_segment_scale_compensate_behaviour() + get_inverted_hierarchy_tree() + jnt_suffix : string variable + gt_ab_joints_default : list of joints + + ''' + cmds.select(gt_ab_joints_default.get('main_jnt')) + game_skeleton = cmds.duplicate(renameChildren=True) + for obj in game_skeleton: + if cmds.objectType(obj) != "joint": + cmds.delete(obj) + + # Rename new skeleton + to_rename = [] + search_jnt = '_' + jnt_suffix + '1' # Automatic renamed during duplication + search_end_jnt = '_end' + jnt_suffix.capitalize() + '1' + new_suffix_end_jnt = '_' + new_suffix + '_end' + jnt_suffix.capitalize() + new_suffix = '_' + new_suffix + '_' + jnt_suffix + for jnt in game_skeleton: + object_short_name = get_short_name(jnt) + new_name = str(object_short_name).replace(search_jnt, new_suffix).replace(search_end_jnt, new_suffix_end_jnt) + if cmds.objExists(jnt) and 'shape' not in cmds.nodeType(jnt, inherited=True) and jnt != new_name: + to_rename.append([jnt,new_name]) + + duplicated_joints = [] + for pair in reversed(to_rename): + if cmds.objExists(pair[0]): + duplicated_joints.append(cmds.rename(pair[0], pair[1])) + + return duplicated_joints, cmds.ls(selection=True)[0] + + +def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ctrl, new_skeleton_suffix = 'game'): + ''' + Attaches a previously generated game skeleton (no ssc skeleton) + to follow and mimic the scale of the original gt auto biped rigger skeleton + + Parameters: + new_skeleton_suffix (optional, string): expected in-between string for game skeleton. + Used to pair with original skeleton + duplicated_joints (list): A list of string containing all generated real time joints + game_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton + scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl) + + Dependencies: + generate_no_ssc_skeleton() + get_inverted_hierarchy_tree() + mimic_segment_scale_compensate_behaviour() + + jnt_suffix : string variable + gt_ab_joints_default : list of joints + + Returns: + sorted_no_ssc_joints (list): A list containing game skeleton joints + ''' + + # Turn off SSC + for jnt in duplicated_joints: + cmds.setAttr(jnt + '.segmentScaleCompensate', 0) + + cmds.select(game_root_jnt, hierarchy=True) # Sync selection order + duplicated_joints = cmds.ls(selection=True, type='joint') + + cmds.select(gt_ab_joints_default.get('main_jnt'), hierarchy=True) + original_joints = cmds.ls(selection=True, type='joint') + + sorted_original_joints = get_inverted_hierarchy_tree(original_joints) + sorted_no_ssc_joints = get_inverted_hierarchy_tree(duplicated_joints) + mimic_segment_scale_compensate_behaviour(sorted_original_joints, sorted_no_ssc_joints) + + # Parent Constraint new system + remove_dupe_str = '_' + new_skeleton_suffix + '_' + jnt_suffix + + remove_org_str = '_' + jnt_suffix + + remove_dupe_end_str = '_' + new_skeleton_suffix + '_end' + jnt_suffix.capitalize() + remove_org_end_str = '_end' + jnt_suffix.capitalize() + + # Parent Constraint Game Skeleton + for jnt in sorted_original_joints: + for game_jnt in sorted_no_ssc_joints: + joint_org = jnt.replace(remove_org_str, '') + joint_dupe = game_jnt.replace(remove_dupe_str, '') + if joint_org == joint_dupe: + cmds.parentConstraint( jnt, game_jnt ) + + for jnt in sorted_original_joints: + for game_jnt in sorted_no_ssc_joints: + joint_org = jnt.replace(remove_org_end_str, '') + joint_dupe = game_jnt.replace(remove_dupe_end_str, '') + if joint_org == joint_dupe: + cmds.parentConstraint( jnt, game_jnt ) + + # Scale Constraint Rootf + cmds.scaleConstraint(scale_constraint_ctrl, game_root_jnt) + + return sorted_no_ssc_joints def create_visualization_line(object_a, object_b): @@ -7168,6 +7387,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.setAttr(gt_ab_joints.get('right_pinky02_jnt') + '.type', 22) # Pinky Finger cmds.setAttr(gt_ab_joints.get('right_pinky03_jnt') + '.type', 22) # Pinky Finger + # Creates game skeleton (No Segment Scale Compensate) + if create_real_time_skeleton: + new_skeleton_suffix = 'game' + duplicated_joints, game_root_jnt = generate_no_ssc_skeleton(new_skeleton_suffix) + sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, main_ctrl, new_skeleton_suffix) + ################# Store Created Joints ################# gt_ab_joints_default['left_forearm_jnt'] = left_forearm_jnt @@ -7965,6 +8190,10 @@ def extract_transform_joint_to_proxy(joint_name, ignore_translate=False, ignore_ cmds.warning('Couldn\'t write to file. Please make sure the exporting directory is accessible.') + + + + # Build UI if __name__ == '__main__': build_gui_auto_biped_rig() \ No newline at end of file From cb5d3bf8673ded763c0034e26a58c0d5c77d555e Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Wed, 20 Oct 2021 18:16:23 -0700 Subject: [PATCH 2/8] Created persistent settings and settings GUI --- python-scripts/gt_auto_biped_rigger.py | 1054 ++++++++++++++---------- 1 file changed, 611 insertions(+), 443 deletions(-) diff --git a/python-scripts/gt_auto_biped_rigger.py b/python-scripts/gt_auto_biped_rigger.py index 7a8c14cd..243c184e 100644 --- a/python-scripts/gt_auto_biped_rigger.py +++ b/python-scripts/gt_auto_biped_rigger.py @@ -101,6 +101,10 @@ Added option to generate secondary skeleton used for game engines (no Segment Scale Compensate) Added option to create lines between pole vectors and their targets + 1.7.6 - 2021-10-20 + Created "settings" button and the GUI updates necessary to display it + Created the base for persistent settings and implemented "User Real-time Skeleton" option + Created a custom help window that takes strings as help inputs to display it to the user To do: Add option to mirror pose @@ -140,7 +144,7 @@ script_name = "GT Auto Biped Rigger" # Version: -script_version = "1.7.5" +script_version = "1.7.6" # Python Version python_version = sys.version_info.major @@ -157,22 +161,27 @@ left_ctrl_color = (0, .3, 1) # Red right_ctrl_color = (1, 0, 0) # Soft Blue automation_ctrl_color = (.6,.2,1) # Purple -create_real_time_skeleton = True # Debugging Vars -debugging = True # Activate Debugging Mode +debugging = False # Activates Debugging Mode debugging_auto_recreate = True # Auto deletes proxy/rig before creating debugging_display_lra = False # Display LRA for all joints after generating debugging_auto_breathing = False # Auto activates breathing Time debugging_import_proxy = True # Auto Imports Proxy debugging_import_path = 'C:\\template.json' # Path to auto import - debugging_bind_rig = True # Auto Binds Rig debugging_bind_geo = 'body_geo' # Name of the geo to bind debugging_bind_heatmap = False #If not using heatmap, then closest distance +# Persistent Settings +gt_ab_settings = { + 'is_settings_visible' : False, + 'body_column_height' : 0, # determined during settings GUI creation + 'using_no_ssc_skeleton' : False, +} + # Loaded Elements Dictionary -gt_ab_settings = { # General Settings +gt_ab_elements = { # General Settings 'main_proxy_grp' : 'auto_biped_proxy' + '_' + grp_suffix, # Center Elements 'main_crv' : 'root' + '_' + proxy_suffix, @@ -237,24 +246,67 @@ } # Auto Populate Control Names (Copy from Left to Right) + Add prefixes -gt_ab_settings_list = list(gt_ab_settings) -for item in gt_ab_settings_list: +gt_ab_elements_list = list(gt_ab_elements) +for item in gt_ab_elements_list: if item.startswith('left_'): - gt_ab_settings[item] = 'left_' + gt_ab_settings.get(item) # Add "left_" prefix - gt_ab_settings[item.replace('left_', 'right_')] = gt_ab_settings.get(item).replace('left_', 'right_') # Add right copy + gt_ab_elements[item] = 'left_' + gt_ab_elements.get(item) # Add "left_" prefix + gt_ab_elements[item.replace('left_', 'right_')] = gt_ab_elements.get(item).replace('left_', 'right_') # Add right copy # Store Default Values +gt_ab_elements_default = copy.deepcopy(gt_ab_elements) gt_ab_settings_default = copy.deepcopy(gt_ab_settings) # Create Joints List gt_ab_joints_default = {} -for obj in gt_ab_settings: +for obj in gt_ab_elements: if obj.endswith('_crv'): - name = gt_ab_settings.get(obj).replace(proxy_suffix, jnt_suffix).replace('end' + proxy_suffix.capitalize(), 'end' + jnt_suffix.capitalize()) + name = gt_ab_elements.get(obj).replace(proxy_suffix, jnt_suffix).replace('end' + proxy_suffix.capitalize(), 'end' + jnt_suffix.capitalize()) gt_ab_joints_default[obj.replace('_crv','_' + jnt_suffix).replace('_proxy', '')] = name gt_ab_joints_default['left_forearm_jnt'] = 'left_forearm_jnt' gt_ab_joints_default['right_forearm_jnt'] = 'right_forearm_jnt' +# Manage Persistent Settings +def get_persistent_settings_auto_biped_rigger(): + ''' + Checks if persistant settings for GT Auto Biped Rigger exists and transfer them to the settings dictionary. + It assumes that persistent settings were stored using the cmds.optionVar function. + ''' + # Check if there is anything stored + stored_setup_exists = cmds.optionVar(exists=("gt_auto_biped_rigger_setup")) + + # The values in these keys will not get imported (No persistent behaviour) + ignore_keys = ['is_settings_visible', 'body_column_height'] + + if stored_setup_exists: + stored_settings = {} + try: + stored_settings = eval(str(cmds.optionVar(q=("gt_auto_biped_rigger_setup")))) + for stored_item in stored_settings: + #print(stored_item) + for item in gt_ab_settings: + if stored_item == item and item not in ignore_keys: + gt_ab_settings[item] = stored_settings.get(stored_item) + except: + print('Couldn\'t load persistent settings, try resetting it in the help menu.') + + +def set_persistent_settings_auto_biped_rigger(): + ''' + Stores persistant settings for GT Auto Biped Rigger. + It converts the dictionary into a list for easy storage. (The get function converts it back to a dictionary) + It assumes that persistent settings were stored using the cmds.optionVar function. + ''' + cmds.optionVar( sv=('gt_auto_biped_rigger_setup', str(gt_ab_settings))) + + +def reset_persistent_settings_auto_biped_rigger(): + ''' Resets persistant settings for GT Auto Biped Rigger ''' + cmds.optionVar( remove='gt_auto_biped_rigger_setup' ) + gt_ab_settings = gt_ab_settings_default + cmds.warning('Persistent settings for ' + script_name + ' were cleared.') + cmds.evalDeferred("build_gui_auto_biped_rig()") + + # Main Dialog ============================================================================ def build_gui_auto_biped_rig(): @@ -263,8 +315,10 @@ def build_gui_auto_biped_rig(): if cmds.window(window_name, exists =True): cmds.deleteUI(window_name) - # Main GUI Start Here ================================================================================= + # Get Persistent Settings + get_persistent_settings_auto_biped_rigger() + # Main GUI Start Here ================================================================================= build_gui_auto_biped_rig = cmds.window(window_name, title=script_name + " (v" + script_version + ')',\ titleBar=True, mnb=False, mxb=False, sizeable =True) @@ -281,9 +335,10 @@ def build_gui_auto_biped_rig(): cmds.separator(h=10, style='none') # Empty Space cmds.rowColumnLayout(nc=1, cw=[(1, 270)], cs=[(1, 10)], p=content_main) # Window Size Adjustment - cmds.rowColumnLayout(nc=3, cw=[(1, 10), (2, 200), (3, 50)], cs=[(1, 10), (2, 0), (3, 0)], p=content_main) # Title Column - cmds.text(" ", bgc=title_bgc_color) # Tiny Empty Green Space + cmds.rowColumnLayout(nc=4, cw=[(1, 10), (2, 150), (3, 50), (4, 50)], cs=[(1, 10), (2, 0), (3, 0)], p=content_main) # Title Column + cmds.text(" ", bgc=title_bgc_color) # Tiny Empty Space cmds.text(main_window_title, bgc=title_bgc_color, fn="boldLabelFont", align="left") + settings_btn = cmds.button( l ="Settings", bgc=title_bgc_color, c=lambda x:update_gui_settings()) cmds.button( l ="Help", bgc=title_bgc_color, c=lambda x:build_help_gui_auto_biped_rig()) cmds.separator(h=10, style='none', p=content_main) # Empty Space @@ -311,7 +366,30 @@ def build_gui_auto_biped_rig(): image_result.write(image_64_decode) image_result.close() + + # Settings ================ @@@ + settings_column = cmds.rowColumnLayout(nc=1, cw=[(1, 260)], cs=[(1,10)], h=1, p=content_main) + + # General Settings + settings_bgc_color = (.4, .4, .4) + cmds.text('General Settings:', font='boldLabelFont') + cmds.separator(h=5, style='none') # Empty Space + cmds.rowColumnLayout(nc=3, cw=[(1, 10), (2, 210), (3, 20)], cs=[(1,10)]) + cmds.text(" ", bgc=settings_bgc_color, h=20) # Tiny Empty Space + cmds.checkBox( label=' Use Real-time Skeleton', value=gt_ab_settings.get('using_no_ssc_skeleton'), ebg=True, cc=lambda x:invert_stored_setting('using_no_ssc_skeleton')) + + custom_help_message = 'Creates another skeleton without the parameter "Segment Scale Compensate" being active. This skeleton inherits the transforms from the controls while mimicking the behaviour of the "Segment Scale Compensate" option, essentially creating a baked version of this Maya depended system.\nAs this baked version does not yet fully support non-uniform scaling, it\'s recommended that you only use it if you are planning to later send this rig into a game engine or another 3d application.\n\nThis will allow you to preserve the stretchy settings even in programs that do not support it.' + custom_help_title = 'Use Real-time Skeleton' + cmds.button(l ="?", bgc=settings_bgc_color, c=lambda x:build_custom_help_window(custom_help_message, custom_help_title)) + + cmds.rowColumnLayout(nc=1, cw=[(1, 240)], cs=[(1,10)], p=settings_column) + + cmds.separator(h=25) + cmds.separator(h=5, style='none') # Empty Space + cmds.button(l ="Reset Persistent Settings", bgc=settings_bgc_color, c=lambda x:reset_persistent_settings_auto_biped_rigger()) + + # Body ==================== body_column = cmds.rowColumnLayout(nc=1, cw=[(1, 260)], cs=[(1,10)], p=content_main) @@ -400,6 +478,40 @@ def build_gui_auto_biped_rig(): widget.setWindowIcon(icon) + ### GUI Functions ### + def invert_stored_setting(key_string): + ''' + Used for boolean values, it inverts the value, so if True it becomes False and vice-versa + + Parameters: + key_string (string) : Key name, used to determine what bool value to flip + ''' + gt_ab_settings[key_string] = not gt_ab_settings.get(key_string) + + def update_gui_settings(): + ''' + Function to show or hide settings. + It acomplishes this by switching the height of the body_column and the settings_column. @@@ + ''' + if gt_ab_settings.get('is_settings_visible') != True: + gt_ab_settings["is_settings_visible"] = True + + cmds.button(settings_btn, e=True, l='Apply', bgc=(.6, .6, .6)) + + # Hide Checklist Items + gt_ab_settings["body_column_height"] = cmds.rowColumnLayout(body_column, q=True, h=True) + cmds.rowColumnLayout(body_column, e=True, h=1) + + # Show Settings Items + cmds.rowColumnLayout(settings_column, e=True, h=(gt_ab_settings.get('body_column_height'))) + else: + gt_ab_settings["is_settings_visible"] = False + cmds.rowColumnLayout(body_column, e=True, h=gt_ab_settings.get('body_column_height')) + cmds.rowColumnLayout(settings_column, e=True, h=1) + cmds.button(settings_btn, e=True, l='Settings', bgc=title_bgc_color) + set_persistent_settings_auto_biped_rigger() + get_persistent_settings_auto_biped_rigger() + # Main GUI Ends Here ================================================================================= @@ -499,6 +611,62 @@ def close_help_gui(): # Help Dialog Ends Here ================================================================================= +def build_custom_help_window(input_text, help_title=''): + ''' + Creates a help window to display the provided text + + Parameters: + input_text (string): Text used as help, this is displayed in a scroll fields. + help_title (optinal, string) + ''' + window_name = help_title.replace(" ","_").replace("-","_").lower().strip() + "_help_window" + if cmds.window(window_name, exists=True): + cmds.deleteUI(window_name, window=True) + + cmds.window(window_name, title= help_title + " Help", mnb=False, mxb=False, s=True) + cmds.window(window_name, e=True, s=True, wh=[1,1]) + + main_column = cmds.columnLayout(p= window_name) + + # Title Text + cmds.separator(h=12, style='none') # Empty Space + cmds.rowColumnLayout(nc=1, cw=[(1, 310)], cs=[(1, 10)], p=main_column) # Window Size Adjustment + cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1, 10)], p=main_column) # Title Column + cmds.text(help_title + " Help", bgc=(.4, .4, .4), fn="boldLabelFont", align="center") + cmds.separator(h=10, style='none', p=main_column) # Empty Space + + # Body ==================== + cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1,10)], p=main_column) + + help_scroll_field = cmds.scrollField(editable=False, wordWrap=True, fn="smallPlainLabelFont") + + cmds.scrollField(help_scroll_field, e=True, ip=0, it=input_text) + cmds.scrollField(help_scroll_field, e=True, ip=1, it='') # Bring Back to the Top + + # Close Button + cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1,10)], p=main_column) + cmds.separator(h=10, style='none') + cmds.button(l='OK', h=30, c=lambda args: close_help_gui()) + cmds.separator(h=8, style='none') + + # Show and Lock Window + cmds.showWindow(window_name) + cmds.window(window_name, e=True, s=False) + + # Set Window Icon + qw = omui.MQtUtil.findWindow(window_name) + if python_version == 3: + widget = wrapInstance(int(qw), QWidget) + else: + widget = wrapInstance(long(qw), QWidget) + icon = QIcon(':/question.png') + widget.setWindowIcon(icon) + + def close_help_gui(): + ''' Closes help windows ''' + if cmds.window(window_name, exists=True): + cmds.deleteUI(window_name, window=True) + # Custom Help Dialog Ends Here ================================================================================= def gtu_combine_curves_list(curve_list): @@ -1066,11 +1234,11 @@ def get_inverted_hierarchy_tree(obj_list, return_short_name=True): -def mimic_segment_scale_compensate_behaviour(joints_with_ssc, joints_no_ssc): +def mimic_segment_scale_compensate(joints_with_ssc, joints_no_ssc): ''' Mimics the behaviour of segment scale compensate tranform system present in Maya transfering the baked values to a secondary joint chain. - The secondary skeleton is compatible with real time engines as it calculates and bakes + The secondary skeleton is compatible with real-time engines as it calculates and bakes scale values directly into the joints. @@ -1180,7 +1348,7 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct Parameters: new_skeleton_suffix (optional, string): expected in-between string for game skeleton. Used to pair with original skeleton - duplicated_joints (list): A list of string containing all generated real time joints + duplicated_joints (list): A list of string containing all generated real-time joints game_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl) @@ -1208,7 +1376,7 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct sorted_original_joints = get_inverted_hierarchy_tree(original_joints) sorted_no_ssc_joints = get_inverted_hierarchy_tree(duplicated_joints) - mimic_segment_scale_compensate_behaviour(sorted_original_joints, sorted_no_ssc_joints) + mimic_segment_scale_compensate(sorted_original_joints, sorted_no_ssc_joints) # Parent Constraint new system remove_dupe_str = '_' + new_skeleton_suffix + '_' + jnt_suffix @@ -1527,16 +1695,16 @@ def validate_operation(operation, debugging=False): # Debugging (Auto deletes generated proxy) if debugging and debugging_auto_recreate: try: - cmds.delete(gt_ab_settings_default.get('main_proxy_grp')) + cmds.delete(gt_ab_elements_default.get('main_proxy_grp')) except: pass # Check if proxy exists in the scene - proxy_elements = [gt_ab_settings_default.get('main_proxy_grp')] - for proxy in gt_ab_settings_default: + proxy_elements = [gt_ab_elements_default.get('main_proxy_grp')] + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings_default.get(proxy)) + proxy_elements.append(gt_ab_elements_default.get(proxy)) for obj in proxy_elements: if cmds.objExists(obj) and is_valid: is_valid = False @@ -1572,8 +1740,8 @@ def validate_operation(operation, debugging=False): try: if cmds.objExists('rig_grp'): cmds.delete('rig_grp') - if cmds.objExists(gt_ab_settings.get('main_proxy_grp')): - cmds.delete(gt_ab_settings.get('main_proxy_grp')) + if cmds.objExists(gt_ab_elements.get('main_proxy_grp')): + cmds.delete(gt_ab_elements.get('main_proxy_grp')) create_proxy(colorize_proxy=True) # Debugging (Auto imports proxy) if debugging_import_proxy and os.path.exists(debugging_import_path): @@ -1582,14 +1750,14 @@ def validate_operation(operation, debugging=False): pass # Validate Proxy - if not cmds.objExists(gt_ab_settings.get('main_proxy_grp')): + if not cmds.objExists(gt_ab_elements.get('main_proxy_grp')): is_valid = False cmds.warning('Proxy couldn\'t be found. Make sure you first create a proxy (guide objects) before generating a rig.') - proxy_elements = [gt_ab_settings.get('main_proxy_grp')] - for proxy in gt_ab_settings_default: + proxy_elements = [gt_ab_elements.get('main_proxy_grp')] + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings.get(proxy)) + proxy_elements.append(gt_ab_elements.get(proxy)) for obj in proxy_elements: if not cmds.objExists(obj) and is_valid: is_valid = False @@ -1642,84 +1810,84 @@ def create_proxy(colorize_proxy=True): cmds.warning('Proxy creation already in progress, please finish it first.') # Main - main_crv = create_main_control(gt_ab_settings_default.get('main_crv')) - main_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('main_proxy_grp')) + main_crv = create_main_control(gt_ab_elements_default.get('main_crv')) + main_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('main_proxy_grp')) cmds.parent(main_crv, main_grp) # Root - cog_proxy_crv = create_joint_curve(gt_ab_settings_default.get('cog_proxy_crv'), 1) + cog_proxy_crv = create_joint_curve(gt_ab_elements_default.get('cog_proxy_crv'), 1) root_proxy_grp = cmds.group(empty=True, world=True, name=cog_proxy_crv + grp_suffix.capitalize()) cmds.parent(cog_proxy_crv, root_proxy_grp) cmds.move(0, 89.2, 0, root_proxy_grp) # Spine 1 - spine01_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine01_proxy_crv'), 0.5) + spine01_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine01_proxy_crv'), 0.5) spine01_proxy_grp = cmds.group(empty=True, world=True, name=spine01_proxy_crv + grp_suffix.capitalize()) cmds.parent(spine01_proxy_crv, spine01_proxy_grp) cmds.move(0, 98.5, 0, spine01_proxy_grp) # Spine 2 - spine02_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine02_proxy_crv'), 0.5) + spine02_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine02_proxy_crv'), 0.5) spine02_proxy_grp = cmds.group(empty=True, world=True, name=spine02_proxy_crv + grp_suffix.capitalize()) cmds.parent(spine02_proxy_crv, spine02_proxy_grp) cmds.move(0, 108.2, 0, spine02_proxy_grp) # Spine 3 - spine03_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine03_proxy_crv'), 0.5) + spine03_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine03_proxy_crv'), 0.5) spine03_proxy_grp = cmds.group(empty=True, world=True, name=spine03_proxy_crv + grp_suffix.capitalize()) cmds.parent(spine03_proxy_crv, spine03_proxy_grp) cmds.move(0, 117.8, 0, spine03_proxy_grp) # Spine 4 - spine04_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine04_proxy_crv'), 1) + spine04_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine04_proxy_crv'), 1) spine04_proxy_grp = cmds.group(empty=True, world=True, name=spine04_proxy_crv + grp_suffix.capitalize()) cmds.parent(spine04_proxy_crv, spine04_proxy_grp) cmds.move(0, 127.5, 0, spine04_proxy_grp) # Neck Base - neck_base_proxy_crv = create_joint_curve(gt_ab_settings_default.get('neck_base_proxy_crv'), .5) + neck_base_proxy_crv = create_joint_curve(gt_ab_elements_default.get('neck_base_proxy_crv'), .5) neck_base_proxy_grp = cmds.group(empty=True, world=True, name=neck_base_proxy_crv + grp_suffix.capitalize()) cmds.parent(neck_base_proxy_crv, neck_base_proxy_grp) cmds.move(0, 137.1, 0, neck_base_proxy_grp) # Neck Mid - neck_mid_proxy_crv = create_joint_curve(gt_ab_settings_default.get('neck_mid_proxy_crv'), .2) + neck_mid_proxy_crv = create_joint_curve(gt_ab_elements_default.get('neck_mid_proxy_crv'), .2) neck_mid_proxy_grp = cmds.group(empty=True, world=True, name=neck_mid_proxy_crv + grp_suffix.capitalize()) cmds.parent(neck_mid_proxy_crv, neck_mid_proxy_grp) cmds.move(0, 139.8, 0, neck_mid_proxy_grp) # Head - head_proxy_crv = create_joint_curve(gt_ab_settings_default.get('head_proxy_crv'), .5) + head_proxy_crv = create_joint_curve(gt_ab_elements_default.get('head_proxy_crv'), .5) head_proxy_grp = cmds.group(empty=True, world=True, name=head_proxy_crv + grp_suffix.capitalize()) cmds.parent(head_proxy_crv, head_proxy_grp) cmds.move(0, 142.4, 0, head_proxy_grp) # Head End - head_end_proxy_crv = create_joint_curve(gt_ab_settings_default.get('head_end_proxy_crv'), .2) + head_end_proxy_crv = create_joint_curve(gt_ab_elements_default.get('head_end_proxy_crv'), .2) head_end_proxy_grp = cmds.group(empty=True, world=True, name=head_end_proxy_crv + grp_suffix.capitalize()) cmds.parent(head_end_proxy_crv, head_end_proxy_grp) cmds.move(0, 160, 0, head_end_proxy_grp) # Jaw - jaw_proxy_crv = create_joint_curve(gt_ab_settings_default.get('jaw_proxy_crv'), .5) + jaw_proxy_crv = create_joint_curve(gt_ab_elements_default.get('jaw_proxy_crv'), .5) jaw_proxy_grp = cmds.group(empty=True, world=True, name=jaw_proxy_crv + grp_suffix.capitalize()) cmds.parent(jaw_proxy_crv, jaw_proxy_grp) cmds.move(0, 147.4, 2.35, jaw_proxy_grp) # Jaw End - jaw_end_proxy_crv = create_joint_curve(gt_ab_settings_default.get('jaw_end_proxy_crv'), .2) + jaw_end_proxy_crv = create_joint_curve(gt_ab_elements_default.get('jaw_end_proxy_crv'), .2) jaw_end_proxy_grp = cmds.group(empty=True, world=True, name=jaw_end_proxy_crv + grp_suffix.capitalize()) cmds.parent(jaw_end_proxy_crv, jaw_end_proxy_grp) cmds.move(0, 142.7, 10.8, jaw_end_proxy_grp) # Right Eye - right_eye_proxy_crv = create_loc_joint_curve(gt_ab_settings_default.get('right_eye_proxy_crv'), .6) + right_eye_proxy_crv = create_loc_joint_curve(gt_ab_elements_default.get('right_eye_proxy_crv'), .6) right_eye_proxy_grp = cmds.group(empty=True, world=True, name=right_eye_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_eye_proxy_crv, right_eye_proxy_grp) cmds.move(-3.5, 151.2, 8.7, right_eye_proxy_grp) # Left Eye - left_eye_proxy_crv = create_loc_joint_curve(gt_ab_settings_default.get('left_eye_proxy_crv'), .6) + left_eye_proxy_crv = create_loc_joint_curve(gt_ab_elements_default.get('left_eye_proxy_crv'), .6) left_eye_proxy_grp = cmds.group(empty=True, world=True, name=left_eye_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_eye_proxy_crv, left_eye_proxy_grp) cmds.move(3.5, 151.2, 8.7, left_eye_proxy_grp) @@ -1727,134 +1895,134 @@ def create_proxy(colorize_proxy=True): ################# Left Arm ################# # Left Clavicle - left_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_clavicle_proxy_crv'), .5) + left_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_clavicle_proxy_crv'), .5) left_clavicle_proxy_grp = cmds.group(empty=True, world=True, name=left_clavicle_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_clavicle_proxy_crv, left_clavicle_proxy_grp) cmds.move(7.3, 130.4, 0, left_clavicle_proxy_grp) # Left Shoulder - left_shoulder_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_shoulder_proxy_crv'), .5) + left_shoulder_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_shoulder_proxy_crv'), .5) left_shoulder_proxy_grp = cmds.group(empty=True, world=True, name=left_shoulder_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_shoulder_proxy_crv, left_shoulder_proxy_grp) cmds.move(17.2, 130.4, 0, left_shoulder_proxy_grp) # Left Elbow - left_elbow_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('left_elbow_proxy_crv'), .5) + left_elbow_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('left_elbow_proxy_crv'), .5) left_elbow_proxy_grp = cmds.group(empty=True, world=True, name=left_elbow_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_elbow_proxy_crv, left_elbow_proxy_grp) cmds.move(37.7, 130.4, 0, left_elbow_proxy_grp) # Left Wrist - left_wrist_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_wrist_proxy_crv'), .6) + left_wrist_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_wrist_proxy_crv'), .6) left_wrist_proxy_grp = cmds.group(empty=True, world=True, name=left_wrist_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_wrist_proxy_crv, left_wrist_proxy_grp) cmds.move(58.2, 130.4, 0, left_wrist_proxy_grp) # Left Thumb - left_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb01_proxy_crv'), proxy_finger_scale) + left_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb01_proxy_crv'), proxy_finger_scale) left_thumb01_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb01_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_thumb01_proxy_crv, left_thumb01_proxy_grp) cmds.move(60.8, 130.4, 2.9, left_thumb01_proxy_grp) - left_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb02_proxy_crv'), proxy_finger_scale) + left_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb02_proxy_crv'), proxy_finger_scale) left_thumb02_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb02_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_thumb02_proxy_crv, left_thumb02_proxy_grp) cmds.move(60.8, 130.4, 7.3, left_thumb02_proxy_grp) - left_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb03_proxy_crv'), proxy_finger_scale) + left_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb03_proxy_crv'), proxy_finger_scale) left_thumb03_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb03_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_thumb03_proxy_crv, left_thumb03_proxy_grp) cmds.move(60.8, 130.4, 11.7, left_thumb03_proxy_grp) - left_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb04_proxy_crv'), proxy_end_joint_scale) + left_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb04_proxy_crv'), proxy_end_joint_scale) left_thumb04_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb04_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_thumb04_proxy_crv, left_thumb04_proxy_grp) cmds.move(60.8, 130.4, 16.3, left_thumb04_proxy_grp) # Left Index - left_index01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index01_proxy_crv'), proxy_finger_scale) + left_index01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index01_proxy_crv'), proxy_finger_scale) left_index01_proxy_grp = cmds.group(empty=True, world=True, name=left_index01_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_index01_proxy_crv, left_index01_proxy_grp) cmds.move(66.9, 130.4, 3.5, left_index01_proxy_grp) - left_index02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index02_proxy_crv'), proxy_finger_scale) + left_index02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index02_proxy_crv'), proxy_finger_scale) left_index02_proxy_grp = cmds.group(empty=True, world=True, name=left_index02_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_index02_proxy_crv, left_index02_proxy_grp) cmds.move(70.1, 130.4, 3.5, left_index02_proxy_grp) - left_index03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index03_proxy_crv'), proxy_finger_scale) + left_index03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index03_proxy_crv'), proxy_finger_scale) left_index03_proxy_grp = cmds.group(empty=True, world=True, name=left_index03_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_index03_proxy_crv, left_index03_proxy_grp) cmds.move(74.2, 130.4, 3.5, left_index03_proxy_grp) - left_index04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index04_proxy_crv'), proxy_end_joint_scale) + left_index04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index04_proxy_crv'), proxy_end_joint_scale) left_index04_proxy_grp = cmds.group(empty=True, world=True, name=left_index04_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_index04_proxy_crv, left_index04_proxy_grp) cmds.move(77.5, 130.4, 3.5, left_index04_proxy_grp) # Left Middle - left_middle01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle01_proxy_crv'), proxy_finger_scale) + left_middle01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle01_proxy_crv'), proxy_finger_scale) left_middle01_proxy_grp = cmds.group(empty=True, world=True, name=left_middle01_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_middle01_proxy_crv, left_middle01_proxy_grp) cmds.move(66.9, 130.4, 1.1, left_middle01_proxy_grp) - left_middle02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle02_proxy_crv'), proxy_finger_scale) + left_middle02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle02_proxy_crv'), proxy_finger_scale) left_middle02_proxy_grp = cmds.group(empty=True, world=True, name=left_middle02_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_middle02_proxy_crv, left_middle02_proxy_grp) cmds.move(70.7, 130.4, 1.1, left_middle02_proxy_grp) - left_middle03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle03_proxy_crv'), proxy_finger_scale) + left_middle03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle03_proxy_crv'), proxy_finger_scale) left_middle03_proxy_grp = cmds.group(empty=True, world=True, name=left_middle03_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_middle03_proxy_crv, left_middle03_proxy_grp) cmds.move(74.4, 130.4, 1.1, left_middle03_proxy_grp) - left_middle04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle04_proxy_crv'), proxy_end_joint_scale) + left_middle04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle04_proxy_crv'), proxy_end_joint_scale) left_middle04_proxy_grp = cmds.group(empty=True, world=True, name=left_middle04_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_middle04_proxy_crv, left_middle04_proxy_grp) cmds.move(78.0, 130.4, 1.1, left_middle04_proxy_grp) # Left Ring - left_ring01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring01_proxy_crv'), proxy_finger_scale) + left_ring01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring01_proxy_crv'), proxy_finger_scale) left_ring01_proxy_grp = cmds.group(empty=True, world=True, name=left_ring01_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ring01_proxy_crv, left_ring01_proxy_grp) cmds.move(66.9, 130.4, -1.1, left_ring01_proxy_grp) - left_ring02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring02_proxy_crv'), proxy_finger_scale) + left_ring02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring02_proxy_crv'), proxy_finger_scale) left_ring02_proxy_grp = cmds.group(empty=True, world=True, name=left_ring02_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ring02_proxy_crv, left_ring02_proxy_grp) cmds.move(70.4, 130.4, -1.1, left_ring02_proxy_grp) - left_ring03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring03_proxy_crv'), proxy_finger_scale) + left_ring03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring03_proxy_crv'), proxy_finger_scale) left_ring03_proxy_grp = cmds.group(empty=True, world=True, name=left_ring03_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ring03_proxy_crv, left_ring03_proxy_grp) cmds.move(74, 130.4, -1.1, left_ring03_proxy_grp) - left_ring04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring04_proxy_crv'), proxy_end_joint_scale) + left_ring04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring04_proxy_crv'), proxy_end_joint_scale) left_ring04_proxy_grp = cmds.group(empty=True, world=True, name=left_ring04_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ring04_proxy_crv, left_ring04_proxy_grp) cmds.move(77.5, 130.4, -1.1, left_ring04_proxy_grp) # Left Pinky - left_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky01_proxy_crv'), proxy_finger_scale) + left_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky01_proxy_crv'), proxy_finger_scale) left_pinky01_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky01_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_pinky01_proxy_crv, left_pinky01_proxy_grp) cmds.move(66.3, 130.4, -3.2, left_pinky01_proxy_grp) - left_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky02_proxy_crv'), proxy_finger_scale) + left_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky02_proxy_crv'), proxy_finger_scale) left_pinky02_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky02_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_pinky02_proxy_crv, left_pinky02_proxy_grp) cmds.move(69.6, 130.4, -3.2, left_pinky02_proxy_grp) - left_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky03_proxy_crv'), proxy_finger_scale) + left_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky03_proxy_crv'), proxy_finger_scale) left_pinky03_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky03_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_pinky03_proxy_crv, left_pinky03_proxy_grp) cmds.move(72.8, 130.4, -3.2, left_pinky03_proxy_grp) - left_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky04_proxy_crv'), proxy_end_joint_scale) + left_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky04_proxy_crv'), proxy_end_joint_scale) left_pinky04_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky04_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_pinky04_proxy_crv, left_pinky04_proxy_grp) cmds.move(76.3, 130.4, -3.2, left_pinky04_proxy_grp) @@ -1862,155 +2030,155 @@ def create_proxy(colorize_proxy=True): ################# Right Arm ################# # Right Clavicle - right_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_clavicle_proxy_crv'), .5) + right_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_clavicle_proxy_crv'), .5) right_clavicle_proxy_grp = cmds.group(empty=True, world=True, name=right_clavicle_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_clavicle_proxy_crv, right_clavicle_proxy_grp) cmds.move(-7.3, 130.4, 0, right_clavicle_proxy_grp) # Right Shoulder - right_shoulder_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_shoulder_proxy_crv'), .5) + right_shoulder_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_shoulder_proxy_crv'), .5) right_shoulder_proxy_grp = cmds.group(empty=True, world=True, name=right_shoulder_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_shoulder_proxy_crv, right_shoulder_proxy_grp) cmds.move(-17.2, 130.4, 0, right_shoulder_proxy_grp) # Right Elbow - right_elbow_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('right_elbow_proxy_crv'), .5) + right_elbow_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('right_elbow_proxy_crv'), .5) right_elbow_proxy_grp = cmds.group(empty=True, world=True, name=right_elbow_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_elbow_proxy_crv, right_elbow_proxy_grp) cmds.move(-37.7, 130.4, 0, right_elbow_proxy_grp) # Right Wrist - right_wrist_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_wrist_proxy_crv'), .6) + right_wrist_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_wrist_proxy_crv'), .6) right_wrist_proxy_grp = cmds.group(empty=True, world=True, name=right_wrist_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_wrist_proxy_crv, right_wrist_proxy_grp) cmds.move(-58.2, 130.4, 0, right_wrist_proxy_grp) # Right Thumb - right_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb01_proxy_crv'), proxy_finger_scale) + right_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb01_proxy_crv'), proxy_finger_scale) right_thumb01_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb01_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_thumb01_proxy_crv, right_thumb01_proxy_grp) cmds.move(-60.8, 130.4, 2.9, right_thumb01_proxy_grp) - right_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb02_proxy_crv'), proxy_finger_scale) + right_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb02_proxy_crv'), proxy_finger_scale) right_thumb02_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb02_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_thumb02_proxy_crv, right_thumb02_proxy_grp) cmds.move(-60.8, 130.4, 7.3, right_thumb02_proxy_grp) - right_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb03_proxy_crv'), proxy_finger_scale) + right_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb03_proxy_crv'), proxy_finger_scale) right_thumb03_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb03_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_thumb03_proxy_crv, right_thumb03_proxy_grp) cmds.move(-60.8, 130.4, 11.7, right_thumb03_proxy_grp) - right_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb04_proxy_crv'), proxy_end_joint_scale) + right_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb04_proxy_crv'), proxy_end_joint_scale) right_thumb04_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb04_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_thumb04_proxy_crv, right_thumb04_proxy_grp) cmds.move(-60.8, 130.4, 16.3, right_thumb04_proxy_grp) # Right Index - right_index01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index01_proxy_crv'), proxy_finger_scale) + right_index01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index01_proxy_crv'), proxy_finger_scale) right_index01_proxy_grp = cmds.group(empty=True, world=True, name=right_index01_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_index01_proxy_crv, right_index01_proxy_grp) cmds.move(-66.9, 130.4, 3.5, right_index01_proxy_grp) - right_index02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index02_proxy_crv'), proxy_finger_scale) + right_index02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index02_proxy_crv'), proxy_finger_scale) right_index02_proxy_grp = cmds.group(empty=True, world=True, name=right_index02_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_index02_proxy_crv, right_index02_proxy_grp) cmds.move(-70.1, 130.4, 3.5, right_index02_proxy_grp) - right_index03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index03_proxy_crv'), proxy_finger_scale) + right_index03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index03_proxy_crv'), proxy_finger_scale) right_index03_proxy_grp = cmds.group(empty=True, world=True, name=right_index03_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_index03_proxy_crv, right_index03_proxy_grp) cmds.move(-74.2, 130.4, 3.5, right_index03_proxy_grp) - right_index04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index04_proxy_crv'), proxy_end_joint_scale) + right_index04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index04_proxy_crv'), proxy_end_joint_scale) right_index04_proxy_grp = cmds.group(empty=True, world=True, name=right_index04_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_index04_proxy_crv, right_index04_proxy_grp) cmds.move(-77.5, 130.4, 3.5, right_index04_proxy_grp) # Right Middle - right_middle01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle01_proxy_crv'), proxy_finger_scale) + right_middle01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle01_proxy_crv'), proxy_finger_scale) right_middle01_proxy_grp = cmds.group(empty=True, world=True, name=right_middle01_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_middle01_proxy_crv, right_middle01_proxy_grp) cmds.move(-66.9, 130.4, 1.1, right_middle01_proxy_grp) - right_middle02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle02_proxy_crv'), proxy_finger_scale) + right_middle02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle02_proxy_crv'), proxy_finger_scale) right_middle02_proxy_grp = cmds.group(empty=True, world=True, name=right_middle02_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_middle02_proxy_crv, right_middle02_proxy_grp) cmds.move(-70.7, 130.4, 1.1, right_middle02_proxy_grp) - right_middle03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle03_proxy_crv'), proxy_finger_scale) + right_middle03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle03_proxy_crv'), proxy_finger_scale) right_middle03_proxy_grp = cmds.group(empty=True, world=True, name=right_middle03_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_middle03_proxy_crv, right_middle03_proxy_grp) cmds.move(-74.4, 130.4, 1.1, right_middle03_proxy_grp) - right_middle04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle04_proxy_crv'), proxy_end_joint_scale) + right_middle04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle04_proxy_crv'), proxy_end_joint_scale) right_middle04_proxy_grp = cmds.group(empty=True, world=True, name=right_middle04_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_middle04_proxy_crv, right_middle04_proxy_grp) cmds.move(-78, 130.4, 1.1, right_middle04_proxy_grp) # Right Ring - right_ring01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring01_proxy_crv'), proxy_finger_scale) + right_ring01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring01_proxy_crv'), proxy_finger_scale) right_ring01_proxy_grp = cmds.group(empty=True, world=True, name=right_ring01_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ring01_proxy_crv, right_ring01_proxy_grp) cmds.move(-66.9, 130.4, -1.1, right_ring01_proxy_grp) - right_ring02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring02_proxy_crv'), proxy_finger_scale) + right_ring02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring02_proxy_crv'), proxy_finger_scale) right_ring02_proxy_grp = cmds.group(empty=True, world=True, name=right_ring02_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ring02_proxy_crv, right_ring02_proxy_grp) cmds.move(-70.4, 130.4, -1.1, right_ring02_proxy_grp) - right_ring03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring03_proxy_crv'), proxy_finger_scale) + right_ring03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring03_proxy_crv'), proxy_finger_scale) right_ring03_proxy_grp = cmds.group(empty=True, world=True, name=right_ring03_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ring03_proxy_crv, right_ring03_proxy_grp) cmds.move(-74, 130.4, -1.1, right_ring03_proxy_grp) - right_ring04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring04_proxy_crv'), proxy_end_joint_scale) + right_ring04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring04_proxy_crv'), proxy_end_joint_scale) right_ring04_proxy_grp = cmds.group(empty=True, world=True, name=right_ring04_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ring04_proxy_crv, right_ring04_proxy_grp) cmds.move(-77.5, 130.4, -1.1, right_ring04_proxy_grp) # Right Pinky - right_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky01_proxy_crv'), proxy_finger_scale) + right_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky01_proxy_crv'), proxy_finger_scale) right_pinky01_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky01_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_pinky01_proxy_crv, right_pinky01_proxy_grp) cmds.move(-66.3, 130.4, -3.2, right_pinky01_proxy_grp) - right_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky02_proxy_crv'), proxy_finger_scale) + right_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky02_proxy_crv'), proxy_finger_scale) right_pinky02_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky02_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_pinky02_proxy_crv, right_pinky02_proxy_grp) cmds.move(-69.6, 130.4, -3.2, right_pinky02_proxy_grp) - right_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky03_proxy_crv'), proxy_finger_scale) + right_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky03_proxy_crv'), proxy_finger_scale) right_pinky03_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky03_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_pinky03_proxy_crv, right_pinky03_proxy_grp) cmds.move(-72.8, 130.4, -3.2, right_pinky03_proxy_grp) - right_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky04_proxy_crv'), proxy_end_joint_scale) + right_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky04_proxy_crv'), proxy_end_joint_scale) right_pinky04_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky04_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_pinky04_proxy_crv, right_pinky04_proxy_grp) cmds.move(-76.3, 130.4, -3.2, right_pinky04_proxy_grp) # Hip - hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('hip_proxy_crv'), .4) + hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('hip_proxy_crv'), .4) hip_proxy_grp = cmds.group(empty=True, world=True, name=hip_proxy_crv + grp_suffix.capitalize()) cmds.parent(hip_proxy_crv, hip_proxy_grp) cmds.move(0, 84.5, 0, hip_proxy_grp) ################# Left Leg ################# # Left Hip - left_hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_hip_proxy_crv'), .4) + left_hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_hip_proxy_crv'), .4) left_hip_proxy_grp = cmds.group(empty=True, world=True, name=left_hip_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_hip_proxy_crv, left_hip_proxy_grp) cmds.move(10.2, 84.5, 0, left_hip_proxy_grp) # Left Knee - left_knee_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('left_knee_proxy_crv'), .5) + left_knee_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('left_knee_proxy_crv'), .5) cmds.rotate(0, 180, 90, left_knee_proxy_crv) cmds.makeIdentity(left_knee_proxy_crv, apply=True, translate=True, scale=True, rotate=True) left_knee_proxy_grp = cmds.group(empty=True, world=True, name=left_knee_proxy_crv + grp_suffix.capitalize()) @@ -2018,19 +2186,19 @@ def create_proxy(colorize_proxy=True): cmds.move(10.2, 46.8, 0, left_knee_proxy_grp) # Left Ankle - left_ankle_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_ankle_proxy_crv'), .4) + left_ankle_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_ankle_proxy_crv'), .4) left_ankle_proxy_grp = cmds.group(empty=True, world=True, name=left_ankle_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ankle_proxy_crv, left_ankle_proxy_grp) cmds.move(10.2, 9.6, 0, left_ankle_proxy_grp) # Left Ball - left_ball_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_ball_proxy_crv'), .4) + left_ball_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_ball_proxy_crv'), .4) left_ball_proxy_grp = cmds.group(empty=True, world=True, name=left_ball_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_ball_proxy_crv, left_ball_proxy_grp) cmds.move(10.2, 0, 13.1, left_ball_proxy_grp) # Left Toe - left_toe_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_toe_proxy_crv'), .35) + left_toe_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_toe_proxy_crv'), .35) left_toe_proxy_grp = cmds.group(empty=True, world=True, name=left_toe_proxy_crv + grp_suffix.capitalize()) cmds.parent(left_toe_proxy_crv, left_toe_proxy_grp) cmds.move(10.2, 0, 23.4, left_toe_proxy_grp) @@ -2038,13 +2206,13 @@ def create_proxy(colorize_proxy=True): ################# Right Leg ################# # Right Hip - right_hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_hip_proxy_crv'), .4) + right_hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_hip_proxy_crv'), .4) right_hip_proxy_grp = cmds.group(empty=True, world=True, name=right_hip_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_hip_proxy_crv, right_hip_proxy_grp) cmds.move(-10.2, 84.5, 0, right_hip_proxy_grp) # Right Knee - right_knee_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('right_knee_proxy_crv'), .5) + right_knee_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('right_knee_proxy_crv'), .5) cmds.rotate(0, 180, 90, right_knee_proxy_crv) cmds.makeIdentity(right_knee_proxy_crv, apply=True, translate=True, scale=True, rotate=True) right_knee_proxy_grp = cmds.group(empty=True, world=True, name=right_knee_proxy_crv + grp_suffix.capitalize()) @@ -2052,19 +2220,19 @@ def create_proxy(colorize_proxy=True): cmds.move(-1.75, 8, 0, right_knee_proxy_grp) # Right Ankle - right_ankle_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_ankle_proxy_crv'), .4) + right_ankle_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_ankle_proxy_crv'), .4) right_ankle_proxy_grp = cmds.group(empty=True, world=True, name=right_ankle_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ankle_proxy_crv, right_ankle_proxy_grp) cmds.move(-10.2, 9.6, 0, right_ankle_proxy_grp) # Right Ball - right_ball_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_ball_proxy_crv'), .4) + right_ball_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_ball_proxy_crv'), .4) right_ball_proxy_grp = cmds.group(empty=True, world=True, name=right_ball_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_ball_proxy_crv, right_ball_proxy_grp) cmds.move(-10.2, 0, 13.1, right_ball_proxy_grp) # Right Toe - right_toe_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_toe_proxy_crv'), .35) + right_toe_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_toe_proxy_crv'), .35) right_toe_proxy_grp = cmds.group(empty=True, world=True, name=right_toe_proxy_crv + grp_suffix.capitalize()) cmds.parent(right_toe_proxy_crv, right_toe_proxy_grp) cmds.move(-10.2, 0, 23.4, right_toe_proxy_grp) @@ -2193,14 +2361,14 @@ def create_proxy(colorize_proxy=True): # Left Elbow Constraints # Left Elbow Pole Vector Dir - left_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_pv_dir') ) - cmds.delete(cmds.pointConstraint(gt_ab_settings_default.get('left_elbow_proxy_crv'), left_elbow_pv_loc[0])) - cmds.parent(left_elbow_pv_loc[0], gt_ab_settings_default.get('left_elbow_proxy_crv')) + left_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_pv_dir') ) + cmds.delete(cmds.pointConstraint(gt_ab_elements_default.get('left_elbow_proxy_crv'), left_elbow_pv_loc[0])) + cmds.parent(left_elbow_pv_loc[0], gt_ab_elements_default.get('left_elbow_proxy_crv')) cmds.move(0,0,-9.6, left_elbow_pv_loc[0], relative=True) - left_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_dir_loc') ) - left_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_aim_loc') ) - left_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_upvec_loc') ) + left_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_dir_loc') ) + left_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_aim_loc') ) + left_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_upvec_loc') ) left_elbow_upvec_loc_grp = cmds.group(empty=True, world=True, name=left_elbow_upvec_loc[0] + grp_suffix.capitalize()) cmds.parent(left_elbow_aim_loc, left_elbow_dir_loc) @@ -2214,7 +2382,7 @@ def create_proxy(colorize_proxy=True): cmds.pointConstraint(left_shoulder_proxy_crv, left_elbow_upvec_loc_grp, skip=['x','z']) - left_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('left_elbow_divide_node')) + left_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('left_elbow_divide_node')) cmds.setAttr(left_elbow_divide_node + '.operation', 2) # Make Divide cmds.setAttr(left_elbow_divide_node + '.input2X', -2) @@ -2231,14 +2399,14 @@ def create_proxy(colorize_proxy=True): # Right Elbow Constraints # Right Elbow Pole Vector Dir - right_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_pv_dir') ) - cmds.delete(cmds.pointConstraint(gt_ab_settings_default.get('right_elbow_proxy_crv'), right_elbow_pv_loc[0])) - cmds.parent(right_elbow_pv_loc[0], gt_ab_settings_default.get('right_elbow_proxy_crv')) + right_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_pv_dir') ) + cmds.delete(cmds.pointConstraint(gt_ab_elements_default.get('right_elbow_proxy_crv'), right_elbow_pv_loc[0])) + cmds.parent(right_elbow_pv_loc[0], gt_ab_elements_default.get('right_elbow_proxy_crv')) cmds.move(0,0,-9.6, right_elbow_pv_loc[0], relative=True) - right_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_dir_loc') ) - right_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_aim_loc') ) - right_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_upvec_loc') ) + right_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_dir_loc') ) + right_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_aim_loc') ) + right_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_upvec_loc') ) right_elbow_upvec_loc_grp = cmds.group(empty=True, world=True, name=right_elbow_upvec_loc[0] + grp_suffix.capitalize()) cmds.parent(right_elbow_aim_loc, right_elbow_dir_loc) @@ -2252,7 +2420,7 @@ def create_proxy(colorize_proxy=True): cmds.pointConstraint(right_shoulder_proxy_crv, right_elbow_upvec_loc_grp, skip=['x','z']) - right_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('right_elbow_divide_node')) + right_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('right_elbow_divide_node')) cmds.setAttr(right_elbow_divide_node + '.operation', 2) # Make Divide cmds.setAttr(right_elbow_divide_node + '.input2X', -2) @@ -2269,7 +2437,7 @@ def create_proxy(colorize_proxy=True): # Left Knee Setup - left_knee_pv_dir = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_pv_dir') ) + left_knee_pv_dir = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_pv_dir') ) temp = cmds.pointConstraint(left_knee_proxy_crv, left_knee_pv_dir) cmds.delete(temp) cmds.move(0, 0, 12.9, left_knee_pv_dir, relative=True) @@ -2277,7 +2445,7 @@ def create_proxy(colorize_proxy=True): # Right Knee Setup - right_knee_pv_dir = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_pv_dir') ) + right_knee_pv_dir = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_pv_dir') ) temp = cmds.pointConstraint(right_knee_proxy_crv, right_knee_pv_dir) cmds.delete(temp) cmds.move(0, 0, 12.9, right_knee_pv_dir, relative=True) @@ -2285,16 +2453,16 @@ def create_proxy(colorize_proxy=True): # Left Knee Constraints - left_knee_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_dir_loc') ) - left_knee_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_aim_loc') ) - left_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_upvec_loc') ) + left_knee_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_dir_loc') ) + left_knee_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_aim_loc') ) + left_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_upvec_loc') ) left_knee_upvec_loc_grp = cmds.group(empty=True, world=True, name=left_knee_upvec_loc[0] + grp_suffix.capitalize()) cmds.parent(left_knee_upvec_loc, left_knee_upvec_loc_grp) cmds.parent(left_knee_upvec_loc_grp, main_crv) cmds.parent(left_knee_dir_loc[0], main_crv) cmds.parent(left_knee_aim_loc[0], left_knee_dir_loc[0]) - left_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('left_knee_divide_node')) + left_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('left_knee_divide_node')) cmds.setAttr(left_knee_divide_node + '.operation', 2) # Make Divide cmds.setAttr(left_knee_divide_node + '.input2X', -2) cmds.connectAttr(left_ankle_proxy_crv + '.tx', left_knee_divide_node + '.input1X') @@ -2313,16 +2481,16 @@ def create_proxy(colorize_proxy=True): # Right Knee Constraints - right_knee_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_dir_loc') ) - right_knee_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_aim_loc') ) - right_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_upvec_loc') ) + right_knee_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_dir_loc') ) + right_knee_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_aim_loc') ) + right_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_upvec_loc') ) right_knee_upvec_loc_grp = cmds.group(empty=True, world=True, name=right_knee_upvec_loc[0] + grp_suffix.capitalize()) cmds.parent(right_knee_upvec_loc, right_knee_upvec_loc_grp) cmds.parent(right_knee_upvec_loc_grp, main_crv) cmds.parent(right_knee_dir_loc[0], main_crv) cmds.parent(right_knee_aim_loc[0], right_knee_dir_loc[0]) - right_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('right_knee_divide_node')) + right_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('right_knee_divide_node')) cmds.setAttr(right_knee_divide_node + '.operation', 2) # Make Divide cmds.setAttr(right_knee_divide_node + '.input2X', -2) cmds.connectAttr(right_ankle_proxy_crv + '.tx', right_knee_divide_node + '.input1X') @@ -2341,7 +2509,7 @@ def create_proxy(colorize_proxy=True): # Left Rolls - left_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('left_ball_pivot_grp')) + left_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('left_ball_pivot_grp')) cmds.parent(left_ball_pivot_grp, main_crv) ankle_pos = cmds.xform(left_ankle_proxy_crv, q=True, ws=True, rp=True) cmds.move(ankle_pos[0], left_ball_pivot_grp, moveX=True) @@ -2352,7 +2520,7 @@ def create_proxy(colorize_proxy=True): cmds.parent(left_ball_proxy_grp, left_ball_pivot_grp) # Right Rolls - right_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('right_ball_pivot_grp')) + right_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('right_ball_pivot_grp')) cmds.parent(right_ball_pivot_grp, main_crv) ankle_pos = cmds.xform(right_ankle_proxy_crv, q=True, ws=True, rp=True) cmds.move(ankle_pos[0], right_ball_pivot_grp, moveX=True) @@ -2548,119 +2716,119 @@ def create_proxy(colorize_proxy=True): cmds.connectAttr(right_ankle_proxy_crv + '.followHip', constraint[0] + '.w0') # Store new names into settings in case they were modified - gt_ab_settings['main_crv'] = main_crv - gt_ab_settings['cog_proxy_crv'] = cog_proxy_crv - gt_ab_settings['spine01_proxy_crv'] = spine01_proxy_crv - gt_ab_settings['spine02_proxy_crv'] = spine02_proxy_crv - gt_ab_settings['spine03_proxy_crv'] = spine03_proxy_crv - gt_ab_settings['spine04_proxy_crv'] = spine04_proxy_crv - gt_ab_settings['neck_base_proxy_crv'] = neck_base_proxy_crv - gt_ab_settings['neck_mid_proxy_crv'] = neck_mid_proxy_crv - gt_ab_settings['head_proxy_crv'] = head_proxy_crv - gt_ab_settings['head_end_proxy_crv'] = head_end_proxy_crv - gt_ab_settings['jaw_proxy_crv'] = jaw_proxy_crv - gt_ab_settings['jaw_end_proxy_crv'] = jaw_end_proxy_crv - gt_ab_settings['hip_proxy_crv'] = hip_proxy_crv + gt_ab_elements['main_crv'] = main_crv + gt_ab_elements['cog_proxy_crv'] = cog_proxy_crv + gt_ab_elements['spine01_proxy_crv'] = spine01_proxy_crv + gt_ab_elements['spine02_proxy_crv'] = spine02_proxy_crv + gt_ab_elements['spine03_proxy_crv'] = spine03_proxy_crv + gt_ab_elements['spine04_proxy_crv'] = spine04_proxy_crv + gt_ab_elements['neck_base_proxy_crv'] = neck_base_proxy_crv + gt_ab_elements['neck_mid_proxy_crv'] = neck_mid_proxy_crv + gt_ab_elements['head_proxy_crv'] = head_proxy_crv + gt_ab_elements['head_end_proxy_crv'] = head_end_proxy_crv + gt_ab_elements['jaw_proxy_crv'] = jaw_proxy_crv + gt_ab_elements['jaw_end_proxy_crv'] = jaw_end_proxy_crv + gt_ab_elements['hip_proxy_crv'] = hip_proxy_crv # Left Side Elements - gt_ab_settings['left_eye_proxy_crv'] = left_eye_proxy_crv - gt_ab_settings['left_clavicle_proxy_crv'] = left_clavicle_proxy_crv - gt_ab_settings['left_shoulder_proxy_crv'] = left_shoulder_proxy_crv - gt_ab_settings['left_elbow_proxy_crv'] = left_elbow_proxy_crv - gt_ab_settings['left_wrist_proxy_crv'] = left_wrist_proxy_crv - gt_ab_settings['left_thumb01_proxy_crv'] = left_thumb01_proxy_crv - gt_ab_settings['left_thumb02_proxy_crv'] = left_thumb02_proxy_crv - gt_ab_settings['left_thumb03_proxy_crv'] = left_thumb03_proxy_crv - gt_ab_settings['left_thumb04_proxy_crv'] = left_thumb04_proxy_crv - gt_ab_settings['left_index01_proxy_crv'] = left_index01_proxy_crv - gt_ab_settings['left_index02_proxy_crv'] = left_index02_proxy_crv - gt_ab_settings['left_index03_proxy_crv'] = left_index03_proxy_crv - gt_ab_settings['left_index04_proxy_crv'] = left_index04_proxy_crv - gt_ab_settings['left_middle01_proxy_crv'] = left_middle01_proxy_crv - gt_ab_settings['left_middle02_proxy_crv'] = left_middle02_proxy_crv - gt_ab_settings['left_middle03_proxy_crv'] = left_middle03_proxy_crv - gt_ab_settings['left_middle04_proxy_crv'] = left_middle04_proxy_crv - gt_ab_settings['left_ring01_proxy_crv'] = left_ring01_proxy_crv - gt_ab_settings['left_ring02_proxy_crv'] = left_ring02_proxy_crv - gt_ab_settings['left_ring03_proxy_crv'] = left_ring03_proxy_crv - gt_ab_settings['left_ring04_proxy_crv'] = left_ring04_proxy_crv - gt_ab_settings['left_pinky01_proxy_crv'] = left_pinky01_proxy_crv - gt_ab_settings['left_pinky02_proxy_crv'] = left_pinky02_proxy_crv - gt_ab_settings['left_pinky03_proxy_crv'] = left_pinky03_proxy_crv - gt_ab_settings['left_pinky04_proxy_crv'] = left_pinky04_proxy_crv - gt_ab_settings['left_hip_proxy_crv'] = left_hip_proxy_crv - gt_ab_settings['left_knee_proxy_crv'] = left_knee_proxy_crv - gt_ab_settings['left_ankle_proxy_crv'] = left_ankle_proxy_crv - gt_ab_settings['left_ball_proxy_crv'] = left_ball_proxy_crv - gt_ab_settings['left_toe_proxy_crv'] = left_toe_proxy_crv - gt_ab_settings['left_elbow_pv_loc'] = left_elbow_pv_loc[0] - gt_ab_settings['left_elbow_dir_loc'] = left_elbow_dir_loc[0] - gt_ab_settings['left_elbow_aim_loc'] = left_elbow_aim_loc[0] - gt_ab_settings['left_elbow_upvec_loc'] = left_elbow_upvec_loc[0] - gt_ab_settings['left_elbow_divide_node'] = left_elbow_divide_node - gt_ab_settings['left_knee_pv_dir'] = left_knee_pv_dir[0] - gt_ab_settings['left_knee_dir_loc'] = left_knee_dir_loc[0] - gt_ab_settings['left_knee_aim_loc'] = left_knee_aim_loc[0] - gt_ab_settings['left_knee_upvec_loc'] = left_knee_upvec_loc[0] - gt_ab_settings['left_knee_divide_node'] = left_knee_divide_node - gt_ab_settings['left_ball_pivot_grp'] = left_ball_pivot_grp + gt_ab_elements['left_eye_proxy_crv'] = left_eye_proxy_crv + gt_ab_elements['left_clavicle_proxy_crv'] = left_clavicle_proxy_crv + gt_ab_elements['left_shoulder_proxy_crv'] = left_shoulder_proxy_crv + gt_ab_elements['left_elbow_proxy_crv'] = left_elbow_proxy_crv + gt_ab_elements['left_wrist_proxy_crv'] = left_wrist_proxy_crv + gt_ab_elements['left_thumb01_proxy_crv'] = left_thumb01_proxy_crv + gt_ab_elements['left_thumb02_proxy_crv'] = left_thumb02_proxy_crv + gt_ab_elements['left_thumb03_proxy_crv'] = left_thumb03_proxy_crv + gt_ab_elements['left_thumb04_proxy_crv'] = left_thumb04_proxy_crv + gt_ab_elements['left_index01_proxy_crv'] = left_index01_proxy_crv + gt_ab_elements['left_index02_proxy_crv'] = left_index02_proxy_crv + gt_ab_elements['left_index03_proxy_crv'] = left_index03_proxy_crv + gt_ab_elements['left_index04_proxy_crv'] = left_index04_proxy_crv + gt_ab_elements['left_middle01_proxy_crv'] = left_middle01_proxy_crv + gt_ab_elements['left_middle02_proxy_crv'] = left_middle02_proxy_crv + gt_ab_elements['left_middle03_proxy_crv'] = left_middle03_proxy_crv + gt_ab_elements['left_middle04_proxy_crv'] = left_middle04_proxy_crv + gt_ab_elements['left_ring01_proxy_crv'] = left_ring01_proxy_crv + gt_ab_elements['left_ring02_proxy_crv'] = left_ring02_proxy_crv + gt_ab_elements['left_ring03_proxy_crv'] = left_ring03_proxy_crv + gt_ab_elements['left_ring04_proxy_crv'] = left_ring04_proxy_crv + gt_ab_elements['left_pinky01_proxy_crv'] = left_pinky01_proxy_crv + gt_ab_elements['left_pinky02_proxy_crv'] = left_pinky02_proxy_crv + gt_ab_elements['left_pinky03_proxy_crv'] = left_pinky03_proxy_crv + gt_ab_elements['left_pinky04_proxy_crv'] = left_pinky04_proxy_crv + gt_ab_elements['left_hip_proxy_crv'] = left_hip_proxy_crv + gt_ab_elements['left_knee_proxy_crv'] = left_knee_proxy_crv + gt_ab_elements['left_ankle_proxy_crv'] = left_ankle_proxy_crv + gt_ab_elements['left_ball_proxy_crv'] = left_ball_proxy_crv + gt_ab_elements['left_toe_proxy_crv'] = left_toe_proxy_crv + gt_ab_elements['left_elbow_pv_loc'] = left_elbow_pv_loc[0] + gt_ab_elements['left_elbow_dir_loc'] = left_elbow_dir_loc[0] + gt_ab_elements['left_elbow_aim_loc'] = left_elbow_aim_loc[0] + gt_ab_elements['left_elbow_upvec_loc'] = left_elbow_upvec_loc[0] + gt_ab_elements['left_elbow_divide_node'] = left_elbow_divide_node + gt_ab_elements['left_knee_pv_dir'] = left_knee_pv_dir[0] + gt_ab_elements['left_knee_dir_loc'] = left_knee_dir_loc[0] + gt_ab_elements['left_knee_aim_loc'] = left_knee_aim_loc[0] + gt_ab_elements['left_knee_upvec_loc'] = left_knee_upvec_loc[0] + gt_ab_elements['left_knee_divide_node'] = left_knee_divide_node + gt_ab_elements['left_ball_pivot_grp'] = left_ball_pivot_grp # Right Side Elements - gt_ab_settings['right_eye_proxy_crv'] = right_eye_proxy_crv - gt_ab_settings['right_clavicle_proxy_crv'] = right_clavicle_proxy_crv - gt_ab_settings['right_shoulder_proxy_crv'] = right_shoulder_proxy_crv - gt_ab_settings['right_elbow_proxy_crv'] = right_elbow_proxy_crv - gt_ab_settings['right_wrist_proxy_crv'] = right_wrist_proxy_crv - gt_ab_settings['right_thumb01_proxy_crv'] = right_thumb01_proxy_crv - gt_ab_settings['right_thumb02_proxy_crv'] = right_thumb02_proxy_crv - gt_ab_settings['right_thumb03_proxy_crv'] = right_thumb03_proxy_crv - gt_ab_settings['right_thumb04_proxy_crv'] = right_thumb04_proxy_crv - gt_ab_settings['right_index01_proxy_crv'] = right_index01_proxy_crv - gt_ab_settings['right_index02_proxy_crv'] = right_index02_proxy_crv - gt_ab_settings['right_index03_proxy_crv'] = right_index03_proxy_crv - gt_ab_settings['right_index04_proxy_crv'] = right_index04_proxy_crv - gt_ab_settings['right_middle01_proxy_crv'] = right_middle01_proxy_crv - gt_ab_settings['right_middle02_proxy_crv'] = right_middle02_proxy_crv - gt_ab_settings['right_middle03_proxy_crv'] = right_middle03_proxy_crv - gt_ab_settings['right_middle04_proxy_crv'] = right_middle04_proxy_crv - gt_ab_settings['right_ring01_proxy_crv'] = right_ring01_proxy_crv - gt_ab_settings['right_ring02_proxy_crv'] = right_ring02_proxy_crv - gt_ab_settings['right_ring03_proxy_crv'] = right_ring03_proxy_crv - gt_ab_settings['right_ring04_proxy_crv'] = right_ring04_proxy_crv - gt_ab_settings['right_pinky01_proxy_crv'] = right_pinky01_proxy_crv - gt_ab_settings['right_pinky02_proxy_crv'] = right_pinky02_proxy_crv - gt_ab_settings['right_pinky03_proxy_crv'] = right_pinky03_proxy_crv - gt_ab_settings['right_pinky04_proxy_crv'] = right_pinky04_proxy_crv - gt_ab_settings['right_hip_proxy_crv'] = right_hip_proxy_crv - gt_ab_settings['right_knee_proxy_crv'] = right_knee_proxy_crv - gt_ab_settings['right_ankle_proxy_crv'] = right_ankle_proxy_crv - gt_ab_settings['right_ball_proxy_crv'] = right_ball_proxy_crv - gt_ab_settings['right_toe_proxy_crv'] = right_toe_proxy_crv - gt_ab_settings['right_elbow_pv_loc'] = right_elbow_pv_loc[0] - gt_ab_settings['right_elbow_dir_loc'] = right_elbow_dir_loc[0] - gt_ab_settings['right_elbow_aim_loc'] = right_elbow_aim_loc[0] - gt_ab_settings['right_elbow_upvec_loc'] = right_elbow_upvec_loc[0] - gt_ab_settings['right_elbow_divide_node'] = right_elbow_divide_node - gt_ab_settings['right_knee_pv_dir'] = right_knee_pv_dir[0] - gt_ab_settings['right_knee_dir_loc'] = right_knee_dir_loc[0] - gt_ab_settings['right_knee_aim_loc'] = right_knee_aim_loc[0] - gt_ab_settings['right_knee_upvec_loc'] = right_knee_upvec_loc[0] - gt_ab_settings['right_knee_divide_node'] = right_knee_divide_node - gt_ab_settings['right_ball_pivot_grp'] = right_ball_pivot_grp + gt_ab_elements['right_eye_proxy_crv'] = right_eye_proxy_crv + gt_ab_elements['right_clavicle_proxy_crv'] = right_clavicle_proxy_crv + gt_ab_elements['right_shoulder_proxy_crv'] = right_shoulder_proxy_crv + gt_ab_elements['right_elbow_proxy_crv'] = right_elbow_proxy_crv + gt_ab_elements['right_wrist_proxy_crv'] = right_wrist_proxy_crv + gt_ab_elements['right_thumb01_proxy_crv'] = right_thumb01_proxy_crv + gt_ab_elements['right_thumb02_proxy_crv'] = right_thumb02_proxy_crv + gt_ab_elements['right_thumb03_proxy_crv'] = right_thumb03_proxy_crv + gt_ab_elements['right_thumb04_proxy_crv'] = right_thumb04_proxy_crv + gt_ab_elements['right_index01_proxy_crv'] = right_index01_proxy_crv + gt_ab_elements['right_index02_proxy_crv'] = right_index02_proxy_crv + gt_ab_elements['right_index03_proxy_crv'] = right_index03_proxy_crv + gt_ab_elements['right_index04_proxy_crv'] = right_index04_proxy_crv + gt_ab_elements['right_middle01_proxy_crv'] = right_middle01_proxy_crv + gt_ab_elements['right_middle02_proxy_crv'] = right_middle02_proxy_crv + gt_ab_elements['right_middle03_proxy_crv'] = right_middle03_proxy_crv + gt_ab_elements['right_middle04_proxy_crv'] = right_middle04_proxy_crv + gt_ab_elements['right_ring01_proxy_crv'] = right_ring01_proxy_crv + gt_ab_elements['right_ring02_proxy_crv'] = right_ring02_proxy_crv + gt_ab_elements['right_ring03_proxy_crv'] = right_ring03_proxy_crv + gt_ab_elements['right_ring04_proxy_crv'] = right_ring04_proxy_crv + gt_ab_elements['right_pinky01_proxy_crv'] = right_pinky01_proxy_crv + gt_ab_elements['right_pinky02_proxy_crv'] = right_pinky02_proxy_crv + gt_ab_elements['right_pinky03_proxy_crv'] = right_pinky03_proxy_crv + gt_ab_elements['right_pinky04_proxy_crv'] = right_pinky04_proxy_crv + gt_ab_elements['right_hip_proxy_crv'] = right_hip_proxy_crv + gt_ab_elements['right_knee_proxy_crv'] = right_knee_proxy_crv + gt_ab_elements['right_ankle_proxy_crv'] = right_ankle_proxy_crv + gt_ab_elements['right_ball_proxy_crv'] = right_ball_proxy_crv + gt_ab_elements['right_toe_proxy_crv'] = right_toe_proxy_crv + gt_ab_elements['right_elbow_pv_loc'] = right_elbow_pv_loc[0] + gt_ab_elements['right_elbow_dir_loc'] = right_elbow_dir_loc[0] + gt_ab_elements['right_elbow_aim_loc'] = right_elbow_aim_loc[0] + gt_ab_elements['right_elbow_upvec_loc'] = right_elbow_upvec_loc[0] + gt_ab_elements['right_elbow_divide_node'] = right_elbow_divide_node + gt_ab_elements['right_knee_pv_dir'] = right_knee_pv_dir[0] + gt_ab_elements['right_knee_dir_loc'] = right_knee_dir_loc[0] + gt_ab_elements['right_knee_aim_loc'] = right_knee_aim_loc[0] + gt_ab_elements['right_knee_upvec_loc'] = right_knee_upvec_loc[0] + gt_ab_elements['right_knee_divide_node'] = right_knee_divide_node + gt_ab_elements['right_ball_pivot_grp'] = right_ball_pivot_grp # Visibility Adjustments - for obj in gt_ab_settings: + for obj in gt_ab_elements: if obj.endswith('_crv'): - proxy_crv = gt_ab_settings.get(obj) + proxy_crv = gt_ab_elements.get(obj) is_end_jnt = False color = (0,0,0) if '_endProxy' in proxy_crv: add_node_note(proxy_crv, 'This is an end proxy. This element will be used to determine the orientation of its parent. For example:\n"jaw_endProxy" determines the orientation of the "jaw_proxy".\n\nEven though a joint will be generated it mostly likely shouldn\'t be an influence when skinning.') color = (.5,.5,0) is_end_jnt=True - elif gt_ab_settings.get('neck_mid_proxy_crv') in proxy_crv: + elif gt_ab_elements.get('neck_mid_proxy_crv') in proxy_crv: add_node_note(proxy_crv, 'This is the neckMid proxy. This element will be automated to receive part of its transforms from the neckBase and the other part from the head.') color = (.3,.3,0) - elif gt_ab_settings.get('left_toe_proxy_crv') in proxy_crv or gt_ab_settings.get('right_toe_proxy_crv') in proxy_crv: + elif gt_ab_elements.get('left_toe_proxy_crv') in proxy_crv or gt_ab_elements.get('right_toe_proxy_crv') in proxy_crv: add_node_note(proxy_crv, 'This is a toe proxy. This element will be used to automate toe poses. Much like an end proxy, it will generate a joint that most likely shoudln\'t be used as an influence when skinning.\n\nThis joint should be placed at the end of the longest toe.') color = (.3,.3,0) is_end_jnt=True @@ -2668,19 +2836,19 @@ def create_proxy(colorize_proxy=True): color = (1,.4,.4) elif proxy_crv.startswith('left_'): color = (.2,.6,1) - elif gt_ab_settings.get('spine01_proxy_crv') in proxy_crv or gt_ab_settings.get('spine02_proxy_crv') in proxy_crv or gt_ab_settings.get('spine03_proxy_crv') in proxy_crv: + elif gt_ab_elements.get('spine01_proxy_crv') in proxy_crv or gt_ab_elements.get('spine02_proxy_crv') in proxy_crv or gt_ab_elements.get('spine03_proxy_crv') in proxy_crv: color = (.3,.3,0) else: color = (1,1,.65) # Notes Only - if gt_ab_settings.get('left_eye_proxy_crv') in proxy_crv or gt_ab_settings.get('right_eye_proxy_crv') in proxy_crv: + if gt_ab_elements.get('left_eye_proxy_crv') in proxy_crv or gt_ab_elements.get('right_eye_proxy_crv') in proxy_crv: add_node_note(proxy_crv, 'This is an eye proxy.\nThis element should be snapped to the center of the eye geometry.\nYou can see the center of the eye by selecting the eye geometry then going to "Display > Transform Display > Local Rotation Axes".\nYou can then use this axis to snap the joint to its center. (Using "Ctrl + V")\n\nPS: If for some reason the pivot point is not in the center of the eye, you can reset it first: "Modify > Center Pivot".') - if gt_ab_settings.get('left_elbow_proxy_crv') in proxy_crv or gt_ab_settings.get('right_elbow_proxy_crv') in proxy_crv: + if gt_ab_elements.get('left_elbow_proxy_crv') in proxy_crv or gt_ab_elements.get('right_elbow_proxy_crv') in proxy_crv: add_node_note(proxy_crv, 'This is an elbow proxy.\nThe movement of this element is intentionaly limited to attempt to keep the joints in one single plane. For better results keep the arm joints in "T" or "A" pose.') - if gt_ab_settings.get('left_knee_proxy_crv') in proxy_crv or gt_ab_settings.get('right_knee_proxy_crv') in proxy_crv: + if gt_ab_elements.get('left_knee_proxy_crv') in proxy_crv or gt_ab_elements.get('right_knee_proxy_crv') in proxy_crv: add_node_note(proxy_crv, 'This is a knee proxy.\nThe movement of this element is intentionaly limited to attempt to keep the joints in one single plane. For better results keep the leg joints in "T" or "A" pose.') if colorize_proxy: @@ -2690,81 +2858,81 @@ def create_proxy(colorize_proxy=True): # Create Lines line_list = [] - line_list.append(create_visualization_line(gt_ab_settings.get('cog_proxy_crv'), gt_ab_settings.get('hip_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('cog_proxy_crv'), gt_ab_settings.get('spine01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine01_proxy_crv'), gt_ab_settings.get('spine02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine02_proxy_crv'), gt_ab_settings.get('spine03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine03_proxy_crv'), gt_ab_settings.get('spine04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('neck_base_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('neck_base_proxy_crv'), gt_ab_settings.get('neck_mid_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('neck_mid_proxy_crv'), gt_ab_settings.get('head_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('head_end_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('jaw_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('jaw_proxy_crv'), gt_ab_settings.get('jaw_end_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('left_eye_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('right_eye_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('cog_proxy_crv'), gt_ab_elements.get('hip_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('cog_proxy_crv'), gt_ab_elements.get('spine01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine01_proxy_crv'), gt_ab_elements.get('spine02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine02_proxy_crv'), gt_ab_elements.get('spine03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine03_proxy_crv'), gt_ab_elements.get('spine04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('neck_base_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('neck_base_proxy_crv'), gt_ab_elements.get('neck_mid_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('neck_mid_proxy_crv'), gt_ab_elements.get('head_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('head_end_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('jaw_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('jaw_proxy_crv'), gt_ab_elements.get('jaw_end_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('left_eye_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('right_eye_proxy_crv'))) # Left Side - line_list.append(create_visualization_line(gt_ab_settings.get('hip_proxy_crv'), gt_ab_settings.get('left_hip_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_hip_proxy_crv'), gt_ab_settings.get('left_knee_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_knee_proxy_crv'), gt_ab_settings.get('left_ankle_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_ankle_proxy_crv'), gt_ab_settings.get('left_ball_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_ball_proxy_crv'), gt_ab_settings.get('left_toe_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('left_clavicle_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_clavicle_proxy_crv'), gt_ab_settings.get('left_shoulder_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_shoulder_proxy_crv'), gt_ab_settings.get('left_elbow_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_elbow_proxy_crv'), gt_ab_settings.get('left_wrist_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('hip_proxy_crv'), gt_ab_elements.get('left_hip_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_hip_proxy_crv'), gt_ab_elements.get('left_knee_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_knee_proxy_crv'), gt_ab_elements.get('left_ankle_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_ankle_proxy_crv'), gt_ab_elements.get('left_ball_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_ball_proxy_crv'), gt_ab_elements.get('left_toe_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('left_clavicle_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_clavicle_proxy_crv'), gt_ab_elements.get('left_shoulder_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_shoulder_proxy_crv'), gt_ab_elements.get('left_elbow_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_elbow_proxy_crv'), gt_ab_elements.get('left_wrist_proxy_crv'))) # Left Fingers - line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_thumb01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb01_proxy_crv'), gt_ab_settings.get('left_thumb02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb02_proxy_crv'), gt_ab_settings.get('left_thumb03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb03_proxy_crv'), gt_ab_settings.get('left_thumb04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_index01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_index01_proxy_crv'), gt_ab_settings.get('left_index02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_index02_proxy_crv'), gt_ab_settings.get('left_index03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_index03_proxy_crv'), gt_ab_settings.get('left_index04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_middle01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_middle01_proxy_crv'), gt_ab_settings.get('left_middle02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_middle02_proxy_crv'), gt_ab_settings.get('left_middle03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_middle03_proxy_crv'), gt_ab_settings.get('left_middle04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_ring01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_ring01_proxy_crv'), gt_ab_settings.get('left_ring02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_ring02_proxy_crv'), gt_ab_settings.get('left_ring03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_ring03_proxy_crv'), gt_ab_settings.get('left_ring04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_pinky01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky01_proxy_crv'), gt_ab_settings.get('left_pinky02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky02_proxy_crv'), gt_ab_settings.get('left_pinky03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky03_proxy_crv'), gt_ab_settings.get('left_pinky04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_thumb01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb01_proxy_crv'), gt_ab_elements.get('left_thumb02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb02_proxy_crv'), gt_ab_elements.get('left_thumb03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb03_proxy_crv'), gt_ab_elements.get('left_thumb04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_index01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_index01_proxy_crv'), gt_ab_elements.get('left_index02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_index02_proxy_crv'), gt_ab_elements.get('left_index03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_index03_proxy_crv'), gt_ab_elements.get('left_index04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_middle01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_middle01_proxy_crv'), gt_ab_elements.get('left_middle02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_middle02_proxy_crv'), gt_ab_elements.get('left_middle03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_middle03_proxy_crv'), gt_ab_elements.get('left_middle04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_ring01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_ring01_proxy_crv'), gt_ab_elements.get('left_ring02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_ring02_proxy_crv'), gt_ab_elements.get('left_ring03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_ring03_proxy_crv'), gt_ab_elements.get('left_ring04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_pinky01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky01_proxy_crv'), gt_ab_elements.get('left_pinky02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky02_proxy_crv'), gt_ab_elements.get('left_pinky03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky03_proxy_crv'), gt_ab_elements.get('left_pinky04_proxy_crv'))) # Right Side - line_list.append(create_visualization_line(gt_ab_settings.get('hip_proxy_crv'), gt_ab_settings.get('right_hip_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_hip_proxy_crv'), gt_ab_settings.get('right_knee_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_knee_proxy_crv'), gt_ab_settings.get('right_ankle_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_ankle_proxy_crv'), gt_ab_settings.get('right_ball_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_ball_proxy_crv'), gt_ab_settings.get('right_toe_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('right_clavicle_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_clavicle_proxy_crv'), gt_ab_settings.get('right_shoulder_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_shoulder_proxy_crv'), gt_ab_settings.get('right_elbow_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_elbow_proxy_crv'), gt_ab_settings.get('right_wrist_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('hip_proxy_crv'), gt_ab_elements.get('right_hip_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_hip_proxy_crv'), gt_ab_elements.get('right_knee_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_knee_proxy_crv'), gt_ab_elements.get('right_ankle_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_ankle_proxy_crv'), gt_ab_elements.get('right_ball_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_ball_proxy_crv'), gt_ab_elements.get('right_toe_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('right_clavicle_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_clavicle_proxy_crv'), gt_ab_elements.get('right_shoulder_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_shoulder_proxy_crv'), gt_ab_elements.get('right_elbow_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_elbow_proxy_crv'), gt_ab_elements.get('right_wrist_proxy_crv'))) # Right Fingers - line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_thumb01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb01_proxy_crv'), gt_ab_settings.get('right_thumb02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb02_proxy_crv'), gt_ab_settings.get('right_thumb03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb03_proxy_crv'), gt_ab_settings.get('right_thumb04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_index01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_index01_proxy_crv'), gt_ab_settings.get('right_index02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_index02_proxy_crv'), gt_ab_settings.get('right_index03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_index03_proxy_crv'), gt_ab_settings.get('right_index04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_middle01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_middle01_proxy_crv'), gt_ab_settings.get('right_middle02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_middle02_proxy_crv'), gt_ab_settings.get('right_middle03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_middle03_proxy_crv'), gt_ab_settings.get('right_middle04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_ring01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_ring01_proxy_crv'), gt_ab_settings.get('right_ring02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_ring02_proxy_crv'), gt_ab_settings.get('right_ring03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_ring03_proxy_crv'), gt_ab_settings.get('right_ring04_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_pinky01_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky01_proxy_crv'), gt_ab_settings.get('right_pinky02_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky02_proxy_crv'), gt_ab_settings.get('right_pinky03_proxy_crv'))) - line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky03_proxy_crv'), gt_ab_settings.get('right_pinky04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_thumb01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb01_proxy_crv'), gt_ab_elements.get('right_thumb02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb02_proxy_crv'), gt_ab_elements.get('right_thumb03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb03_proxy_crv'), gt_ab_elements.get('right_thumb04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_index01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_index01_proxy_crv'), gt_ab_elements.get('right_index02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_index02_proxy_crv'), gt_ab_elements.get('right_index03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_index03_proxy_crv'), gt_ab_elements.get('right_index04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_middle01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_middle01_proxy_crv'), gt_ab_elements.get('right_middle02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_middle02_proxy_crv'), gt_ab_elements.get('right_middle03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_middle03_proxy_crv'), gt_ab_elements.get('right_middle04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_ring01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_ring01_proxy_crv'), gt_ab_elements.get('right_ring02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_ring02_proxy_crv'), gt_ab_elements.get('right_ring03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_ring03_proxy_crv'), gt_ab_elements.get('right_ring04_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_pinky01_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky01_proxy_crv'), gt_ab_elements.get('right_pinky02_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky02_proxy_crv'), gt_ab_elements.get('right_pinky03_proxy_crv'))) + line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky03_proxy_crv'), gt_ab_elements.get('right_pinky04_proxy_crv'))) lines_grp = cmds.group(name='visualization_lines', empty=True, world=True) cmds.setAttr(lines_grp + '.overrideEnabled', 1) @@ -2773,19 +2941,19 @@ def create_proxy(colorize_proxy=True): for obj in line_objs: cmds.parent(obj, lines_grp) - cmds.parent(lines_grp, gt_ab_settings.get('main_proxy_grp')) + cmds.parent(lines_grp, gt_ab_elements.get('main_proxy_grp')) - cmds.addAttr(gt_ab_settings.get('main_crv'), ln="proxyOptions", at="enum", en="-------------:", keyable=True) - cmds.setAttr(gt_ab_settings.get('main_crv') + '.proxyOptions', lock=True) - cmds.addAttr(gt_ab_settings.get('main_crv'), ln="linesVisibility", at="bool", keyable=True) - cmds.setAttr(gt_ab_settings.get('main_crv') + '.linesVisibility', 1) - cmds.connectAttr(gt_ab_settings.get('main_crv') + '.linesVisibility', lines_grp + '.v', f=True) + cmds.addAttr(gt_ab_elements.get('main_crv'), ln="proxyOptions", at="enum", en="-------------:", keyable=True) + cmds.setAttr(gt_ab_elements.get('main_crv') + '.proxyOptions', lock=True) + cmds.addAttr(gt_ab_elements.get('main_crv'), ln="linesVisibility", at="bool", keyable=True) + cmds.setAttr(gt_ab_elements.get('main_crv') + '.linesVisibility', 1) + cmds.connectAttr(gt_ab_elements.get('main_crv') + '.linesVisibility', lines_grp + '.v', f=True) # Main Proxy Control Scale - cmds.connectAttr(gt_ab_settings.get('main_crv') + '.sy', gt_ab_settings.get('main_crv') + '.sx', f=True) - cmds.connectAttr(gt_ab_settings.get('main_crv') + '.sy', gt_ab_settings.get('main_crv') + '.sz', f=True) - cmds.setAttr(gt_ab_settings.get('main_crv') + '.sx', k=False) - cmds.setAttr(gt_ab_settings.get('main_crv') + '.sz', k=False) + cmds.connectAttr(gt_ab_elements.get('main_crv') + '.sy', gt_ab_elements.get('main_crv') + '.sx', f=True) + cmds.connectAttr(gt_ab_elements.get('main_crv') + '.sy', gt_ab_elements.get('main_crv') + '.sz', f=True) + cmds.setAttr(gt_ab_elements.get('main_crv') + '.sx', k=False) + cmds.setAttr(gt_ab_elements.get('main_crv') + '.sz', k=False) # Clean Selection and Print Feedback @@ -2941,11 +3109,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Create Joints gt_ab_joints = {} - for obj in gt_ab_settings: + for obj in gt_ab_elements: if obj.endswith('_crv'): cmds.select(d=True) - joint = cmds.joint(name=rename_proxy(gt_ab_settings.get(obj)), radius=1) - constraint = cmds.pointConstraint(gt_ab_settings.get(obj), joint) + joint = cmds.joint(name=rename_proxy(gt_ab_elements.get(obj)), radius=1) + constraint = cmds.pointConstraint(gt_ab_elements.get(obj), joint) cmds.delete(constraint) gt_ab_joints[obj.replace('_crv','_' + jnt_suffix).replace('_proxy', '')] = joint @@ -2960,46 +3128,46 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil orient_to_target(gt_ab_joints.get('jaw_jnt'), gt_ab_joints.get('jaw_end_jnt'), (90, 0, 90)) # Left Finger Orients - orient_to_target(gt_ab_joints.get('left_thumb01_jnt'), gt_ab_joints.get('left_thumb02_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb01_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_thumb02_jnt'), gt_ab_joints.get('left_thumb03_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb02_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_thumb03_jnt'), gt_ab_joints.get('left_thumb04_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb03_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_thumb01_jnt'), gt_ab_joints.get('left_thumb02_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb01_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_thumb02_jnt'), gt_ab_joints.get('left_thumb03_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb02_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_thumb03_jnt'), gt_ab_joints.get('left_thumb04_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb03_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_index01_jnt'), gt_ab_joints.get('left_index02_jnt'), (0, 0, 90), gt_ab_settings.get('left_index01_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_index02_jnt'), gt_ab_joints.get('left_index03_jnt'), (0, 0, 90), gt_ab_settings.get('left_index02_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_index03_jnt'), gt_ab_joints.get('left_index04_jnt'), (0, 0, 90), gt_ab_settings.get('left_index03_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_index01_jnt'), gt_ab_joints.get('left_index02_jnt'), (0, 0, 90), gt_ab_elements.get('left_index01_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_index02_jnt'), gt_ab_joints.get('left_index03_jnt'), (0, 0, 90), gt_ab_elements.get('left_index02_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_index03_jnt'), gt_ab_joints.get('left_index04_jnt'), (0, 0, 90), gt_ab_elements.get('left_index03_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_middle01_jnt'), gt_ab_joints.get('left_middle02_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle01_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_middle02_jnt'), gt_ab_joints.get('left_middle03_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle02_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_middle03_jnt'), gt_ab_joints.get('left_middle04_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle03_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_middle01_jnt'), gt_ab_joints.get('left_middle02_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle01_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_middle02_jnt'), gt_ab_joints.get('left_middle03_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle02_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_middle03_jnt'), gt_ab_joints.get('left_middle04_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle03_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_ring01_jnt'), gt_ab_joints.get('left_ring02_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring01_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_ring02_jnt'), gt_ab_joints.get('left_ring03_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring02_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_ring03_jnt'), gt_ab_joints.get('left_ring04_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring03_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_ring01_jnt'), gt_ab_joints.get('left_ring02_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring01_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_ring02_jnt'), gt_ab_joints.get('left_ring03_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring02_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_ring03_jnt'), gt_ab_joints.get('left_ring04_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring03_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_pinky01_jnt'), gt_ab_joints.get('left_pinky02_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky01_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_pinky02_jnt'), gt_ab_joints.get('left_pinky03_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky02_proxy_crv'), up_vec=(0,1,0), brute_force=True) - orient_to_target(gt_ab_joints.get('left_pinky03_jnt'), gt_ab_joints.get('left_pinky04_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky03_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_pinky01_jnt'), gt_ab_joints.get('left_pinky02_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky01_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_pinky02_jnt'), gt_ab_joints.get('left_pinky03_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky02_proxy_crv'), up_vec=(0,1,0), brute_force=True) + orient_to_target(gt_ab_joints.get('left_pinky03_jnt'), gt_ab_joints.get('left_pinky04_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky03_proxy_crv'), up_vec=(0,1,0), brute_force=True) # Right Finger Orients - orient_to_target(gt_ab_joints.get('right_thumb01_jnt'), gt_ab_joints.get('right_thumb02_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb01_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_thumb02_jnt'), gt_ab_joints.get('right_thumb03_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb02_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_thumb03_jnt'), gt_ab_joints.get('right_thumb04_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb03_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_thumb01_jnt'), gt_ab_joints.get('right_thumb02_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb01_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_thumb02_jnt'), gt_ab_joints.get('right_thumb03_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb02_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_thumb03_jnt'), gt_ab_joints.get('right_thumb04_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb03_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_index01_jnt'), gt_ab_joints.get('right_index02_jnt'), (0, 180, 0), gt_ab_settings.get('right_index01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_index02_jnt'), gt_ab_joints.get('right_index03_jnt'), (0, 180, 0), gt_ab_settings.get('right_index02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_index03_jnt'), gt_ab_joints.get('right_index04_jnt'), (0, 180, 0), gt_ab_settings.get('right_index03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_index01_jnt'), gt_ab_joints.get('right_index02_jnt'), (0, 180, 0), gt_ab_elements.get('right_index01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_index02_jnt'), gt_ab_joints.get('right_index03_jnt'), (0, 180, 0), gt_ab_elements.get('right_index02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_index03_jnt'), gt_ab_joints.get('right_index04_jnt'), (0, 180, 0), gt_ab_elements.get('right_index03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_middle01_jnt'), gt_ab_joints.get('right_middle02_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_middle02_jnt'), gt_ab_joints.get('right_middle03_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_middle03_jnt'), gt_ab_joints.get('right_middle04_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_middle01_jnt'), gt_ab_joints.get('right_middle02_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_middle02_jnt'), gt_ab_joints.get('right_middle03_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_middle03_jnt'), gt_ab_joints.get('right_middle04_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_ring01_jnt'), gt_ab_joints.get('right_ring02_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_ring02_jnt'), gt_ab_joints.get('right_ring03_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_ring03_jnt'), gt_ab_joints.get('right_ring04_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_ring01_jnt'), gt_ab_joints.get('right_ring02_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_ring02_jnt'), gt_ab_joints.get('right_ring03_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_ring03_jnt'), gt_ab_joints.get('right_ring04_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_pinky01_jnt'), gt_ab_joints.get('right_pinky02_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_pinky02_jnt'), gt_ab_joints.get('right_pinky03_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) - orient_to_target(gt_ab_joints.get('right_pinky03_jnt'), gt_ab_joints.get('right_pinky04_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_pinky01_jnt'), gt_ab_joints.get('right_pinky02_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_pinky02_jnt'), gt_ab_joints.get('right_pinky03_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) + orient_to_target(gt_ab_joints.get('right_pinky03_jnt'), gt_ab_joints.get('right_pinky04_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True) # Center Parenting @@ -3118,13 +3286,13 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil change_viewport_color(joint, (.3,.3,0)) # Set Orientation For Arms - orient_to_target(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('left_shoulder_jnt'), (-90,0,0), gt_ab_settings.get('left_clavicle_proxy_crv')) + orient_to_target(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('left_shoulder_jnt'), (-90,0,0), gt_ab_elements.get('left_clavicle_proxy_crv')) orient_to_target(gt_ab_joints.get('left_shoulder_jnt'), gt_ab_joints.get('left_elbow_jnt'), (-90,0,0)) - orient_to_target(gt_ab_joints.get('left_elbow_jnt'), gt_ab_joints.get('left_wrist_jnt'), (-90,0,0), gt_ab_settings.get('left_elbow_proxy_crv')) + orient_to_target(gt_ab_joints.get('left_elbow_jnt'), gt_ab_joints.get('left_wrist_jnt'), (-90,0,0), gt_ab_elements.get('left_elbow_proxy_crv')) - orient_to_target(gt_ab_joints.get('right_clavicle_jnt'), gt_ab_joints.get('right_shoulder_jnt'), (90,0,0), gt_ab_settings.get('right_clavicle_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_clavicle_jnt'), gt_ab_joints.get('right_shoulder_jnt'), (90,0,0), gt_ab_elements.get('right_clavicle_proxy_crv'), (-1,0,0)) orient_to_target(gt_ab_joints.get('right_shoulder_jnt'), gt_ab_joints.get('right_elbow_jnt'), (90,0,0), aim_vec=(-1,0,0)) - orient_to_target(gt_ab_joints.get('right_elbow_jnt'), gt_ab_joints.get('right_wrist_jnt'), (90,0,0), gt_ab_settings.get('right_elbow_proxy_crv'), aim_vec=(-1,0,0)) + orient_to_target(gt_ab_joints.get('right_elbow_jnt'), gt_ab_joints.get('right_wrist_jnt'), (90,0,0), gt_ab_elements.get('right_elbow_proxy_crv'), aim_vec=(-1,0,0)) # Left Arm Parenting cmds.parent(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('spine04_jnt')) @@ -3148,12 +3316,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(gt_ab_joints.get('left_pinky01_jnt'), world=True) # Left Wrist Orient - temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('left_wrist_proxy_crv') + '_orient_target') - constraint = cmds.parentConstraint(gt_ab_settings.get('left_wrist_proxy_crv'), temp_transform) + temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('left_wrist_proxy_crv') + '_orient_target') + constraint = cmds.parentConstraint(gt_ab_elements.get('left_wrist_proxy_crv'), temp_transform) cmds.delete(constraint) - cmds.parent(temp_transform, gt_ab_settings.get('left_wrist_proxy_crv')) + cmds.parent(temp_transform, gt_ab_elements.get('left_wrist_proxy_crv')) cmds.setAttr(temp_transform + '.tx', 1) - orient_to_target(gt_ab_joints.get('left_wrist_jnt'), temp_transform, (-90,0,0), gt_ab_settings.get('left_wrist_proxy_crv')) + orient_to_target(gt_ab_joints.get('left_wrist_jnt'), temp_transform, (-90,0,0), gt_ab_elements.get('left_wrist_proxy_crv')) cmds.delete(temp_transform) # Left Add Fingers @@ -3174,12 +3342,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(gt_ab_joints.get('right_pinky01_jnt'), world=True) # Right Wrist Orient - temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('right_wrist_proxy_crv') + '_orient_target') - constraint = cmds.parentConstraint(gt_ab_settings.get('right_wrist_proxy_crv'), temp_transform) + temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('right_wrist_proxy_crv') + '_orient_target') + constraint = cmds.parentConstraint(gt_ab_elements.get('right_wrist_proxy_crv'), temp_transform) cmds.delete(constraint) - cmds.parent(temp_transform, gt_ab_settings.get('right_wrist_proxy_crv')) + cmds.parent(temp_transform, gt_ab_elements.get('right_wrist_proxy_crv')) cmds.setAttr(temp_transform + '.tx', -1) - orient_to_target(gt_ab_joints.get('right_wrist_jnt'), temp_transform, (90,0,0), gt_ab_settings.get('right_wrist_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_wrist_jnt'), temp_transform, (90,0,0), gt_ab_elements.get('right_wrist_proxy_crv'), (-1,0,0)) cmds.delete(temp_transform) # Right Add Fingers @@ -3198,7 +3366,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(gt_ab_joints.get('spine01_jnt'), world=True) # Root Orients - cog_orients = cmds.xform(gt_ab_settings.get('cog_proxy_crv'), q=True, ro=True) + cog_orients = cmds.xform(gt_ab_elements.get('cog_proxy_crv'), q=True, ro=True) cmds.joint(gt_ab_joints.get('cog_jnt'), e=True, oj='none', zso=True) # ch cmds.setAttr(gt_ab_joints.get('cog_jnt') + '.jointOrientX', 90) cmds.setAttr(gt_ab_joints.get('cog_jnt') + '.jointOrientY', 0) @@ -3207,7 +3375,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.makeIdentity(gt_ab_joints.get('cog_jnt'), apply=True, rotate=True) # Hip Orients - hip_orients = cmds.xform(gt_ab_settings.get('hip_proxy_crv'), q=True, ro=True) + hip_orients = cmds.xform(gt_ab_elements.get('hip_proxy_crv'), q=True, ro=True) cmds.joint(gt_ab_joints.get('hip_jnt'), e=True, oj='none', zso=True) cmds.setAttr(gt_ab_joints.get('hip_jnt') + '.jointOrientX', 90) cmds.setAttr(gt_ab_joints.get('hip_jnt') + '.jointOrientY', 0) @@ -3216,19 +3384,19 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.makeIdentity(gt_ab_joints.get('hip_jnt'), apply=True, rotate=True) - orient_to_target(gt_ab_joints.get('left_hip_jnt'), gt_ab_joints.get('left_knee_jnt'), (90,0,-90), gt_ab_settings.get('left_knee_proxy_crv')) - orient_to_target(gt_ab_joints.get('left_knee_jnt'), gt_ab_joints.get('left_ankle_jnt'), (90,0,-90), gt_ab_settings.get('left_knee_proxy_crv')) + orient_to_target(gt_ab_joints.get('left_hip_jnt'), gt_ab_joints.get('left_knee_jnt'), (90,0,-90), gt_ab_elements.get('left_knee_proxy_crv')) + orient_to_target(gt_ab_joints.get('left_knee_jnt'), gt_ab_joints.get('left_ankle_jnt'), (90,0,-90), gt_ab_elements.get('left_knee_proxy_crv')) - orient_to_target(gt_ab_joints.get('right_hip_jnt'), gt_ab_joints.get('right_knee_jnt'), (90,0,-90), gt_ab_settings.get('right_knee_proxy_crv'), (-1,0,0)) - orient_to_target(gt_ab_joints.get('right_knee_jnt'), gt_ab_joints.get('right_ankle_jnt'), (90,0,-90), gt_ab_settings.get('right_knee_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_hip_jnt'), gt_ab_joints.get('right_knee_jnt'), (90,0,-90), gt_ab_elements.get('right_knee_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_knee_jnt'), gt_ab_joints.get('right_ankle_jnt'), (90,0,-90), gt_ab_elements.get('right_knee_proxy_crv'), (-1,0,0)) # Feet Orients # Left Foot - orient_to_target(gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_ball_jnt'), (90,0,-90), gt_ab_settings.get('left_ankle_proxy_crv'))#, (-1,0,0)) - orient_to_target(gt_ab_joints.get('left_ball_jnt'), gt_ab_joints.get('left_toe_jnt'), (90,0,-90), gt_ab_settings.get('left_ball_proxy_crv'))#, (-1,0,0)) + orient_to_target(gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_ball_jnt'), (90,0,-90), gt_ab_elements.get('left_ankle_proxy_crv'))#, (-1,0,0)) + orient_to_target(gt_ab_joints.get('left_ball_jnt'), gt_ab_joints.get('left_toe_jnt'), (90,0,-90), gt_ab_elements.get('left_ball_proxy_crv'))#, (-1,0,0)) # Right Foot - orient_to_target(gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_ball_jnt'), (90,0,-90), gt_ab_settings.get('right_ankle_proxy_crv'), (-1,0,0)) - orient_to_target(gt_ab_joints.get('right_ball_jnt'), gt_ab_joints.get('right_toe_jnt'), (90,0,-90), gt_ab_settings.get('right_ball_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_ball_jnt'), (90,0,-90), gt_ab_elements.get('right_ankle_proxy_crv'), (-1,0,0)) + orient_to_target(gt_ab_joints.get('right_ball_jnt'), gt_ab_joints.get('right_toe_jnt'), (90,0,-90), gt_ab_elements.get('right_ball_proxy_crv'), (-1,0,0)) # Right Leg Parenting @@ -3278,19 +3446,19 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil change_viewport_color(gt_ab_joints.get('right_forearm_jnt'), (1,1,0)) # # Left Eye Orient - # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('left_eye_proxy_crv') + '_orient_target') - # cmds.delete(cmds.parentConstraint(gt_ab_settings.get('left_eye_proxy_crv'), temp_transform)) - # cmds.parent(temp_transform, gt_ab_settings.get('left_eye_proxy_crv')) + # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('left_eye_proxy_crv') + '_orient_target') + # cmds.delete(cmds.parentConstraint(gt_ab_elements.get('left_eye_proxy_crv'), temp_transform)) + # cmds.parent(temp_transform, gt_ab_elements.get('left_eye_proxy_crv')) # cmds.setAttr(temp_transform + '.tz', 1) - # orient_to_target(gt_ab_joints.get('left_eye_jnt'), temp_transform, (0,0,0), gt_ab_settings.get('left_eye_proxy_crv'))#, (-1,0,0)) + # orient_to_target(gt_ab_joints.get('left_eye_jnt'), temp_transform, (0,0,0), gt_ab_elements.get('left_eye_proxy_crv'))#, (-1,0,0)) # cmds.delete(temp_transform) # # Right Eye Orient - # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('right_eye_proxy_crv') + '_orient_target') - # cmds.delete(cmds.parentConstraint(gt_ab_settings.get('right_eye_proxy_crv'), temp_transform)) - # cmds.parent(temp_transform, gt_ab_settings.get('right_eye_proxy_crv')) + # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('right_eye_proxy_crv') + '_orient_target') + # cmds.delete(cmds.parentConstraint(gt_ab_elements.get('right_eye_proxy_crv'), temp_transform)) + # cmds.parent(temp_transform, gt_ab_elements.get('right_eye_proxy_crv')) # cmds.setAttr(temp_transform + '.tz', 1) - # orient_to_target(gt_ab_joints.get('right_eye_jnt'), temp_transform, (0,0,0), gt_ab_settings.get('right_eye_proxy_crv'))#, (-1,0,0)) + # orient_to_target(gt_ab_joints.get('right_eye_jnt'), temp_transform, (0,0,0), gt_ab_elements.get('right_eye_proxy_crv'))#, (-1,0,0)) # cmds.delete(temp_transform) @@ -3542,7 +3710,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Main Ctrl main_ctrl = create_main_control(name='main_' + ctrl_suffix) - main_ctrl_scale = cmds.xform(gt_ab_settings.get('main_crv'), q=True, ws=True, scale=True) + main_ctrl_scale = cmds.xform(gt_ab_elements.get('main_crv'), q=True, ws=True, scale=True) cmds.scale( main_ctrl_scale[1], main_ctrl_scale[1], main_ctrl_scale[1], main_ctrl ) cmds.makeIdentity(main_ctrl, apply=True, scale=True) @@ -3562,7 +3730,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil for shape in cmds.listRelatives(direction_ctrl, s=True, f=True) or []: shape = cmds.rename(shape, "{0}Shape".format(direction_ctrl)) change_viewport_color(direction_ctrl, (1,1,0)) - cmds.delete(cmds.scaleConstraint(gt_ab_settings.get('main_crv'), direction_ctrl)) + cmds.delete(cmds.scaleConstraint(gt_ab_elements.get('main_crv'), direction_ctrl)) cmds.makeIdentity(direction_ctrl, apply=True, scale=True) direction_ctrl_grp = cmds.group(name=direction_ctrl + grp_suffix.capitalize(), empty=True, world=True) cmds.parent(direction_ctrl, direction_ctrl_grp) @@ -3887,8 +4055,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Knee Find Position temp_transform = cmds.group(name=left_knee_ik_ctrl + '_rotExtraction', empty=True, world=True) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_knee_proxy_crv'), temp_transform)) - cmds.delete(cmds.aimConstraint(gt_ab_settings.get('left_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_knee_proxy_crv'), temp_transform)) + cmds.delete(cmds.aimConstraint(gt_ab_elements.get('left_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) cmds.move(left_knee_scale_offset ,0 , 0, temp_transform, os=True, relative=True) cmds.delete(cmds.pointConstraint(temp_transform, left_knee_ik_ctrl_grp)) cmds.delete(temp_transform) @@ -3920,8 +4088,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Foot Position cmds.delete(cmds.pointConstraint([gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_toe_jnt')], left_foot_ik_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(left_foot_ik_ctrl_grp + '.ry', desired_rotation[1]) # Left Foot Pivot Adjustment @@ -4034,8 +4202,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Knee Find Position temp_transform = cmds.group(name=right_knee_ik_ctrl + '_rotExtraction', empty=True, world=True) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_knee_proxy_crv'), temp_transform)) - cmds.delete(cmds.aimConstraint(gt_ab_settings.get('right_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_knee_proxy_crv'), temp_transform)) + cmds.delete(cmds.aimConstraint(gt_ab_elements.get('right_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) cmds.move(right_knee_scale_offset*-1 ,0 , 0, temp_transform, os=True, relative=True) cmds.delete(cmds.pointConstraint(temp_transform, right_knee_ik_ctrl_grp)) cmds.delete(temp_transform) @@ -4067,8 +4235,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Foot Position cmds.delete(cmds.pointConstraint([gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_toe_jnt')], right_foot_ik_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(right_foot_ik_ctrl_grp + '.ry', desired_rotation[1]) # Right Foot Pivot Adjustment @@ -4277,8 +4445,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Knee Find Position left_arm_scale_offset = left_arm_scale_offset*.5 temp_transform = cmds.group(name=left_elbow_ik_ctrl + '_rotExtraction', empty=True, world=True) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_elbow_proxy_crv'), temp_transform)) - cmds.delete(cmds.aimConstraint(gt_ab_settings.get('left_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_elbow_proxy_crv'), temp_transform)) + cmds.delete(cmds.aimConstraint(gt_ab_elements.get('left_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0))) cmds.move(left_arm_scale_offset ,0 , 0, temp_transform, os=True, relative=True) cmds.delete(cmds.pointConstraint(temp_transform, left_elbow_ik_ctrl_grp)) cmds.delete(temp_transform) @@ -4488,8 +4656,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Elbow Find Position right_arm_scale_offset = abs(right_arm_scale_offset)*.5 temp_transform = cmds.group(name=right_elbow_ik_ctrl + '_rotExtraction', empty=True, world=True) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_elbow_proxy_crv'), temp_transform)) - cmds.delete(cmds.aimConstraint(gt_ab_settings.get('right_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,1,0), worldUpType="vector", worldUpVector=(0,1,0))) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_elbow_proxy_crv'), temp_transform)) + cmds.delete(cmds.aimConstraint(gt_ab_elements.get('right_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,1,0), worldUpType="vector", worldUpVector=(0,1,0))) cmds.move(right_arm_scale_offset ,0 , 0, temp_transform, os=True, relative=True) cmds.delete(cmds.pointConstraint(temp_transform, right_elbow_ik_ctrl_grp)) cmds.delete(temp_transform) @@ -4530,7 +4698,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(left_arm_switch, left_arm_switch_grp) change_viewport_color(left_arm_switch, left_ctrl_color) - cmds.delete(cmds.parentConstraint(gt_ab_settings.get('left_wrist_proxy_crv'), left_arm_switch_grp)) + cmds.delete(cmds.parentConstraint(gt_ab_elements.get('left_wrist_proxy_crv'), left_arm_switch_grp)) cmds.parent(left_arm_switch_grp, main_ctrl) # Right Arm @@ -4559,7 +4727,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(right_arm_switch, right_arm_switch_grp) change_viewport_color(right_arm_switch, right_ctrl_color) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_wrist_proxy_crv'), right_arm_switch_grp)) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_wrist_proxy_crv'), right_arm_switch_grp)) cmds.parent(right_arm_switch_grp, main_ctrl) @@ -4589,9 +4757,9 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(left_leg_switch, left_leg_switch_grp) change_viewport_color(left_leg_switch, left_ctrl_color) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_ankle_proxy_crv'), left_leg_switch_grp)) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_ankle_proxy_crv'), left_leg_switch_grp)) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) cmds.setAttr(left_leg_switch_grp + '.ry', desired_rotation[1]) cmds.parent(left_leg_switch_grp, main_ctrl) @@ -4624,7 +4792,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil change_viewport_color(right_leg_switch, right_ctrl_color) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_ankle_proxy_crv'), right_leg_switch_grp)) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_ankle_proxy_crv'), right_leg_switch_grp)) cmds.parent(right_leg_switch_grp, main_ctrl) @@ -4649,8 +4817,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Toe Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(left_toe_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(left_foot_scale_offset/4,left_toe_roll_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -4675,8 +4843,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Toe Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_up_down_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(left_toe_up_down_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(left_foot_scale_offset/2.6,left_toe_up_down_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -4703,8 +4871,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Ball Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ball_jnt'), left_ball_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(left_ball_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(left_foot_scale_offset/3,left_ball_roll_ctrl_grp, x=True, relative=True, objectSpace=True) @@ -4731,8 +4899,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Left Heel Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ankle_jnt'), left_heel_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(left_heel_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(left_foot_scale_offset/3.5*-1,left_heel_roll_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -4765,8 +4933,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Toe Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(right_toe_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(-right_foot_scale_offset/4,right_toe_roll_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -4791,8 +4959,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Toe Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_up_down_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(right_toe_up_down_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(-right_foot_scale_offset/2.6,right_toe_up_down_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -4823,8 +4991,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Ball Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ball_jnt'), right_ball_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(right_ball_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(right_foot_scale_offset/3,right_ball_roll_ctrl_grp, x=True, relative=True, objectSpace=True) @@ -4855,8 +5023,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil # Right Heel Position and Visibility cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ankle_jnt'), right_heel_roll_ctrl_grp, skip='y')) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) - desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True) cmds.setAttr(right_heel_roll_ctrl_grp + '.ry', desired_rotation[1]) cmds.move(-right_foot_scale_offset/3.5*-1,right_heel_roll_ctrl_grp, z=True, relative=True, objectSpace=True) @@ -5720,11 +5888,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(left_toe_pos_pivot_grp, left_toe_pivot_grp) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ankle_jnt'), left_foot_pivot_grp)) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_ball_pivot_grp'), left_heel_pivot_grp)) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_ball_pivot_grp'), left_heel_pivot_grp)) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ball_jnt'), left_ball_pivot_grp)) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_pivot_grp)) - desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True) + desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True) cmds.setAttr(left_foot_pivot_grp + '.ry', desired_rotation[1]) cmds.setAttr(left_heel_pivot_grp + '.ry', desired_rotation[1]) cmds.setAttr(left_ball_pivot_grp + '.ry', desired_rotation[1]) @@ -5913,11 +6081,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(right_toe_pos_pivot_grp, right_toe_pivot_grp) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ankle_jnt'), right_foot_pivot_grp)) - cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_ball_pivot_grp'), right_heel_pivot_grp)) + cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_ball_pivot_grp'), right_heel_pivot_grp)) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ball_jnt'), right_ball_pivot_grp)) cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_pivot_grp)) - desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True) + desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True) cmds.setAttr(right_foot_pivot_grp + '.ry', desired_rotation[1]) cmds.setAttr(right_heel_pivot_grp + '.ry', desired_rotation[1]) cmds.setAttr(right_ball_pivot_grp + '.ry', desired_rotation[1]) @@ -7199,32 +7367,32 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil lock_hide_default_attr(ik_solvers_grp, visibility=False) # Create Seamless FK/IK Switch References - left_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_ankle_ik_reference') )[0] + left_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_ankle_ik_reference') )[0] cmds.delete(cmds.parentConstraint(left_foot_ik_ctrl, left_ankle_ref_loc)) cmds.parent(left_ankle_ref_loc, left_ankle_fk_jnt) cmds.setAttr(left_ankle_ref_loc + '.v', 0) - left_knee_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_ik_reference') )[0] + left_knee_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_ik_reference') )[0] cmds.delete(cmds.pointConstraint(left_knee_ik_ctrl, left_knee_ref_loc)) cmds.parent(left_knee_ref_loc, left_knee_fk_jnt) cmds.setAttr(left_knee_ref_loc + '.v', 0) - left_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_ik_reference') )[0] + left_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_ik_reference') )[0] cmds.delete(cmds.pointConstraint(left_elbow_ik_ctrl, left_elbow_ref_loc)) cmds.parent(left_elbow_ref_loc, left_elbow_fk_jnt) cmds.setAttr(left_elbow_ref_loc + '.v', 0) - right_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_ankle_ik_reference') )[0] + right_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_ankle_ik_reference') )[0] cmds.delete(cmds.parentConstraint(right_foot_ik_ctrl, right_ankle_ref_loc)) cmds.parent(right_ankle_ref_loc, right_ankle_fk_jnt) cmds.setAttr(right_ankle_ref_loc + '.v', 0) - right_knee_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_ik_reference') )[0] + right_knee_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_ik_reference') )[0] cmds.delete(cmds.pointConstraint(right_knee_ik_ctrl, right_knee_ref_loc)) cmds.parent(right_knee_ref_loc, right_knee_fk_jnt) cmds.setAttr(right_knee_ref_loc + '.v', 0) - right_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_ik_reference') )[0] + right_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_ik_reference') )[0] cmds.delete(cmds.pointConstraint(right_elbow_ik_ctrl, right_elbow_ref_loc)) cmds.parent(right_elbow_ref_loc, right_elbow_fk_jnt) cmds.setAttr(right_elbow_ref_loc + '.v', 0) @@ -7234,7 +7402,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.matchTransform(left_leg_toe_ik_handle[0], left_toe_fk_jnt, pos=1, rot=1) # Delete Proxy - cmds.delete(gt_ab_settings.get('main_proxy_grp')) + cmds.delete(gt_ab_elements.get('main_proxy_grp')) # Add Notes note = 'This rig was created using ' + str(script_name) + '. (v' + str(script_version) + ')\n\nIssues, questions or suggestions? Go to:\ngithub.com/TrevisanGMW/gt-tools' @@ -7388,7 +7556,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.setAttr(gt_ab_joints.get('right_pinky03_jnt') + '.type', 22) # Pinky Finger # Creates game skeleton (No Segment Scale Compensate) - if create_real_time_skeleton: + if gt_ab_settings.get('using_no_ssc_skeleton'): new_skeleton_suffix = 'game' duplicated_joints, game_root_jnt = generate_no_ssc_skeleton(new_skeleton_suffix) sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, main_ctrl, new_skeleton_suffix) @@ -7447,9 +7615,9 @@ def reset_proxy(suppress_warning=False): attributes_set_zero = ['tx', 'ty', 'tz', 'rx', 'ry', 'rz', 'followHip'] attributes_set_one = ['sx', 'sy', 'sz', 'v'] proxy_elements = [] - for proxy in gt_ab_settings_default: + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings_default.get(proxy)) + proxy_elements.append(gt_ab_elements_default.get(proxy)) for obj in proxy_elements: if cmds.objExists(obj): for attr in attributes_set_zero: @@ -7483,7 +7651,7 @@ def delete_proxy(suppress_warning=False): is_deleted = False - to_delete_elements = [gt_ab_settings.get('main_proxy_grp'), gt_ab_settings.get('main_crv') ] + to_delete_elements = [gt_ab_elements.get('main_proxy_grp'), gt_ab_elements.get('main_crv') ] for obj in to_delete_elements: if cmds.objExists(obj) and is_deleted == False: cmds.delete(obj) @@ -7521,14 +7689,14 @@ def mirror_attr(source, target): # Validate Proxy is_valid = True - if not cmds.objExists(gt_ab_settings.get('main_proxy_grp')): + if not cmds.objExists(gt_ab_elements.get('main_proxy_grp')): is_valid = False cmds.warning('Proxy couldn\'t be found. Make sure you first create a proxy (guide objects) before mirroring it.') - proxy_elements = [gt_ab_settings.get('main_proxy_grp')] - for proxy in gt_ab_settings_default: + proxy_elements = [gt_ab_elements.get('main_proxy_grp')] + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings.get(proxy)) + proxy_elements.append(gt_ab_elements.get(proxy)) for obj in proxy_elements: if not cmds.objExists(obj) and is_valid: is_valid = False @@ -7539,11 +7707,11 @@ def mirror_attr(source, target): right_elements = [] if is_valid: - for obj in gt_ab_settings: + for obj in gt_ab_elements: if obj.startswith('left_') and '_crv' in obj: - left_elements.append(gt_ab_settings.get(obj)) + left_elements.append(gt_ab_elements.get(obj)) elif obj.startswith('right_') and '_crv' in obj: - right_elements.append(gt_ab_settings.get(obj)) + right_elements.append(gt_ab_elements.get(obj)) for left_obj in left_elements: for right_obj in right_elements: @@ -7573,10 +7741,10 @@ def export_proxy_pose(): is_valid = True successfully_created_file = False - proxy_elements = [gt_ab_settings.get('main_proxy_grp')] - for proxy in gt_ab_settings_default: + proxy_elements = [gt_ab_elements.get('main_proxy_grp')] + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings.get(proxy)) + proxy_elements.append(gt_ab_elements.get(proxy)) for obj in proxy_elements: if not cmds.objExists(obj) and is_valid: is_valid = False @@ -7591,12 +7759,12 @@ def export_proxy_pose(): if successfully_created_file and is_valid: export_dict = {'gt_auto_biped_version' : script_version, 'gt_auto_biped_export_method' : 'object-space'} - for obj in gt_ab_settings_default: + for obj in gt_ab_elements_default: if '_crv' in obj: - translate = cmds.getAttr(gt_ab_settings_default.get(obj) + '.translate')[0] - rotate = cmds.getAttr(gt_ab_settings_default.get(obj) + '.rotate')[0] - scale = cmds.getAttr(gt_ab_settings_default.get(obj) + '.scale')[0] - to_save = [gt_ab_settings_default.get(obj), translate, rotate, scale] + translate = cmds.getAttr(gt_ab_elements_default.get(obj) + '.translate')[0] + rotate = cmds.getAttr(gt_ab_elements_default.get(obj) + '.rotate')[0] + scale = cmds.getAttr(gt_ab_elements_default.get(obj) + '.scale')[0] + to_save = [gt_ab_elements_default.get(obj), translate, rotate, scale] export_dict[obj] = to_save try: @@ -7708,9 +7876,9 @@ def set_unlocked_ws_attr(target, attr, value_tuple): proxy_exists = True proxy_elements = [] - for proxy in gt_ab_settings_default: + for proxy in gt_ab_elements_default: if '_crv' in proxy: - proxy_elements.append(gt_ab_settings.get(proxy)) + proxy_elements.append(gt_ab_elements.get(proxy)) for obj in proxy_elements: if not cmds.objExists(obj) and proxy_exists: proxy_exists = False @@ -8173,7 +8341,7 @@ def extract_transform_joint_to_proxy(joint_name, ignore_translate=False, ignore_ else: values_to_store = extract_transform_joint_to_proxy(jnt) - for proxy_key in gt_ab_settings_default: + for proxy_key in gt_ab_elements_default: if jnt_key.replace('_' + jnt_suffix, '_proxy_crv') == proxy_key: export_dict[proxy_key] = values_to_store From c2a3da7c83f668d0e609484d592911b9f31cb1d2 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 16:49:35 -0700 Subject: [PATCH 3/8] Added docs about new settings menu --- docs/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/README.md b/docs/README.md index 35949f54..62039ce1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -829,6 +829,12 @@ This rig comes with many custom attributes so you can tweak how much stability/f GT Auto Biped Abduction/Adduction System Example +

Settings:

+
    +
  • Use Real-time Skeleton:
    Creates another skeleton without the parameter "Segment Scale Compensate" being active. This skeleton inherits the transforms from the controls while mimicking the behaviour of the "Segment Scale Compensate" option, essentially creating a baked version of this Maya depended system. + As this baked version does not yet fully support non-uniform scaling, it's recommended that you only use it if you are planning to later send this rig into a game engine or another 3d application. This will allow you to preserve the stretchy settings even in programs that do not support it.
  • +
+

Imports/Exporting Skin Weights:

This might be obvious, but when exporting and importing skin weights, don't forget to include all influences before importing it. This can be done by clicking on "Select Skinning Joints" then adding them as influences through "Rigging > Skin > Edit Influences > Add Influence"

From c9efaf692230e533f7cb1b56761d6855940056a3 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 16:50:03 -0700 Subject: [PATCH 4/8] Slightly updated GUI look --- docs/media/gt_auto_biped_rigger.jpg | Bin 38131 -> 38629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/media/gt_auto_biped_rigger.jpg b/docs/media/gt_auto_biped_rigger.jpg index abfb67fb0dcf4a1057c1f5ed9e353833a4c7c848..53c9548dd55c08547603f32ab8759eab5719b002 100644 GIT binary patch literal 38629 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≈MjJ{PI!kV+t{$fc^wXg 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 tG)QS4{I3pb9{+sB{{js|Gavu} From 4eb0787a156a92995552d7acabb4c48b86f45961 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 16:52:28 -0700 Subject: [PATCH 5/8] Real-time joints overwrite original joint names --- python-scripts/gt_auto_biped_rigger.py | 141 ++++++++++++++++++------- 1 file changed, 103 insertions(+), 38 deletions(-) diff --git a/python-scripts/gt_auto_biped_rigger.py b/python-scripts/gt_auto_biped_rigger.py index 243c184e..8c76d2a2 100644 --- a/python-scripts/gt_auto_biped_rigger.py +++ b/python-scripts/gt_auto_biped_rigger.py @@ -105,10 +105,13 @@ Created "settings" button and the GUI updates necessary to display it Created the base for persistent settings and implemented "User Real-time Skeleton" option Created a custom help window that takes strings as help inputs to display it to the user + + 1.7.7 - 2021-10-21 + Changed the behaviour for when creating a real-time skeleton so it overwrites the original skeleton To do: - Add option to mirror pose - Move functions to a module (this script is getting to big) + Add option to mirror rigged pose (for animators) + Move functions to a module (this script is getting too big) Create ribbon setup for the spine ( add switch to the master control ) Add more roll joints (upper part of the arm, legs, etc) Add option to auto create proxy geo @@ -144,7 +147,7 @@ script_name = "GT Auto Biped Rigger" # Version: -script_version = "1.7.6" +script_version = "1.7.7" # Python Version python_version = sys.version_info.major @@ -304,7 +307,13 @@ def reset_persistent_settings_auto_biped_rigger(): cmds.optionVar( remove='gt_auto_biped_rigger_setup' ) gt_ab_settings = gt_ab_settings_default cmds.warning('Persistent settings for ' + script_name + ' were cleared.') - cmds.evalDeferred("build_gui_auto_biped_rig()") + try: + cmds.evalDeferred("gt_auto_biped_rigger.build_gui_auto_biped_rig()") + except: + try: + build_gui_auto_biped_rig() + except: + pass @@ -1300,12 +1309,22 @@ def get_short_name(obj): short_name = split_path[len(split_path)-1] return short_name -def generate_no_ssc_skeleton(new_suffix='game'): +def generate_no_ssc_skeleton(new_suffix='game', jnt_suffix='jnt'): ''' Uses other functions to build a secondary skeleton that doesn't rely on Maya's segment scale compensate system. It insteads bakes the scale on to the children joints. + Parameters: + new_suffix (optional, string): The in-between word used to create a new suffix. + The new one will be new_suffix + "_" + jnt_suffix. + e.g. myJoint_jnt => myJOint_game_jnt + jnt_suffix (optional, string): The suffix the script expects + to find at the end of every joint + Returns: + duplicated_joints (string): Generated joints + no_ssc_root_jnt (string): Root joint for the generated joints + Dependencies: get_short_name() mimic_segment_scale_compensate_behaviour() @@ -1336,11 +1355,22 @@ def generate_no_ssc_skeleton(new_suffix='game'): for pair in reversed(to_rename): if cmds.objExists(pair[0]): duplicated_joints.append(cmds.rename(pair[0], pair[1])) + + # Turn off SSC + for jnt in duplicated_joints: + cmds.setAttr(jnt + '.segmentScaleCompensate', 0) return duplicated_joints, cmds.ls(selection=True)[0] -def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ctrl, new_skeleton_suffix = 'game'): +def attach_no_ssc_skeleton(duplicated_joints, + realtime_root_jnt, + current_root_jnt, + root_scale_constraint_ctrl, + new_skeleton_suffix = 'game', + jnt_suffix='jnt', + swap_names=True, + driver_suffix='driver'): ''' Attaches a previously generated game skeleton (no ssc skeleton) to follow and mimic the scale of the original gt auto biped rigger skeleton @@ -1349,29 +1379,25 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct new_skeleton_suffix (optional, string): expected in-between string for game skeleton. Used to pair with original skeleton duplicated_joints (list): A list of string containing all generated real-time joints - game_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton - scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl) - + realtime_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton + current_root_jnt (string): The name of the root joint (usually the top parent) of the current skeleton + root_scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl) + jnt_suffix (optional, string): The suffix the script expects + to find at the end of every joint + + Returns: + sorted_no_ssc_joints (list): A list containing game skeleton joints + Dependencies: + get_short_name() generate_no_ssc_skeleton() get_inverted_hierarchy_tree() mimic_segment_scale_compensate_behaviour() - - jnt_suffix : string variable - gt_ab_joints_default : list of joints - - Returns: - sorted_no_ssc_joints (list): A list containing game skeleton joints ''' - - # Turn off SSC - for jnt in duplicated_joints: - cmds.setAttr(jnt + '.segmentScaleCompensate', 0) - - cmds.select(game_root_jnt, hierarchy=True) # Sync selection order + cmds.select(realtime_root_jnt, hierarchy=True) # Sync selection order duplicated_joints = cmds.ls(selection=True, type='joint') - cmds.select(gt_ab_joints_default.get('main_jnt'), hierarchy=True) + cmds.select(current_root_jnt, hierarchy=True) original_joints = cmds.ls(selection=True, type='joint') sorted_original_joints = get_inverted_hierarchy_tree(original_joints) @@ -1379,30 +1405,68 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct mimic_segment_scale_compensate(sorted_original_joints, sorted_no_ssc_joints) # Parent Constraint new system - remove_dupe_str = '_' + new_skeleton_suffix + '_' + jnt_suffix - - remove_org_str = '_' + jnt_suffix + remove_new_str = '_' + new_skeleton_suffix + '_' + jnt_suffix + remove_old_str = '_' + jnt_suffix remove_dupe_end_str = '_' + new_skeleton_suffix + '_end' + jnt_suffix.capitalize() remove_org_end_str = '_end' + jnt_suffix.capitalize() - # Parent Constraint Game Skeleton + # Parent Constraint Real-time Skeleton for jnt in sorted_original_joints: - for game_jnt in sorted_no_ssc_joints: - joint_org = jnt.replace(remove_org_str, '') - joint_dupe = game_jnt.replace(remove_dupe_str, '') + for realtime_jnt in sorted_no_ssc_joints: + joint_org = jnt.replace(remove_old_str, '') + joint_dupe = realtime_jnt.replace(remove_new_str, '') if joint_org == joint_dupe: - cmds.parentConstraint( jnt, game_jnt ) + cmds.parentConstraint( jnt, realtime_jnt ) for jnt in sorted_original_joints: - for game_jnt in sorted_no_ssc_joints: + for realtime_jnt in sorted_no_ssc_joints: joint_org = jnt.replace(remove_org_end_str, '') - joint_dupe = game_jnt.replace(remove_dupe_end_str, '') + joint_dupe = realtime_jnt.replace(remove_dupe_end_str, '') if joint_org == joint_dupe: - cmds.parentConstraint( jnt, game_jnt ) - - # Scale Constraint Rootf - cmds.scaleConstraint(scale_constraint_ctrl, game_root_jnt) + cmds.parentConstraint( jnt, realtime_jnt ) + + # Scale Constraint Root + cmds.scaleConstraint(root_scale_constraint_ctrl, realtime_root_jnt) + + # Swap Names (Real-time skeleton becomes the standard skeleton) + if swap_names: + + # Make original invisible + cmds.setAttr(current_root_jnt + '.v', 0) + + # Move Game Skeleton To Top + cmds.reorder(realtime_root_jnt, front=True) + + to_rename = [] + # Search RT + search_end_jnt = '_' + new_skeleton_suffix + '_end' + jnt_suffix.capitalize() + search_jnt = '_' + new_skeleton_suffix + '_' + jnt_suffix + # Replace RT + new_suffix = '_' + jnt_suffix + new_suffix_end_jnt = '_end' + jnt_suffix.capitalize() + for jnt in sorted_no_ssc_joints: + object_short_name = get_short_name(jnt) + new_name = str(object_short_name).replace(search_jnt, new_suffix).replace(search_end_jnt, new_suffix_end_jnt) + if cmds.objExists(jnt) and 'shape' not in cmds.nodeType(jnt, inherited=True) and jnt != new_name: + to_rename.append([jnt,new_name]) + # Search + search_end_jnt = '_end' + jnt_suffix.capitalize() + search_jnt = '_' + jnt_suffix + # Replace + new_suffix = '_' + driver_suffix + '_' + jnt_suffix + new_suffix_end_jnt = '_' + driver_suffix + '_end' + jnt_suffix.capitalize() + for jnt in sorted_original_joints: + object_short_name = get_short_name(jnt) + new_name = str(object_short_name).replace(search_jnt, new_suffix).replace(search_end_jnt, new_suffix_end_jnt) + if cmds.objExists(jnt) and 'shape' not in cmds.nodeType(jnt, inherited=True) and jnt != new_name: + to_rename.append([jnt,new_name]) + + for pair in reversed(to_rename): + if cmds.objExists(pair[0]): + cmds.rename(pair[0], pair[1]) + + return sorted_no_ssc_joints @@ -6849,7 +6913,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil cmds.parent(foot_automation_grp, rig_setup_grp) # Scale Constraints - cmds.scaleConstraint(main_ctrl, skeleton_grp) + main_skeleton_constraint = cmds.scaleConstraint(main_ctrl, skeleton_grp) + cmds.setAttr(main_skeleton_constraint[0] + '.v', 0) cmds.scaleConstraint(main_ctrl, rig_setup_grp) # Hierarchy Adjustments and Color @@ -7559,7 +7624,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil if gt_ab_settings.get('using_no_ssc_skeleton'): new_skeleton_suffix = 'game' duplicated_joints, game_root_jnt = generate_no_ssc_skeleton(new_skeleton_suffix) - sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, main_ctrl, new_skeleton_suffix) + sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, gt_ab_joints_default.get('main_jnt'), main_ctrl, new_skeleton_suffix) ################# Store Created Joints ################# From 210ce1253389f42dd2c3942c570bcd3c0773a711 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 17:27:05 -0700 Subject: [PATCH 6/8] Updated version --- mel-scripts/gt_tools_menu.mel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mel-scripts/gt_tools_menu.mel b/mel-scripts/gt_tools_menu.mel index c16b2868..ee1866a7 100644 --- a/mel-scripts/gt_tools_menu.mel +++ b/mel-scripts/gt_tools_menu.mel @@ -147,7 +147,7 @@ //---------------------------------------------------------------------------- // Globals -global string $scriptVersion = "1.7.9"; +global string $scriptVersion = "1.7.10"; global string $gMainWindow; string $installedVersion = `optionVar -q "gt_tools_version"`; From f0f74f1e0f1f2729436e757a7b95ae3f8dfac2d8 Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 20:14:56 -0700 Subject: [PATCH 7/8] Added auto update optionVar during first run --- mel-scripts/gt_tools_menu.mel | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mel-scripts/gt_tools_menu.mel b/mel-scripts/gt_tools_menu.mel index ee1866a7..a05c113d 100644 --- a/mel-scripts/gt_tools_menu.mel +++ b/mel-scripts/gt_tools_menu.mel @@ -144,6 +144,9 @@ // 1.7.8 // Added "gtu_full_hud_toggle" // +// 1.7.10 +// Added optionVar "gt_check_for_updates_interval_days" and set it to 15 in case it doesn't exist (default value) +// //---------------------------------------------------------------------------- // Globals @@ -172,9 +175,10 @@ if (`optionVar -exists "gt_check_for_updates_auto_active"` && $silentlyAutoCheck catchQuiet(python("gt_check_for_updates.silent_update_check()")); } -if (`optionVar -exists "gt_check_for_updates_auto_active"` == 0) +if (`optionVar -exists "gt_check_for_updates_auto_active"` == 0) // First time running { - optionVar -sv "gt_check_for_updates_auto_active" 1; // First time running + optionVar -sv "gt_check_for_updates_auto_active" 1; + optionVar -sv "gt_check_for_updates_interval_days" 15; } From 1fccb5a2f94a43ee002f7e6110964765232ea09c Mon Sep 17 00:00:00 2001 From: TrevisanGMW Date: Thu, 21 Oct 2021 20:15:55 -0700 Subject: [PATCH 8/8] Made it fully compatible with semantic versioning --- python-scripts/gt_check_for_updates.py | 140 ++++++++++++++++++++----- 1 file changed, 111 insertions(+), 29 deletions(-) diff --git a/python-scripts/gt_check_for_updates.py b/python-scripts/gt_check_for_updates.py index 13acfbf3..a6ab3666 100644 --- a/python-scripts/gt_check_for_updates.py +++ b/python-scripts/gt_check_for_updates.py @@ -21,6 +21,10 @@ 1.5 - 2021-05-11 Made script compatible with Python 3 (Maya 2022+) + + 1.6 - 2021-10-21 + Updated parsing mechanism to be fully compatible with semantic versioning + Updated the silent update checker Debugging Lines: @@ -75,7 +79,7 @@ import re # Script Version (This Script) -script_version = '1.5' +script_version = '1.6' gt_tools_latest_release_api = 'https://api.github.com/repos/TrevisanGMW/gt-tools/releases/latest' gt_tools_tag_release_api = 'https://api.github.com/repos/TrevisanGMW/gt-tools/releases/tags/' @@ -317,15 +321,52 @@ def execute_operation(): current_version_int = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')))) latest_version_int = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')))) - if current_version_int < latest_version_int: + current_version_major = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[0])) + current_version_minor = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[1])) + current_version_patch = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[2])) + + latest_version_major = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[0])) + latest_version_minor = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[1])) + latest_version_patch = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[2])) + + current_state = 'unknown' + + # Check Major + if current_version_major < latest_version_major: + current_state = 'update' + elif current_version_major > latest_version_major: + current_state = 'unreleased' + else: + current_state = 'same' + + # Check Minor + if current_state == 'same': + if current_version_minor < latest_version_minor: + current_state = 'update' + elif current_version_minor > latest_version_minor: + current_state = 'unreleased' + else: + current_state = 'same' + + # Check Patch + if current_state == 'same': + if current_version_patch < latest_version_patch: + current_state = 'update' + elif current_version_patch > latest_version_patch: + current_state = 'unreleased' + + if current_state == 'update': cmds.button(update_btn, e=True, en=True, bgc=(.6, .6, .6)) cmds.text(update_status, e=True, l="New Update Available!", fn="tinyBoldLabelFont", bgc=(1, .5, .5)) - elif current_version_int > latest_version_int: + elif current_state == 'unreleased': cmds.text(update_status, e=True, l="Unreleased update!", fn="tinyBoldLabelFont", bgc=(.7, 0 , 1)) cmds.button(update_btn, e=True, en=False) - else: + elif current_state == 'same': cmds.text(update_status, e=True, l="You're up to date!", fn="tinyBoldLabelFont", bgc=(0, 1, 0)) cmds.button(update_btn, e=True, en=False) + else: + cmds.text(update_status, e=True, l="Unknown!", fn="tinyBoldLabelFont", bgc=(0, 0, 0)) + cmds.button(update_btn, e=True, en=False) published_at = '' try: @@ -338,22 +379,33 @@ def execute_operation(): cmds.scrollField(output_scroll_field, e=True, ip=0, it=response_list[0].get('body')) if latest_version_int != 0: - try: - previous_version = str(latest_version_int - 1) - previous_version_tag = 'v' - for c in previous_version: - previous_version_tag += c + '.' - previous_version_tag = previous_version_tag[:-1] - - before_previous_version = str(latest_version_int - 2) - before_previous_version_tag = 'v' - for c in before_previous_version: - before_previous_version_tag += c + '.' - before_previous_version_tag = before_previous_version_tag[:-1] - + try: + previous_version = '' + if latest_version_patch != 0: + previous_version = 'v' + str(latest_version_major) + '.' + str(latest_version_minor) + '.' + str(latest_version_patch-1) + else: + if latest_version_minor != 0: + previous_version = 'v' + str(latest_version_major) + '.' + str(latest_version_minor-1) + '.' + str(latest_version_patch) + else: + if latest_version_major != 0: + previous_version = 'v' + str(latest_version_major-1) + '.' + str(latest_version_minor) + '.' + str(latest_version_patch) + + previous_version_major = int(re.sub("[^0-9]", "", str(previous_version.split('.')[0]))) + previous_version_minor = int(re.sub("[^0-9]", "", str(previous_version.split('.')[1]))) + previous_version_patch = int(re.sub("[^0-9]", "", str(previous_version.split('.')[2]))) + + before_previous_version = '' + if previous_version_patch != 0: + before_previous_version = 'v' + str(previous_version_major) + '.' + str(previous_version_minor) + '.' + str(previous_version_patch-1) + else: + if previous_version_minor != 0: + before_previous_version = 'v' + str(previous_version_major) + '.' + str(previous_version_minor-1) + '.' + str(previous_version_patch) + else: + if previous_version_major != 0: + before_previous_version = 'v' + str(previous_version_major-1) + '.' + str(previous_version_minor) + '.' + str(previous_version_patch) - previous_version_response = get_github_release(gt_tools_tag_release_api + previous_version_tag) - before_previous_version_response = get_github_release(gt_tools_tag_release_api + before_previous_version_tag) + previous_version_response = get_github_release(gt_tools_tag_release_api + previous_version) + before_previous_version_response = get_github_release(gt_tools_tag_release_api + before_previous_version) if previous_version_response[1] in success_codes: published_at = '' @@ -364,7 +416,6 @@ def execute_operation(): cmds.scrollField(output_scroll_field, e=True, ip=0, it='\n\n' + (previous_version_response[0].get('tag_name') + (' ' * 80) + '(' + published_at + ')\n')) cmds.scrollField(output_scroll_field, e=True, ip=0, it=previous_version_response[0].get('body')) - if before_previous_version_response[1] in success_codes: published_at = '' @@ -475,6 +526,7 @@ def silent_update_check(): if is_active: def compare_current_latest(): + # Get Interval check_interval = gt_check_for_updates.get('def_auto_updater_interval') persistent_check_interval_exists = cmds.optionVar(exists=('gt_check_for_updates_interval_days')) @@ -492,10 +544,12 @@ def compare_current_latest(): last_check_date = today_date # Failed to extract date else: last_check_date = today_date # Failed to extract date + cmds.optionVar(sv=('gt_check_for_updates_last_date', str(today_date))) # Store check for updates last date # Calculate Delta delta = today_date - last_check_date days_since_last_check = delta.days + if days_since_last_check > check_interval: # Define Current Version @@ -510,18 +564,46 @@ def compare_current_latest(): response_list = get_github_release(gt_tools_latest_release_api) gt_check_for_updates['latest_version'] = response_list[0].get('tag_name') or "v0.0.0" - current_version_int = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')))) - latest_version_int = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')))) - - if current_version_int == 0 or latest_version_int == 0: - pass + current_version_major = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[0])) + current_version_minor = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[1])) + current_version_patch = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('current_version')).split('.')[2])) + + latest_version_major = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[0])) + latest_version_minor = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[1])) + latest_version_patch = int(re.sub("[^0-9]", "", str(gt_check_for_updates.get('latest_version')).split('.')[2])) + + current_state = 'unknown' + + # Check Major + if current_version_major < latest_version_major: + current_state = 'update' + elif current_version_major > latest_version_major: + current_state = 'unreleased' else: + current_state = 'same' + + # Check Minor + if current_state == 'same': + if current_version_minor < latest_version_minor: + current_state = 'update' + elif current_version_minor > latest_version_minor: + current_state = 'unreleased' + else: + current_state = 'same' + + # Check Patch + if current_state == 'same': + if current_version_patch < latest_version_patch: + current_state = 'update' + elif current_version_patch > latest_version_patch: + current_state = 'unreleased' + + + if current_state == 'update': cmds.optionVar( sv=('gt_check_for_updates_last_date', str(today_date))) # Store check date - if current_version_int < latest_version_int: - #print("New Update Available!") - build_gui_gt_check_for_updates() + build_gui_gt_check_for_updates() - # Print Output - Debugging + ## Print Output - Debugging # print('Check Interval: ' + str(check_interval)) # print('Check Delta: ' + str(days_since_last_check)) # print('Current Version: ' + str(current_version_int))