class RigACharacterUI: # Base widget sizes _SIZE_WIDGET_WIDTH = 100 _SIZE_WIDGET_HEIGHT = 30 def __init__(self, util, characters_location, window_name): self._logger = Logger(self.__class__.__name__) self._util = util self._skeleton_definition = SkeletonDefinition() self._characters_location = characters_location self._window_name = window_name def show_window(self): if cmds.window(self._window_name, exists=True): return window = cmds.window(self._window_name, title='[Rig-a-thon] Rig a Character', iconName='Rig a Character', sizeable=False, toolbox=True) self._create_ui_panel() cmds.showWindow(window) self._util.perform_maya_2015_window_resize_workaround(self._window_name) def run_script_generate_skeleton(self, *args): title = 'Generate Skeleton' message = 'Select Skeleton Pose: T-Pose or Relaxed Pose?' buttons = ['T-Pose', 'Relaxed Pose', 'Cancel'] result = self._util.custom_message_box(title, message, buttons, buttons[0], buttons[2]) if result == 'T-Pose': self._util.generate_script('01_skeleton_definition_t_pose') self._util.exec_generated_script('01_skeleton_definition_t_pose') elif result == 'Relaxed Pose': self._util.generate_script('01_skeleton_definition_relaxed_pose') self._util.exec_generated_script('01_skeleton_definition_relaxed_pose') def run_script_add_skin_weight_influence(self, *args): self._util.generate_script('02_custom_add_skin_weight_influence') self._util.exec_generated_script('02_custom_add_skin_weight_influence') def run_script_add_anim_locators(self, *args): self._util.generate_script('03_animation_locators') self._util.exec_generated_script('03_animation_locators') def run_script_rig_it(self, *args): self._util.generate_script('04a_pre_rig_script') self._util.generate_script('04b_custom_pre_rig_script') self._util.generate_script('04c_rig_script') self._util.generate_script('04d_post_rig_script') self._util.generate_script('04e_custom_post_rig_script') self._util.exec_generated_script('04a_pre_rig_script') self._util.exec_generated_script('04b_custom_pre_rig_script') self._util.exec_generated_script('04c_rig_script') self._util.exec_generated_script('04d_post_rig_script') self._util.exec_generated_script('04e_custom_post_rig_script') def save_character(self, *args): dialog_title = 'Save Character' last_character_name = self._util.load_from_cache('last_character_name', '') character_name = self._util.dialog_box_ok_cancel(dialog_title, 'Enter a Character Name:', last_character_name) if character_name is None or len(character_name.strip()) == 0: # Save cancelled return self._util.save_to_cache('last_character_name', character_name) character_path = os.path.join(self._characters_location, character_name + '.mb') if os.path.exists(character_path): # Character already exists err_msg = 'Save failed.\n\nCharacter name \'$character_name\' already exists.'.replace('$character_name', character_name) self._util.message_box(dialog_title, err_msg) return if not os.path.isdir(self._characters_location): # Create directory os.makedirs(self._characters_location) cmds.file(rename=character_path) cmds.file(save=True, type='mayaBinary', force=True, prompt=True) if os.path.exists(character_path): # Save successful cmds.file(new=True, force=True) cmds.deleteUI(self._window_name) self._logger.command_message('Character saved as \'$character_path\'.'.replace('$character_path', character_path)) success_msg = 'Save successful.\n\nSee Script Editor for details.' self._util.message_box(dialog_title, success_msg) def run_script_pose_arms_in_t_pose(self, *args): self._util.generate_script('adv_pose_arms_in_t_pose') self._util.exec_generated_script('adv_pose_arms_in_t_pose') def run_script_recreate_skeleton_and_geometry(self, *args): result = self._util.dialog_box_yes_no('Recreate Skeleton and Geometry', 'WARNING! This will detach the skin from the geometry. Are you sure? ', default_button = 'No') if not result: return self._util.generate_script('adv_recreate_skeleton_and_geometry') self._util.exec_generated_script('adv_recreate_skeleton_and_geometry') def run_script_dump_skeleton_definition(self, *args): self._skeleton_definition.dump() def _create_ui_panel(self): widget_width = self._SIZE_WIDGET_WIDTH widget_height = self._SIZE_WIDGET_HEIGHT cmds.columnLayout(adjustableColumn=True) cmds.frameLayout(label='Rigging Scripts', borderStyle='etchedOut', collapsable=False, collapse=False, enable=True) cmds.rowColumnLayout(numberOfColumns=1) cmds.button(label='Generate Skeleton', command=partial(self.run_script_generate_skeleton), width=widget_width*2, height=widget_height) cmds.button(label='Add Skin Weight Influence', command=partial(self.run_script_add_skin_weight_influence), width=widget_width*2, height=widget_height) cmds.button(label='Add Anim Locators', command=partial(self.run_script_add_anim_locators), width=widget_width*2, height=widget_height) cmds.button(label='Rig It!', command=partial(self.run_script_rig_it), width=widget_width*2, height=widget_height) cmds.button(label='Save Character', command=partial(self.save_character), width=widget_width*2, height=widget_height) cmds.setParent(upLevel=True) cmds.setParent(upLevel=True) cmds.frameLayout(label='Advanced', borderStyle='etchedOut', collapsable=True, collapse=True, enable=True) cmds.rowColumnLayout(numberOfColumns=1) cmds.button(label='Pose Arms in T-Pose', command=partial(self.run_script_pose_arms_in_t_pose), width=widget_width*2, height=widget_height) cmds.button(label='Recreate Skeleton and Geometry', command=partial(self.run_script_recreate_skeleton_and_geometry), width=widget_width*2, height=widget_height) cmds.button(label='Dump Skeleton Definition', command=partial(self.run_script_dump_skeleton_definition), width=widget_width*2, height=widget_height) cmds.setParent(upLevel=True) cmds.setParent(upLevel=True) cmds.setParent(upLevel=True)
def __init__(self, util, characters_location, window_name): self._logger = Logger(self.__class__.__name__) self._util = util self._skeleton_definition = SkeletonDefinition() self._characters_location = characters_location self._window_name = window_name