Product documentation · Current desktop UI

Maya source functions

1091 definitions in the current source checkout. This source map includes internal helpers and class methods. It is not a supported API contract or a promise that a function can be called through a bridge. For supported entry points use the Python API reference or bundled DCC wrapper pages.

maya_tools.Animation.anim_export.anim_export

export_animation

def export_animation(maya_file, export_path, namespace, start_frame, end_frame, nodes=None, reference_paths=None, changelist=None)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:16

Opens Maya file and exports animation to FBX using `mayapy`. :param maya_file: (str): Path to the Maya scene file. :param export_path: (str): Path where the FBX should be saved. :param namespace: (str): Namespace of the skeleton. :param sta

get_all_joint_children

def get_all_joint_children(root_joint)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:141

Returns a list of all child joints (recursively) under the given root joint.

bake_all_keyable_attributes

def bake_all_keyable_attributes(nodes, start_frame, end_frame)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:151

:param nodes: nodes to bake :param start_frame: start of range to bake :param end_frame: end of range to bake :return:

export_metahuman_sliders_as_fbx

def export_metahuman_sliders_as_fbx(slider_set='FacialControls', fbx_path='', start_frame=None, end_frame=None)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:171

Bakes facial slider animation and exports it as an FBX. :param slider_set: Name of the set containing facial sliders. :param fbx_path: Full file path for the FBX export. :param start_frame: Start frame of baking range. Defaults to timeline

update_joint_setup_for_import

def update_joint_setup_for_import(facial_joints)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:215

Sets up hierachy to match the Face Archetype Skeleton :param facial_joints: list of facial joints :return:

import_reference_and_strip_namespace_test

def import_reference_and_strip_namespace_test(namespace, root)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:256

Imports objects from a reference associated with the given namespace, imports any nested references, strips all namespaces, renames duplicates, and returns a list of renamed transform nodes. :param namespace: The namespace of the reference.

add_missing_parents_with_long_names

def add_missing_parents_with_long_names(joint_list)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:326

Given a list of joints, return the full DAG paths including all parent joints. Ensures all names are long paths to avoid ambiguity. :param joint_list: List of joint names (can be short or long) :return: List of joints including all parents,

sort_reverse_hierarchy

def sort_reverse_hierarchy(node_list)

module function · public name · maya_tools/Animation/anim_export/anim_export.py:349

Sorts DAG nodes in reverse hierarchy order (children before parents). Assumes all nodes are given as full paths or unique enough to convert to full paths.

maya_tools.Animation.anim_export.anim_export_command

export_animation_to_fbx

def export_animation_to_fbx(export_path, namespace, start_frame, end_frame, nodes=None, reference_paths=None, changelist=None)

module function · public name · maya_tools/Animation/anim_export/anim_export_command.py:8

Subprocess command function which calls the actual export function, to make scene state unchanged :param export_path: full path for fbx animation to be exported :param namespace: namespace to be exported in the data :param start_frame: star

run_export

def run_export(cmd, maya_env, export_path)

module function · public name · maya_tools/Animation/anim_export/anim_export_command.py:67

exports using subprocess to keep maya scene unchanged / non-destructive :param cmd: subprocess command string for export :param maya_env: maya env settings from os.environ.copy() :param export_path: actual fbx export location :return:

export_animation_async

def export_animation_async(cmd, maya_env, export_path)

module function · public name · maya_tools/Animation/anim_export/anim_export_command.py:93

exports on separate thread so maya session isn't locked up during export :param cmd: subprocess command string for export :param maya_env: maya env settings from os.environ.copy() :param export_path: actual fbx export location :return:

maya_tools.Animation.anim_export.anim_export_utils

get_facial_sliders

def get_facial_sliders(namespace=None)

module function · public name · maya_tools/Animation/anim_export/anim_export_utils.py:4

Detects the 'FacialControls' set under any namespace (including nested ones) and returns the slider nodes and the actual namespace they belong to. :param namespace: (optional) A base namespace to filter by. :return: Tuple (slider_nodes, act

get_facial_joints

def get_facial_joints(namespace)

module function · public name · maya_tools/Animation/anim_export/anim_export_utils.py:28

Detects joints with 'FACIAL_' in their name within the given namespace (including nested ones). Returns the list of joints and the actual namespace. :param namespace: Base namespace to filter by (e.g., 'MyChar') :return: Tuple (facial_joint

open_scene_with_specific_references

def open_scene_with_specific_references(maya_file, reference_list)

module function · public name · maya_tools/Animation/anim_export/anim_export_utils.py:55

Opens a Maya scene and loads only the specified references, ignoring any others. :param maya_file: Full path to the .ma or .mb file :param reference_list: List of dictionaries [{"path": "...", "namespace": "..."}, ...]

find_references_from_namespace

def find_references_from_namespace(namespace)

module function · public name · maya_tools/Animation/anim_export/anim_export_utils.py:81

Find all reference nodes (including sub-references and constraint dependencies) associated with a given namespace. :param namespace: The namespace you want to check, e.g., 'Test:sub_rig'. :return: List of [ref_path, ref_node] pairs.

maya_tools.Animation.anim_export.bridge_export

export_fbx

def export_fbx(export_path: str, start_frame: int=1, end_frame: int=120, selected_only: bool=True, nodes: Iterable[str] | None=None, bake_animation: bool=True, use_animation_range: bool=False) -> dict[str, Any]

module function · public name · maya_tools/Animation/anim_export/bridge_export.py:12

maya_tools.Animation.anim_export.clean_skeleton_export

_joint_order

def _joint_order(joints: dict[str, str], parent_of) -> list[str]

module function · internal · maya_tools/Animation/anim_export/clean_skeleton_export.py:16

Return parent-first order; reject partial or disconnected skeletons.

export_control_rig_skeleton

def export_control_rig_skeleton(scene_path: str | Path, output_fbx: str | Path, *, start_frame: int, end_frame: int, rig_namespace: str='CharacterRig', solved_namespace: str='RetargetSolved', mapping_profile: str | Path | None=None, overwrite: bool=False) -> dict

module function · public name · maya_tools/Animation/anim_export/clean_skeleton_export.py:47

Open a baked-control scene, export its clean deform skeleton, reopen-audit it. The solved skeleton identifies the intended deform-joint subset, not the motion to export: the referenced control rig is sampled after any edits. Requires mayapy

maya_tools.Animation.anim_export.fbx_export_core

export_fbx_with_settings

def export_fbx_with_settings(filepath: str | Path, *, settings: Iterable[str], selected_only: bool=True, cmds_module=None, mel_module=None) -> Path

module function · public name · maya_tools/Animation/anim_export/fbx_export_core.py:9

maya_tools.Animation.bridge_import

import_fbx

def import_fbx(filepath: str, namespace: str='') -> dict[str, Any]

module function · public name · maya_tools/Animation/bridge_import.py:9

translate_imported_meshes

def translate_imported_meshes(objects: list[str], translation: list[float], relative: bool=True) -> dict[str, Any]

module function · public name · maya_tools/Animation/bridge_import.py:55

Move only visible meshes supplied by the preceding Maya import stage.

maya_tools.Animation.bridge_keyframe

set_keyframe

def set_keyframe(object_name: str, attribute: str, value: float, frame: int | float | str) -> dict[str, Any]

module function · public name · maya_tools/Animation/bridge_keyframe.py:16

maya_tools.Animation.bridge_timeline

inspect_animation_range

def inspect_animation_range(objects: Iterable[str] | None=None) -> dict[str, Any]

module function · public name · maya_tools/Animation/bridge_timeline.py:7

maya_tools.Cinematics.SequenceUI.sequence_ui

_maya_qt_major_version

def _maya_qt_major_version()

module function · internal · maya_tools/Cinematics/SequenceUI/sequence_ui.py:5

Return the Qt binding Maya was built with, or ``None`` outside Maya.

_stored_qcolor

def _stored_qcolor(value)

module function · internal · maya_tools/Cinematics/SequenceUI/sequence_ui.py:63

Parses a QColor representation without executing persisted code. :param value: stored QColor string or QColor instance :return: QColor value

is_maya

def is_maya()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:90

is_motionbuilder

def is_motionbuilder()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:97

AnimationManagerUI.__init__

def AnimationManagerUI.__init__(self, parent=None)

class method · internal · maya_tools/Cinematics/SequenceUI/sequence_ui.py:137

AnimationManagerUI.init_ui

def AnimationManagerUI.init_ui(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:200

Initializes the UI layout and widgets. :return:

AnimationManagerUI.on_item_changed

def AnimationManagerUI.on_item_changed(self, item)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:336

AnimationManagerUI.closeEvent

def AnimationManagerUI.closeEvent(self, event)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:339

Called when the window is closing. Used to clean up callbacks.

AnimationManagerUI.eventFilter

def AnimationManagerUI.eventFilter(self, obj, event)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:346

AnimationManagerUI.set_table_background_scaled

def AnimationManagerUI.set_table_background_scaled(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:352

Loads the Icon as the background after converting to grayscale :return:

AnimationManagerUI.filter_skeletons

def AnimationManagerUI.filter_skeletons(self, text)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:374

Filters list of skeletons in the group box :param text: Text to filter by :return:

AnimationManagerUI._update_engine_state

def AnimationManagerUI._update_engine_state(self)

class method · internal · maya_tools/Cinematics/SequenceUI/sequence_ui.py:388

AnimationManagerUI._on_file_open_completed

def AnimationManagerUI._on_file_open_completed(self, *args)

class method · internal · maya_tools/Cinematics/SequenceUI/sequence_ui.py:404

Internal method triggered when a new scene is opened.

AnimationManagerUI.show_context_menu

def AnimationManagerUI.show_context_menu(self, pos)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:410

Shows Context Menu for editing Row Data or Widgets from Row Data :param pos: Position selected in Table, since the context menu needs to know which row is being edited

AnimationManagerUI.update_export_directory_for_row

def AnimationManagerUI.update_export_directory_for_row(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:479

Function updates the export directory for any number of selected rows :return:

AnimationManagerUI.update_skeleton_list

def AnimationManagerUI.update_skeleton_list(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:500

Function to reload the skeleton list from the uproject without having to reselect project :return:

AnimationManagerUI.update_project

def AnimationManagerUI.update_project(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:525

Function to reload the skeleton list after selecting the uproject :return:

AnimationManagerUI.update_selected_column

def AnimationManagerUI.update_selected_column(self, column, value)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:550

Updates selected column with specific value (usually run on selected rows) :param column: Column to be updated :param value: Value to update in column :return:

AnimationManagerUI.add_animation

def AnimationManagerUI.add_animation(self, anim=None, directory=None, start=None, end=None, namespace=None, skeleton=None, color=None, nodes=None)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:571

Adds a new row using the right-side input fields with validation and an error pop-up. :param anim: Animation Name to be added to row :param directory: Export Directory for the animation, uses the directory widget input otherwise :param star

AnimationManagerUI.add_animations_for_selection

def AnimationManagerUI.add_animations_for_selection(self, selection=False)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:653

Adds animation entries for selected, including camera and character tracks. :return:

AnimationManagerUI.add_animations_for_shots

def AnimationManagerUI.add_animations_for_shots(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:699

Adds animation entries for shots, including camera and character tracks. :return:

AnimationManagerUI.delete_animation

def AnimationManagerUI.delete_animation(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:747

Deletes the selected rows from the QTableWidget. Handles multiple row selections and reorders correctly to prevent index shifting. :return:

AnimationManagerUI.duplicate_animation

def AnimationManagerUI.duplicate_animation(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:773

Duplicates the selected row, inserting the duplicate directly below it. Handles shifting indices due to insertions.

AnimationManagerUI.add_facial_export_row_for_selected

def AnimationManagerUI.add_facial_export_row_for_selected(self, joints=False)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:815

Adds Facial Sliders or joints for Namespace of selected row, including nested namespaces in case of sub references Defaults to Face Archetype for skeleton otherwise uses the default skeleton if doesn't exist :return:

AnimationManagerUI.select_all_with_namespace

def AnimationManagerUI.select_all_with_namespace(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:890

Selects all rows in the table that match the namespace of the currently selected row.

AnimationManagerUI.open_color_picker

def AnimationManagerUI.open_color_picker(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:914

Opens a QColorDialog and ensures it stays on top of Maya's UI. :return:

AnimationManagerUI.update_color_button

def AnimationManagerUI.update_color_button(self, color)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:935

Updates Choose Color button to display the selected color. :param color: Color to be updated, example formatting : QtGui.QColor(255, 255, 255) :return:

AnimationManagerUI.apply_row_colors

def AnimationManagerUI.apply_row_colors(self, color=None)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:957

Applies the chosen color to all selected rows in the QTableWidget. :param color: Color to be updated, example formatting : QtGui.QColor(255, 255, 255) :return:

AnimationManagerUI.set_scene_range

def AnimationManagerUI.set_scene_range(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:997

Sets the Maya timeline to match the selected animation's frame range. :return:

AnimationManagerUI.copy_selected_filenames

def AnimationManagerUI.copy_selected_filenames(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1020

Copies selected Export Locations to clipboard. :return:

AnimationManagerUI.populate_right_side_from_selected_row

def AnimationManagerUI.populate_right_side_from_selected_row(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1031

Copies values from the selected row and pastes them into the right-side layout widgets. :return:

AnimationManagerUI.export_cinematic

def AnimationManagerUI.export_cinematic(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1077

Exports the selected animations and imports the data into Unreal. :return:

AnimationManagerUI.export_animation

def AnimationManagerUI.export_animation(self, cinematic=False, publish=None)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1084

Exports the selected animations and imports the data into Unreal. :return:

AnimationManagerUI.load_data

def AnimationManagerUI.load_data(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1252

Loads the data from the ExportData node to populate the UI widgets :return: list with anim_dict

AnimationManagerUI.store_data

def AnimationManagerUI.store_data(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1306

Stores the data for exports to the attributes on the ExportData node :return:

AnimationManagerUI.create_file_menu

def AnimationManagerUI.create_file_menu(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1331

Creates File Menu at top of Window :return:

AnimationManagerUI.export_data

def AnimationManagerUI.export_data(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1344

Exports the UI Animations for loading into another file or package :return:

AnimationManagerUI.import_data

def AnimationManagerUI.import_data(self)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1370

Imports Data from exported json (using the Export Data File Menu option, not the Export Animation option) :return:

AnimationManagerUI.get_uproject

def AnimationManagerUI.get_uproject(self, directory)

class method · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1399

show_animation_manager

def show_animation_manager()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_ui.py:1410

Launches the Animation Manager UI in Maya. :return:

maya_tools.Cinematics.SequenceUI.sequence_utils

add_file_open_callback

def add_file_open_callback(widget)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:13

remove_file_open_callback

def remove_file_open_callback()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:24

Removes all previously registered Maya scene callbacks.

get_main_window_pointer

def get_main_window_pointer()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:36

Get the Maya main window pointer :return:

get_camera_sequencer_data

def get_camera_sequencer_data()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:45

Retrieves all shots, shot ranges, and corresponding shot cameras from Maya's Camera Sequencer. :return: List of tuples (shot_number, start_frame, end_frame, camera)

export_node_exists

def export_node_exists()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:62

get_display_range

def get_display_range()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:66

:return: start and end frames of the time slider

set_display_range

def set_display_range(start_frame, end_frame)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:76

:param start_frame: :param end_frame: :return:

display_warning

def display_warning(warning)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:88

:param warning: Warning to display :return:

get_cameras_from_selection

def get_cameras_from_selection()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:97

get_scene_path

def get_scene_path()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:108

get_rig_namespaces

def get_rig_namespaces(selection=True)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:114

Detects namespaces of selected rigs that contain joints with 'origin' as the top joint. :return: Set of valid namespaces

generate_sequence_dict_from_anim_dict

def generate_sequence_dict_from_anim_dict(anim_dict)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:148

Generates a new dictionary with shot_number as the key, and a list of animations as the value. Each animation has export path, skeleton, blueprint (default to None), nodes, start frame, and end frame. :param anim_dict: The original animatio

get_maya_fps

def get_maya_fps()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:185

create_and_populate_export_node

def create_and_populate_export_node(anim_dict, skeletons, uproject, log_path, cmd_path, export_directory, namespace_skeleton_map)

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:224

Data is passed from the UI, likely wont need to call from Maya directly (just separating out cmds calls into this file) :param anim_dict: :param skeletons: :param uproject: :param log_path: :param cmd_path: :param export_directory: :param n

get_export_node_data

def get_export_node_data()

module function · public name · maya_tools/Cinematics/SequenceUI/sequence_utils.py:254

maya_tools.maya_menu

log

def log(message)

module function · public name · maya_tools/maya_menu.py:45

log_exception

def log_exception(message)

module function · public name · maya_tools/maya_menu.py:49

maya_execute_and_capture

def maya_execute_and_capture(encoded_code, bridge_session='')

module function · public name · maya_tools/maya_menu.py:54

_bridge_error

def _bridge_error(message, code='bridge_request_failed')

module function · internal · maya_tools/maya_menu.py:110

_receive_bridge_payload

def _receive_bridge_payload(connection, maximum_bytes=_MAX_BRIDGE_REQUEST_BYTES)

module function · internal · maya_tools/maya_menu.py:114

_encode_bridge_response

def _encode_bridge_response(response)

module function · internal · maya_tools/maya_menu.py:126

_handle_bridge_client

def _handle_bridge_client(connection)

module function · internal · maya_tools/maya_menu.py:136

_run_bridge_client

def _run_bridge_client(connection)

module function · internal · maya_tools/maya_menu.py:169

_serve_authenticated_bridge

def _serve_authenticated_bridge(server)

module function · internal · maya_tools/maya_menu.py:176

_stop_authenticated_bridge

def _stop_authenticated_bridge()

module function · internal · maya_tools/maya_menu.py:205

_current_session_payload

def _current_session_payload(port)

module function · internal · maya_tools/maya_menu.py:219

_read_session_file

def _read_session_file()

module function · internal · maya_tools/maya_menu.py:231

_write_session_file

def _write_session_file(sessions)

module function · internal · maya_tools/maya_menu.py:240

save_session_to_file

def save_session_to_file(port)

module function · public name · maya_tools/maya_menu.py:251

cleanup_command_port_files

def cleanup_command_port_files(*args)

module function · public name · maya_tools/maya_menu.py:262

save_port_to_file

def save_port_to_file(port)

module function · public name · maya_tools/maya_menu.py:283

get_command_port

def get_command_port()

module function · public name · maya_tools/maya_menu.py:299

send_command

def send_command(command, port=COMMAND_PORT_START)

module function · public name · maya_tools/maya_menu.py:303

_is_port_open

def _is_port_open(port)

module function · internal · maya_tools/maya_menu.py:335

_close_legacy_tech_connector_command_ports

def _close_legacy_tech_connector_command_ports()

module function · internal · maya_tools/maya_menu.py:344

create_command_port

def create_command_port(port=COMMAND_PORT_START, stp='python')

module function · public name · maya_tools/maya_menu.py:385

initialize_command_port

def initialize_command_port()

module function · public name · maya_tools/maya_menu.py:433

Start Maya's localhost bridge; authorize each request at execution. The listener must be available from Maya startup even when Tech Connector is activated later. ``_handle_bridge_client`` validates the current per-user session token before

on_before_save

def on_before_save(*args)

module function · public name · maya_tools/maya_menu.py:453

remove_save_callback

def remove_save_callback()

module function · public name · maya_tools/maya_menu.py:471

_register_exit_cleanup

def _register_exit_cleanup()

module function · internal · maya_tools/maya_menu.py:486

_register_before_save_job

def _register_before_save_job()

module function · internal · maya_tools/maya_menu.py:502

Register a real Maya API save callback instead of scriptJob. This avoids invalid scriptJob events like 'BeforeSave' in Maya 2023.

_get_maya_main_window

def _get_maya_main_window()

module function · internal · maya_tools/maya_menu.py:524

_show_sequence_ui

def _show_sequence_ui(*args)

module function · internal · maya_tools/maya_menu.py:531

_show_hik_ui

def _show_hik_ui(*args)

module function · internal · maya_tools/maya_menu.py:539

_transfer_fbx_animation_to_controls

def _transfer_fbx_animation_to_controls(*args)

module function · internal · maya_tools/maya_menu.py:549

create_maya_menu

def create_maya_menu()

module function · public name · maya_tools/maya_menu.py:557

create_menu_once

def create_menu_once()

module function · public name · maya_tools/maya_menu.py:602

maya_tools.maya_setup

update_maya_script_path

def update_maya_script_path(new_path)

module function · public name · maya_tools/maya_setup.py:10

Update MAYA_SCRIPT_PATH environment variable for the current Windows user.

find_or_create_user_setup

def find_or_create_user_setup()

module function · public name · maya_tools/maya_setup.py:32

Create or refresh the current profile's authenticated Maya startup.

add_tools_to_user_setup

def add_tools_to_user_setup(tools_dir)

module function · public name · maya_tools/maya_setup.py:61

Add sys.path.append for tools_dir into userSetup.py if not present.

install_current_maya_tools

def install_current_maya_tools()

module function · public name · maya_tools/maya_setup.py:94

Install the current checkout into Maya; never runs merely on import.

maya_tools.Rigging.auto_skinner

_as_mesh_transform

def _as_mesh_transform(node: str) -> str

module function · internal · maya_tools/Rigging/auto_skinner.py:45

find_skin_cluster

def find_skin_cluster(mesh: str) -> Optional[str]

module function · public name · maya_tools/Rigging/auto_skinner.py:62

get_joint_position

def get_joint_position(joint: str) -> om.MVector

module function · public name · maya_tools/Rigging/auto_skinner.py:69

_short_name

def _short_name(node: str) -> str

module function · internal · maya_tools/Rigging/auto_skinner.py:73

_find_joint_by_terms

def _find_joint_by_terms(joints: Sequence[str], terms: Sequence[str]) -> Optional[str]

module function · internal · maya_tools/Rigging/auto_skinner.py:77

_find_first_existing_joint

def _find_first_existing_joint(joints: Sequence[str], term_sets: Sequence[Sequence[str]]) -> Optional[str]

module function · internal · maya_tools/Rigging/auto_skinner.py:85

get_skin_joints

def get_skin_joints(root_joint: str, include_ignored: bool=False) -> List[str]

module function · public name · maya_tools/Rigging/auto_skinner.py:93

build_bone_segments

def build_bone_segments(joints: Sequence[str]) -> List[Tuple[str, str]]

module function · public name · maya_tools/Rigging/auto_skinner.py:114

build_cached_bone_segments

def build_cached_bone_segments(joints: Sequence[str]) -> List[BindSegment]

module function · public name · maya_tools/Rigging/auto_skinner.py:127

closest_point_on_segment

def closest_point_on_segment(point: om.MVector, a: om.MVector, b: om.MVector) -> Tuple[om.MVector, float]

module function · public name · maya_tools/Rigging/auto_skinner.py:135

get_mesh_vertices

def get_mesh_vertices(mesh: str) -> List[str]

module function · public name · maya_tools/Rigging/auto_skinner.py:147

normalize_and_limit_weights

def normalize_and_limit_weights(weights: WeightList, max_influences: int=DEFAULT_MAX_INFLUENCES) -> WeightList

module function · public name · maya_tools/Rigging/auto_skinner.py:152

build_default_shoulder_profile

def build_default_shoulder_profile(joints: Sequence[str]) -> dict

module function · public name · maya_tools/Rigging/auto_skinner.py:164

save_shoulder_profile

def save_shoulder_profile(profile: dict, path: str) -> str

module function · public name · maya_tools/Rigging/auto_skinner.py:204

load_shoulder_profile

def load_shoulder_profile(path: str) -> dict

module function · public name · maya_tools/Rigging/auto_skinner.py:213

_vertex_weight_for_joint

def _vertex_weight_for_joint(skin: str, vertex: str, joint: str) -> float

module function · internal · maya_tools/Rigging/auto_skinner.py:218

learn_shoulder_profile_from_skin

def learn_shoulder_profile_from_skin(mesh: str, root_joint: str='origin', radius_scale: float=0.45, min_vertices: int=6) -> dict

module function · public name · maya_tools/Rigging/auto_skinner.py:228

learn_shoulder_profile_from_selected

def learn_shoulder_profile_from_selected(root_joint: str='origin', output_path: Optional[str]=None, radius_scale: float=0.45) -> dict

module function · public name · maya_tools/Rigging/auto_skinner.py:277

apply_shoulder_profile_to_weights

def apply_shoulder_profile_to_weights(pos: om.MVector, weights: WeightList, shoulder_profile: Optional[dict], blend_strength: float, max_influences: int) -> WeightList

module function · public name · maya_tools/Rigging/auto_skinner.py:296

apply_shoulder_profile_to_skin

def apply_shoulder_profile_to_skin(mesh: str, skin: str, shoulder_profile: Optional[dict], blend_strength: float=0.35, max_influences: int=DEFAULT_MAX_INFLUENCES) -> None

module function · public name · maya_tools/Rigging/auto_skinner.py:329

resolve_shoulder_profile

def resolve_shoulder_profile(shoulder_profile: Optional[object], joints: Sequence[str]) -> Optional[dict]

module function · public name · maya_tools/Rigging/auto_skinner.py:359

bind_mesh

def bind_mesh(mesh: str, joints: Sequence[str], max_influences: int=DEFAULT_MAX_INFLUENCES, replace_existing: bool=False, bind_method: int=DEFAULT_BIND_METHOD) -> str

module function · public name · maya_tools/Rigging/auto_skinner.py:375

run_geodesic_voxel_bind

def run_geodesic_voxel_bind(skin_cluster: str, max_influences: int=DEFAULT_MAX_INFLUENCES, falloff: float=0.0, voxel_resolution: int=256, validate_voxels: bool=True) -> bool

module function · public name · maya_tools/Rigging/auto_skinner.py:409

solve_vertex_weights

def solve_vertex_weights(vertex: str, segments: Sequence[Tuple[str, str]], max_influences: int=DEFAULT_MAX_INFLUENCES, falloff_power: float=2.0) -> List[Tuple[str, float]]

module function · public name · maya_tools/Rigging/auto_skinner.py:433

solve_vertex_weights_from_position

def solve_vertex_weights_from_position(pos: om.MVector, segments: Sequence[BindSegment], max_influences: int=DEFAULT_MAX_INFLUENCES, falloff_power: float=2.0) -> List[Tuple[str, float]]

module function · public name · maya_tools/Rigging/auto_skinner.py:451

apply_auto_weights

def apply_auto_weights(mesh: str, root_joint: str, max_influences: int=DEFAULT_MAX_INFLUENCES, replace_existing_skin: bool=False, falloff_power: float=2.0, bind_method: int=DEFAULT_BIND_METHOD, custom_distance_weights: bool=True, geodesic_voxel_falloff: float=0.0, geodesic_voxel_resolution: int=256, shoulder_profile: Optional[object]=None, shoulder_blend_strength: float=0.0) -> str

module function · public name · maya_tools/Rigging/auto_skinner.py:475

smooth_skin_weights

def smooth_skin_weights(mesh: str, iterations: int=2) -> Optional[str]

module function · public name · maya_tools/Rigging/auto_skinner.py:570

auto_skin_mesh

def auto_skin_mesh(mesh: str, root_joint: str='origin', max_influences: int=DEFAULT_MAX_INFLUENCES, smooth_iterations: int=2, replace_existing_skin: bool=False, falloff_power: float=2.0, bind_method: int=DEFAULT_BIND_METHOD, custom_distance_weights: bool=True, geodesic_voxel_falloff: float=0.0, geodesic_voxel_resolution: int=256, shoulder_profile: Optional[object]=None, shoulder_blend_strength: float=0.0) -> str

module function · public name · maya_tools/Rigging/auto_skinner.py:588

auto_skin_selected

def auto_skin_selected(root_joint: str='origin', max_influences: int=DEFAULT_MAX_INFLUENCES, smooth_iterations: int=2, replace_existing_skin: bool=False, falloff_power: float=2.0, bind_method: int=DEFAULT_BIND_METHOD, custom_distance_weights: bool=True, geodesic_voxel_falloff: float=0.0, geodesic_voxel_resolution: int=256, shoulder_profile: Optional[object]=None, shoulder_blend_strength: float=0.0) -> str

module function · public name · maya_tools/Rigging/auto_skinner.py:622

maya_tools.Rigging.build_vehicle_rig_template

_string_attr

def _string_attr(node: str, name: str, value: str) -> None

module function · internal · maya_tools/Rigging/build_vehicle_rig_template.py:29

_double_attr

def _double_attr(node: str, name: str, value: float, *, minimum: float=0.0) -> None

module function · internal · maya_tools/Rigging/build_vehicle_rig_template.py:34

_bool_attr

def _bool_attr(node: str, name: str, value: bool) -> None

module function · internal · maya_tools/Rigging/build_vehicle_rig_template.py:39

_role

def _role(node: str, value: str) -> None

module function · internal · maya_tools/Rigging/build_vehicle_rig_template.py:44

build

def build(output_path: Path=OUTPUT_PATH) -> Path

module function · public name · maya_tools/Rigging/build_vehicle_rig_template.py:48

maya_tools.Rigging.create_rig

_mapped_existing_joint

def _mapped_existing_joint(mapping, slot)

module function · internal · maya_tools/Rigging/create_rig.py:107

Return a mapped joint only when it exists in the Maya scene. :param mapping: mapping for mapping :param slot: slot :return: result

_mapped_existing_joints

def _mapped_existing_joints(mapping, slot)

module function · internal · maya_tools/Rigging/create_rig.py:128

Return only existing joints from a mapped multi-joint slot. :param mapping: mapping for mapping :param slot: slot :return: result

_filter_existing_face_joint_map

def _filter_existing_face_joint_map(face_joint_map)

module function · internal · maya_tools/Rigging/create_rig.py:149

Copy a face mapping while removing joints that do not exist. Missing single-joint slots become None. Missing joints are removed from multi-joint slots so modules never receive invalid scene nodes. :param face_joint_map: mapping for face joi

hik_map_to_rig_args

def hik_map_to_rig_args(body_joint_map, face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:188

Translate body and face mappings into rig arguments. Only joints that exist in the scene are included. Face slots are read from face_joint_map rather than body_joint_map. :param body_joint_map: mapping for body joint map :param face_joint_m

create_brow_main_setup

def create_brow_main_setup(side, root_parent='head1_ctrl')

module function · public name · maya_tools/Rigging/create_rig.py:319

Creates the main eyebrows setup, snapping it to the middle brow control. :param side: Left or right side (l/r) :param root_parent: Parent control node name :return: dict

_safe_rename_hierarchy_tokens

def _safe_rename_hierarchy_tokens(root_node, replacements, delete_shapes_on_driver=True)

module function · internal · maya_tools/Rigging/create_rig.py:403

Rename an entire hierarchy by applying ordered token replacements to every node name, leaf-to-root. :param root_node: Root transform of hierarchy :param replacements: Ordered string replacements list of tuples :param delete_shapes_on_driver

rename_brow_pad_hierarchies

def rename_brow_pad_hierarchies(side)

module function · public name · maya_tools/Rigging/create_rig.py:461

Rename these hierarchies for the given side: 1. side_browX_ctrl_pad -> side_browX_driver_pad and rename entire hierarchy ctrl -> driver 2. side_browX_main_ctrl_pad -> side_browX_ctrl_pad and rename entire hierarchy main_ctrl -> ctrl Also de

setup_secondary_face_constraints

def setup_secondary_face_constraints(face_joint_map=None, head_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:513

Setup secondary face constraints. :param face_joint_map: mapping for face joint map :param head_ctrl: head ctrl :return:

safe_constrain_two_parents

def safe_constrain_two_parents(controls, parent1, parent2, **kwargs)

module function · public name · maya_tools/Rigging/create_rig.py:569

Safe constrain two parents. :param controls: list of controls :param parent1: parent1 :param parent2: parent2 :param kwargs: list of kwargs :return:

hide_post_build_face_nodes

def hide_post_build_face_nodes(node_names=POST_BUILD_HIDDEN_FACE_NODES)

module function · public name · maya_tools/Rigging/create_rig.py:634

Hide the internal face joints that should not remain visible to animators.

create_full_rig

def create_full_rig(arm_joints=None, leg_joints=None, spine_joints=None, neck_joints=None, root_joints=None, hip_swing='hipswing', face_joint_map=None, face_joints=None, snap_rfl=True, shoe_meshes=None)

module function · public name · maya_tools/Rigging/create_rig.py:688

Builds the entire character rig by coordinating modular setup builders. :param arm_joints: list of mapped arm joints :param leg_joints: list or dict of mapped leg joints :param spine_joints: list of mapped spine joints :param neck_joints: l

set_all_limb_ik_fk_switches

def set_all_limb_ik_fk_switches(value=1.0)

module function · public name · maya_tools/Rigging/create_rig.py:929

Set every constructed arm/leg IK/FK switch to the build default.

_short_scene_name

def _short_scene_name(node)

module function · internal · maya_tools/Rigging/create_rig.py:946

_extension_base_name

def _extension_base_name(node)

module function · internal · maya_tools/Rigging/create_rig.py:950

Return the authored system stem for a joint/control hierarchy node.

_is_builder_owned_extension_root

def _is_builder_owned_extension_root(node, owned, known_bases)

module function · internal · maya_tools/Rigging/create_rig.py:981

Return whether an apparent extension root belongs to a fixed module. Old extension manifests can outlive the metadata bug that originally misclassified a face control. Match generated control-root naming only; custom systems with unrelated

_set_store_json

def _set_store_json(attribute, value)

module function · internal · maya_tools/Rigging/create_rig.py:999

_get_store_json

def _get_store_json(attribute, default=None)

module function · internal · maya_tools/Rigging/create_rig.py:1011

_node_reference

def _node_reference(node)

module function · internal · maya_tools/Rigging/create_rig.py:1024

Return a rename-tolerant scene reference with a readable fallback.

_resolve_node_reference

def _resolve_node_reference(reference)

module function · internal · maya_tools/Rigging/create_rig.py:1034

Resolve a stored node reference by UUID first and name second.

get_dynamic_rig_modules

def get_dynamic_rig_modules()

module function · public name · maya_tools/Rigging/create_rig.py:1053

Return ordered tool-authored module build records stored in the scene.

_save_dynamic_rig_modules

def _save_dynamic_rig_modules(records)

module function · internal · maya_tools/Rigging/create_rig.py:1062

_capture_new_nodes

def _capture_new_nodes(before_uuids)

module function · internal · maya_tools/Rigging/create_rig.py:1066

Capture all nodes created since a UUID snapshot.

_scene_node_uuids

def _scene_node_uuids()

module function · internal · maya_tools/Rigging/create_rig.py:1076

Return all scene UUIDs without relying on Maya's argument-less ls mode.

_dynamic_build_inputs

def _dynamic_build_inputs(spec)

module function · internal · maya_tools/Rigging/create_rig.py:1086

_build_dynamic_module_record

def _build_dynamic_module_record(record)

module function · internal · maya_tools/Rigging/create_rig.py:1097

Build one registered module and refresh its generated-node ownership.

register_dynamic_rig_module

def register_dynamic_rig_module(module_id, module_type, build_spec, build_now=True)

module function · public name · maya_tools/Rigging/create_rig.py:1160

Register a tool-authored module and optionally build it immediately.

remove_dynamic_rig_modules_for_rebuild

def remove_dynamic_rig_modules_for_rebuild()

module function · public name · maya_tools/Rigging/create_rig.py:1196

Remove generated nodes while retaining every registered build recipe.

rebuild_dynamic_rig_modules

def rebuild_dynamic_rig_modules()

module function · public name · maya_tools/Rigging/create_rig.py:1216

Rebuild all enabled dynamic modules in their original creation order.

set_dynamic_rig_module_active

def set_dynamic_rig_module_active(module_id, active)

module function · public name · maya_tools/Rigging/create_rig.py:1236

Remove or rebuild one registered module while retaining its recipe.

dynamic_module_spec

def dynamic_module_spec(joints, parent=None, **settings)

module function · public name · maya_tools/Rigging/create_rig.py:1264

Create the persistent input specification used by rigging UI widgets.

repair_preserved_extension_body_mapping

def repair_preserved_extension_body_mapping(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:1274

Keep preserved user systems out of fixed HumanIK body module slots. Auto-detection can map a later user joint branch (for example baby_neck) into the standard Neck/Head slots. During rebuild that would create a second control with the same

_metadata_rig_ownership

def _metadata_rig_ownership()

module function · internal · maya_tools/Rigging/create_rig.py:1343

Return builder-owned nodes, base joints, and known authored stems.

record_rig_owned_nodes

def record_rig_owned_nodes()

module function · public name · maya_tools/Rigging/create_rig.py:1400

Record the exact builder-owned scene nodes before extensions reattach.

_current_rig_ownership

def _current_rig_ownership()

module function · internal · maya_tools/Rigging/create_rig.py:1456

Resolve the latest exact ownership snapshot, with legacy fallback.

_extension_boundary_roots

def _extension_boundary_roots(owned, base_joints, known_bases)

module function · internal · maya_tools/Rigging/create_rig.py:1483

Find unowned control branches attached to the generated rig. Extra deformation joints remain safe beneath the source skeleton during teardown. Only control DAG branches must be detached from control parents that the builder replaces.

_constraint_record

def _constraint_record(node)

module function · internal · maya_tools/Rigging/create_rig.py:1521

_node_from_plug

def _node_from_plug(plug)

module function · internal · maya_tools/Rigging/create_rig.py:1555

_cross_boundary_connections

def _cross_boundary_connections(extension_nodes, owned, constraint_nodes)

module function · internal · maya_tools/Rigging/create_rig.py:1559

preserve_post_build_extensions

def preserve_post_build_extensions()

module function · public name · maya_tools/Rigging/create_rig.py:1595

Detach and store every post-build system crossing the rig boundary.

_resolve_unique_node

def _resolve_unique_node(name)

module function · internal · maya_tools/Rigging/create_rig.py:1730

_additional_system_display_name

def _additional_system_display_name(name)

module function · internal · maya_tools/Rigging/create_rig.py:1735

Return a concise animator-facing label for an authored system root.

_normalize_extension_manifest_state

def _normalize_extension_manifest_state(manifest)

module function · internal · maya_tools/Rigging/create_rig.py:1745

Clear a stale preserved flag once every saved root is reattached.

get_external_rig_systems

def get_external_rig_systems(discover_live=True)

module function · public name · maya_tools/Rigging/create_rig.py:1765

Return user-authored control systems attached around the generated rig. Saved manifest roots remain an inventory after restoration. A live scan also exposes newly-authored systems before the first Remove/Rebuild cycle. Builder-owned systems

get_embedded_secondary_arm_systems

def get_embedded_secondary_arm_systems()

module function · public name · maya_tools/Rigging/create_rig.py:1832

Discover complete secondary arm modules embedded in the core rig. Divine Being's extra arms are authored beneath the main control hierarchy, so the general external-extension scanner correctly treats them as owned core nodes. Expose their c

_short_plug

def _short_plug(plug)

module function · internal · maya_tools/Rigging/create_rig.py:1924

_system_hierarchy_nodes

def _system_hierarchy_nodes(root)

module function · internal · maya_tools/Rigging/create_rig.py:1929

_boundary_constraint_records

def _boundary_constraint_records(system_nodes)

module function · internal · maya_tools/Rigging/create_rig.py:1941

_all_boundary_connections

def _all_boundary_connections(system_nodes, constraint_nodes=(), include_internal=False)

module function · internal · maya_tools/Rigging/create_rig.py:1958

Capture non-message DG links touching a system hierarchy.

inspect_external_rig_system

def inspect_external_rig_system(root, manifest=None)

module function · public name · maya_tools/Rigging/create_rig.py:1998

Return every saved/live connection that crosses one system boundary.

inspect_dynamic_rig_module

def inspect_dynamic_rig_module(record)

module function · public name · maya_tools/Rigging/create_rig.py:2039

Return live boundary details for one recipe-backed added module.

set_external_rig_system_active

def set_external_rig_system_active(root, active)

module function · public name · maya_tools/Rigging/create_rig.py:2068

Reversibly attach or detach one user-authored system.

_restore_constraint

def _restore_constraint(record)

module function · internal · maya_tools/Rigging/create_rig.py:2172

restore_post_build_extensions

def restore_post_build_extensions()

module function · public name · maya_tools/Rigging/create_rig.py:2200

Reattach preserved extension systems to the newly generated rig.

remove_full_rig

def remove_full_rig(body_joint_map, face_joint_map=None)

module function · public name · maya_tools/Rigging/create_rig.py:2295

Removes all controls, rig nodes, and clears the Do_Not_Touch group. :param body_joint_map: body joint mapping dictionary :param face_joint_map: face joint mapping dictionary :return: None

create_rig_from_mapping

def create_rig_from_mapping(body_joint_map, face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:2373

Runs create_full_rig using the mapped joints from HIK/Face mappings. :param body_joint_map: body joint mapping dictionary :param face_joint_map: face joint mapping dictionary :return: None

query_space_switches

def query_space_switches(driven)

module function · public name · maya_tools/Rigging/create_rig.py:2444

Queries and returns any space switches driving 'driven' checking control and pad levels. :param driven: control node to query :return: list[dict]

delete_unused_scaffold_nodes

def delete_unused_scaffold_nodes()

module function · public name · maya_tools/Rigging/create_rig.py:2545

Delete unused scaffold and temporary nodes without removing rig drivers. A ``*_main`` joint with a matching control (or parented beneath a control) is a persistent surface driver used by the lips, brows, and eyelids. It must survive even if

rig_brows_module

def rig_brows_module(side, face_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:2606

Builds the eyebrows setup with lofted surfaces and driver controls. :param side: left or right side (l/r) :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_brows_module

def remove_brows_module(side, face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:2642

Removes all controls and constraints built for eyebrows. :param side: left or right side (l/r) :param face_joint_map: face joint mapping dictionary :return: int

rig_eyelids_module

def rig_eyelids_module(side, face_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:2669

Builds the eyelids setup with lofted surfaces and driver controls. :param side: left or right side (l/r) :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :return: None

get_ordered_hierarchy

def get_ordered_hierarchy(root)

module function · public name · maya_tools/Rigging/create_rig.py:2739

Gets ordered hierarchy. :param root: root :return: result

duplicate_static_hierarchy

def duplicate_static_hierarchy(root, suffix='static')

module function · public name · maya_tools/Rigging/create_rig.py:2762

Duplicate static hierarchy. :param root: root :param suffix: suffix :return: result

remove_eyelids_module

def remove_eyelids_module(side, face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:2805

Removes all controls and constraints built for eyelids. :param side: left or right side (l/r) :param face_joint_map: face joint mapping dictionary :return: int

rig_mouth_module

def rig_mouth_module(face_joint_map, parent_ctrl=None, jaw_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:2876

Builds the mouth setup with lofted surfaces, follicle controls, and jaw drivers. :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :param jaw_ctrl: jaw control node name :return: None

remove_mouth_module

def remove_mouth_module(face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:2955

Removes all controls and constraints built for the mouth. :param face_joint_map: face joint mapping dictionary :return: int

rig_eyes_module

def rig_eyes_module(face_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:3025

Builds the eye aim control setup. :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_eyes_module

def remove_eyes_module(face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:3064

Removes all controls built for the eyes. :param face_joint_map: face joint mapping dictionary :return: int

rig_tongue_module

def rig_tongue_module(face_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:3099

Builds the tongue controls setup. :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_tongue_module

def remove_tongue_module(face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:3128

Removes all controls built for the tongue. :param face_joint_map: face joint mapping dictionary :return: int

rig_teeth_module

def rig_teeth_module(face_joint_map, parent_ctrl=None, jaw_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:3147

Builds the upper and lower teeth controls setup. :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :param jaw_ctrl: jaw control node name :return: None

remove_teeth_module

def remove_teeth_module(face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:3182

Removes all controls built for the teeth. :param face_joint_map: face joint mapping dictionary :return: int

rig_other_face_module

def rig_other_face_module(face_joint_map, parent_ctrl=None, jaw_ctrl=None, jaw_joint=None)

module function · public name · maya_tools/Rigging/create_rig.py:3202

Rig other face module. :param face_joint_map: mapping for face joint map :param parent_ctrl: parent ctrl :param jaw_ctrl: jaw ctrl :param jaw_joint: jaw joint :return:

remove_other_face_module

def remove_other_face_module(face_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:3337

Removes all secondary controls built for other face joints. :param face_joint_map: face joint mapping dictionary :return: int

rig_arm_module

def rig_arm_module(side, body_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:3353

Rigs the Arm (IK/FK limb, Fingers, and Twist surface rigs). :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

_find_parent_joint_control

def _find_parent_joint_control(joint)

module function · internal · maya_tools/Rigging/create_rig.py:3556

Walk up the joint hierarchy from joint and return the first ancestor control. :param joint: joint name to search from :return: str or None

_capture_orphaned_space_switch_roles

def _capture_orphaned_space_switch_roles(module_controls, module_name)

module function · internal · maya_tools/Rigging/create_rig.py:3581

Before removing a module, scan every OTHER control in the scene for space switches that list any of module_controls as a target. The original ordered (target, display_name) pairs are stored inside GLOBAL_RIG_STORE[module_name]["orphaned_rol

_restore_orphaned_space_switch_roles

def _restore_orphaned_space_switch_roles(module_name, rebuilt_ctrl_map=None)

module function · internal · maya_tools/Rigging/create_rig.py:3645

After a module is rebuilt, re-insert its controls into every space switch that previously referenced them, restoring the original enum index order. :param module_name: name of the module being restored :param rebuilt_ctrl_map: optional dict

_delete_space_switch_for_ctrl

def _delete_space_switch_for_ctrl(ctrl, attr_name='space')

module function · internal · maya_tools/Rigging/create_rig.py:3694

Remove all space-switch scaffolding for ctrl by traversing the scene graph. :param ctrl: control node name :param attr_name: name of the enum attribute to delete :return: None

_short_node_name

def _short_node_name(node)

module function · internal · maya_tools/Rigging/create_rig.py:3761

Short node name. :param node: node :return: result

_base_from_joint

def _base_from_joint(joint)

module function · internal · maya_tools/Rigging/create_rig.py:3772

Base from joint. :param joint: joint :return: result

_unique_existing_nodes

def _unique_existing_nodes(nodes, include_missing=False)

module function · internal · maya_tools/Rigging/create_rig.py:3782

Unique existing nodes. :param nodes: list of nodes :param include_missing: include missing :return: result

_pad_for_ctrl

def _pad_for_ctrl(ctrl)

module function · internal · maya_tools/Rigging/create_rig.py:3803

Pad for ctrl. :param ctrl: ctrl :return: result

_safe_delete_nodes

def _safe_delete_nodes(nodes)

module function · internal · maya_tools/Rigging/create_rig.py:3815

Safe delete nodes. :param nodes: list of nodes :return: result

_controls_from_joint_controls

def _controls_from_joint_controls(joints)

module function · internal · maya_tools/Rigging/create_rig.py:3829

Controls from joint controls. :param joints: list of joints :return: result

_is_rfl_pivot_joint

def _is_rfl_pivot_joint(node)

module function · internal · maya_tools/Rigging/create_rig.py:3844

Is rfl pivot joint. :param node: node :return: result

_rfl_pivot_joints

def _rfl_pivot_joints(side=None)

module function · internal · maya_tools/Rigging/create_rig.py:3863

Rfl pivot joints. :param side: side :return: result

preserve_rfl_pivot_joints

def preserve_rfl_pivot_joints(side=None)

module function · public name · maya_tools/Rigging/create_rig.py:3881

Preserve rfl pivot joints. :param side: side :return: result

_metadata_joint_nodes

def _metadata_joint_nodes(metadata)

module function · internal · maya_tools/Rigging/create_rig.py:3911

Metadata joint nodes. :param metadata: metadata :return: result

_safe_scene_nodes_by_prefix

def _safe_scene_nodes_by_prefix(prefixes)

module function · internal · maya_tools/Rigging/create_rig.py:3973

Safe scene nodes by prefix. :param prefixes: list of prefixes :return: result

_module_prefixes

def _module_prefixes(module_id, metadata)

module function · internal · maya_tools/Rigging/create_rig.py:3995

Module prefixes. :param module_id: module id :param metadata: metadata :return: result

_connected_module_nodes

def _connected_module_nodes(seed_nodes, prefixes=None)

module function · internal · maya_tools/Rigging/create_rig.py:4047

Connected module nodes. :param seed_nodes: list of seed nodes :param prefixes: list of prefixes :return: result

_discover_module_controls

def _discover_module_controls(module_id, metadata)

module function · internal · maya_tools/Rigging/create_rig.py:4099

Discover module controls. :param module_id: module id :param metadata: metadata :return: result

_discover_module_cleanup_nodes

def _discover_module_cleanup_nodes(module_id, metadata)

module function · internal · maya_tools/Rigging/create_rig.py:4155

Discover module cleanup nodes. :param module_id: module id :param metadata: metadata :return: result

_prepare_module_metadata_for_save

def _prepare_module_metadata_for_save(module_id, data_dict)

module function · internal · maya_tools/Rigging/create_rig.py:4187

Prepares module metadata for save. :param module_id: module id :param data_dict: mapping for data dict :return: result

_get_module_controls_for_removal

def _get_module_controls_for_removal(module_id, fallback_controls=None)

module function · internal · maya_tools/Rigging/create_rig.py:4212

Gets module controls for removal. :param module_id: module id :param fallback_controls: list of fallback controls :return: result

get_module_controls

def get_module_controls(module_id, existing_only=True)

module function · public name · maya_tools/Rigging/create_rig.py:4226

Return controls recorded/discovered for a stored rig module. :param module_id: unique module identifier :param existing_only: only return controls that exist in the current scene :return: list[str]

_rebuild_identity_key

def _rebuild_identity_key(node_name)

module function · internal · maya_tools/Rigging/create_rig.py:4238

Return a conservative role key for matching controls across rebuilds.

_capture_control_shape_snapshot

def _capture_control_shape_snapshot(ctrl)

module function · internal · maya_tools/Rigging/create_rig.py:4251

Capture editable NURBS control CVs without depending on shape names.

_capture_control_shape_holder

def _capture_control_shape_holder(ctrl)

module function · internal · maya_tools/Rigging/create_rig.py:4266

Instance a control's exact curve shapes into a hidden rebuild holder.

_restore_control_shape_holder

def _restore_control_shape_holder(ctrl, holder, shape_snapshot=None)

module function · internal · maya_tools/Rigging/create_rig.py:4289

Replace rebuilt curves with the exact instanced shapes saved pre-removal.

_control_pad_hierarchy

def _control_pad_hierarchy(ctrl)

module function · internal · maya_tools/Rigging/create_rig.py:4326

Return only the conventional SDK/pad parents for a control.

_restore_control_shape_snapshot

def _restore_control_shape_snapshot(ctrl, shape_snapshot)

module function · internal · maya_tools/Rigging/create_rig.py:4344

Restore captured CVs when the rebuilt curve topology is unambiguous.

capture_module_rebuild_identity

def capture_module_rebuild_identity(module_id, controls=None)

module function · public name · maya_tools/Rigging/create_rig.py:4388

Persist live control/space names and control shapes before module removal.

_unique_rebuild_role_map

def _unique_rebuild_role_map(records)

module function · internal · maya_tools/Rigging/create_rig.py:4440

Return role -> record only for roles that occur exactly once.

_rename_rebuilt_node

def _rename_rebuilt_node(node, desired_name)

module function · internal · maya_tools/Rigging/create_rig.py:4450

Rename one rebuilt node without overwriting a live scene node.

restore_module_rebuild_identity

def restore_module_rebuild_identity(module_id)

module function · public name · maya_tools/Rigging/create_rig.py:4466

Restore uniquely matched legacy names, spaces, and control CV shapes.

_delete_module_from_metadata

def _delete_module_from_metadata(module_id, fallback_nodes=None, fallback_controls=None, protected_nodes=None, prefer_fallback=False)

module function · internal · maya_tools/Rigging/create_rig.py:4593

Deletes module from metadata. :param module_id: module id :param fallback_nodes: list of fallback nodes :param fallback_controls: list of fallback controls :return: result

remove_arm_module

def remove_arm_module(side, body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:4646

Remove rig nodes and space switches for the given arm side. :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :return: int

resolve_rfl_joints

def resolve_rfl_joints(side)

module function · public name · maya_tools/Rigging/create_rig.py:4680

Resolve an existing reverse-foot hierarchy. Supports both the newer toe pivot name and older/manual ball pivot name: <side>_toe_RFL <side>_ball_RFL Returns joints in the order expected by build_rfl_ik_and_constraints: heel, outerBank, inner

create_rfl_joints_template

def create_rfl_joints_template(side, ankle_jnt, toe_jnt, toe_tip_jnt)

module function · public name · maya_tools/Rigging/create_rig.py:4745

Creates RFL template joints heel > outerBank > innerBank > toeTip > toe > ankle. :param side: side :param ankle_jnt: ankle jnt :param toe_jnt: toe jnt :param toe_tip_jnt: toe tip jnt :return: result

rig_leg_module

def rig_leg_module(side, body_joint_map, parent_ctrl=None, snap_rfl=True, shoe_meshes=None)

module function · public name · maya_tools/Rigging/create_rig.py:4788

Rigs the Leg (IK/FK limb, Twist surface rigs, foot roll RFL, and switches). :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_leg_module

def remove_leg_module(side, body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5128

Remove rig nodes and RFL setups for the given leg side. :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :return: int

rig_root_module

def rig_root_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5174

Builds the root origin control setup. :param body_joint_map: body joint mapping dictionary :return: None

remove_root_module

def remove_root_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5196

Removes the root origin control setup. :param body_joint_map: body joint mapping dictionary :return: int

rig_pelvis_module

def rig_pelvis_module(body_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:5208

Builds the pelvis and hipswing control setup. :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_pelvis_module

def remove_pelvis_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5251

Removes the pelvis and hipswing control setup. :param body_joint_map: body joint mapping dictionary :return: int

rig_spine_module

def rig_spine_module(body_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:5270

Builds the spine control setup. :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_spine_module

def remove_spine_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5359

Removes the spine control setup. :param body_joint_map: body joint mapping dictionary :return: int

rig_neck_module

def rig_neck_module(body_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:5379

Builds the neck control setup and space switches. :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_neck_module

def remove_neck_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5441

Removes the neck control setup. :param body_joint_map: body joint mapping dictionary :return: int

rig_head_module

def rig_head_module(body_joint_map, face_joint_map=None, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:5461

Builds the head control setup and space switches. :param body_joint_map: body joint mapping dictionary :param face_joint_map: face joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_head_module

def remove_head_module(body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5501

Removes the head control setup. :param body_joint_map: body joint mapping dictionary :return: int

_module_attr_name

def _module_attr_name(module_id)

module function · internal · maya_tools/Rigging/create_rig.py:5511

Normalise a module ID to a valid Maya attribute name. :param module_id: unique module identifier :return: str

save_module_metadata

def save_module_metadata(module_id, data_dict)

module function · public name · maya_tools/Rigging/create_rig.py:5523

Persist data_dict for module_id on the scene-level store node. :param module_id: unique module identifier :param data_dict: dictionary containing module properties :return: None

load_module_metadata

def load_module_metadata(module_id)

module function · public name · maya_tools/Rigging/create_rig.py:5549

Return the stored dict for module_id, or {} if not found. :param module_id: unique module identifier :return: dict

get_all_module_metadata

def get_all_module_metadata()

module function · public name · maya_tools/Rigging/create_rig.py:5568

Return {module_id: data_dict} for every stored module. :return: dict

clear_module_metadata

def clear_module_metadata(module_id)

module function · public name · maya_tools/Rigging/create_rig.py:5587

Mark a module as not built while keeping its joint/parent info. :param module_id: unique module identifier :return: None

store_rig_connections

def store_rig_connections(controls_list, module_name)

module function · public name · maya_tools/Rigging/create_rig.py:5598

Queries space switches, external constraints, and output connections for controls_list and stores them in GLOBAL_RIG_STORE[module_name]. :param controls_list: list of control nodes to query :param module_name: name of the module :return: No

rebuild_all_space_switches

def rebuild_all_space_switches()

module function · public name · maya_tools/Rigging/create_rig.py:5673

Rebuilds all space switches in the scene using stored connections to ensure they are perfectly aligned with newly oriented controls.

_space_switch_targets_from_record

def _space_switch_targets_from_record(sw)

module function · internal · maya_tools/Rigging/create_rig.py:5682

Space switch targets from record. :param sw: sw :return: result

_space_switch_exists_in_scene

def _space_switch_exists_in_scene(sw)

module function · internal · maya_tools/Rigging/create_rig.py:5698

Space switch exists in scene. :param sw: sw :return: result

_constraint_exists

def _constraint_exists(driver, driven, constraint_type)

module function · internal · maya_tools/Rigging/create_rig.py:5719

Constraint exists. :param driver: driver :param driven: driven :param constraint_type: constraint type :return: result

restore_rig_connections

def restore_rig_connections(module_name)

module function · public name · maya_tools/Rigging/create_rig.py:5751

Restores space switches, constraints, and output connections stored for module_name. :param module_name: name of the module :return: int

rig_clavicle_module

def rig_clavicle_module(side, body_joint_map, parent_ctrl=None)

module function · public name · maya_tools/Rigging/create_rig.py:5848

Builds the Clavicle control setup. :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :param parent_ctrl: parent control node name :return: None

remove_clavicle_module

def remove_clavicle_module(side, body_joint_map)

module function · public name · maya_tools/Rigging/create_rig.py:5891

Removes the Clavicle control setup. :param side: left or right side (l/r) :param body_joint_map: body joint mapping dictionary :return: int

maya_tools.Rigging.create_rig_core

normalize_rfl_joint_suffixes

def normalize_rfl_joint_suffixes(side=None, namespace=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:61

Normalize existing reverse-foot joint suffixes to uppercase ``_RFL``. This is a rename-only migration: authored pivots, hierarchy, orientation, and node identity are retained. Ambiguous or occupied destinations are refused rather than guess

_get_joint

def _get_joint(body_joint_map, slot, default=None)

module function · internal · maya_tools/Rigging/create_rig_core.py:152

Gets joint. :param body_joint_map: mapping for body joint map :param slot: slot :param default: default :return: result

create_diamond_ctrl

def create_diamond_ctrl(name, size=1.0, normal=(0, 1, 0))

module function · public name · maya_tools/Rigging/create_rig_core.py:172

Creates a diamond-shaped nurbsCurve control. :param name: ctrl_name :param size: local size mult :param normal: relative direction :return:

create_prism_ctrl

def create_prism_ctrl(name, size=1.0, depth=0.5, normal=(0, 1, 0))

module function · public name · maya_tools/Rigging/create_rig_core.py:203

Creates a prism-shaped nurbsCurve control. :param name: control name :param size: horizontal/vertical scale of diamond :param depth: prism depth along Y-axis :param normal: vector to orient the prism along (default Y-up) :return:

create_cube_ctrl

def create_cube_ctrl(name, size=1.5)

module function · public name · maya_tools/Rigging/create_rig_core.py:251

Wireframe cube control :param name: control name :param size: local size mult :return:

snap_ctrl_cvs_to_child

def snap_ctrl_cvs_to_child(ctrl, child_joint, axis='x', flip_direction=False)

module function · public name · maya_tools/Rigging/create_rig_core.py:271

Snaps control CVs toward the child joint along a local axis. :param ctrl: control transform :param child_joint: child joint or pad :param axis: 'x', 'y', or 'z' (local axis to operate on) :param flip_direction: reverse child-facing side

create_sphere_ctrl

def create_sphere_ctrl(name, radius=1.5)

module function · public name · maya_tools/Rigging/create_rig_core.py:326

Creates a sphere-like control made of 3 rotated circles with proper shape parenting :param name: ctrl name :param radius: relative radius of sphere :return:

create_bi_arrow_ctrl

def create_bi_arrow_ctrl(name, size=1.2)

module function · public name · maya_tools/Rigging/create_rig_core.py:363

Two arrows pointing in opposite directions, rotated 90° around X-axis :param name: ctrl name :param size: relative size mult :return:

setup_show_twist_ctrls

def setup_show_twist_ctrls(side, limb, twist_joints=None, attr_nice_name='Show Twist Ctrls')

module function · public name · maya_tools/Rigging/create_rig_core.py:393

Setup show twist ctrls. :param side: side :param limb: limb :param twist_joints: list of twist joints :param attr_nice_name: attr nice name :return: result

_stretch_node_token

def _stretch_node_token(node)

module function · internal · maya_tools/Rigging/create_rig_core.py:461

Return a short Maya-safe token for stretch helper-node names.

_ensure_stretch_attr

def _ensure_stretch_attr(control, attr_name='stretch')

module function · internal · maya_tools/Rigging/create_rig_core.py:467

Create and return a keyable 0-1 stretch blend on ``control``.

_create_volume_stretch_network

def _create_volume_stretch_network(prefix, ratio_attr, volume_attr, driven_node, length_axis)

module function · internal · maya_tools/Rigging/create_rig_core.py:488

Preserve approximate volume by scaling axes perpendicular to length. Constant volume requires cross-sectional area to change by the inverse of the length ratio. Applying ``ratio ** -0.5`` to both perpendicular axes produces that area change

_joint_segment_axis

def _joint_segment_axis(joint)

module function · internal · maya_tools/Rigging/create_rig_core.py:525

Return the dominant local translate axis and its signed rest value.

_isolate_joint_from_parent_volume_scale

def _isolate_joint_from_parent_volume_scale(joint)

module function · internal · maya_tools/Rigging/create_rig_core.py:532

Prevent a rigid extremity joint from inheriting limb volume scaling.

_drive_fleshy_twist_joints_volume_scale

def _drive_fleshy_twist_joints_volume_scale(segment_joints, segment_length_axes, volume_scale_outputs)

module function · internal · maya_tools/Rigging/create_rig_core.py:557

Drive skinning twist influences with their segment's transverse scale.

_create_stretch_ratio_network

def _create_stretch_ratio_network(prefix, current_distance_attr, rest_length, stretch_attr, scale_reference=None, rest_length_attr=None, minimum_ratio=None)

module function · internal · maya_tools/Rigging/create_rig_core.py:592

Create a scale-aware stretch/compression ratio and return its output.

_create_distance_dimension

def _create_distance_dimension(prefix, start_position, end_position, start_parent=None, end_parent=None)

module function · internal · maya_tools/Rigging/create_rig_core.py:656

Create a hidden distanceDimension and return all nodes it owns.

_ensure_distance_nodes_group

def _ensure_distance_nodes_group()

module function · internal · maya_tools/Rigging/create_rig_core.py:694

Return the hidden ``Do_Not_Touch|distance_nodes`` DAG group.

_curve_world_up_vector

def _curve_world_up_vector(curve_shape)

module function · internal · maya_tools/Rigging/create_rig_core.py:725

Return a stable world-space normal for motion paths on a curve. Closed facial loops are especially prone to a single motionPath roll when Maya has to infer an up vector. A Newell-style normal computed from the curve CVs gives every sample t

create_joints_along_curve

def create_joints_along_curve(curve, joint_count=5, keep_attached=True, name_prefix=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:764

Create evenly spaced independent joints along a NURBS curve. When ``keep_attached`` is true, each joint is placed below a transform driven by its own fraction-mode motionPath node. Otherwise the evaluated world transforms are baked onto the

setup_spine_segment_stretch

def setup_spine_segment_stretch(spine_joints, control_data, pelvis_ctrl, scale_reference=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:860

Add per-bone distance stretch without replacing the existing FK spine.

_drive_stretch_segments

def _drive_stretch_segments(prefix, segment_joints, ratio_attr)

module function · internal · maya_tools/Rigging/create_rig_core.py:967

Drive signed local joint translations from a shared stretch ratio.

setup_ik_limb_stretch

def setup_ik_limb_stretch(ik_joints, ik_ctrl, switch_ctrl, scale_reference=None, setup_positions=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:990

Add bend-preserving stretch to a two-bone IK chain. The enabled ratio is measured against the chain's original root-to-end chord, not the sum of its two bone lengths. Dividing by the length sum makes the scaled bones exactly equal the targe

create_ik_fk_limb

def create_ik_fk_limb(sel, root_parent)

module function · public name · maya_tools/Rigging/create_rig_core.py:1107

Creates an IK/FK limb from either: - 3 joints (arm) - 4+ joints (leg with extra joints) Behavior is determined purely by joint count. :param sel: list of joints in the limb chain (top -> mid -> end -> optional extras) :param root_parent: tr

get_nose_joints

def get_nose_joints(face_joint_map=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:1676

Gets nose joints. :param face_joint_map: mapping for face joint map :return: result

set_sdk

def set_sdk(driver, driven_attr, keys)

module function · public name · maya_tools/Rigging/create_rig_core.py:1711

set driven key function :param driver: 'ctrl.attr' :param driven_attr: 'node.attr' :param keys: list of tuples [(driver_value, driven_value)] :return:

_connect_attr_once

def _connect_attr_once(source_attr, dest_attr, force=False)

module function · internal · maya_tools/Rigging/create_rig_core.py:1728

Connect source_attr to dest_attr only when that exact connection is missing. :param source_attr: source attr :param dest_attr: dest attr :param force: force :return: result

_clear_sdk_anim_curves

def _clear_sdk_anim_curves(driven_attrs)

module function · internal · maya_tools/Rigging/create_rig_core.py:1750

Clear sdk anim curves. :param driven_attrs: list of driven attrs :return:

ensure_rfl_attrs

def ensure_rfl_attrs(ik_leg_ctrl)

module function · public name · maya_tools/Rigging/create_rig_core.py:1765

Ensures the reverse foot setup attributes exist on the IK leg control. :param ik_leg_ctrl: name of the IK leg control node :return: None

ensure_world_aligned_bank_sdk

def ensure_world_aligned_bank_sdk(joint)

module function · public name · maya_tools/Rigging/create_rig_core.py:1801

Insert a world-aligned rotation group below an RFL bank joint. RFL joints can carry arbitrary joint orientation from skeleton placement. Driving their ordinary control SDK's local Z therefore banks around a diagonal axis. This group parents

setup_rfl_sdks

def setup_rfl_sdks(ik_leg_ctrl, rfl_joints, rfl_control_map=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:1932

Connect the reverse-foot attributes to the RFL control SDK groups. RFL joints may be resolved as long DAG paths, but generated controls use short names. Always strip the joint path before constructing control names. :param ik_leg_ctrl: ik l

build_rfl_ik_and_constraints

def build_rfl_ik_and_constraints(side, ik_leg_ctrl, ik_leg_joints, rfl_joints)

module function · public name · maya_tools/Rigging/create_rig_core.py:2011

creates full reverse foot setup from existing joints :param side: l or r :param ik_leg_ctrl: actual leg ik ctrl :param ik_leg_joints: list of ['ankle', 'toe', 'toeTip'] joints :param rfl_joints: list of ['heel', 'outerBank', 'innerBank', 't

find_ik_handle_constrained_by_ctrl

def find_ik_handle_constrained_by_ctrl(ctrl)

module function · public name · maya_tools/Rigging/create_rig_core.py:2099

Finds the IK handle currently constrained by the given control. :param ctrl: actual ik ctrl :return: Returns the ikHandle or None.

snap_to_joint_matrix

def snap_to_joint_matrix(jnt, node)

module function · public name · maya_tools/Rigging/create_rig_core.py:2116

snaps node to the joint using world matrix :param jnt: joint to snap to :param node: node to snap :return:

orient_control_pad_to_world_safely

def orient_control_pad_to_world_safely(ctrl, jnt)

module function · public name · maya_tools/Rigging/create_rig_core.py:2127

Safely orients the control's pad to world coordinate space without moving the joint, unparenting children first, resetting world rotation on the pad, recreating parent/scale constraints, and then reparenting the children back under the cont

apply_side_color_override

def apply_side_color_override(node)

module function · public name · maya_tools/Rigging/create_rig_core.py:2190

Auto-detect side from name and apply viewport override color to the SHAPE. l_ -> blue (6) r_ -> red (13) center -> yellow (17) :param node: ctrl to edit :return:

create_joint_controls

def create_joint_controls(joint_list=None, control_shape='sphere', root_parent=None, sub_ctrls=False, keep_constraint=True, sub_ctrl_shape_rotation_x=0.0, sub_ctrl_shape_rotation_z=0.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2222

Creates a control hierarchy for the joints :param joint_list: list of joints to create , accepts hierarchy or single item list :param control_shape: shape type, can be circle, diamond, prism, arrow, cube or sphere :param root_parent: what t

get_side_prefix

def get_side_prefix(name)

module function · public name · maya_tools/Rigging/create_rig_core.py:2381

gets side if it exists for node :param name: node to check :return: Returns 'l', 'r', or None based on joint naming.

scale_ctrl_cvs_local

def scale_ctrl_cvs_local(ctrl, scale=(1.0, 1.0, 1.0))

module function · public name · maya_tools/Rigging/create_rig_core.py:2396

Scales CVs of a NURBS curve or surface relative to the control's local space. :param ctrl: transform of the control :param scale: (sx, sy, sz) local scale multiplier :return:

rotate_ctrl_cvs_object_x

def rotate_ctrl_cvs_object_x(ctrl, degrees=90.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2424

Rotate a control's shape CVs around its local X axis. The transform itself is not rotated, so its zero channels, constraints, and animation behavior remain unchanged.

rotate_ctrl_cvs_object_z

def rotate_ctrl_cvs_object_z(ctrl, degrees=90.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2476

Rotate a control's shape CVs around local Z without rotating its transform.

rotate_ctrl_cvs_object_y

def rotate_ctrl_cvs_object_y(ctrl, degrees=90.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2523

Rotate a control's shape CVs around local Y without rotating its transform.

get_region_size_from_joints

def get_region_size_from_joints(joints)

module function · public name · maya_tools/Rigging/create_rig_core.py:2571

Returns average spatial size of a joint region. Useful for auto-scaling controls (mouth, eyelids, brows). :param joints: list of joints :return: Average of results

scale_ctrl_to_region

def scale_ctrl_to_region(ctrl, region_joints, base_size=1.0, multiplier=1.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2601

Scales control CVs based on the size of a joint region. :param ctrl: ctrl to scale :param region_joints: list of joints :param base_size: reference size (tweak once per rig) :param multiplier: artistic tuning knob :return:

offset_pv_pad

def offset_pv_pad(pad, side, amount=5.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2630

:param pad: pad to offset :param side: side of ctrl :param amount: offset amount :return:

position_finger_pv_above_knuckle

def position_finger_pv_above_knuckle(pad, knuckle_joint, distance=5.0)

module function · public name · maya_tools/Rigging/create_rig_core.py:2645

Place a finger PV above the knuckle on its signed local-Z axis. The project finger frame has local Y pointing sideways. Local Z is the knuckle-up axis; choose its sign against scene up so mirrored hands both place the PV above rather than b

normalize

def normalize(v)

module function · public name · maya_tools/Rigging/create_rig_core.py:2674

Normalises a 3D vector. :param v: input 3D vector :return: list[float]

cross

def cross(a, b)

module function · public name · maya_tools/Rigging/create_rig_core.py:2684

Computes the cross product of two 3D vectors. :param a: first 3D vector :param b: second 3D vector :return: list[float]

create_surface_from_joints_original

def create_surface_from_joints_original(joint_chain, name='surface')

module function · public name · maya_tools/Rigging/create_rig_core.py:2698

Stable surface builder using nurbsPlane + CV positioning. - Offsets using joint local Z axis - Supports closed loops - Creates follicles + follicle joints :param joint_chain: list of joints :param name: surface name :return: surface, follic

create_loft_surface_with_follicle_joints

def create_loft_surface_with_follicle_joints(joint_chain, name='surface', offset=0.5)

module function · public name · maya_tools/Rigging/create_rig_core.py:2828

Create a lofted surface along a joint chain. Creates: - Lofted NURBS surface - Follicles attached to the surface - Follicle joints parented to the follicles (to drive controls) :param joint_chain: list of joints :param name: surface name :p

_compensate_twist_control_pad_volume_scale

def _compensate_twist_control_pad_volume_scale(ctrl_pad, parent_driver)

module function · internal · maya_tools/Rigging/create_rig_core.py:2916

Keep twist control pads at a stable world size under limb volume scale.

setup_surface_rig

def setup_surface_rig(joint_chain, loft_name='eyelid', offset=0.5, region='eyelid', root_parent=None, create_controls=True)

module function · public name · maya_tools/Rigging/create_rig_core.py:2946

Sets up the eyelid rig: - Duplicates first joint to close the chain - Creates loft + follicles + follicle joints - Deletes temp joint - Creates controls and aims them at follicle joints :param joint_chain: list of joints :param loft_name: s

_bind_surface_to_joints

def _bind_surface_to_joints(surface, influences, **skin_options)

module function · internal · maya_tools/Rigging/create_rig_core.py:3114

Bind a NURBS surface in place using an explicit transform DAG path.

refresh_skin_bind_matrices_for_current_pose

def refresh_skin_bind_matrices_for_current_pose(influences)

module function · public name · maya_tools/Rigging/create_rig_core.py:3144

Make the current rigged pose the skin rest pose for selected influences. Rig construction reparents and constrains the bind joints to their driver chains. Some production scenes also arrive with joints that have already been repositioned re

_face_surface_weight_role

def _face_surface_weight_role(influence, region)

module function · internal · maya_tools/Rigging/create_rig_core.py:3191

Normalize a surface driver name to the anatomical role in the template.

_apply_reference_face_surface_weights

def _apply_reference_face_surface_weights(skin, surface, region, side=None)

module function · internal · maya_tools/Rigging/create_rig_core.py:3210

Apply the studio Lost Soul Kid mouth/eyelid CV weight profile by role.

_group_center_surface_controls

def _group_center_surface_controls(loft_name, root_parent, driver_data, joint_to_ctrl)

module function · internal · maya_tools/Rigging/create_rig_core.py:3321

Group centered main controls and share their scale with joint controls.

_configure_twist_control_orientation_distribution

def _configure_twist_control_orientation_distribution(joint_chain, follicle_joints, joint_to_ctrl, neutral_frame, full_twist_frame)

module function · internal · maya_tools/Rigging/create_rig_core.py:3369

Blend twist controls from a neutral proximal frame to full distal roll.

setup_surface_rig_with_drivers

def setup_surface_rig_with_drivers(joint_list, loft_name='eyelid', offset=0.5, driver_follicle_indices=None, side='r', region='eyelid', root_parent=None, face_joint_map=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:3483

Sets up a driver based surface rig (great for Mouth and eyelid setups) :param joint_list: list of joints :param loft_name: surface name :param offset: amount to offset curves to loft from joints :param driver_follicle_indices: mapping indic

constrain_controls_to_two_parents

def constrain_controls_to_two_parents(controls, parent1, parent2, parent1_value=1.0, parent2_value=0.0, maintain_offset=True)

module function · public name · maya_tools/Rigging/create_rig_core.py:3899

Apply a parentConstraint to each control in the list using parent1 and parent2 as drivers. :param controls: Controls to constrain :param parent1: First parent/driver :param parent2: Second parent/driver :param parent1_value: Weight value fo

bake_joint_orient_to_rotate

def bake_joint_orient_to_rotate(joints=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:3966

Moves jointOrient values into rotate channels while preserving world-space pose. :param joints: list of joints to bake; all joints if None :return: None

_zero_joint_orient_preserve_world

def _zero_joint_orient_preserve_world(joints)

module function · internal · maya_tools/Rigging/create_rig_core.py:4000

Bake jointOrient into rotate while keeping each joint's world matrix.

_seed_finger_ik_preferred_angles

def _seed_finger_ik_preferred_angles(ik_chain, curl_degrees=9.0, pole_world_position=None, target_joints=None, capture_from_pose=False, base_rotate_values=None, preferred_angle_values=None)

module function · internal · maya_tools/Rigging/create_rig_core.py:4013

Choose a local curl axis from the finger plane and prefer curling away from PV. For each bend joint, test all three local axes against the world-space direction a positive rotation would move the next joint. The axis whose bend direction be

_connect_ik_finger_channels_to_ctrl_pad

def _connect_ik_finger_channels_to_ctrl_pad(ik_joint, ctrl_pad)

module function · internal · maya_tools/Rigging/create_rig_core.py:4199

Replace finger-pad constraints with direct IK translate/rotate channels.

create_finger_rigs

def create_finger_rigs(finger_joints, hand_driver=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:4237

Creates IK driven FK system for finger joints :param finger_joints: finger joints :param hand_driver: parent transform/joint name to parent finger rigs under :return:

mirror_face_joints

def mirror_face_joints(joints, search_replace=('l_', 'r_'), mirror_axis='YZ', rotate_z_180=True)

module function · public name · maya_tools/Rigging/create_rig_core.py:4868

Mirrors face joints and optionally rotates them 180 degrees in Z (object space). :param joints: list of joint names to mirror :param search_replace: tuple (search, replace) for naming :param mirror_axis: 'YZ', 'XZ', or 'XY' :param rotate_z_

create_composite_space

def create_composite_space(name, parents, match_to, parent_node=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:4928

Creates a transform constrained to multiple parents, matched to the driven group. :param name: name of the composite space node to create :param parents: list of parent control nodes :param match_to: node to match position/orientation to :p

create_space_switch

def create_space_switch(driven, targets, attr_name='space', dup_suffix='_spaceTarget', constraint_type='parent', enum_names=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:4970

Builds a space switch where each target gets a matched child transform, and those children are the actual constraint drivers. Constraint is applied to the driven control's parent group. :param driven: control name that drives space switchin

build_enum_names_for_space_targets

def build_enum_names_for_space_targets(targets, side=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:5104

Build enum display names in the SAME ORDER as the incoming targets. Do not reorder here. Target order must drive enum order. :param targets: list of targets :param side: side :return: result

_swap_first_lr_character

def _swap_first_lr_character(name)

module function · internal · maya_tools/Rigging/create_rig_core.py:5180

Swaps the first character of the name if it is l, r, L, or R. :param name: joint or node name :return: str

get_ctrl_shape_cvs

def get_ctrl_shape_cvs(ctrl)

module function · public name · maya_tools/Rigging/create_rig_core.py:5202

Gets ctrl shape cvs. :param ctrl: ctrl :return: result

store_all_control_cv_positions

def store_all_control_cv_positions(store_node=MODULE_STORE_NODE)

module function · public name · maya_tools/Rigging/create_rig_core.py:5226

Store all control cv positions. :param store_node: store node :return: result

restore_all_control_cv_positions

def restore_all_control_cv_positions(store_node=MODULE_STORE_NODE)

module function · public name · maya_tools/Rigging/create_rig_core.py:5293

Restore all control cv positions. :param store_node: store node :return: result

_get_side_enum_map

def _get_side_enum_map(joint)

module function · internal · maya_tools/Rigging/create_rig_core.py:5408

Gets a name-to-index mapping dictionary for the 'side' attribute enum. :param joint: joint name to query :return: dict

_flip_joint_label_side

def _flip_joint_label_side(joint)

module function · internal · maya_tools/Rigging/create_rig_core.py:5422

Flips the joint label side attribute value from Left to Right or vice versa. :param joint: joint name to flip :return: None

_get_joint_hierarchy

def _get_joint_hierarchy(root_joint)

module function · internal · maya_tools/Rigging/create_rig_core.py:5448

Returns all child joints under root_joint in hierarchical order. :param root_joint: root joint name :return: list[str]

mirror_joint_yz_behavior_with_label_flip

def mirror_joint_yz_behavior_with_label_flip(root_joint=None, rename_first_char=True)

module function · public name · maya_tools/Rigging/create_rig_core.py:5460

Mirror a joint chain across YZ using behavior mirroring. Then flip joint label Side from Left<->Right on the mirrored chain. Optionally swaps first character of the mirrored names: l/r/L/R. :param root_joint: root joint name to mirror; sl=T

create_leg_space_switches

def create_leg_space_switches(side, body_joint_map=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:5516

Builds space switches (including composite spaces) for the Leg module. :param side: left or right side (l/r) :param body_joint_map: optional body joint mapping dictionary :return: None

create_arm_space_switches

def create_arm_space_switches(side, body_joint_map=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:5650

Builds space switches (including composite spaces) for the Arm module. :param side: left or right side (l/r) :param body_joint_map: optional body joint mapping dictionary :return: None

create_rig_space_switches

def create_rig_space_switches(side)

module function · public name · maya_tools/Rigging/create_rig_core.py:5802

Builds the base space switches for both Leg and Arm modules on this side. :param side: left or right side (l/r) :return: None

create_eye_aim_setup

def create_eye_aim_setup(left_eye_joint='l_eye', right_eye_joint='r_eye', aim_distance=25, head_ctrl='head1_ctrl')

module function · public name · maya_tools/Rigging/create_rig_core.py:5812

Creates a standard left/right eye aim setup with a shared center aim control. :param left_eye_joint: left eye joint name :param right_eye_joint: right eye joint name :param aim_distance: local aim control distance offset :param head_ctrl: h

strip_ctrl_shape_and_rename

def strip_ctrl_shape_and_rename(ctrl)

module function · public name · maya_tools/Rigging/create_rig_core.py:5912

Delete all shapes under the transform and rename it. Args: ctrl (str): Control node name to process. Returns: str: The new node name. :param ctrl: ctrl :return: result

setup_jaw_lip_driver

def setup_jaw_lip_driver(jaw_ctrl, lip_driver_ctrls, lip_ctrl_dict, head_ctrl='head1_ctrl')

module function · public name · maya_tools/Rigging/create_rig_core.py:5942

Initial setup for driving mouth and lips via the jaw control. Args: jaw_ctrl (str): Name of the jaw control. lip_driver_ctrls (list[str]): List of driver controls for the lips. lip_ctrl_dict (dict): Dictionary mapping joints to lip controls

create_twist_driver

def create_twist_driver(driver_bone='l_thigh_driver', child_bone='l_knee_driver', parent='hipswing_ctrl', surface='l_thigh_surface', constraint_settings=None)

module function · public name · maya_tools/Rigging/create_rig_core.py:6137

Creates a twist driver setup for a limb segment. Args: driver_bone (str): Name of the driver bone. child_bone (str): Name of the child bone. parent (str): Parent control or group name. surface (str): Name of the lofted surface. Returns: str

maya_tools.Rigging.create_rig_modules

bind_runtime

def bind_runtime(namespace)

module function · public name · maya_tools/Rigging/create_rig_modules.py:18

Binds facade helpers used by the modular rig implementations. :param namespace: globals from the public ``create_rig`` facade. :return: None.

maya_tools.Rigging.enum_attrs

get_side_from_node

def get_side_from_node(node)

module function · public name · maya_tools/Rigging/enum_attrs.py:23

resolve_space_target

def resolve_space_target(label, node=None, side=None)

module function · public name · maya_tools/Rigging/enum_attrs.py:32

resolve_space_targets_from_labels

def resolve_space_targets_from_labels(labels, node=None, side=None, require_existing=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:46

get_enum_labels

def get_enum_labels(node, attr)

module function · public name · maya_tools/Rigging/enum_attrs.py:66

get_enum_attrs

def get_enum_attrs(node)

module function · public name · maya_tools/Rigging/enum_attrs.py:73

collect_enum_data

def collect_enum_data(nodes=None, attr_filter=None, strip_namespaces=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:86

Collect enum definitions from nodes. Parameters ---------- nodes : list[str] or None Nodes to inspect. If None, uses selection. attr_filter : list[str] or None If provided, only these enum attrs are exported. strip_namespaces : bool If True

save_enum_data_to_json

def save_enum_data_to_json(filepath, nodes=None, attr_filter=None, strip_namespaces=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:150

load_enum_data_from_json

def load_enum_data_from_json(filepath)

module function · public name · maya_tools/Rigging/enum_attrs.py:168

get_attr_connections

def get_attr_connections(plug)

module function · public name · maya_tools/Rigging/enum_attrs.py:176

Returns incoming and outgoing connections for an attribute plug.

disconnect_attr_connections

def disconnect_attr_connections(plug)

module function · public name · maya_tools/Rigging/enum_attrs.py:185

reconnect_attr_connections

def reconnect_attr_connections(plug, incoming, outgoing)

module function · public name · maya_tools/Rigging/enum_attrs.py:198

rebuild_enum_attr_with_order

def rebuild_enum_attr_with_order(node, attr, new_labels, preserve_value_by_label=True, stored_label=None, stored_value=None, verbose=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:212

Rebuild enum order on an existing attr while preserving connections. Notes ----- - This preserves raw connections by disconnecting and reconnecting them. - It remaps the attr's local current value by label when possible. - If stored_label i

build_node_lookup

def build_node_lookup(strip_namespaces=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:328

Build a lookup of scene nodes by short name.

apply_enum_data

def apply_enum_data(data, prefer_first_match=True, strip_namespaces=True, verbose=True)

module function · public name · maya_tools/Rigging/enum_attrs.py:348

Apply stored enum data to matching nodes in the current scene.

export_selected_enum_orders

def export_selected_enum_orders(filepath, attr_filter=None)

module function · public name · maya_tools/Rigging/enum_attrs.py:427

Export enum label orders from selected nodes to JSON.

import_enum_orders

def import_enum_orders(filepath)

module function · public name · maya_tools/Rigging/enum_attrs.py:439

Import enum label orders from JSON and apply them to matching nodes in the currently opened scene.

maya_tools.Rigging.joint_placement_ml

_quantile

def _quantile(values, q)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:56

mesh_profile_features

def mesh_profile_features(mesh)

module function · public name · maya_tools/Rigging/joint_placement_ml.py:67

Return a normalized 32-slice silhouette profile for a Maya mesh.

_solve_multi_rhs

def _solve_multi_rhs(matrix, values)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:106

Solve a small dense system by pivoted Gauss-Jordan elimination.

_fit

def _fit(rows, alpha=RIDGE_ALPHA, output_names=None)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:134

_predict

def _predict(model, features)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:188

_profile_support_distance

def _profile_support_distance(model, features)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:212

Nearest approved profile distance in standardized feature space.

_point_error

def _point_error(prediction, truth, names)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:229

_region_error

def _region_error(prediction, truth, names)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:241

Return the mean normalized point error for one independently gated region.

_shape_neighbor_prediction

def _shape_neighbor_prediction(rows, target, names)

module function · internal · maya_tools/Rigging/joint_placement_ml.py:247

train_model

def train_model(example_directory, registry_path, output_path)

module function · public name · maya_tools/Rigging/joint_placement_ml.py:271

Train and save a model; activate it only when grouped holdout passes.

predict_mesh

def predict_mesh(mesh, model_path='')

module function · public name · maya_tools/Rigging/joint_placement_ml.py:456

Return supported normalized landmarks for independently active regions.

record_approved_scene

def record_approved_scene(case_id, family, atlas_directory='')

module function · public name · maya_tools/Rigging/joint_placement_ml.py:490

Add an artist-approved live Maya placement and train with regional gates. The active model is replaced only if grouped holdout improves over the shape-neighbor baseline and no previously active region regresses. Every attempt is recorded in

maya_tools.Rigging.joint_placement_reference_builder

_short_name

def _short_name(node: str) -> str

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:34

_studio_root

def _studio_root() -> str

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:38

_largest_body_mesh

def _largest_body_mesh() -> str

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:51

_normalized_point

def _normalized_point(point, origin, height)

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:71

_mesh_points

def _mesh_points(mesh: str)

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:79

_mesh_profile_features

def _mesh_profile_features(mesh_points, bounds, height: float)

module function · internal · maya_tools/Rigging/joint_placement_reference_builder.py:95

Build the shared normalized silhouette descriptor used by the learner.

capture_scene

def capture_scene(scene: str, case_id: str, output_directory: str) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_reference_builder.py:132

Capture every uniquely named deform joint from a file or current scene. Pass an empty ``scene`` to capture the active Maya scene without opening, saving, or otherwise modifying it. This is used when an artist marks the current joint placeme

build_atlas

def build_atlas(cases: Iterable[Tuple[str, str]], output_directory: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_reference_builder.py:248

maya_tools.Rigging.joint_placement_regression

_utc_now

def _utc_now() -> str

module function · internal · maya_tools/Rigging/joint_placement_regression.py:42

_distance

def _distance(a, b) -> float

module function · internal · maya_tools/Rigging/joint_placement_regression.py:46

_mesh_frame

def _mesh_frame(mesh: str) -> Dict[str, object]

module function · internal · maya_tools/Rigging/joint_placement_regression.py:50

_normalize_point

def _normalize_point(point, frame: Dict[str, object])

module function · internal · maya_tools/Rigging/joint_placement_regression.py:67

_normalized_points

def _normalized_points(points: Dict[str, Tuple[float, float, float]], frame)

module function · internal · maya_tools/Rigging/joint_placement_regression.py:77

_normalized_bone_lengths

def _normalized_bone_lengths(points: Dict[str, object]) -> Dict[str, float]

module function · internal · maya_tools/Rigging/joint_placement_regression.py:81

_studio_root

def _studio_root(namespace: str='') -> Optional[str]

module function · internal · maya_tools/Rigging/joint_placement_regression.py:89

_template_anchor_points

def _template_anchor_points(namespace: str='', root: Optional[str]=None) -> Dict[str, Tuple[float, float, float]]

module function · internal · maya_tools/Rigging/joint_placement_regression.py:105

capture_baseline

def capture_baseline(mesh: str, path: str, case_id: str='', namespace: str='', notes: str='', thresholds: Optional[Dict[str, object]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:126

Capture the currently approved fitted skeleton as a golden baseline.

capture_mapped_baseline

def capture_mapped_baseline(mesh: str, path: str, target_to_source_joint: Dict[str, str], case_id: str='', notes: str='', thresholds: Optional[Dict[str, object]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:184

Capture joints from an external approved rig under studio target names.

capture_anchor_baseline

def capture_anchor_baseline(mesh: str, path: str, canonical_to_source_joint: Dict[str, str], case_id: str='', notes: str='', thresholds: Optional[Dict[str, object]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:239

Capture approved core anchors from an older or differently named rig.

load_baseline

def load_baseline(path: str) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:296

evaluate_points

def evaluate_points(mesh: str, points: Dict[str, Tuple[float, float, float]], baseline: Dict[str, object], preview: Optional[joint_placer.PlacementPreview]=None, template_joint_count: int=0, reverse_foot_joint_count: int=0, fitted_points: Optional[Dict[str, Tuple[float, float, float]]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:308

Compare a placement result with one approved normalized baseline.

evaluate_mesh_against_baseline

def evaluate_mesh_against_baseline(mesh: str, baseline_path: str, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, build_skeleton: bool=False, use_topology_reference: bool=False) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:438

evaluate_studio_foot_contract

def evaluate_studio_foot_contract(namespace: str='', mesh: str='', require_mirror: bool=True) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:497

Validate the animator-facing foot result on a fitted studio skeleton.

evaluate_studio_pelvis_contract

def evaluate_studio_pelvis_contract(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placement_regression.py:652

Validate the shared pelvis-ridge lift on a fitted studio skeleton.

write_report

def write_report(report: Dict[str, object], path: str) -> str

module function · public name · maya_tools/Rigging/joint_placement_regression.py:754

capture_selected_baseline

def capture_selected_baseline(path: str, case_id: str='', namespace: str='')

module function · public name · maya_tools/Rigging/joint_placement_regression.py:761

evaluate_selected_mesh

def evaluate_selected_mesh(baseline_path: str, template_path: str=DEFAULT_PLACEMENT_TEMPLATE)

module function · public name · maya_tools/Rigging/joint_placement_regression.py:768

maya_tools.Rigging.joint_placement_regression_runner

_resolve

def _resolve(value: str, base: Path) -> str

module function · internal · maya_tools/Rigging/joint_placement_regression_runner.py:18

_resolve_scene_mesh

def _resolve_scene_mesh(cmds, requested: str) -> str

module function · internal · maya_tools/Rigging/joint_placement_regression_runner.py:25

Resolve a recorded mesh path without silently choosing ambiguity.

_import_fbx_in_namespace

def _import_fbx_in_namespace(cmds, scene: str, namespace: str) -> None

module function · internal · maya_tools/Rigging/joint_placement_regression_runner.py:53

Import FBX DAG nodes into a predictable namespace. Maya 2023's FBX plug-in can ignore the ``cmds.file(namespace=...)`` flag. Capture the imported nodes and namespace their transforms/joints explicitly so source skeleton names cannot collide

run_manifest

def run_manifest(manifest_path: str)

module function · public name · maya_tools/Rigging/joint_placement_regression_runner.py:83

main

def main(argv=None) -> int

module function · public name · maya_tools/Rigging/joint_placement_regression_runner.py:326

maya_tools.Rigging.joint_placer

PlacementFrame.world_to_logical

def PlacementFrame.world_to_logical(self, point: Vector3) -> Vector3

class method · public name · maya_tools/Rigging/joint_placer.py:94

PlacementFrame.logical_to_world

def PlacementFrame.logical_to_world(self, point: Vector3) -> Vector3

class method · public name · maya_tools/Rigging/joint_placer.py:101

PlacementFrame.world_axis

def PlacementFrame.world_axis(self, logical_axis: str) -> str

class method · public name · maya_tools/Rigging/joint_placer.py:108

PlacementFrame.world_index

def PlacementFrame.world_index(self, logical_axis: str) -> int

class method · public name · maya_tools/Rigging/joint_placer.py:112

PlacementFrame.world_normal

def PlacementFrame.world_normal(self, logical_axis: str) -> Vector3

class method · public name · maya_tools/Rigging/joint_placer.py:115

MeshPlacementReport.is_closed_manifold

def MeshPlacementReport.is_closed_manifold(self) -> bool

class method · public name · maya_tools/Rigging/joint_placer.py:174

MeshPlacementReport.as_dict

def MeshPlacementReport.as_dict(self) -> Dict[str, object]

class method · public name · maya_tools/Rigging/joint_placer.py:182

_short_name

def _short_name(node: str) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:453

_point_vector

def _point_vector(points: Dict[str, Vector3], name: str) -> Optional[om.MVector]

module function · internal · maya_tools/Rigging/joint_placer.py:457

classify_arm_pose

def classify_arm_pose(points: Dict[str, Vector3], frame: Optional[PlacementFrame]=None) -> Tuple[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:464

Classify generated arm placement as T-pose or A-pose from shoulder-to-hand slope. Returns: tuple[str, float]: pose label and absolute arm-down angle from horizontal.

_line_value_at

def _line_value_at(start: Vector3, end: Vector3, sample: Vector3, parameter_axis: int, value_axis: int) -> float

module function · internal · maya_tools/Rigging/joint_placer.py:502

enforce_limb_planarity

def enforce_limb_planarity(points: Dict[str, Vector3], minimum_bend: float=0.0, inside_query: Optional['MeshInteriorQuery']=None, frame: Optional[PlacementFrame]=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:516

Put the primary IK chains on explicit anatomical planes. Arms use the template's side/up bend plane: depth is the outward hinge axis (local Y), so the elbow prebend must be vertical rather than drifting toward character-front/back. Legs and

refine_shoulder_landmarks

def refine_shoulder_landmarks(points: Dict[str, Vector3], query: 'MeshInteriorQuery', frame: Optional[PlacementFrame]=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:735

Move each arm root from the torso seed to the humeral-head section. A globally scaled template commonly leaves the upper-arm pivot inside the chest. In a T/A pose, the torso-to-arm transition is measurable: the very tall torso section colla

refine_leg_landmarks

def refine_leg_landmarks(points: Dict[str, Vector3], query: 'MeshInteriorQuery', frame: Optional[PlacementFrame]=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:837

Solve hip height, knee line, and ankle line from limb morphology. Template ratios put the sample character's knees too high and its ankles down in the foot. The knee is the compact section between the thigh and calf, while the ankle is the

refine_foot_landmarks

def refine_foot_landmarks(points: Dict[str, Vector3], query: 'MeshInteriorQuery', frame: Optional[PlacementFrame]=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:936

Place toe base and tip in the local foot volume after ankle solving.

_sanitize_studio_template_core_points

def _sanitize_studio_template_core_points(points: Dict[str, Vector3]) -> Dict[str, Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:1004

Repair known-invalid bind-pose landmarks without editing the source rig. The current studio template contains a right-hand-tip bind matrix copied from the left side and an effectively coincident chest-tip/neck pair. These values corrupt the

measure_planar_deviation

def measure_planar_deviation(points: Dict[str, Vector3], frame: Optional[PlacementFrame]=None) -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:1045

_as_mesh_transform

def _as_mesh_transform(node: str) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:1094

Return a mesh transform from a selected transform or mesh shape.

get_mesh_bounds

def get_mesh_bounds(mesh: str) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:1112

_mesh_dag_path

def _mesh_dag_path(mesh: str) -> om.MDagPath

module function · internal · maya_tools/Rigging/joint_placer.py:1130

analyze_mesh_for_joint_placement

def analyze_mesh_for_joint_placement(mesh: str) -> MeshPlacementReport

module function · public name · maya_tools/Rigging/joint_placer.py:1140

Return topology facts that determine how trustworthy volume tests are.

_deduplicate_sorted

def _deduplicate_sorted(values: Iterable[float], tolerance: float) -> List[float]

module function · internal · maya_tools/Rigging/joint_placer.py:1170

_pair_intersection_intervals

def _pair_intersection_intervals(values: Iterable[float], tolerance: float) -> List[Tuple[float, float]]

module function · internal · maya_tools/Rigging/joint_placer.py:1178

Pair ordered surface crossings into solid intervals for a closed mesh.

_choose_interval

def _choose_interval(intervals: Iterable[Tuple[float, float]], preferred_value: float) -> Optional[Tuple[float, float]]

module function · internal · maya_tools/Rigging/joint_placer.py:1188

_recenter_along_direction

def _recenter_along_direction(query: 'MeshInteriorQuery', point: Vector3, direction: om.MVector) -> Tuple[Vector3, float, bool]

module function · internal · maya_tools/Rigging/joint_placer.py:1200

Center a point through the mesh along an arbitrary world direction.

_place_along_direction_fraction

def _place_along_direction_fraction(query: 'MeshInteriorQuery', point: Vector3, direction: om.MVector, fraction: float) -> Tuple[Vector3, float, bool]

module function · internal · maya_tools/Rigging/joint_placer.py:1236

Place a point at a chosen fraction through an arbitrary mesh section.

MeshInteriorQuery.__init__

def MeshInteriorQuery.__init__(self, mesh: str)

class method · internal · maya_tools/Rigging/joint_placer.py:1280

MeshInteriorQuery._components

def MeshInteriorQuery._components(point: Vector3) -> List[float]

class method · internal · maya_tools/Rigging/joint_placer.py:1295

MeshInteriorQuery._ray_hits

def MeshInteriorQuery._ray_hits(self, source: Vector3, direction: om.MFloatVector, max_distance: float) -> List[om.MFloatPoint]

class method · internal · maya_tools/Rigging/joint_placer.py:1298

MeshInteriorQuery.axis_intervals

def MeshInteriorQuery.axis_intervals(self, point: Vector3, axis: str) -> List[Tuple[float, float]]

class method · public name · maya_tools/Rigging/joint_placer.py:1319

MeshInteriorQuery.point_inside

def MeshInteriorQuery.point_inside(self, point: Vector3) -> bool

class method · public name · maya_tools/Rigging/joint_placer.py:1330

MeshInteriorQuery.recenter_axis

def MeshInteriorQuery.recenter_axis(self, point: Vector3, axis: str) -> Tuple[Vector3, float, bool]

class method · public name · maya_tools/Rigging/joint_placer.py:1354

MeshInteriorQuery.move_inside

def MeshInteriorQuery.move_inside(self, point: Vector3) -> Tuple[Vector3, bool]

class method · public name · maya_tools/Rigging/joint_placer.py:1364

Move an outside proposal just inside its closest local surface.

MeshInteriorQuery.move_inside_preserving_plane

def MeshInteriorQuery.move_inside_preserving_plane(self, point: Vector3, fixed_axis: str) -> Tuple[Vector3, bool]

class method · public name · maya_tools/Rigging/joint_placer.py:1388

Move a point into the mesh without leaving its solved IK plane.

_cached_mesh_interior_query

def _cached_mesh_interior_query(mesh: str) -> MeshInteriorQuery

module function · internal · maya_tools/Rigging/joint_placer.py:1423

Reuse acceleration structures throughout one placement run.

clear_mesh_query_cache

def clear_mesh_query_cache() -> None

module function · public name · maya_tools/Rigging/joint_placer.py:1434

Release placement acceleration structures before a new mesh solve.

point_from_normalized_bounds

def point_from_normalized_bounds(bounds: Dict[str, object], xyz: Vector3) -> Vector3

module function · public name · maya_tools/Rigging/joint_placer.py:1438

extract_studio_template_core_points

def extract_studio_template_core_points(template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:1449

Read authored bind-pose world positions directly from a Maya ASCII template.

extract_studio_template_joint_axes

def extract_studio_template_joint_axes(template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Dict[str, Dict[str, Vector3]]

module function · public name · maya_tools/Rigging/joint_placer.py:1510

Read each joint's authored world-space XYZ basis from its bind matrix.

solve_studio_template_points

def solve_studio_template_points(mesh: str, template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Tuple[Dict[str, Vector3], Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:1577

Scale the authored studio skeleton into the target mesh as the proposal.

_load_reference_placement_corpus

def _load_reference_placement_corpus() -> List[Dict[str, object]]

module function · internal · maya_tools/Rigging/joint_placer.py:1613

_reference_shape_distance

def _reference_shape_distance(entry: Dict[str, object], width_ratio: float, depth_ratio: float, vertex_count: int) -> float

module function · internal · maya_tools/Rigging/joint_placer.py:1691

_rank_reference_entries

def _rank_reference_entries(mesh: str, require_detail: bool=False) -> List[Tuple[float, Dict[str, object]]]

module function · internal · maya_tools/Rigging/joint_placer.py:1706

_solve_linear_system_4x4

def _solve_linear_system_4x4(matrix, vector) -> Optional[List[float]]

module function · internal · maya_tools/Rigging/joint_placer.py:1733

_affine_transfer_point

def _affine_transfer_point(source_points: List[Vector3], target_points: List[Vector3], source_point: Vector3) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:1756

solve_topology_reference_points

def solve_topology_reference_points(mesh: str) -> Tuple[Dict[str, Vector3], List[str]]

module function · public name · maya_tools/Rigging/joint_placer.py:1786

Transfer an approved skeleton through identical production topology.

solve_reference_thumb_dorsal_vectors

def solve_reference_thumb_dorsal_vectors(mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:1950

Transfer approved thumb roll vectors through matching mesh topology.

solve_reference_thumb_knuckle_z_vectors

def solve_reference_thumb_knuckle_z_vectors(mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2052

Transfer the approved local-Z thumb direction through mesh topology. A shortest-arc bone aim preserves the reference roll approximately, but it cannot account for character-specific deformation around the thumb mound. Exact-topology affine

solve_reference_eyelid_tip_points

def solve_reference_eyelid_tip_points(mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2163

Transfer eyelid tips by weighted exact-topology vertex correspondence. Eyelid surface patches are nearly planar, so a free affine fit can produce a valid mathematical transform with a wildly incorrect ray direction. Inverse-distance interpo

solve_reference_eye_centers

def solve_reference_eye_centers(mesh: str, eyelid_tip_points: Optional[Dict[str, Vector3]]=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2250

Infer eye pivots from the eyelid ring when no eyeball mesh exists. The approved rigs encode a stable relationship between each eye pivot and its visible eyelid loop. Reconstructing that relationship in lid-local units is more reliable than

_scene_mesh_vertices

def _scene_mesh_vertices(meshes: Iterable[str]) -> List[om.MPoint]

module function · internal · maya_tools/Rigging/joint_placer.py:2338

Return world-space vertices for non-intermediate scene meshes.

_scene_feature_meshes

def _scene_feature_meshes(include_tokens: Iterable[str], exclude_tokens: Iterable[str]=(), anchor_mesh: str='') -> List[str]

module function · internal · maya_tools/Rigging/joint_placer.py:2353

Find mesh transforms by semantic name tokens, regardless of hierarchy.

_point_cloud_bounds_center

def _point_cloud_bounds_center(points: Iterable[om.MPoint]) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:2399

solve_scene_eye_mesh_centers

def solve_scene_eye_mesh_centers(body_mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2410

Use actual eyeball geometry, including a single combined two-eye mesh.

solve_scene_oral_mesh_points

def solve_scene_oral_mesh_points(body_mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2431

Place teeth and tongue joints from separate feature meshes when present.

solve_scene_brow_mesh_points

def solve_scene_brow_mesh_points(body_mesh: str) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:2474

Sample separate eyebrow meshes into smooth medial-to-lateral joint arcs.

fit_studio_scene_feature_joints

def fit_studio_scene_feature_joints(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:2524

Reapply authoritative eye, teeth, and tongue mesh centers after volume fitting.

fit_studio_face_pivots_to_mesh

def fit_studio_face_pivots_to_mesh(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:2541

Finish internal face pivots from this character's face and throat mesh. These anchors are especially vulnerable to atlas transfer: a nose root can collapse onto the head pivot, a tongue can drift away from its separate tongue surface, and a

smooth_reference_eyelid_tip_points

def smooth_reference_eyelid_tip_points(points: Dict[str, Vector3], iterations: int=4, strength: float=0.4) -> Tuple[Dict[str, Vector3], Dict[str, object]]

module function · public name · maya_tools/Rigging/joint_placer.py:2734

Regularize each authored eyelid arc while preserving both corners. Upper and lower lids are smoothed independently so the inner and outer canthi remain exact. The caller projects the resulting proposals back to the mesh, making this a curve

solve_reference_detail_points

def solve_reference_detail_points(mesh: str, reference_count: int=3) -> Tuple[Dict[str, Vector3], List[str]]

module function · public name · maya_tools/Rigging/joint_placer.py:2806

Blend the closest approved full skeletons into target mesh space. The atlas supplies anatomical proportions for fingers, thumbs, feet, correctives, and facial branches. Mesh-volume fitting is intentionally a secondary local correction so it

_solve_reference_proportional_joint_points

def _solve_reference_proportional_joint_points(mesh: str, joint_names: Iterable[str], reference_count: int=5, excluded_case_ids: Iterable[str]=()) -> Tuple[Dict[str, Vector3], List[str]]

module function · internal · maya_tools/Rigging/joint_placer.py:2856

solve_reference_internal_head_points

def solve_reference_internal_head_points(mesh: str, reference_count: int=5, excluded_case_ids: Iterable[str]=()) -> Tuple[Dict[str, Vector3], List[str]]

module function · public name · maya_tools/Rigging/joint_placer.py:2904

Fit neck, skull, jaw, teeth, and tongue without surface extrapolation. These pivots sit inside the skull or oral cavity, where nearest-surface patches are frequently close to planar. A local affine solve can then become ill-conditioned and

solve_reference_toe_points

def solve_reference_toe_points(mesh: str, reference_count: int=5, excluded_case_ids: Iterable[str]=()) -> Tuple[Dict[str, Vector3], List[str]]

module function · public name · maya_tools/Rigging/joint_placer.py:2926

Fit toe bases at the authored ball pivots and tips inside the mesh end.

solve_reference_corpus_points

def solve_reference_corpus_points(mesh: str, template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Tuple[Dict[str, Vector3], Dict[str, float], List[str], str]

module function · public name · maya_tools/Rigging/joint_placer.py:2940

Seed placement from the closest approved normalized character.

solve_mapped_hierarchy_points

def solve_mapped_hierarchy_points(mesh: str, joint_map: dict, template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Tuple[Dict[str, Vector3], Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:3009

Use the active rig mapping as the proportion and hierarchy proposal.

solve_basic_biped_points

def solve_basic_biped_points(mesh: str) -> Tuple[Dict[str, Vector3], Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:3121

Return first-pass biped joint positions. The current implementation is proportional, with confidence set low/medium. This gives a stable baseline that can later be refined by landmark or mesh cross-section solvers without changing the downs

validate_points_inside_mesh

def validate_points_inside_mesh(mesh: str, points: Dict[str, Vector3], query: Optional[MeshInteriorQuery]=None) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:3145

Return deform landmarks whose positions cannot be verified in the mesh.

straighten_core_spine_points

def straighten_core_spine_points(points: Dict[str, Vector3], query: Optional['MeshInteriorQuery']=None) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:3177

Keep the fitted spine on one straight pelvis-to-neck centerline. Preserve the target mesh's fitted vertebral heights and end pivots; remove independent depth/lateral recentering from intermediate vertebrae, which otherwise produces a visibl

validate_anatomical_layout

def validate_anatomical_layout(points: Dict[str, Vector3], bounds: Dict[str, object], frame: Optional[PlacementFrame]=None) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:3207

Return actionable hierarchy/order problems in an otherwise valid volume solution.

solve_production_biped_points

def solve_production_biped_points(mesh: str, landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, joint_map: Optional[dict]=None) -> Tuple[Dict[str, Vector3], Dict[str, float], MeshPlacementReport, List[str], Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:3359

Place a biped template using proposals plus mesh-volume verification. ``landmark_points`` is the integration seam for an ML or vision provider. Known joint names override the proportional proposal, but every override is still recentered and

_is_generated_joint

def _is_generated_joint(joint: str) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:3649

_tag_generated_joint

def _tag_generated_joint(joint: str) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:3660

_set_string_attr

def _set_string_attr(node: str, attr: str, value: str) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:3668

_set_float_attr

def _set_float_attr(node: str, attr: str, value: float) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:3676

_connect_placement_mesh

def _connect_placement_mesh(root: str, mesh: str) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:3684

Keep a rename-safe mesh link, readable path, and geometry signature.

_placement_mesh_signature

def _placement_mesh_signature(mesh: str) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:3708

Hash a mesh's world-space topology and points for safe approved reruns.

_approved_placement_matches_mesh

def _approved_placement_matches_mesh(root: str, mesh: str) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:3727

Return whether the existing approved pose belongs to this mesh.

_legacy_studio_pose_matches_mesh

def _legacy_studio_pose_matches_mesh(root: str, mesh: str, anchor_names: Optional[Iterable[str]]=None, allow_mapped_hierarchy: bool=False) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:3771

Recognize an untagged, already-fitted studio pose on its body mesh. Older joint-placer scenes have no geometry signature. Preserve their scene-authored placement on first use only when the mapped/core anchors already occupy the selected mes

tag_pose_metadata

def tag_pose_metadata(root_joint: str, pose_type: str, pose_angle_degrees: float) -> None

module function · public name · maya_tools/Rigging/joint_placer.py:3827

delete_existing_generated_skeleton

def delete_existing_generated_skeleton(root_name: str='origin') -> None

module function · public name · maya_tools/Rigging/joint_placer.py:3832

create_joint

def create_joint(name: str, position: Vector3, parent: Optional[str]=None, radius: float=1.0) -> str

module function · public name · maya_tools/Rigging/joint_placer.py:3842

orient_skeleton

def orient_skeleton(root_joint: str) -> None

module function · public name · maya_tools/Rigging/joint_placer.py:3861

_world_align_joint_preserving_children

def _world_align_joint_preserving_children(joint: str) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:3878

world_align_origin_and_pelvis

def world_align_origin_and_pelvis(root_joint: str) -> None

module function · public name · maya_tools/Rigging/joint_placer.py:3906

zero_origin_translation_preserving_children

def zero_origin_translation_preserving_children(root_joint: str) -> None

module function · public name · maya_tools/Rigging/joint_placer.py:3915

Put the rig-space origin at world zero without moving the skeleton.

build_skeleton_from_points

def build_skeleton_from_points(points: Dict[str, Vector3], root_name: str='origin', orient: bool=True, replace_existing: bool=True, pose_type: str='unknown', pose_angle_degrees: float=0.0) -> str

module function · public name · maya_tools/Rigging/joint_placer.py:3929

make_hik_maps_from_root

def make_hik_maps_from_root(root_joint: str) -> Tuple[dict, dict]

module function · public name · maya_tools/Rigging/joint_placer.py:3961

validate_body_joint_map

def validate_body_joint_map(body_joint_map: dict, required_slots: Iterable[str]=CORE_HIK_SLOTS) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:3995

create_guides_from_points

def create_guides_from_points(points: Dict[str, Vector3], group_name: str='auto_joint_guides_grp', confidence: Optional[Dict[str, float]]=None, outside_joints: Optional[Iterable[str]]=None) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:4004

Create or update color-coded guides without rebuilding the DAG.

delete_auto_joint_guides

def delete_auto_joint_guides() -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:4090

Delete only the temporary guide hierarchy owned by joint placement.

_template_namespace_prefix

def _template_namespace_prefix(namespace: str) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:4099

_find_template_joint

def _find_template_joint(template_name: str, namespace: str='') -> Optional[str]

module function · internal · maya_tools/Rigging/joint_placer.py:4104

is_studio_template_skeleton

def is_studio_template_skeleton(root_joint: str, namespace: str='') -> bool

module function · public name · maya_tools/Rigging/joint_placer.py:4113

_mapped_joint

def _mapped_joint(joint_map: Optional[dict], slot: str) -> Optional[str]

module function · internal · maya_tools/Rigging/joint_placer.py:4129

placement_frame_from_mapping

def placement_frame_from_mapping(joint_map: Optional[dict]) -> PlacementFrame

module function · public name · maya_tools/Rigging/joint_placer.py:4140

Infer character axes from mapped hips/head and left/right limbs.

_logical_mesh_bounds

def _logical_mesh_bounds(mesh: str, frame: PlacementFrame) -> Dict[str, object]

module function · internal · maya_tools/Rigging/joint_placer.py:4168

mapped_anatomical_joints

def mapped_anatomical_joints(joint_map: Optional[dict]) -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:4191

Resolve the active HIK mapping into placement roles. Spine roles are distributed across the available HIK spine slots, allowing a user hierarchy to contain one through four mapped spine joints.

mapped_hierarchy_missing_slots

def mapped_hierarchy_missing_slots(joint_map: Optional[dict]) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:4219

mapped_hierarchy_requested

def mapped_hierarchy_requested(joint_map: Optional[dict]) -> bool

module function · public name · maya_tools/Rigging/joint_placer.py:4223

_common_mapped_root

def _common_mapped_root(joints: Iterable[str]) -> Optional[str]

module function · internal · maya_tools/Rigging/joint_placer.py:4227

mapped_studio_template_namespace

def mapped_studio_template_namespace(joint_map: Optional[dict]) -> Optional[str]

module function · public name · maya_tools/Rigging/joint_placer.py:4256

Return the namespace when a mapping points at the studio template. The UI auto-populates its HIK mapping from any skeleton in the scene. A loaded studio template must still use the specialized studio fitting pass; treating it as an arbitrar

_mapped_finger_chains

def _mapped_finger_chains(joint_map: Optional[dict]) -> List[List[str]]

module function · internal · maya_tools/Rigging/joint_placer.py:4273

_multiply_joint_local_translations

def _multiply_joint_local_translations(joints: Iterable[str], multiplier: float) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:4287

_orient_reverse_foot_ik_chain

def _orient_reverse_foot_ik_chain(side: str, namespace: str) -> Dict[str, Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:4307

Make the distal RFL IK offsets signed local-X only and coplanar.

_fit_reverse_foot_chain

def _fit_reverse_foot_chain(side: str, namespace: str, points: Dict[str, Vector3], desired_scale: float, ground_pivots: Optional[Dict[str, Vector3]]=None) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:4344

Snap one reverse-foot helper chain after the deformation T-pose is final.

_reverse_foot_source_mesh

def _reverse_foot_source_mesh(root: str, points: Dict[str, Vector3], preferred_mesh: Optional[str]=None) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:4422

Resolve an optional footwear mesh or Joint Placer's body-mesh fallback.

_mesh_candidate_for_foot

def _mesh_candidate_for_foot(meshes: Sequence[str], points: Dict[str, Vector3], side: str, fallback: str) -> str

module function · internal · maya_tools/Rigging/joint_placer.py:4477

Choose selected footwear nearest this side's ankle-to-toe footprint.

_solve_reverse_foot_ground_pivots

def _solve_reverse_foot_ground_pivots(query: 'MeshInteriorQuery', side: str, ankle: Vector3, toe: Vector3, toe_tip: Vector3, ground_y: float=0.0) -> Dict[str, Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:4522

Fit heel and bank pivots to the actual local sole footprint. The solve uses a horizontal foot basis rather than template offsets or channel values. It therefore remains stable after T-pose rotations and on characters with different foot siz

_mirror_reverse_foot_ground_pivots_if_symmetric

def _mirror_reverse_foot_ground_pivots_if_symmetric(ground_pivots: Dict[str, Dict[str, Vector3]], center_x: float) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:4664

Mirror the left footprint unless the measured right mesh differs materially.

snap_reverse_foot_helpers_to_deformation_skeleton

def snap_reverse_foot_helpers_to_deformation_skeleton(namespace: str='', sides: Optional[Iterable[str]]=None, shoe_meshes: Optional[Iterable[str]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:4703

Snap RFL helpers to the finalized deformation-leg T-pose. Initial anatomical placement and skin import deliberately leave the detached reverse-foot helpers untouched. The T-pose pass first straightens the legs in front view and grounds the

snap_all_reverse_foot_helpers_after_t_pose

def snap_all_reverse_foot_helpers_after_t_pose(shoe_meshes: Optional[Iterable[str]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:4829

Run post-T-pose RFL fitting, optionally using selected footwear meshes.

_joint_world_axes

def _joint_world_axes(joint: str) -> Dict[str, om.MVector]

module function · internal · maya_tools/Rigging/joint_placer.py:4855

_rotate_vector_between_directions

def _rotate_vector_between_directions(vector: om.MVector, source_direction: om.MVector, target_direction: om.MVector) -> om.MVector

module function · internal · maya_tools/Rigging/joint_placer.py:4864

Shortest-arc transport of a vector from one aim direction to another.

solve_reference_joint_roll_vectors

def solve_reference_joint_roll_vectors(mesh: str, desired_x_by_name: Dict[str, om.MVector]) -> Tuple[Dict[str, om.MVector], List[str]]

module function · public name · maya_tools/Rigging/joint_placer.py:4894

Transfer approved local-Y roll while retaining target positions/X aims. The production rigs agree on a relative arm and digit frame. Positions may differ substantially between characters, so copying Euler values is not a valid comparison. I

solve_template_joint_roll_vectors

def solve_template_joint_roll_vectors(desired_x_by_name: Dict[str, om.MVector], template_path: str=DEFAULT_PLACEMENT_TEMPLATE) -> Dict[str, om.MVector]

module function · public name · maya_tools/Rigging/joint_placer.py:4988

Transport each named joint's authored rig-template roll to its fitted X.

_reference_roll_basis

def _reference_roll_basis(x_axis: om.MVector, reference_y: om.MVector) -> Tuple[om.MVector, om.MVector, om.MVector]

module function · internal · maya_tools/Rigging/joint_placer.py:5014

Build a right-handed Maya basis from an exact aim and approved roll.

_reference_z_basis

def _reference_z_basis(x_axis: om.MVector, reference_z: om.MVector) -> Tuple[om.MVector, om.MVector, om.MVector]

module function · internal · maya_tools/Rigging/joint_placer.py:5032

Build a right-handed Maya basis from an exact aim and approved Z.

_configure_preferred_bend_axis

def _configure_preferred_bend_axis(joint: str, world_plane_normal: Vector3, plane_label: str) -> Optional[str]

module function · internal · maya_tools/Rigging/joint_placer.py:5050

Record hinge metadata without inventing a preferred-angle pose.

capture_current_pose_as_preferred_angles

def capture_current_pose_as_preferred_angles(root: str) -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:5072

Store the completed placed pose as every joint's preferred angles. This must run after all placement and orientation cleanup. Preferred angles are pose data, so deriving them from nominal prebend constants can disagree with the skeleton the

import_matching_skin_weights

def import_matching_skin_weights(mesh: str, export_dir: str=DEFAULT_SKIN_WEIGHT_DIR) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:5105

Import exported weights when both files exactly match the mesh name.

_finger_plane_normal

def _finger_plane_normal(joint: str, fallback: Vector3) -> Vector3

module function · internal · maya_tools/Rigging/joint_placer.py:5158

_finger_chain

def _finger_chain(root_joint: str) -> List[str]

module function · internal · maya_tools/Rigging/joint_placer.py:5176

_project_joint_chain_to_plane

def _project_joint_chain_to_plane(chain: List[str]) -> float

module function · internal · maya_tools/Rigging/joint_placer.py:5192

Project a chain onto its strongest authored plane and return prior deviation.

_projected_chain_plane_deviation

def _projected_chain_plane_deviation(chain: List[str]) -> float

module function · internal · maya_tools/Rigging/joint_placer.py:5218

Return maximum deviation from a chain's strongest plane, without edits.

_project_finger_chain_to_tip_plane

def _project_finger_chain_to_tip_plane(chain: List[str], query: Optional['MeshInteriorQuery']=None) -> Dict[str, float]

module function · internal · maya_tools/Rigging/joint_placer.py:5243

Keep a centered terminal fixed while flattening its 02-to-tip chain. A generic best-fit plane can pull a fingertip away from the actual mesh cap. Instead, the plane is constrained to pass through joints 02 and the already-centered terminal;

_studio_fingertip_center_offsets

def _studio_fingertip_center_offsets(mesh: str, namespace: str='') -> Dict[str, Tuple[float, float]]

module function · internal · maya_tools/Rigging/joint_placer.py:5302

Measure terminal offsets from their local mesh-section centers.

_enforce_no_reverse_finger_bend

def _enforce_no_reverse_finger_bend(chain: List[str], query: Optional['MeshInteriorQuery']=None, dorsal_hint: Vector3=(0.0, 1.0, 0.0)) -> float

module function · internal · maya_tools/Rigging/joint_placer.py:5352

Remove distal hyperextension without erasing a mesh-authored curl. ``chain`` is the articulated 02-terminal chain. Heights along the dorsal axis are expressed as slopes along the finger, then projected onto a monotonically decreasing sequen

enforce_studio_finger_planarity

def enforce_studio_finger_planarity(root: str, namespace: str='', mesh: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:5462

Make joints 02 through the terminal of each digit one bend plane. Joint 01 is the metacarpal fan/root and may approach joint 02 from outside that plane. The articulated finger starts at 02; projecting only that subchain preserves the approv

_align_mild_studio_digit_bend

def _align_mild_studio_digit_bend(chain: List[str], query: Optional['MeshInteriorQuery']=None, obvious_bend_ratio: float=0.08) -> Dict[str, object]

module function · internal · maya_tools/Rigging/joint_placer.py:5533

Put 03/04 on the 02-to-tip line unless the mesh shows a clear bend.

_studio_finger_chains

def _studio_finger_chains(namespace: str='') -> Dict[str, List[str]]

module function · internal · maya_tools/Rigging/joint_placer.py:5591

Return the authored high-resolution digit chains by stable template name.

_depth_centered_inside_point

def _depth_centered_inside_point(query: MeshInteriorQuery, point: Vector3) -> Tuple[Vector3, bool]

module function · internal · maya_tools/Rigging/joint_placer.py:5609

Center a hand proposal through palm/finger thickness. In the studio T/A pose the hand spreads across XZ and its thickness is Y. Recentring Z can silently jump between adjacent fingers, producing crossed chains that are technically inside th

_bounded_move_inside

def _bounded_move_inside(query: MeshInteriorQuery, point: Vector3, maximum_distance: float) -> Tuple[Vector3, bool]

module function · internal · maya_tools/Rigging/joint_placer.py:5627

Accept a closest-surface repair only when it remains anatomically local. Hands and facial features contain several nearby disconnected volumes. An unconstrained closest-point repair can therefore move a thumb tip into the index finger, or a

_fit_studio_wrist

def _fit_studio_wrist(query: MeshInteriorQuery, side: str, namespace: str) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:5648

Place a wrist at the narrow arm-to-palm section and center it in 3D.

_studio_digit_surface_rows

def _studio_digit_surface_rows(query: MeshInteriorQuery, side: str, chains: Dict[str, List[str]], namespace: str) -> Dict[str, float]

module function · internal · maya_tools/Rigging/joint_placer.py:5703

Detect the four separate non-thumb finger rows from mesh sections.

_studio_thumb_tip_from_sections

def _studio_thumb_tip_from_sections(query: MeshInteriorQuery, side: str, wrist: om.MVector, source: List[om.MVector]) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:5757

Find the distal thumb volume independently of the neighboring fingers.

_studio_digit_tip_from_row

def _studio_digit_tip_from_row(query: MeshInteriorQuery, side: str, wrist: om.MVector, row_z: float, preferred_y: float) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:5808

Resolve one fingertip from its isolated top-view digit row.

_fit_studio_hand_from_reference

def _fit_studio_hand_from_reference(query: MeshInteriorQuery, root: str, chains: Dict[str, List[str]], namespace: str='') -> Dict[str, object]

module function · internal · maya_tools/Rigging/joint_placer.py:5840

Locally conform an atlas-seeded hand without rebuilding its anatomy.

fit_studio_hand_joints

def fit_studio_hand_joints(mesh: str, root: str, namespace: str='', preserve_reference_layout: bool=False) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:5957

Fit detailed studio fingers to the actual hand volume. The template supplies digit spread, proportions, and bend planes. Each chain is kept as long as the mesh allows and is centered through the local mesh thickness, so placement is not mer

fit_studio_distal_thumb_joints

def fit_studio_distal_thumb_joints(mesh: str, namespace: str='', smoothing: float=0.0, minimum_bend_degrees: float=4.0) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6232

Restore the topology-authored distal thumb pivots and rest bend. The topology/reference solve already owns the longitudinal knuckle and fingertip locations. ``smoothing`` is retained as an explicit opt-in for legacy data, but defaults to ze

fit_studio_thumb_root_depth

def fit_studio_thumb_root_depth(mesh: str, namespace: str='', dorsal_fraction: float=0.45) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6393

Seat thumb_01 slightly palmar of center without moving its children. A world-axis hand-depth solve is unreliable where the thumb mound turns away from the palm. Use the topology-transferred thumb dorsal vector (or the joint's local Y fallba

fit_studio_finger_knuckle_height

def fit_studio_finger_knuckle_height(mesh: str, namespace: str='', upper_fraction: float=2.0 / 3.0) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6445

Seat each finger joint 02 two thirds toward the dorsal surface. Joints 03-04 retain their mesh-derived pose and joint 05 remains centered in the fingertip. The later planar pass makes that 02-05 chain a stable single-axis curl plane without

fit_studio_arm_red_dot_refinement

def fit_studio_arm_red_dot_refinement(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6496

Audit the topology-fitted shoulder, elbow, and wrist landmarks. The approved topology transfer already places these pivots from the source rigs. A former post-pass recentered the chain independently and then projected the wrist onto a synth

fit_studio_arm_hand_from_reference

def fit_studio_arm_hand_from_reference(mesh: str, namespace: str='', reference_targets: Optional[Dict[str, Vector3]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6533

Restore approved mesh-relative arm and hand landmarks exactly. Topology transfer from the approved rig corpus owns elbow, wrist, and digit anatomy. No independent per-joint section-centering is allowed here: that post-process bent otherwise

_find_studio_elbow_section

def _find_studio_elbow_section(query: 'MeshInteriorQuery', shoulder: Vector3, wrist: Vector3) -> Optional[Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:6583

Find the compact elbow section along a posed shoulder-to-wrist span.

fit_studio_elbow_pivots_to_mesh

def fit_studio_elbow_pivots_to_mesh(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6647

Fit both elbow pivots consistently at the approved arm-chain fraction.

fit_studio_arm_hinge_plane_to_mesh

def fit_studio_arm_hinge_plane_to_mesh(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6690

Conform arm pivots without flattening an authored A-pose into a T-pose. Atlas transfer supplies stable longitudinal landmarks, while the target mesh owns each pivot's through-volume depth. Shoulder, elbow, and wrist must *not* share one wor

_fit_studio_twist_segments

def _fit_studio_twist_segments(namespace: str='') -> List[str]

module function · internal · maya_tools/Rigging/joint_placer.py:6837

Place studio twist joints at deterministic fractions of their segment.

mirror_studio_right_leg_from_left

def mirror_studio_right_leg_from_left(namespace: str='') -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:6868

Make the right leg an exact world-X reflection of the authored left leg.

_same_side_interval

def _same_side_interval(intervals: Iterable[Tuple[float, float]], side: str, center_x: float, seed_x: float) -> Optional[Tuple[float, float]]

module function · internal · maya_tools/Rigging/joint_placer.py:6894

Choose the local shell interval belonging to one anatomical side.

refine_studio_core_targets_for_mesh

def refine_studio_core_targets_for_mesh(targets: Dict[str, Vector3], mesh: str) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:6925

Refine torso, A-stance legs, feet, and neck from local mesh sections. Unlike a whole-mesh inside test, every leg point must use the interval on its own side. This prevents the opposite leg or pelvis shell from falsely validating a joint in

_fit_studio_feet_to_volume

def _fit_studio_feet_to_volume(query: MeshInteriorQuery, namespace: str='') -> Dict[str, Dict[str, Vector3]]

module function · internal · maya_tools/Rigging/joint_placer.py:7246

Derive toe base and tip from each foot's longitudinal mesh interval.

fit_studio_foot_front_flare

def fit_studio_foot_front_flare(mesh: str, namespace: str='') -> Dict[str, Dict[str, Vector3]]

module function · public name · maya_tools/Rigging/joint_placer.py:7287

Recenter each foot joint in its own same-side mesh section. Reference toe tips can initially sit beyond the mesh end. Applying this correction after containment lets the final foot use the actual local footprint instead of a fixed character

fit_studio_toe_pivots_to_volume

def fit_studio_toe_pivots_to_volume(mesh: str, namespace: str='') -> Dict[str, Dict[str, Vector3]]

module function · public name · maya_tools/Rigging/joint_placer.py:7334

Center toe pivots on the full forefoot and toe-end centerline. The toe base uses the center of the complete same-side forefoot width, not one digit's interval. The terminal helper sits at the center of the toe-end line, just inside the long

align_studio_thigh_roots_to_pelvis_depth

def align_studio_thigh_roots_to_pelvis_depth(namespace: str='') -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:7523

Align both femoral roots with the pelvis in side view.

fit_studio_toe_tips_to_ground

def fit_studio_toe_tips_to_ground(namespace: str='', ground_y: float=0.0) -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:7547

Put terminal toe pivots on the supplied mesh ground without lateral drift. The old extrapolation * (toe_depth / foot_depth) amplified any ankle to toe X mismatch and pulled tips across the character centerline. The local foot section pass n

fit_studio_pelvis_ridge

def fit_studio_pelvis_ridge(mesh: str, namespace: str='') -> Dict[str, Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:7586

Raise the pelvis branch toward the visible pelvic ridge. Pelvis, hipswing, and both femoral roots move by one shared scale-relative amount. Every other joint is restored to its original world position so the correction does not translate th

fit_studio_detail_joints_to_volume

def fit_studio_detail_joints_to_volume(mesh: str, root: str, namespace: str='', preserve_reference_layout: bool=False) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:7684

Conform every non-root studio joint to the character volume.

fit_studio_brow_end_joints_to_surface

def fit_studio_brow_end_joints_to_surface(mesh: str, root: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:7768

Continue each outer brow arc using the approved rig proportions. Brow landmarks are independent children of the head, so a generic local surface transfer can accidentally fold ``brow_end`` back toward the eye. Approved rigs consistently con

fit_studio_brows_from_left_profile

def fit_studio_brows_from_left_profile(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:7876

Transfer the approved left-brow spacing and surface proximity.

fit_studio_brow_arcs_to_surface

def fit_studio_brow_arcs_to_surface(mesh: str, root: str, namespace: str='', iterations: int=4, strength: float=0.35) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:7929

Fair each complete brow row into one smooth surface-following arc.

fit_studio_lip_joints_to_surface

def fit_studio_lip_joints_to_surface(mesh: str, namespace: str='', iterations: int=8, strength: float=1.0) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:8260

Author two clean, symmetric lip arcs from mesh-fitted face anchors. The approved center and commissure pivots are anchors. Only the four intermediate pivots on each half are faired; this prevents the upper and lower passes from fighting ove

fit_studio_eyelid_joints_to_surface

def fit_studio_eyelid_joints_to_surface(mesh: str, root: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:8465

Collapse eyelid roots to each eye and ray their tips onto the lid skin.

orient_studio_single_child_chains

def orient_studio_single_child_chains(root: str, namespace: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:8592

Aim local X down every unambiguous one-child studio bone. Branch joints retain their authored basis because no single child defines a unique aim direction. The origin is also preserved as a world-space reference. Every oriented joint is mea

orient_studio_eyelid_chains_to_tips

def orient_studio_eyelid_chains_to_tips(root: str) -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:8635

Aim each eyelid segment's local +X toward its mesh-fitted tip child. The saved Lost Soul Kid rig authors every eyelid tip at positive local X. Preserve that convention for both template and mapped fits, after their mesh-dependent tip locati

orient_studio_digit_chains

def orient_studio_digit_chains(mesh: str='', namespace: str='', preserve_positions: bool=False, preserve_knuckle_positions: bool=False) -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:8696

Center fingertips and author straight, animator-facing digit channels. Joint 01 aims at joint 02. Every joint from 02 onward uses signed Translate X only (+X left, -X right), and the articulated chain shares one bend plane. From joint 02 on

configure_studio_bend_axes

def configure_studio_bend_axes(root: str, namespace: str='') -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:9262

Author one preferred bend axis while leaving all channels editable.

configure_studio_elbow_bend_axes_from_channels

def configure_studio_elbow_bend_axes_from_channels(namespace: str='') -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:9314

Bias elbow IK to local Z while keeping every rotate channel editable.

zero_studio_elbow_bind_rotations

def zero_studio_elbow_bind_rotations(namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:9345

Keep fitted lowerarm bind orientation on rotate, never jointOrient. The fitted world frame is preserved exactly while its Euler values are stored in the animator-facing rotate channels. Joint Orient and Rotate Axis remain zero, and every ch

enforce_studio_joint_dof_policy

def enforce_studio_joint_dof_policy(namespace: str='') -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:9369

Set animator-facing hinge axes without locking transform channels.

zero_studio_digit_non_curl_rotations

def zero_studio_digit_non_curl_rotations(namespace: str='') -> Dict[str, int]

module function · public name · maya_tools/Rigging/joint_placer.py:9403

Bake digit rest frames into jointOrient so only curl is in rotateZ.

enforce_studio_thumb_z_only_rotates

def enforce_studio_thumb_z_only_rotates(namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:9437

Keep thumb 02-terminal animator rotations on the curl channel only. Approved thumb pivots can require a multi-axis rest frame under a lowered, scaled hand. Store that fitted rest frame in jointOrient, leaving rotate channels neutral and loc

capture_studio_template_knee_bend_axes

def capture_studio_template_knee_bend_axes(namespace: str='') -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:9487

Tag knees with the studio template's authored local-Y hinge.

_studio_knee_hinge_direction

def _studio_knee_hinge_direction(side: str, namespace: str='') -> om.MVector

module function · internal · maya_tools/Rigging/joint_placer.py:9502

Return the normal of one fitted hip-knee-ankle plane.

align_studio_leg_front_projection

def align_studio_leg_front_projection(mesh: str='', namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:9552

Place each knee on its hip-to-ankle line in front view only. Knee Y (height) and Z (sagittal depth) remain mesh-fitted. Only lateral X is corrected. Front-plane continuity is authoritative even when imperfect or asymmetric geometry means th

align_studio_knees_to_final_mesh_line

def align_studio_knees_to_final_mesh_line(mesh: str, namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:9592

Place knee pivots on the final guided hip-to-ankle line in the mesh. The mesh core pass runs before optional scene guides are restored. A later thigh guide can therefore move the femoral root while leaving its knee at the pre-guide position

finalize_studio_core_positions_from_mesh

def finalize_studio_core_positions_from_mesh(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:9675

Re-fit the central spine and leg pivots after orientation restores. Preserve the fitted spine heights from the selected mesh/reference solve, recenter each vertebra in its own torso section, and center each ankle in its own side's mesh sect

fit_studio_wrist_pivots_to_mesh

def fit_studio_wrist_pivots_to_mesh(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:9877

Re-seat wrist pivots in the hand volume after all reference restores. Later approved-frame restores can put the wrist back on the dorsal edge after the earlier arm fit. Reapply the established 60-percent section placement as the last positi

finalize_studio_spine_neck_head

def finalize_studio_spine_neck_head(mesh: str, namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:9956

Reassert the central torso/head line after all detail volume fitting.

enforce_studio_neck2_midpoint

def enforce_studio_neck2_midpoint(namespace: str='') -> Optional[Vector3]

module function · public name · maya_tools/Rigging/joint_placer.py:9996

Keep neck2 exactly halfway between the final neck1 and head1 pivots.

enforce_studio_neck2_head1_local_x_plane

def enforce_studio_neck2_head1_local_x_plane(namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:10019

Keep neck2->head1 on the joint's local X axis after final restores. The head pivot remains at its fitted mesh-relative location to within the tiny off-plane correction required to put the segment in a single plane.

align_studio_center_face_positions

def align_studio_center_face_positions(mesh: str, namespace: str='') -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:10063

Place central body and face anchors on the mesh front-view midline. Capture targets before moving parents and preserve child world matrices.

enforce_studio_center_face_local_zeroes

def enforce_studio_center_face_local_zeroes(namespace: str='', preserve_nose_root_depth: bool=False) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:10106

Enforce studio nose local-channel zeroes without moving child branches.

configure_mapped_bend_axes

def configure_mapped_bend_axes(root: str, joint_map: dict) -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:10149

Apply the same hinge policy through user-defined HIK joint mappings.

_joint_translation_is_editable

def _joint_translation_is_editable(joint: str) -> bool

module function · internal · maya_tools/Rigging/joint_placer.py:10209

_set_joint_world_translation

def _set_joint_world_translation(joint: str, position: Vector3) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10219

Set a joint pivot in world space without changing its world orientation.

_set_joint_world_translation_preserving_children

def _set_joint_world_translation_preserving_children(joint: str, position: Vector3) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10227

Move one joint pivot while leaving every child subtree in world space.

_set_joint_world_basis_preserving_children

def _set_joint_world_basis_preserving_children(joint: str, basis: Sequence[float]) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10246

Apply an exact world basis without disturbing any child world pose.

_set_joint_local_rotation_preserving_children

def _set_joint_local_rotation_preserving_children(joint: str, rotation: Vector3) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10289

Set exact rotate channels without moving any child branches.

_orient_joint_x_to_child

def _orient_joint_x_to_child(joint: str, child: str, world_up: Vector3=(0.0, 1.0, 0.0), aim_sign: float=1.0) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10321

Aim signed local X at one child without moving its branches. Studio arm joints own twist/helper branches in addition to the primary chain. Maya's generic hierarchy orient can choose one of those branches as its aim target. Detaching every d

_orient_joint_x_to_world_direction

def _orient_joint_x_to_world_direction(joint: str, direction: Vector3, world_up: Vector3=(0.0, 1.0, 0.0)) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10400

Aim local X at an explicit world vector while preserving child poses.

_orient_joint_with_world_z_hinge

def _orient_joint_with_world_z_hinge(joint: str, direction: Vector3, world_z: Vector3) -> None

module function · internal · maya_tools/Rigging/joint_placer.py:10465

Aim X as closely as possible down-bone while keeping an exact Z hinge.

_move_joint_orientation_to_rotate

def _move_joint_orientation_to_rotate(joint: str) -> Tuple[float, float, float]

module function · internal · maya_tools/Rigging/joint_placer.py:10514

Preserve a joint's world basis while moving jointOrient onto rotate.

move_all_studio_joint_orientation_to_rotate

def move_all_studio_joint_orientation_to_rotate(root: str, namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:10592

Zero jointOrient/rotateAxis everywhere without changing world poses.

_capture_studio_joint_positions

def _capture_studio_joint_positions(root: str) -> Dict[str, Vector3]

module function · internal · maya_tools/Rigging/joint_placer.py:10630

Capture one stable world-space position per studio joint.

_capture_studio_joint_world_matrices

def _capture_studio_joint_world_matrices(root: str) -> Dict[str, Sequence[float]]

module function · internal · maya_tools/Rigging/joint_placer.py:10644

Capture complete approved joint frames for a deterministic rerun.

_restore_studio_joint_world_matrices

def _restore_studio_joint_world_matrices(root: str, matrices: Dict[str, Sequence[float]]) -> int

module function · internal · maya_tools/Rigging/joint_placer.py:10661

Restore full frames parent-first after a clean template rebuild.

_restore_studio_joint_world_positions

def _restore_studio_joint_world_positions(root: str, positions: Dict[str, Vector3]) -> Dict[str, float]

module function · internal · maya_tools/Rigging/joint_placer.py:10682

Restore approved pivots without replacing newly authored orientations. Existing studio skeletons are an artist-approved placement source. A joint-placer rerun may standardize their axes, but it must not reinterpret their anatomy from the me

validate_studio_final_joint_placement

def validate_studio_final_joint_placement(mesh: str, root: str, fitted_positions: Optional[Dict[str, Vector3]]=None, stage: str='final', validate_orientations: bool=False, validate_center_face_alignment: bool=True, validate_fingertip_centering: bool=True, validate_neck2_midpoint: bool=True, validate_nose_root_local_zero: bool=True) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:10721

Reject post-fit hierarchy drift and grossly displaced joint pivots.

orient_studio_arm_chains

def orient_studio_arm_chains(mesh: str='', namespace: str='', only_joints: Optional[Sequence[str]]=None) -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:11537

Aim arm X axes at placed children and transfer approved template roll. Joint placement owns every pivot. The atlas owns only the relative frame: left +X runs down the arm and right -X runs down it, while Y/Z retain the same roll used by app

orient_studio_leg_reference_frames

def orient_studio_leg_reference_frames(mesh: str='', namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:11634

Transfer approved leg roll without changing fitted leg/foot pivots.

enforce_studio_elbow_z_hinges

def enforce_studio_elbow_z_hinges(namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:11700

Preserve the authored arm frame and identify its local bend axis. Arm roll is already transferred from approved production rigs by :func:`orient_studio_arm_chains`. Do not rebuild that frame from the shoulder/elbow/wrist triangle here: on r

orient_studio_elbow_z_hinge_frames

def orient_studio_elbow_z_hinge_frames(namespace: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:11733

Align upperarm/lowerarm frames to their bend plane for rotateZ curl. The two segment X axes are aimed at their placed children. Their shared Z axis is the shoulder-elbow-wrist plane normal, so the lowerarm's fitted rest bend is representabl

enforce_studio_knee_y_hinges

def enforce_studio_knee_y_hinges(namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:11809

Express each fitted knee pose exclusively on local rotateY. The thigh frame comes from the hip-knee-ankle plane, with local Y normal to that plane. Mesh-relative pivots stay fixed while the knee and every child through toeTip use signed loc

orient_studio_spine_vertical

def orient_studio_spine_vertical(namespace: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:11937

Give every spine pivot one identical scene-vertical world basis.

orient_studio_root_pelvis_hipswing_y_up

def orient_studio_root_pelvis_hipswing_y_up(namespace: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:11981

Give origin, pelvis, and hipswing a shared world-Y-up basis.

orient_studio_head_chains

def orient_studio_head_chains(namespace: str='', include_oral: bool=True) -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:12037

Aim the central neck, skull, jaw, and tongue joints down-bone. These joints own facial and oral branches, so the generic one-child pass deliberately skips several of them. Explicit primary-child pairs keep local X anatomical while preservin

orient_studio_neck1_grid_standard

def orient_studio_neck1_grid_standard(namespace: str='') -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12113

Keep neck1 aimed at neck2 with the same forward-Y axis as the spine.

orient_studio_center_face_grid_axes

def orient_studio_center_face_grid_axes(namespace: str='') -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12154

World-align center facial anchors to the scene grid axes exactly.

fit_studio_neck_head_jaw_relative

def fit_studio_neck_head_jaw_relative(mesh: str, namespace: str='', placement_names: Optional[Iterable[str]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:12182

Transfer approved neck/head/jaw pivots by mesh-relative proportions.

orient_studio_teeth_scene_y_up

def orient_studio_teeth_scene_y_up(namespace: str='') -> Dict[str, float]

module function · public name · maya_tools/Rigging/joint_placer.py:12389

World-align teeth joints with scene Y up and zero jointOrient. Teeth are rigid oral anchors rather than down-bone chain joints. Keeping their basis scene-aligned makes dental controls predictable even when the head and jaw parents carry cha

orient_studio_brow_joints

def orient_studio_brow_joints(mesh: str='', namespace: str='') -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12442

Aim X at the next brow and keep Y tangent to the facial surface.

zero_studio_eyelid_tip_rotates

def zero_studio_eyelid_tip_rotates(root: str) -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12529

Zero terminal eyelid rotate channels after all orientation passes.

orient_studio_surface_face_joints

def orient_studio_surface_face_joints(mesh: str, root: str) -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12561

Keep cheek and under-eye X axes tangent to the facial surface.

orient_studio_face_local_y_up

def orient_studio_face_local_y_up(root: str) -> Dict[str, Dict[str, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12663

Orient side facial joints to the studio's mirrored X/Y/Z convention. The lateral axis is derived from the eye landmarks so this remains aligned to the character when the mesh is rotated in the scene. Left-side joints use outward lateral X,

orient_studio_leg_chains

def orient_studio_leg_chains(namespace: str='', only_joints: Optional[Sequence[str]]=None) -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:12787

Author studio-mirrored signed-X frames for both leg chains.

orient_studio_twist_joints_like_parents

def orient_studio_twist_joints_like_parents(root: str, namespace: str='') -> Dict[str, str]

module function · public name · maya_tools/Rigging/joint_placer.py:13006

Match every studio twist joint's world basis exactly to its parent bone.

enforce_studio_twist_translate_x

def enforce_studio_twist_translate_x(root: str) -> Dict[str, Tuple[float, float, float]]

module function · public name · maya_tools/Rigging/joint_placer.py:13057

Put every deformation twist joint solely on its parent's local X axis. Twist pivots are fitted along their parent segment and inherit that segment's basis. Final elbow/leg orientation cleanup can nevertheless leave stale local Y/Z offsets.

unlock_studio_joint_channels

def unlock_studio_joint_channels(root: str, namespace: str='') -> int

module function · public name · maya_tools/Rigging/joint_placer.py:13116

Leave every studio joint transform channel unlocked and keyable.

_capture_mapped_twist_fractions

def _capture_mapped_twist_fractions(joint_map: dict) -> Dict[str, Tuple[str, str, float]]

module function · internal · maya_tools/Rigging/joint_placer.py:13156

Remember authored twist spacing before the core hierarchy is resized.

mapped_detail_editability_issues

def mapped_detail_editability_issues(root: str) -> List[str]

module function · public name · maya_tools/Rigging/joint_placer.py:13195

Return driven/locked body detail joints that make a fit unsafe. MetaHuman body helpers must be editable in neutral-pose editing mode before their core skeleton is repositioned. Detect this before any scale or joint move so a live RigLogic/R

place_mapped_detail_joints

def place_mapped_detail_joints(mesh: str, root: str, joint_map: dict, twist_fractions: Optional[Dict[str, Tuple[str, str, float]]]=None) -> Dict[str, object]

module function · public name · maya_tools/Rigging/joint_placer.py:13235

Place and verify MetaHuman-style twist and corrective joints. Facial DNA joints and driver duplicates are deliberately untouched. Their neutral transforms belong to RigLogic/DNA and require the face mesh/DNA update workflow rather than a bo

fit_mapped_skeleton

def fit_mapped_skeleton(mesh: str, points: Dict[str, Vector3], joint_map: dict) -> Tuple[str, int, int, Dict[str, object]]

module function · public name · maya_tools/Rigging/joint_placer.py:13512

Fit solved anatomical roles onto an existing user-defined hierarchy.

fit_studio_template_skeleton

def fit_studio_template_skeleton(points: Dict[str, Vector3], mesh: str='', template_path: str=DEFAULT_PLACEMENT_TEMPLATE, namespace: str='', replace_existing: bool=True, approved_world_matrices: Optional[Dict[str, Sequence[float]]]=None) -> Tuple[str, int, int]

module function · public name · maya_tools/Rigging/joint_placer.py:13733

Load or reuse the complete studio skeleton and fit it to solved anchors.

preview_biped_joint_placement

def preview_biped_joint_placement(mesh: str, solver: str='production', landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, create_guides: bool=True, joint_map: Optional[dict]=None) -> PlacementPreview

module function · public name · maya_tools/Rigging/joint_placer.py:15072

Solve and validate placement without creating or replacing a skeleton.

build_basic_biped_skeleton

def build_basic_biped_skeleton(mesh: str, orient: bool=True, replace_existing: bool=True, create_guides: bool=False, solver: str='production', landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, template_namespace: str='', require_interior: bool=False, joint_map: Optional[dict]=None, import_skin_weights: bool=False) -> PlacementResult

module function · public name · maya_tools/Rigging/joint_placer.py:15146

create_auto_joints_for_mesh

def create_auto_joints_for_mesh(mesh: str, orient: bool=True, replace_existing: bool=True, create_guides: bool=False, solver: str='production', landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, template_namespace: str='', require_interior: bool=False, joint_map: Optional[dict]=None, import_skin_weights: bool=False) -> Tuple[dict, dict]

module function · public name · maya_tools/Rigging/joint_placer.py:15431

preview_selected_mesh_joint_placement

def preview_selected_mesh_joint_placement(solver: str='production', landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, create_guides: bool=True, joint_map: Optional[dict]=None) -> PlacementPreview

module function · public name · maya_tools/Rigging/joint_placer.py:15460

Preview the selected mesh without creating or replacing rig joints.

create_auto_joints_for_selected_mesh

def create_auto_joints_for_selected_mesh(orient: bool=True, replace_existing: bool=True, create_guides: bool=False, solver: str='production', landmark_points: Optional[Dict[str, Vector3]]=None, template_path: str=DEFAULT_PLACEMENT_TEMPLATE, template_namespace: str='', require_interior: bool=False, joint_map: Optional[dict]=None) -> Tuple[dict, dict]

module function · public name · maya_tools/Rigging/joint_placer.py:15481

maya_tools.Rigging.metahuman_utils

rebind_metahuman_face_to_body

def rebind_metahuman_face_to_body(face_mesh, face_joints, body_joints, skin_weights_path, dna_file_path)

module function · public name · maya_tools/Rigging/metahuman_utils.py:7

Rebind MetaHuman head mesh to a different body rig, transfer skin weights, and update the DNA. :param face_mesh: Name of the MetaHuman face mesh (e.g. "Face_Mesh") :param face_joints: List of face rig joints to snap (e.g. ["root", "pelvis",

maya_tools.Rigging.mocap.control_identity

is_animator_control_identity

def is_animator_control_identity(node: str, object_sets: Iterable[str]=()) -> bool

module function · public name · maya_tools/Rigging/mocap/control_identity.py:8

Use a naming contract or an explicit Maya control set membership.

maya_tools.Rigging.mocap.fbx_to_control_rig

_input_file

def _input_file(value: str | Path, suffixes: set[str], role: str) -> Path

module function · internal · maya_tools/Rigging/mocap/fbx_to_control_rig.py:16

_require_compatible_maya_scene

def _require_compatible_maya_scene(rig_scene: Path, running_version: str) -> None

module function · internal · maya_tools/Rigging/mocap/fbx_to_control_rig.py:25

Refuse a newer Maya ASCII rig before any retarget output is written. Maya may open a newer scene while dropping unsupported nodes and still report a successful reference. That is not a trustworthy control bake. Maya binary files cannot be i

transfer_fbx_animation_to_control_rig

def transfer_fbx_animation_to_control_rig(*, animation_fbx: str | Path, rig_scene: str | Path, target_hik_fbx: str | Path, output_scene: str | Path, mapping_profile: str | Path | None=None, solved_fbx: str | Path | None=None, source_mapping: dict[str, dict[str, Any]] | None=None, source_hik_fbx: str | Path | None=None, source_tpose_frame: float | None=None, target_character: str | None=None, rig_namespace: str='CharacterRig', solved_namespace: str='RetargetSolved', overwrite: bool=False, force_discard_scene: bool=False) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/fbx_to_control_rig.py:49

Transfer a selected animation FBX onto a selected Maya control rig. The animation FBX's embedded locked HIK character is preferred. An uncharacterized source uses a selected sister ``source_hik_fbx`` or, when omitted, tries the selected tar

transfer_fbx_animation_dialog

def transfer_fbx_animation_dialog(**kwargs: Any) -> dict[str, Any] | None

module function · public name · maya_tools/Rigging/mocap/fbx_to_control_rig.py:195

Pick the source FBX, Maya rig, companion HIK FBX, and output scene. Cancellation leaves the scene unchanged. The dialog offers the selected target's companion HIK FBX or a separately selected characterized sister FBX for the animation skele

maya_tools.Rigging.mocap.fbx_to_engine

transfer_fbx_to_engine

def transfer_fbx_to_engine(*, animation_fbx: str | Path, rig_scene: str | Path, target_hik_fbx: str | Path, output_scene: str | Path, output_fbx: str | Path, source_hik_fbx: str | Path | None=None, source_mapping: dict[str, dict[str, Any]] | None=None, source_tpose_frame: float | None=None, mapping_profile: str | Path | None=None, target_character: str | None=None, overwrite: bool=False, force_discard_scene: bool=False) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/fbx_to_engine.py:9

Retarget, bake animator controls, then export only target deform joints. All inputs and both user-facing outputs are preflighted before Maya changes scenes. The companion/slot checks and clean-FBX reopen audit are delegated to their validat

maya_tools.Rigging.mocap.hik_mapping

unqualified_name

def unqualified_name(node)

module function · public name · maya_tools/Rigging/mocap/hik_mapping.py:29

Return a DAG and namespace independent Maya node name.

stable_node_name

def stable_node_name(node)

module function · public name · maya_tools/Rigging/mocap/hik_mapping.py:35

Return the shortest namespace-qualified name stable under reparenting.

load_profile

def load_profile(json_path, base_joint_map=None)

module function · public name · maya_tools/Rigging/mocap/hik_mapping.py:41

Load a serialized HumanIK map without modifying the shared default.

from_character_definition

def from_character_definition(character, base_joint_map=None)

module function · public name · maya_tools/Rigging/mocap/hik_mapping.py:69

Read slot connections supported by the active Maya HIK node version.

_hierarchy

def _hierarchy(root_joint)

module function · internal · maya_tools/Rigging/mocap/hik_mapping.py:87

_resolve_unique

def _resolve_unique(name, hierarchy)

module function · internal · maya_tools/Rigging/mocap/hik_mapping.py:97

_between

def _between(ancestor, descendant)

module function · internal · maya_tools/Rigging/mocap/hik_mapping.py:104

resolve_to_scene

def resolve_to_scene(joint_map, root_joint, repair_required=True)

module function · public name · maya_tools/Rigging/mocap/hik_mapping.py:119

Resolve one mapping to one hierarchy and return validation provenance.

maya_tools.Rigging.mocap.hik_retarget

_source_scripts

def _source_scripts() -> None

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:11

_import_fbx

def _import_fbx(path: Path, namespace: str | None=None) -> None

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:22

_source_joint

def _source_joint(bone_name: str, imported_joints: set[str]) -> str

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:38

_character_slots

def _character_slots(character: str) -> dict[str, str]

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:49

Read the imported HIK definition, retaining only unambiguous joint links.

_imported_character

def _imported_character(before: set[str], imported_joints: set[str], role: str) -> tuple[str, dict[str, str]]

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:65

_character_joint

def _character_joint(character: str, attribute: str) -> str

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:89

_position

def _position(node: str, frame: float) -> list[float]

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:98

_bare

def _bare(node: str) -> str

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:103

_copy_matching_animation

def _copy_matching_animation(animated_joints: set[str], characterized_joints: set[str], slots: dict[str, str]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/mocap/hik_retarget.py:107

Apply a clip to its separately characterized sister skeleton. Match the full joint-parent lineage, not only the leaf name. Real face rigs can repeat a leaf joint name in separate branches; those names are not ambiguous when their ancestry i

retarget_fbx_hik

def retarget_fbx_hik(target_rig: str, source_fbx: str, output_fbx: str, source_mapping: dict[str, dict[str, Any]] | None=None, target_character: str | None='Character1', source_character: str='AIStudioSourceCharacter', source_namespace: str='AIStudioSource', target_namespace: str='MannyRig_v01_retarget', reset_scene: bool=True, source_tpose_frame: float | None=None, source_hik_fbx: str | None=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/hik_retarget.py:156

Retarget from an imported HIK character or an explicit slot/bone map. An animation-only FBX can use ``source_hik_fbx`` when it has the same skeleton as a separately characterized sister FBX. Otherwise a mapped, uncharacterized FBX needs ``s

maya_tools.Rigging.mocap.hik_ui

_maya_major_version

def _maya_major_version()

module function · internal · maya_tools/Rigging/mocap/hik_ui.py:18

_rig_stack_source_signature

def _rig_stack_source_signature()

module function · internal · maya_tools/Rigging/mocap/hik_ui.py:64

Return a cheap signature that changes when a rig module changes on disk.

reload_rig_function_stack

def reload_rig_function_stack(force=False)

module function · public name · maya_tools/Rigging/mocap/hik_ui.py:93

Reload changed Maya rig modules; skip the expensive no-change path.

get_default_export_path

def get_default_export_path()

module function · public name · maya_tools/Rigging/mocap/hik_ui.py:148

get_main_window_pointer

def get_main_window_pointer()

module function · public name · maya_tools/Rigging/mocap/hik_ui.py:159

Get the Maya main window pointer :return:

ParentSelectionDialog.__init__

def ParentSelectionDialog.__init__(self, msg, parent=None)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:169

ControlRigPopup.__init__

def ControlRigPopup.__init__(self, skeletal_meshes, joint_map, uproject, parent=None)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:201

ControlRigPopup.filter_meshes

def ControlRigPopup.filter_meshes(self, text)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:241

ControlRigPopup.create_control_rig

def ControlRigPopup.create_control_rig(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:246

UnrealSkeletalExportDialog.__init__

def UnrealSkeletalExportDialog.__init__(self, rig_name, output_directory, asset_data, maya_meshes=None, selected_meshes=None, parent=None)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:263

UnrealSkeletalExportDialog._browse_output

def UnrealSkeletalExportDialog._browse_output(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:371

UnrealSkeletalExportDialog._set_all_export_meshes

def UnrealSkeletalExportDialog._set_all_export_meshes(self, checked)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:376

UnrealSkeletalExportDialog._checked_export_meshes

def UnrealSkeletalExportDialog._checked_export_meshes(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:381

UnrealSkeletalExportDialog._mesh_changed

def UnrealSkeletalExportDialog._mesh_changed(self, *_args)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:388

UnrealSkeletalExportDialog._update_preview

def UnrealSkeletalExportDialog._update_preview(self, *_args)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:406

UnrealSkeletalExportDialog._character_folder

def UnrealSkeletalExportDialog._character_folder(parent, clean_name)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:426

UnrealSkeletalExportDialog._validate_and_accept

def UnrealSkeletalExportDialog._validate_and_accept(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:430

UnrealSkeletalExportDialog.values

def UnrealSkeletalExportDialog.values(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:444

HIKDefinitionUI.__init__

def HIKDefinitionUI.__init__(self, parent=None, *, host_mode='maya')

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:458

HIKDefinitionUI._install_missing_tooltips

def HIKDefinitionUI._install_missing_tooltips(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:546

Fill tooltip gaps for interactive controls across every UI tab.

HIKDefinitionUI._notify_operation

def HIKDefinitionUI._notify_operation(self, title, message, severity='info')

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:611

Report an operation result without creating a top-level window.

HIKDefinitionUI._vehicle_live_tick

def HIKDefinitionUI._vehicle_live_tick(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:639

HIKDefinitionUI._build_hik_tab

def HIKDefinitionUI._build_hik_tab(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:649

HIKDefinitionUI._build_rigging_tab

def HIKDefinitionUI._build_rigging_tab(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:851

HIKDefinitionUI._build_skinning_tab

def HIKDefinitionUI._build_skinning_tab(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1646

Move all skinning tools into a dedicated, scrollable tab.

HIKDefinitionUI._build_mesh_tab

def HIKDefinitionUI._build_mesh_tab(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1662

Build the persistent Maya-to-Unreal mesh definition surface.

HIKDefinitionUI._sync_mesh_export_rig_name

def HIKDefinitionUI._sync_mesh_export_rig_name(self, value)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1781

HIKDefinitionUI.browse_mesh_export_directory

def HIKDefinitionUI.browse_mesh_export_directory(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:1785

HIKDefinitionUI._set_all_mesh_export_items

def HIKDefinitionUI._set_all_mesh_export_items(self, checked)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1792

HIKDefinitionUI._checked_mesh_export_items

def HIKDefinitionUI._checked_mesh_export_items(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1797

HIKDefinitionUI.refresh_mesh_export_scene_meshes

def HIKDefinitionUI.refresh_mesh_export_scene_meshes(self, *_args)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:1804

HIKDefinitionUI.use_selected_meshes_for_export

def HIKDefinitionUI.use_selected_meshes_for_export(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:1825

HIKDefinitionUI.refresh_mesh_export_unreal_assets

def HIKDefinitionUI.refresh_mesh_export_unreal_assets(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:1838

HIKDefinitionUI._mesh_export_target_changed

def HIKDefinitionUI._mesh_export_target_changed(self, *_args)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1875

HIKDefinitionUI._mesh_export_skeleton_policy_changed

def HIKDefinitionUI._mesh_export_skeleton_policy_changed(self, *_args)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1893

HIKDefinitionUI._update_mesh_export_preview

def HIKDefinitionUI._update_mesh_export_preview(self, *_args)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1898

HIKDefinitionUI._mesh_export_character_folder

def HIKDefinitionUI._mesh_export_character_folder(parent, clean_name)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1932

HIKDefinitionUI._mesh_export_settings

def HIKDefinitionUI._mesh_export_settings(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1936

HIKDefinitionUI._build_vehicle_tab

def HIKDefinitionUI._build_vehicle_tab(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:1960

HIKDefinitionUI.pick_vehicle_template_path

def HIKDefinitionUI.pick_vehicle_template_path(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2091

HIKDefinitionUI.load_vehicle_joint_template

def HIKDefinitionUI.load_vehicle_joint_template(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2101

HIKDefinitionUI.build_vehicle_rig_from_template

def HIKDefinitionUI.build_vehicle_rig_from_template(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2117

HIKDefinitionUI.assign_vehicle_ground

def HIKDefinitionUI.assign_vehicle_ground(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2138

HIKDefinitionUI.update_vehicle_ground

def HIKDefinitionUI.update_vehicle_ground(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2149

HIKDefinitionUI.enable_vehicle_live_ground

def HIKDefinitionUI.enable_vehicle_live_ground(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2160

HIKDefinitionUI.reset_vehicle_wheel_roll

def HIKDefinitionUI.reset_vehicle_wheel_roll(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2173

HIKDefinitionUI.set_vehicle_auto_steering

def HIKDefinitionUI.set_vehicle_auto_steering(self, enabled)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2182

HIKDefinitionUI.set_vehicle_steering_drive

def HIKDefinitionUI.set_vehicle_steering_drive(self, enabled)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2200

HIKDefinitionUI.set_vehicle_chassis_ground_follow

def HIKDefinitionUI.set_vehicle_chassis_ground_follow(self, enabled)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2219

HIKDefinitionUI.set_vehicle_chassis_follow_value

def HIKDefinitionUI.set_vehicle_chassis_follow_value(self, attribute, value)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2229

HIKDefinitionUI.bake_vehicle_ground

def HIKDefinitionUI.bake_vehicle_ground(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2239

HIKDefinitionUI.save_vehicle_rig_file

def HIKDefinitionUI.save_vehicle_rig_file(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2252

HIKDefinitionUI.get_space_switch_mode

def HIKDefinitionUI.get_space_switch_mode(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2267

HIKDefinitionUI._get_joint_status_display

def HIKDefinitionUI._get_joint_status_display(self, jnt)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:2270

HIKDefinitionUI._update_list_widget

def HIKDefinitionUI._update_list_widget(self, list_widget, items)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:2304

Replace all items in a QListWidget with the given items, appending status color cues.

HIKDefinitionUI.create_space_switch

def HIKDefinitionUI.create_space_switch(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2323

HIKDefinitionUI.create_joints_from_selected_curve

def HIKDefinitionUI.create_joints_from_selected_curve(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2337

HIKDefinitionUI.populate_default_face_map_from_scene

def HIKDefinitionUI.populate_default_face_map_from_scene(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2385

Fill default_face_map with scene joints under HIK head reference.

HIKDefinitionUI.assign_face_from_selection

def HIKDefinitionUI.assign_face_from_selection(self, list_widget)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2389

HIKDefinitionUI.pick_rig_template_path

def HIKDefinitionUI.pick_rig_template_path(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2403

HIKDefinitionUI.load_biped_rig_template

def HIKDefinitionUI.load_biped_rig_template(self, reference=False)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2418

HIKDefinitionUI.preview_selected_joint_placement

def HIKDefinitionUI.preview_selected_joint_placement(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2465

Create confidence-colored guides without modifying the skeleton.

HIKDefinitionUI.fit_template_to_selected_mesh

def HIKDefinitionUI.fit_template_to_selected_mesh(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2521

Fit the active mapped hierarchy, or the studio template as fallback.

HIKDefinitionUI.capture_joint_placement_baseline

def HIKDefinitionUI.capture_joint_placement_baseline(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2726

Save the selected approved mesh/skeleton pair as normalized golden data.

HIKDefinitionUI.validate_joint_placement_baseline

def HIKDefinitionUI.validate_joint_placement_baseline(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2804

Run non-destructive placement QA against one approved baseline.

HIKDefinitionUI.run_joint_placement_regression_suite

def HIKDefinitionUI.run_joint_placement_regression_suite(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2844

Launch the manifest suite in mayapy so the artist scene is untouched.

HIKDefinitionUI.create_rig_mapping

def HIKDefinitionUI.create_rig_mapping(self, refresh_details=True)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2899

HIKDefinitionUI._rfl_shoe_meshes_from_ui

def HIKDefinitionUI._rfl_shoe_meshes_from_ui(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:2940

HIKDefinitionUI.set_rfl_shoe_mesh_from_selection

def HIKDefinitionUI.set_rfl_shoe_mesh_from_selection(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2949

Store selected mesh transforms for footwear-aware RFL fitting.

HIKDefinitionUI.set_t_pose_from_mapping

def HIKDefinitionUI.set_t_pose_from_mapping(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:2972

Set the mapped deformation skeleton to T-pose as one undoable action.

HIKDefinitionUI.build_full_rig

def HIKDefinitionUI.build_full_rig(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3072

HIKDefinitionUI.remove_full_rig

def HIKDefinitionUI.remove_full_rig(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3353

HIKDefinitionUI._sync_export_joint_maps

def HIKDefinitionUI._sync_export_joint_maps(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:3387

HIKDefinitionUI.send_skeletal_mesh_to_unreal

def HIKDefinitionUI.send_skeletal_mesh_to_unreal(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3399

Run the Maya-to-Unreal workflow from the persistent Mesh tab definition.

HIKDefinitionUI.auto_detect_face_joints

def HIKDefinitionUI.auto_detect_face_joints(self, key_path, list_widget)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3462

HIKDefinitionUI.create_single_control

def HIKDefinitionUI.create_single_control(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3503

HIKDefinitionUI.create_additional_limb_module

def HIKDefinitionUI.create_additional_limb_module(self, module_type)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3537

Build and register an arbitrary additional arm or leg chain.

HIKDefinitionUI.export_skin_weights

def HIKDefinitionUI.export_skin_weights(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3584

HIKDefinitionUI.import_skin_weights

def HIKDefinitionUI.import_skin_weights(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3599

HIKDefinitionUI._confirm_skin_influence_renames

def HIKDefinitionUI._confirm_skin_influence_renames(self, mesh, proposals, unresolved, ambiguous)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:3702

Ask before applying safe, formatting-only influence renames.

HIKDefinitionUI.auto_hammer_weight_spikes

def HIKDefinitionUI.auto_hammer_weight_spikes(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3777

Repair isolated whole-mesh weight outliers without softening valid gradients.

HIKDefinitionUI.smooth_skin_weights_spatially

def HIKDefinitionUI.smooth_skin_weights_spatially(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3837

Smooth a selected mesh, or restrict diffusion to selected vertices.

HIKDefinitionUI.activate_spatial_skin_smooth_brush

def HIKDefinitionUI.activate_spatial_skin_smooth_brush(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3882

HIKDefinitionUI.deactivate_spatial_skin_smooth_brush

def HIKDefinitionUI.deactivate_spatial_skin_smooth_brush(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3904

HIKDefinitionUI.transfer_skin_weights_from_selection

def HIKDefinitionUI.transfer_skin_weights_from_selection(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3908

HIKDefinitionUI.create_surface_rig_with_drivers

def HIKDefinitionUI.create_surface_rig_with_drivers(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3936

HIKDefinitionUI.sort_joints_by_bounding_box

def HIKDefinitionUI.sort_joints_by_bounding_box(self, joints)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:3983

HIKDefinitionUI.auto_detect_indices

def HIKDefinitionUI.auto_detect_indices(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4014

HIKDefinitionUI._pick_parent

def HIKDefinitionUI._pick_parent(self, field)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4074

HIKDefinitionUI.make_selector_callback

def HIKDefinitionUI.make_selector_callback(self, slot)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4079

HIKDefinitionUI.update_button_color

def HIKDefinitionUI.update_button_color(self, slot)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4088

HIKDefinitionUI.get_opposite_slot

def HIKDefinitionUI.get_opposite_slot(self, slot)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4099

HIKDefinitionUI.mirror_joint_name

def HIKDefinitionUI.mirror_joint_name(self, name: str) -> str

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4106

HIKDefinitionUI.pick_selected_joint

def HIKDefinitionUI.pick_selected_joint(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4141

HIKDefinitionUI.load_definition

def HIKDefinitionUI.load_definition(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4155

HIKDefinitionUI.save_definition

def HIKDefinitionUI.save_definition(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4168

HIKDefinitionUI.auto_detect

def HIKDefinitionUI.auto_detect(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4175

HIKDefinitionUI.get_uproject

def HIKDefinitionUI.get_uproject(self, directory)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4205

HIKDefinitionUI.guess_joint_map_from_root

def HIKDefinitionUI.guess_joint_map_from_root(self, root_joint)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4212

HIKDefinitionUI.create_hik_character

def HIKDefinitionUI.create_hik_character(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4218

HIKDefinitionUI.store_all_face_connections

def HIKDefinitionUI.store_all_face_connections(self, silent=False)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4275

HIKDefinitionUI._get_module_joints

def HIKDefinitionUI._get_module_joints(self, module)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4301

HIKDefinitionUI._get_face_module_joints

def HIKDefinitionUI._get_face_module_joints(self, module)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4328

HIKDefinitionUI.create_body_module_setup

def HIKDefinitionUI.create_body_module_setup(self, module, silent=False)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4350

HIKDefinitionUI.remove_body_module_setup

def HIKDefinitionUI.remove_body_module_setup(self, module)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4517

HIKDefinitionUI.create_face_module_setup

def HIKDefinitionUI.create_face_module_setup(self, module, silent=False, parent_override=None, jaw_ctrl_override=None, jaw_joint_override=None)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4568

HIKDefinitionUI.remove_face_module_setup

def HIKDefinitionUI.remove_face_module_setup(self, module)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4755

HIKDefinitionUI.load_settings_from_selection

def HIKDefinitionUI.load_settings_from_selection(self)

class method · public name · maya_tools/Rigging/mocap/hik_ui.py:4805

HIKDefinitionUI._create_joint_slots_group

def HIKDefinitionUI._create_joint_slots_group(self, title, slots, module_id)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4920

HIKDefinitionUI._assign_joint_to_slot

def HIKDefinitionUI._assign_joint_to_slot(self, slot_key, line_edit)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4943

HIKDefinitionUI._update_edit_view_slot_ui

def HIKDefinitionUI._update_edit_view_slot_ui(self, slot_key, joint_name)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4963

HIKDefinitionUI._create_space_switch_edit_row

def HIKDefinitionUI._create_space_switch_edit_row(self, ctrl_name, default_targets, module_id)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4968

HIKDefinitionUI._save_custom_space_switches

def HIKDefinitionUI._save_custom_space_switches(self, module_id, ctrl_name, targets)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:4998

HIKDefinitionUI._create_face_list_block

def HIKDefinitionUI._create_face_list_block(self, label, key_path)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5005

HIKDefinitionUI._make_module_detail_widget

def HIKDefinitionUI._make_module_detail_widget(self, module_id, status_lbl)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5056

Create a collapsible detail widget for a module grid row.

HIKDefinitionUI._refresh_module_detail_widget

def HIKDefinitionUI._refresh_module_detail_widget(self, module_id)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5373

Query live scene state and update the detail widget for one module.

HIKDefinitionUI._module_exists

def HIKDefinitionUI._module_exists(self, module_id, was_built, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5397

HIKDefinitionUI._set_module_view_state

def HIKDefinitionUI._set_module_view_state(self, module_widgets, module_exists)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5407

HIKDefinitionUI._refresh_module_edit_fields

def HIKDefinitionUI._refresh_module_edit_fields(self, module_id, module_widgets, metadata)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5411

HIKDefinitionUI._refresh_create_remove_buttons

def HIKDefinitionUI._refresh_create_remove_buttons(self, module_id, module_exists)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5448

HIKDefinitionUI._refresh_module_status_label

def HIKDefinitionUI._refresh_module_status_label(self, status_label, was_built, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5482

HIKDefinitionUI._refresh_parent_button

def HIKDefinitionUI._refresh_parent_button(self, parent_button, was_built, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5493

HIKDefinitionUI._refresh_jaw_buttons

def HIKDefinitionUI._refresh_jaw_buttons(self, module_id, module_widgets, metadata, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5524

HIKDefinitionUI._refresh_mapped_joints_label

def HIKDefinitionUI._refresh_mapped_joints_label(self, module_id, module_widgets, metadata)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5544

HIKDefinitionUI._refresh_spaces_and_connections

def HIKDefinitionUI._refresh_spaces_and_connections(self, module_id, module_widgets, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5569

HIKDefinitionUI._get_module_space_controls

def HIKDefinitionUI._get_module_space_controls(self, module_id, main_control)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5604

HIKDefinitionUI._space_control_label

def HIKDefinitionUI._space_control_label(self, ctrl_name)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5631

HIKDefinitionUI._add_spaces_section

def HIKDefinitionUI._add_spaces_section(self, layout, control_label, space_targets, add_separator=False)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5641

HIKDefinitionUI._add_driven_by_section

def HIKDefinitionUI._add_driven_by_section(self, layout, driven_by_nodes, add_separator=False)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5681

HIKDefinitionUI._set_scene_node_button

def HIKDefinitionUI._set_scene_node_button(self, button, node_name, missing_text='—', valid_color='#6699cc')

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5714

HIKDefinitionUI._safe_reconnect_button

def HIKDefinitionUI._safe_reconnect_button(self, button, callback)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5737

HIKDefinitionUI._short_node_list

def HIKDefinitionUI._short_node_list(self, node_names)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5747

HIKDefinitionUI._refresh_all_module_details

def HIKDefinitionUI._refresh_all_module_details(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5750

Refresh the detail widget for every registered module.

HIKDefinitionUI._refresh_additional_systems

def HIKDefinitionUI._refresh_additional_systems(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5760

Render registered and external additions below the body modules.

HIKDefinitionUI._set_additional_system_active

def HIKDefinitionUI._set_additional_system_active(self, system_id, managed, active)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5931

Add/remove an extra system, preserving its recipe or live graph.

HIKDefinitionUI._get_registered_module_ids

def HIKDefinitionUI._get_registered_module_ids(self)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5954

HIKDefinitionUI._populate_fields_from_metadata

def HIKDefinitionUI._populate_fields_from_metadata(self, module_id, metadata)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:5961

HIKDefinitionUI._get_first_existing_ctrl

def HIKDefinitionUI._get_first_existing_ctrl(self, module_id, meta=None)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6066

Return the first scene-existing control for a module (candidates + metadata fallback).

HIKDefinitionUI._select_module_root

def HIKDefinitionUI._select_module_root(self, module_name)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6089

Select the first existing control for a module.

HIKDefinitionUI._get_ctrl_scene_parent

def HIKDefinitionUI._get_ctrl_scene_parent(self, ctrl)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6097

Traverse up the DAG hierarchy to find the first ancestor ending with '_ctrl'.

HIKDefinitionUI._get_space_targets

def HIKDefinitionUI._get_space_targets(self, ctrl)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6111

Return the list of (display_name, actual_node_name) space switch option names for *ctrl*, if any.

HIKDefinitionUI._get_incoming_connections

def HIKDefinitionUI._get_incoming_connections(self, ctrl)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6182

Return external nodes driving *ctrl* via connections or constraints (excluding its own pad/sdk chain).

HIKDefinitionUI._clear_widget_layout

def HIKDefinitionUI._clear_widget_layout(self, layout)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6236

Remove and delete all widgets from a QLayout.

HIKDefinitionUI._select_node

def HIKDefinitionUI._select_node(self, node)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6246

Select *node* in the Maya scene if it exists.

HIKDefinitionUI._on_tab_changed

def HIKDefinitionUI._on_tab_changed(self, index)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6251

Handle lightweight tab activation without rescanning the scene. Module status already refreshes after build/remove operations and via the explicit Refresh Module Details button. A tab click must remain a pure UI operation; live extension di

HIKDefinitionUI._load_module_metadata_from_scene

def HIKDefinitionUI._load_module_metadata_from_scene(self, report_missing=True, refresh_details=True)

class method · internal · maya_tools/Rigging/mocap/hik_ui.py:6261

Read rig_module_store and refresh all detail widgets. When report_missing is False, stale saved-joint references are ignored silently. This is used during initial UI startup.

launch_hik_ui

def launch_hik_ui(parent=None, *, graph=None, selection_provider=None, undo_callback=None, refresh_callback=None)

module function · public name · maya_tools/Rigging/mocap/hik_ui.py:6346

maya_tools.Rigging.mocap.referenced_animation_scene

_leaf

def _leaf(node: str) -> str

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:17

_bare

def _bare(node: str) -> str

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:21

_import_fbx

def _import_fbx(path: Path, namespace: str) -> list[str]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:25

reference_rig

def reference_rig(rig_scene: str | Path, namespace: str) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/referenced_animation_scene.py:42

_source_joint_map

def _source_joint_map(namespace: str) -> dict[str, str]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:70

_driven_joint

def _driven_joint(control: str) -> str | None

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:91

_driven_parent_constraint_offset

def _driven_parent_constraint_offset(control: str, driven: str) -> dict[str, Any]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:117

_referenced_rig_transforms

def _referenced_rig_transforms(rig_namespace: str) -> list[str]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:150

_referenced_rig_joint_map

def _referenced_rig_joint_map(rig_namespace: str) -> dict[str, str]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:159

_is_animator_control

def _is_animator_control(node: str) -> bool

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:171

Accept named controls or explicitly marked controls, never internal IK nodes.

_world_pose

def _world_pose(node: str, frame: float) -> dict[str, list[float]]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:176

_vector_error

def _vector_error(left: list[float], right: list[float]) -> float

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:184

_angular_error

def _angular_error(left: list[float], right: list[float]) -> float

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:188

_world_quaternion

def _world_quaternion(node: str) -> OpenMaya.MQuaternion

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:193

_quaternion_error

def _quaternion_error(left_rotation: OpenMaya.MQuaternion, right_rotation: OpenMaya.MQuaternion) -> float

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:198

_world_rotation_error

def _world_rotation_error(left_node: str, right_node: str) -> float

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:211

_world_rotation_offset

def _world_rotation_offset(source_node: str, target_node: str) -> OpenMaya.MQuaternion

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:215

discover_create_rig_bindings

def discover_create_rig_bindings(rig_namespace: str, solved_namespace: str, allowed_bones: set[str] | None=None) -> list[dict[str, str]]

module function · public name · maya_tools/Rigging/mocap/referenced_animation_scene.py:219

Discover controls by their joint-driving graph, including non-``_ctrl`` rigs.

_preflight_bake_controls

def _preflight_bake_controls(controls: list[str]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:261

_select_fk_and_spine_targets

def _select_fk_and_spine_targets(rig_namespace: str) -> dict[str, Any]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:304

Put known rig variants in a single-target pose-solve mode. Current create-rig limbs use ``ikFkBlend=0`` for FK. The older Juice rig connects ``IkFk`` directly to FK weights and therefore needs 1 instead. Its deform spine also blends an IK j

_solve_offset_delta

def _solve_offset_delta(columns: list[list[float]], delta: list[float]) -> list[float]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:348

Invert the measured world-position response to three offset channels.

_calibrate_single_ribbon_spines

def _calibrate_single_ribbon_spines(bindings: list[dict[str, str]], rig_joints: dict[str, str], start: float, end: float) -> list[dict[str, Any]]

module function · internal · maya_tools/Rigging/mocap/referenced_animation_scene.py:367

Correct a static ribbon rest offset without changing animator keys. Legacy rigs may drive a mapped deform spine joint from one ribbon target whose authored rest position differs from the characterized FBX. Measure the constraint's own offse

bake_solved_skeleton_to_create_rig_controls

def bake_solved_skeleton_to_create_rig_controls(rig_namespace: str, solved_namespace: str, *, mapping_profile: str | Path, start_frame: float | None=None, end_frame: float | None=None, sample_subdivisions: int=4) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/referenced_animation_scene.py:446

build_referenced_animation_scene

def build_referenced_animation_scene(*, rig_scene: str | Path, solved_animation_fbx: str | Path, output_scene: str | Path, rig_namespace: str='CharacterRig', solved_namespace: str='RetargetSolved', rig_adapter: str='create_rig', mapping_profile: str | Path | None=None, start_frame: float | None=None, end_frame: float | None=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/referenced_animation_scene.py:718

publish_referenced_animation_source

def publish_referenced_animation_source(*, work_scene: str | Path, published_rig_scene: str | Path, output_scene: str | Path) -> dict[str, Any]

module function · public name · maya_tools/Rigging/mocap/referenced_animation_scene.py:772

Publish a portable review scene and prove its rig reference and keys survive reload.

maya_tools.Rigging.mocap.setup_hik

get_descendant_joints

def get_descendant_joints(root_joint)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:198

Returns all descendant joints of root_joint (including root).

find_face_joints

def find_face_joints(pattern, face_joints)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:205

Return joints in the scene matching the pattern that are descendants of the face root.

_exists

def _exists(j)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:211

get_world_position

def get_world_position(obj)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:215

Gets the world position :param obj: name of object :return:

align_clavicle_Y_by_rotateY

def align_clavicle_Y_by_rotateY(clavicle_joint, sample_range=30.0, step=0.1)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:225

Level the first clavicle child by changing only rotateY.

_best_oriented_rotation_axis

def _best_oriented_rotation_axis(joint, world_direction=(0.0, 0.0, 1.0), candidates=('X', 'Y', 'Z'))

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:247

Return the local rotate axis most parallel to a world-space direction.

align_clavicle_to_upperarm_height

def align_clavicle_to_upperarm_height(clavicle_joint, upperarm_joint, sample_range=30.0, step=0.1)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:269

Level clavicle local X in front view with a pure world-Z rotation. The studio clavicle frame uses local Y for its authored forward/back roll and local Z close to world vertical. Rotating whichever local axis merely happens to be closest to

_aim_frame_preserving_roll

def _aim_frame_preserving_roll(world_matrix, target_x)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:361

Aim a world frame's X axis by shortest arc without changing its roll.

_canonical_t_pose_arm_frame

def _canonical_t_pose_arm_frame(target_x, side)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:380

Return a mirrored T-pose frame with local Z as the elbow hinge axis.

aim_joint_x_axis_to_world_x

def aim_joint_x_axis_to_world_x(joint_name, side=None)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:404

Aim local +X at world +X and normalize mirrored arm roll for T-pose.

_set_oriented_elbow_prebend

def _set_oriented_elbow_prebend(elbow, hand, degrees=3.0)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:505

Aim the forearm in depth while retaining its placed roll frame.

_toe_tip_from_chain

def _toe_tip_from_chain(toe, side)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:550

_rotation_value

def _rotation_value(joint, axis)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:568

_set_rotation_value

def _set_rotation_value(joint, axis, value)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:572

Set one rotate channel without touching translate or jointOrient.

_nearest_right_angle

def _nearest_right_angle(value)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:581

Return the closest 90-degree Euler value with a clean zero.

_sample_rotation_axis

def _sample_rotation_axis(joint, axis, objective, sample_range=90.0, absolute_min=None, absolute_max=None)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:587

Minimize an objective on one rotate channel with bounded evaluations. The previous four dense sweeps evaluated Maya's dependency graph about 330 times per axis. A coarse global pass followed by golden-section refinement preserves the same d

_front_leg_line_error

def _front_leg_line_error(thigh, knee, ankle)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:660

Normalized front-view error for thigh, knee, and ankle collinearity.

_front_vertical_segment_error

def _front_vertical_segment_error(start_joint, end_joint)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:676

World-X difference for a segment that must be vertical in front view.

_flat_segment_error

def _flat_segment_error(start_joint, end_joint)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:681

World-height difference for a segment that should rest flat.

_flatten_segment_with_rotation

def _flatten_segment_with_rotation(start_joint, end_joint, sample_range=120.0, hinge_axis='Z')

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:686

Flatten a foot segment using only its authored hinge channel. Searching every Euler channel can find a numerically flat result by rolling the foot or twisting the toe sideways. Studio leg placement authors Z as the knee/ankle/toe pitch hing

_skin_mesh_for_joints

def _skin_mesh_for_joints(joints)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:708

Return the largest skinned mesh influenced by the supplied joints.

_foot_mesh_contact_regions

def _foot_mesh_contact_regions(mesh, ankle, tip, sample_count=12)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:734

Find longitudinal landmarks and a mesh-relative lower-envelope grid.

_mesh_contact_height

def _mesh_contact_height(components)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:833

Return a trimmed-mean height for a fixed low mesh contact patch.

_mesh_contact_heights

def _mesh_contact_heights(regions)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:844

Evaluate every fixed contact patch from one deformed mesh point read.

_align_foot_front_projection_with_rotation

def _align_foot_front_projection_with_rotation(ankle, toe, tip, ankle_y_limits=None)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:878

Put the whole foot on one front-view line without twisting the toe.

_foot_pose_metrics

def _foot_pose_metrics(regions, ankle, toe, tip)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:909

Measure anatomical foot placement without relying on rotate values.

_foot_pose_is_grounded

def _foot_pose_is_grounded(metrics)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:957

Return whether an existing anatomical pose is already a valid T-pose.

_flatten_foot_mesh_with_rotation

def _flatten_foot_mesh_with_rotation(ankle, toe, tip)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:973

Align the front projection and level sole contacts using rotations only.

_mirror_right_foot_pose_from_left

def _mirror_right_foot_pose_from_left(leg_chains, side_reports)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1131

Use the solved left foot pose on a geometrically symmetric right foot. Studio template joints use mirrored joint orientation, so equal ankle and toe rotate channels produce reflected world-space endpoints. Independently optimizing both side

_ground_flattened_feet_with_pelvis

def _ground_flattened_feet_with_pelvis(pelvis, side_reports)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1225

Report foot contact heights without moving the pelvis. Footwear may extend below or outside the skinned body mesh, so sampled body-mesh contacts are not a reliable ground-plane reference. Keep the authored pelvis height and leave ground pla

_prepare_legs_for_t_pose

def _prepare_legs_for_t_pose(leg_chains, pelvis=None)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1278

Flatten each leg in front view using only the thigh rotate channel. Rotating the complete fitted chain at the thigh preserves its authored segment lengths, depth prebend, foot pose, and jointOrient values. After flattening, translate the pe

_t_pose_snapshot_joints

def _t_pose_snapshot_joints(joint_map, fallback_joints=())

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1387

Return the unique mapped joints whose world pose defines the T-pose.

_capture_t_pose_world_matrices

def _capture_t_pose_world_matrices(joints)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1419

Capture stable world matrices for idempotence detection.

_capture_t_pose_authored_channels

def _capture_t_pose_authored_channels(joints)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1428

Capture placement-owned channels that T-pose is forbidden to rewrite.

_validate_t_pose_authored_channels

def _validate_t_pose_authored_channels(before, pelvis=None)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1443

Reject any T-pose edit to placement-owned orientation or offsets.

_read_t_pose_snapshot

def _read_t_pose_snapshot(holder)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1477

_matches_t_pose_snapshot

def _matches_t_pose_snapshot(holder, joints)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1496

_store_t_pose_snapshot

def _store_t_pose_snapshot(holder, joints)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1511

_t_pose_rotation_blockers

def _t_pose_rotation_blockers(joint_channels)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1531

Return locked or driven rotate plugs that T-pose cannot author safely.

_require_editable_t_pose_channels

def _require_editable_t_pose_channels(joint_channels)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1562

Fail before posing when a built rig already owns required channels.

validate_t_pose_channels

def validate_t_pose_channels(joint_map)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:1582

Validate mapped channels before the UI opens its pose undo transaction.

set_t_pose

def set_t_pose(l_upperarm=None, r_upperarm=None, l_clav=None, r_clav=None, l_elbow=None, r_elbow=None, l_hand=None, r_hand=None, joint_map=None, pelvis=None, snap_rfl=True, shoe_meshes=None)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:1615

T-pose the arms and legs before snapping reverse-foot helpers. Arm and thigh rotate channels are changed on the deformation skeleton. The pelvis translation and all jointOrient values remain untouched. Arms extend along world X while each f

_joint_map_entry

def _joint_map_entry(value)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1821

Return the joint name and HIK index from either supported map format.

_is_joint_descendant

def _is_joint_descendant(joint, ancestor)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1830

Return True when *joint* is below *ancestor* in the Maya joint hierarchy.

_validate_hik_mapping

def _validate_hik_mapping(joint_map)

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1839

Validate mapped nodes and complete arm chains before modifying the scene.

_hik_definition_ui_exists

def _hik_definition_ui_exists()

module function · internal · maya_tools/Rigging/mocap/setup_hik.py:1882

The definition update MEL is unsafe unless its contextual tab was built.

setup_hik_character

def setup_hik_character(character_name, joint_map, fbx_export_path, namespace)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:1893

Setup a HIK character definition and export to FBX for MotionBuilder. :param character_name: Name of the HIK character to create. :param joint_map: Mapping of HIK slots to joint names. :param fbx_export_path: Full path to export the FBX fil

populate_default_face_map_from_scene

def populate_default_face_map_from_scene(base_face_map=None)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:2021

Fill face map with default scene joints under HIK head reference.

guess_joint_map_from_root

def guess_joint_map_from_root(root_joint, base_joint_map=None)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:2105

Guesses HIK joint slots from a root joint based on name matching. :param root_joint: The root joint of the skeleton. :param base_joint_map: Optional dict to write results into (e.g. self.default_map). If None, a deep copy of setup_hik.DEFAU

create_rig_mapping

def create_rig_mapping(root_joint=None)

module function · public name · maya_tools/Rigging/mocap/setup_hik.py:2338

Standalone HIK mapping function. Auto-detects the skeleton root if none is provided, then runs guess_joint_map_from_root and populate_default_face_map_from_scene. Returns a tuple of (body_joint_map, face_joint_map) suitable for passing to c

maya_tools.Rigging.rig_template

_short_name

def _short_name(node: str) -> str

module function · internal · maya_tools/Rigging/rig_template.py:19

_is_rfl_joint

def _is_rfl_joint(node: str) -> bool

module function · internal · maya_tools/Rigging/rig_template.py:23

_top_level_anim_bot_containers

def _top_level_anim_bot_containers()

module function · internal · maya_tools/Rigging/rig_template.py:27

_remove_duplicate_anim_bot_containers

def _remove_duplicate_anim_bot_containers()

module function · internal · maya_tools/Rigging/rig_template.py:42

_top_level_display_point_helpers

def _top_level_display_point_helpers()

module function · internal · maya_tools/Rigging/rig_template.py:59

_remove_duplicate_display_point_helpers

def _remove_duplicate_display_point_helpers()

module function · internal · maya_tools/Rigging/rig_template.py:73

Keep one disconnected template displayPoints helper across imports.

_template_display_layer_role

def _template_display_layer_role(node: str) -> str

module function · internal · maya_tools/Rigging/rig_template.py:101

Return the template role for Maya's collision-renamed display layers.

_make_display_layer_editable

def _make_display_layer_editable(layer: str) -> None

module function · internal · maya_tools/Rigging/rig_template.py:112

Leave placement layers visible and selectable after template import.

_consolidate_template_display_layers

def _consolidate_template_display_layers()

module function · internal · maya_tools/Rigging/rig_template.py:130

Merge repeated template-import layers into one geo/joints layer pair. Maya does not merge display layers during scene import. When _geo and _joints already exist, it creates rig_template__geo, then rig_template__geo1 and so on. Move every m

load_biped_rig_template

def load_biped_rig_template(template_path: str=DEFAULT_BIPED_RIG_TEMPLATE, namespace: str='', reference: bool=False, merge_namespaces_on_clash: bool=False) -> dict

module function · public name · maya_tools/Rigging/rig_template.py:168

Import or reference the biped rig template and report skeleton/RFL joints.

load_default_biped_rig_template

def load_default_biped_rig_template(reference: bool=False, namespace: str='') -> dict

module function · public name · maya_tools/Rigging/rig_template.py:264

_vehicle_role

def _vehicle_role(node: str) -> str

module function · internal · maya_tools/Rigging/rig_template.py:272

load_vehicle_rig_template

def load_vehicle_rig_template(template_path: str=DEFAULT_VEHICLE_RIG_TEMPLATE, namespace: str='', reference: bool=False, merge_namespaces_on_clash: bool=False) -> dict

module function · public name · maya_tools/Rigging/rig_template.py:282

Import the joint-only vehicle template and report its portable roles. SI-unit configuration is stored as attributes on the joints. Controls, geometry, constraints, and ground-query nodes are created later by the host vehicle-rig builder.

load_default_vehicle_rig_template

def load_default_vehicle_rig_template(reference: bool=False, namespace: str='') -> dict

module function · public name · maya_tools/Rigging/rig_template.py:359

maya_tools.Rigging.rigging_host_adapter

reload_dependencies

def reload_dependencies() -> str

module function · public name · maya_tools/Rigging/rigging_host_adapter.py:30

Refresh the complete Maya rig stack for bridge-driven operations.

_result

def _result(ok: bool, capability: str, message: str='', **kwargs: Any) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:80

scene_joints

def scene_joints() -> dict[str, Any]

module function · public name · maya_tools/Rigging/rigging_host_adapter.py:84

selection

def selection() -> dict[str, Any]

module function · public name · maya_tools/Rigging/rigging_host_adapter.py:101

execute

def execute(capability: str, payload: dict[str, Any]) -> dict[str, Any]

module function · public name · maya_tools/Rigging/rigging_host_adapter.py:105

_definition

def _definition(value: Any) -> CharacterDefinition

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:118

_maya_maps

def _maya_maps(definition: CharacterDefinition) -> tuple[dict[str, Any], dict[str, Any]]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:128

_op_definition_auto_map

def _op_definition_auto_map(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:142

_op_definition_assign_slot

def _op_definition_assign_slot(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:154

_op_definition_clear_slot

def _op_definition_clear_slot(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:163

_op_definition_mirror_slots

def _op_definition_mirror_slots(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:169

_op_definition_validate

def _op_definition_validate(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:174

_op_definition_set_reference_pose

def _op_definition_set_reference_pose(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:181

_op_definition_import

def _op_definition_import(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:191

_op_definition_export

def _op_definition_export(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:196

_op_rig_place_joints

def _op_rig_place_joints(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:205

_op_rig_set_t_pose

def _op_rig_set_t_pose(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:289

_op_rig_build_full

def _op_rig_build_full(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:299

_op_rig_build_module

def _op_rig_build_module(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:321

_op_rig_remove_module

def _op_rig_remove_module(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:352

_op_rig_rebuild_module

def _op_rig_rebuild_module(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:372

_op_rig_create_control

def _op_rig_create_control(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:379

_op_rig_create_constraint

def _op_rig_create_constraint(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:390

_op_rig_create_ik_fk_limb

def _op_rig_create_ik_fk_limb(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:407

_op_rig_create_space_switch

def _op_rig_create_space_switch(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:412

_op_rig_create_ribbon

def _op_rig_create_ribbon(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:421

_op_skin_surface_spatial_smooth_brush

def _op_skin_surface_spatial_smooth_brush(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:434

_op_rig_create_twist

def _op_rig_create_twist(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:449

_op_rig_create_motion_path

def _op_rig_create_motion_path(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:469

_op_rig_create_curve_joints

def _op_rig_create_curve_joints(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:474

_op_rig_create_reverse_foot

def _op_rig_create_reverse_foot(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:490

_op_rig_store_connections

def _op_rig_store_connections(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:495

_op_rig_restore_connections

def _op_rig_restore_connections(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:501

_op_rig_create_face_module

def _op_rig_create_face_module(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:506

_op_retarget_solve_pose

def _op_retarget_solve_pose(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:510

_op_retarget_bake

def _op_retarget_bake(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:525

_op_retarget_transfer_take

def _op_retarget_transfer_take(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:533

_op_rig_set_ik_fk_blend

def _op_rig_set_ik_fk_blend(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:537

_op_rig_set_space

def _op_rig_set_space(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:545

_op_rig_create_mesh_attachment

def _op_rig_create_mesh_attachment(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:553

_op_rig_create_pose_reader

def _op_rig_create_pose_reader(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:558

_op_rig_edit_control_shape

def _op_rig_edit_control_shape(payload: dict[str, Any]) -> dict[str, Any]

module function · internal · maya_tools/Rigging/rigging_host_adapter.py:563

maya_tools.Rigging.skinning_utils

_SurfaceSmoothBrushOverlay.__init__

def _SurfaceSmoothBrushOverlay.__init__(self, parent=None)

class method · internal · maya_tools/Rigging/skinning_utils.py:47

_SurfaceSmoothBrushOverlay.set_circle

def _SurfaceSmoothBrushOverlay.set_circle(self, center, radius)

class method · internal · maya_tools/Rigging/skinning_utils.py:56

_SurfaceSmoothBrushOverlay.clear_circle

def _SurfaceSmoothBrushOverlay.clear_circle(self)

class method · internal · maya_tools/Rigging/skinning_utils.py:63

_SurfaceSmoothBrushOverlay.paintEvent

def _SurfaceSmoothBrushOverlay.paintEvent(self, _event)

class method · internal · maya_tools/Rigging/skinning_utils.py:67

transfer_skin_weights_from_selection

def transfer_skin_weights_from_selection(remove_unused_influences=True)

module function · public name · maya_tools/Rigging/skinning_utils.py:80

Transfer skin weights from selected source meshes to the last selected mesh.

transfer_skin_weights

def transfer_skin_weights(source_meshes, target_mesh)

module function · public name · maya_tools/Rigging/skinning_utils.py:96

Transfer skin weights from source meshes to a target mesh. Args: source_meshes (list[str]) target_mesh (str) Returns: dict | bool

_has_skin_cluster

def _has_skin_cluster(mesh)

module function · internal · maya_tools/Rigging/skinning_utils.py:143

_find_skin_cluster

def _find_skin_cluster(mesh)

module function · internal · maya_tools/Rigging/skinning_utils.py:147

_mesh_shape

def _mesh_shape(mesh)

module function · internal · maya_tools/Rigging/skinning_utils.py:158

Resolve a polygon transform or shape to its visible mesh shape.

_selected_mesh_and_vertices

def _selected_mesh_and_vertices()

module function · internal · maya_tools/Rigging/skinning_utils.py:172

Return one selected mesh and optional explicitly selected vertices.

_vertex_surface_area_weights

def _vertex_surface_area_weights(mesh_path)

module function · internal · maya_tools/Rigging/skinning_utils.py:200

Return per-vertex world-space area weights for irregular meshes. Plain vertex averaging heavily favors densely tessellated patches. That can make a spatial brush appear to do nothing when the nearby surface on the other side of a bad topolo

_pre_skin_surface_points

def _pre_skin_surface_points(transform, visible_shape, vertex_count)

module function · internal · maya_tools/Rigging/skinning_utils.py:224

Return the undeformed sibling mesh points when Maya exposes a shapeOrig.

smooth_skin_weights_spatial_from_selection

def smooth_skin_weights_spatial_from_selection(radius=1.0, iterations=4, strength=0.5, max_influences=4, normal_angle=75.0, max_neighbors=48, cross_region_share=0.1, entire_mesh=False, automatic_radius=False, artifact_only=False)

module function · public name · maya_tools/Rigging/skinning_utils.py:243

Smooth the selected skin using surface position instead of edge topology. The automatic batch path intentionally ignores a component subset. It is the one-click alternative to painting and should repair the full selected skinned surface, in

smooth_skin_weights_spatial

def smooth_skin_weights_spatial(mesh, vertex_indices=None, radius=1.0, iterations=4, strength=0.5, max_influences=4, normal_angle=75.0, max_neighbors=48, sample_weights=None, adaptive_radius=False, cross_region_share=0.45, automatic_radius=False, topology_share=0.0, artifact_only=False, outlier_threshold=0.06)

module function · public name · maya_tools/Rigging/skinning_utils.py:271

Diffuse weights through world-space neighborhoods, ignoring mesh edges. The normal-angle gate reduces bleeding between nearby opposing surfaces. Locked influences retain their exact input weights.

SurfaceSpatialSmoothBrush.__init__

def SurfaceSpatialSmoothBrush.__init__(self, mesh, radius, strength, iterations, max_influences, normal_angle, max_neighbors, cross_region_share)

class method · internal · maya_tools/Rigging/skinning_utils.py:777

SurfaceSpatialSmoothBrush._create_outline

def SurfaceSpatialSmoothBrush._create_outline(self)

class method · internal · maya_tools/Rigging/skinning_utils.py:810

SurfaceSpatialSmoothBrush.hide_outline

def SurfaceSpatialSmoothBrush.hide_outline(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:832

SurfaceSpatialSmoothBrush.delete_outline

def SurfaceSpatialSmoothBrush.delete_outline(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:838

SurfaceSpatialSmoothBrush._world_to_view

def SurfaceSpatialSmoothBrush._world_to_view(view, point)

class method · internal · maya_tools/Rigging/skinning_utils.py:848

SurfaceSpatialSmoothBrush._ensure_overlay

def SurfaceSpatialSmoothBrush._ensure_overlay(self, panel, widget)

class method · internal · maya_tools/Rigging/skinning_utils.py:865

SurfaceSpatialSmoothBrush._update_overlay

def SurfaceSpatialSmoothBrush._update_overlay(self, hit_data, view, panel, widget)

class method · internal · maya_tools/Rigging/skinning_utils.py:875

SurfaceSpatialSmoothBrush._update_outline

def SurfaceSpatialSmoothBrush._update_outline(self, hit_data)

class method · internal · maya_tools/Rigging/skinning_utils.py:896

SurfaceSpatialSmoothBrush._rebuild_buckets

def SurfaceSpatialSmoothBrush._rebuild_buckets(self)

class method · internal · maya_tools/Rigging/skinning_utils.py:921

SurfaceSpatialSmoothBrush._cell

def SurfaceSpatialSmoothBrush._cell(self, point)

class method · internal · maya_tools/Rigging/skinning_utils.py:928

SurfaceSpatialSmoothBrush._hit_from_screen

def SurfaceSpatialSmoothBrush._hit_from_screen(self, screen_point, view=None)

class method · internal · maya_tools/Rigging/skinning_utils.py:935

SurfaceSpatialSmoothBrush._collect_at_hit

def SurfaceSpatialSmoothBrush._collect_at_hit(self, hit_data)

class method · internal · maya_tools/Rigging/skinning_utils.py:958

SurfaceSpatialSmoothBrush.press

def SurfaceSpatialSmoothBrush.press(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:974

SurfaceSpatialSmoothBrush.drag

def SurfaceSpatialSmoothBrush.drag(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:983

SurfaceSpatialSmoothBrush._component_and_weights

def SurfaceSpatialSmoothBrush._component_and_weights(self, indices)

class method · internal · maya_tools/Rigging/skinning_utils.py:1002

SurfaceSpatialSmoothBrush.release

def SurfaceSpatialSmoothBrush.release(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:1012

SurfaceSpatialSmoothBrush.hover_from_cursor

def SurfaceSpatialSmoothBrush.hover_from_cursor(self, force=False)

class method · public name · maya_tools/Rigging/skinning_utils.py:1079

SurfaceSpatialSmoothBrush.begin_viewport_stroke

def SurfaceSpatialSmoothBrush.begin_viewport_stroke(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:1102

SurfaceSpatialSmoothBrush.continue_viewport_stroke

def SurfaceSpatialSmoothBrush.continue_viewport_stroke(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:1112

SurfaceSpatialSmoothBrush.finish_viewport_stroke

def SurfaceSpatialSmoothBrush.finish_viewport_stroke(self)

class method · public name · maya_tools/Rigging/skinning_utils.py:1120

SurfaceSpatialSmoothBrush.resize_from_pixels

def SurfaceSpatialSmoothBrush.resize_from_pixels(self, pixel_delta)

class method · public name · maya_tools/Rigging/skinning_utils.py:1127

_SurfaceSmoothBrushKeyFilter.eventFilter

def _SurfaceSmoothBrushKeyFilter.eventFilter(self, watched, event)

class method · internal · maya_tools/Rigging/skinning_utils.py:1141

_surface_smooth_brush_press

def _surface_smooth_brush_press()

module function · internal · maya_tools/Rigging/skinning_utils.py:1186

_surface_smooth_brush_drag

def _surface_smooth_brush_drag()

module function · internal · maya_tools/Rigging/skinning_utils.py:1191

_surface_smooth_brush_release

def _surface_smooth_brush_release()

module function · internal · maya_tools/Rigging/skinning_utils.py:1196

_surface_smooth_brush_tool_changed

def _surface_smooth_brush_tool_changed()

module function · internal · maya_tools/Rigging/skinning_utils.py:1201

_cleanup_surface_spatial_smooth_brush

def _cleanup_surface_spatial_smooth_brush()

module function · internal · maya_tools/Rigging/skinning_utils.py:1213

activate_surface_spatial_smooth_brush

def activate_surface_spatial_smooth_brush(radius=1.0, iterations=1, strength=0.35, max_influences=8, normal_angle=120.0, max_neighbors=96, cross_region_share=0.45)

module function · public name · maya_tools/Rigging/skinning_utils.py:1228

Activate the topology-independent Maya skin smoothing brush.

deactivate_surface_spatial_smooth_brush

def deactivate_surface_spatial_smooth_brush()

module function · public name · maya_tools/Rigging/skinning_utils.py:1271

Exit the spatial skin brush and return to Maya's selection context.

_collect_skin_data

def _collect_skin_data(meshes)

module function · internal · maya_tools/Rigging/skinning_utils.py:1277

_create_target_skin

def _create_target_skin(target_mesh, skin_data)

module function · internal · maya_tools/Rigging/skinning_utils.py:1309

_copy_weights

def _copy_weights(source_meshes, target_mesh)

module function · internal · maya_tools/Rigging/skinning_utils.py:1338

_run_weight_hammer

def _run_weight_hammer(mesh)

module function · internal · maya_tools/Rigging/skinning_utils.py:1348

_canonical_skin_meshes

def _canonical_skin_meshes(meshes)

module function · internal · maya_tools/Rigging/skinning_utils.py:1367

Return unique long transform paths for mesh shapes or transforms.

export_skin_weights

def export_skin_weights(meshes, export_dir='C:/temp/weights')

module function · public name · maya_tools/Rigging/skinning_utils.py:1389

Exports skin weights for a list of meshes to XML using deformerWeights. Saves influence order in individual JSON sidecar files. :param meshes: list of mesh names to export :param export_dir: target directory to save all files

_influence_leaf_name

def _influence_leaf_name(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1447

Return an influence name without its DAG path or Maya namespace.

_influence_node_name

def _influence_node_name(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1453

Return an influence leaf name while retaining its Maya namespace.

_influence_match_key

def _influence_match_key(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1458

Normalize harmless punctuation differences for influence-name matching.

_find_similar_scene_influences

def _find_similar_scene_influences(missing_influences, scene_influences, limit=3, cutoff=0.6, short_names=True)

module function · internal · maya_tools/Rigging/skinning_utils.py:1463

Return likely scene-name matches without silently remapping influences.

_twist_influence_match_key

def _twist_influence_match_key(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1496

Canonicalize the two supported limb-twist ordinal conventions.

_resolve_scene_influences

def _resolve_scene_influences(saved_influences, scene_influences)

module function · internal · maya_tools/Rigging/skinning_utils.py:1513

Resolve saved influences to scene joints without renaming any nodes. Matching is deliberately conservative. Full paths and namespaced leaf names win first, followed by unique namespace-free leaf names. The only fuzzy rule accepted is the st

_influence_requires_remap

def _influence_requires_remap(saved_influence, scene_influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1573

Return whether Maya's XML source name actually needs remapping.

_prepare_deformer_weights_xml

def _prepare_deformer_weights_xml(source_path, influence_mapping, target_deformer, target_shape)

module function · internal · maya_tools/Rigging/skinning_utils.py:1581

Create a temporary XML copy addressed directly to the target skin.

_deformer_weights_vertex_count

def _deformer_weights_vertex_count(source_path)

module function · internal · maya_tools/Rigging/skinning_utils.py:1626

Read the exported point count used by Maya's index mapping method.

_influence_alias_keys

def _influence_alias_keys(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1636

Return conservative keys for common exported-joint name variants.

_influence_side

def _influence_side(influence)

module function · internal · maya_tools/Rigging/skinning_utils.py:1652

Return l/r for explicitly sided influences, otherwise None.

_propose_safe_influence_renames

def _propose_safe_influence_renames(missing_influences, scene_joints)

module function · internal · maya_tools/Rigging/skinning_utils.py:1658

Propose unique formatting-only joint renames for user confirmation.

_rename_scene_influences

def _rename_scene_influences(rename_requests)

module function · internal · maya_tools/Rigging/skinning_utils.py:1690

Atomically rename confirmed scene joints while retaining namespaces.

_format_missing_influence_failure

def _format_missing_influence_failure(mesh, missing_influences, suggestions)

module function · internal · maya_tools/Rigging/skinning_utils.py:1731

import_skin_weights

def import_skin_weights(meshes, export_dir='C:/temp/weights', missing_influence_resolver=None)

module function · public name · maya_tools/Rigging/skinning_utils.py:1756

Import skin weights without rebuilding an existing skinCluster. Existing influences and dagPose membership are preserved. Influences present in the saved data but missing from the cluster are added at zero weight before the weights are load

maya_tools.Rigging.temp_cleanup

_is_temp_bone

def _is_temp_bone(node)

module function · internal · maya_tools/Rigging/temp_cleanup.py:14

delete_temp_bones

def delete_temp_bones(exclude=())

module function · public name · maya_tools/Rigging/temp_cleanup.py:19

Delete newly created construction joints with a distinct ``temp`` token. Non-temporary children are first reparented beside the temporary joint so cleanup cannot accidentally remove a persistent skeleton branch. Referenced and explicitly ex

cleanup_temp_bones

def cleanup_temp_bones(function)

module function · public name · maya_tools/Rigging/temp_cleanup.py:73

Clean up only temporary joints created by this operation. Existing scene joints are treated as user data, even when their names contain ``temp``. Sweeping the entire scene before a fit could otherwise delete authored helpers such as hair, e

maya_tools.Rigging.undo_utils

undo_chunk

def undo_chunk(name: str) -> Iterator[None]

module function · public name · maya_tools/Rigging/undo_utils.py:17

Group nested rig edits into one Maya undo step.

undoable

def undoable(name: str) -> Callable[[_F], _F]

module function · public name · maya_tools/Rigging/undo_utils.py:34

Decorate a public Maya operation with a nested-safe undo chunk.

maya_tools.Rigging.unreal_skeletal_export

_mesh_transforms

def _mesh_transforms(values: list[str] | tuple[str, ...] | None=None) -> list[str]

module function · internal · maya_tools/Rigging/unreal_skeletal_export.py:17

list_skinned_meshes

def list_skinned_meshes() -> list[str]

module function · public name · maya_tools/Rigging/unreal_skeletal_export.py:41

Return exportable, non-intermediate skinned mesh transforms in the scene.

_skin_clusters

def _skin_clusters(meshes: list[str]) -> list[str]

module function · internal · maya_tools/Rigging/unreal_skeletal_export.py:57

_influences

def _influences(clusters: list[str]) -> list[str]

module function · internal · maya_tools/Rigging/unreal_skeletal_export.py:68

_root_joints

def _root_joints(joints: list[str]) -> list[str]

module function · internal · maya_tools/Rigging/unreal_skeletal_export.py:79

restore_skin_bind_pose

def restore_skin_bind_pose(meshes: list[str] | tuple[str, ...] | None=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/unreal_skeletal_export.py:94

export_skeletal_fbx

def export_skeletal_fbx(rig_name: str, output_directory: str, *, meshes: list[str] | tuple[str, ...] | None=None, skeletal_mesh_name: str='') -> dict[str, Any]

module function · public name · maya_tools/Rigging/unreal_skeletal_export.py:118

remove_rig_restore_bind_pose_and_export

def remove_rig_restore_bind_pose_and_export(body_joint_map: dict[str, Any], face_joint_map: dict[str, Any] | None, rig_name: str, output_directory: str, *, meshes: list[str] | tuple[str, ...] | None=None, skeletal_mesh_name: str='') -> dict[str, Any]

module function · public name · maya_tools/Rigging/unreal_skeletal_export.py:170

Remove generated controls, restore skin bind pose, and export Unreal FBX.

maya_tools.Rigging.validation_proxy

create_rigged_proxy

def create_rigged_proxy(name_prefix: str='AIStudio_Proxy', start_frame: int=1, end_frame: int=24, travel_distance: float=100.0) -> dict[str, Any]

module function · public name · maya_tools/Rigging/validation_proxy.py:8

inspect_rigged_proxy

def inspect_rigged_proxy(name_prefix: str='AIStudio_Proxy', start_frame: int=1, end_frame: int=24) -> dict[str, Any]

module function · public name · maya_tools/Rigging/validation_proxy.py:78

maya_tools.Rigging.vehicle_rig

_short_name

def _short_name(node: str) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:37

_nodes_with_attr_value

def _nodes_with_attr_value(attribute: str, value: str, *, node_type: str='') -> list[str]

module function · internal · maya_tools/Rigging/vehicle_rig.py:41

find_template_roots

def find_template_roots() -> list[str]

module function · public name · maya_tools/Rigging/vehicle_rig.py:56

find_rig_roots

def find_rig_roots() -> list[str]

module function · public name · maya_tools/Rigging/vehicle_rig.py:60

_resolve_template_root

def _resolve_template_root(root_joint: Optional[str]=None) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:64

_role_nodes

def _role_nodes(root_joint: str) -> dict[str, list[str]]

module function · internal · maya_tools/Rigging/vehicle_rig.py:79

_add_string

def _add_string(node: str, name: str, value: str) -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:92

_add_float

def _add_float(node: str, name: str, value: float, *, minimum: Optional[float]=None, maximum: Optional[float]=None, keyable: bool=True) -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:98

_add_bool

def _add_bool(node: str, name: str, value: bool, *, keyable: bool=True) -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:112

_set_color

def _set_color(control: str, color: int) -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:118

_curve

def _curve(name: str, points, color: int) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:124

_box_control

def _box_control(name: str, dimensions: tuple[float, float, float]) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:130

_world_position

def _world_position(node: str) -> tuple[float, float, float]

module function · internal · maya_tools/Rigging/vehicle_rig.py:140

_scene_units_per_meter

def _scene_units_per_meter() -> float

module function · internal · maya_tools/Rigging/vehicle_rig.py:145

_json_attr

def _json_attr(node: str, name: str, default)

module function · internal · maya_tools/Rigging/vehicle_rig.py:153

_find_rig_root

def _find_rig_root(node: Optional[str]=None) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:163

_unique_name

def _unique_name(base: str) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:178

build_vehicle_rig

def build_vehicle_rig(root_joint: Optional[str]=None, *, ground_meshes: Optional[Iterable[str]]=None, create_preview_geometry: bool=True) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:188

_mesh_shape

def _mesh_shape(node: str) -> str

module function · internal · maya_tools/Rigging/vehicle_rig.py:380

attach_ground

def attach_ground(meshes: Iterable[str], *, rig_root: Optional[str]=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:390

attach_selected_ground

def attach_selected_ground(rig_root: Optional[str]=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:405

_mesh_intersection

def _mesh_intersection(mesh: str, origin: om.MFloatPoint, direction: om.MFloatVector, maximum: float)

module function · internal · maya_tools/Rigging/vehicle_rig.py:410

_normalize

def _normalize(value: om.MVector, fallback: om.MVector) -> om.MVector

module function · internal · maya_tools/Rigging/vehicle_rig.py:427

_orientation_matrix

def _orientation_matrix(position, up: om.MVector, forward_hint: om.MVector) -> list[float]

module function · internal · maya_tools/Rigging/vehicle_rig.py:431

_steering_angles

def _steering_angles(rows: list[dict[str, Any]], steering_degrees: float, maximum_degrees: float, blend: float) -> dict[str, float]

module function · internal · maya_tools/Rigging/vehicle_rig.py:445

_ensure_auto_steer_attributes

def _ensure_auto_steer_attributes(rig_root: str, chassis_control: str) -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:476

Upgrade previously saved vehicle rigs without resetting animator values.

_apply_bicycle_motion

def _apply_bicycle_motion(rig_root: str, global_control: str, rows: list[dict[str, Any]], steering_degrees: float) -> dict[str, float | bool]

module function · internal · maya_tools/Rigging/vehicle_rig.py:525

Make forward/reverse translation follow the steered front axle. This is the kinematic bicycle model: curvature is tan(steer) / wheelbase. The signed travel distance makes reversing rotate the chassis in the opposite direction without any sp

_wheelbase

def _wheelbase(rows: list[dict[str, Any]]) -> float

module function · internal · maya_tools/Rigging/vehicle_rig.py:603

_automatic_steer_angle

def _automatic_steer_angle(rig_root: str, chassis_control: str, rows: list[dict[str, Any]], maximum_degrees: float) -> float

module function · internal · maya_tools/Rigging/vehicle_rig.py:619

Derive front-wheel steering from chassis yaw or animated path curvature.

_suspension_contact

def _suspension_contact(rig_root: str, mount: str, meshes: list[str], up: om.MVector, down: om.MVector, units: float) -> dict[str, Any]

module function · internal · maya_tools/Rigging/vehicle_rig.py:683

Query one sprung wheel from maximum compression to maximum droop.

_average

def _average(values: list[float]) -> float

module function · internal · maya_tools/Rigging/vehicle_rig.py:762

_solve_chassis_ground_driver

def _solve_chassis_ground_driver(rig_root: str, chassis_control: str, global_control: str, rows: list[dict[str, Any]], meshes: list[str], units: float) -> dict[str, float | int | bool]

module function · internal · maya_tools/Rigging/vehicle_rig.py:766

Fit the sprung chassis to wheel contacts without touching animator channels.

_wheel_roll

def _wheel_roll(rig_root: str, control: str, spin_driver: str, steer_driver: str, center: om.MVector, radius: float) -> float

module function · internal · maya_tools/Rigging/vehicle_rig.py:863

reset_wheel_roll

def reset_wheel_roll(rig_root: Optional[str]=None, *, preserve_rotation: bool=False) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:924

update_ground

def update_ground(rig_root: Optional[str]=None) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:960

_callback_attributes

def _callback_attributes(rig_root: str) -> list[str]

module function · internal · maya_tools/Rigging/vehicle_rig.py:1079

remove_ground_callback

def remove_ground_callback(rig_root: Optional[str]=None) -> None

module function · public name · maya_tools/Rigging/vehicle_rig.py:1129

Remove every live evaluator registered for one vehicle rig.

remove_all_ground_callbacks

def remove_all_ground_callbacks() -> None

module function · public name · maya_tools/Rigging/vehicle_rig.py:1143

Remove live callbacks, including entries whose scene nodes were deleted.

_refresh_active_viewport

def _refresh_active_viewport() -> None

module function · internal · maya_tools/Rigging/vehicle_rig.py:1160

Refresh at display cadence without stalling manipulator mouse events.

_live_refresh

def _live_refresh(rig_root: str, *, refresh_viewport: bool=True) -> bool

module function · internal · maya_tools/Rigging/vehicle_rig.py:1173

update_registered_live_rigs

def update_registered_live_rigs(*, refresh_viewport: bool=True) -> int

module function · public name · maya_tools/Rigging/vehicle_rig.py:1184

Evaluate registered rigs now; intended for a Qt viewport heartbeat.

install_ground_callback

def install_ground_callback(rig_root: Optional[str]=None) -> list[int]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1199

Install native DG/time callbacks for immediate drag and playback updates. ``scriptJob(attributeChange=...)`` can be coalesced until a Maya manipulator releases the mouse. MNodeMessage is delivered for every channel edit, while MEventMessage

install_ground_callbacks

def install_ground_callbacks() -> list[int]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1248

install_scene_callbacks

def install_scene_callbacks() -> list[int]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1256

Restore live vehicle evaluation whenever a scene is opened or imported.

bake_ground

def bake_ground(rig_root: Optional[str]=None, *, start: Optional[float]=None, end: Optional[float]=None, step: float=1.0) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1277

save_vehicle_rig

def save_vehicle_rig(path: str=DEFAULT_RIG_PATH) -> str

module function · public name · maya_tools/Rigging/vehicle_rig.py:1316

build_example_scene

def build_example_scene(path: str=DEFAULT_RIG_PATH) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1326

build_demo_scene

def build_demo_scene(path: str=DEFAULT_DEMO_PATH) -> dict[str, Any]

module function · public name · maya_tools/Rigging/vehicle_rig.py:1343

Build and bake a short uneven-ground validation scene.

maya_tools.Utilities.dag

disable_evaluation

def disable_evaluation()

module function · public name · maya_tools/Utilities/dag.py:3

Equivalent to Evaluation > Evaluation Mode > Off

enable_evaluation

def enable_evaluation()

module function · public name · maya_tools/Utilities/dag.py:11

Restore normal evaluation (Parallel).

rename_duplicates

def rename_duplicates()

module function · public name · maya_tools/Utilities/dag.py:24

Renames duplicate DAG nodes by appending an incrementing number. Example: cube -> cube1 cube -> cube2 cube -> cube3

maya_tools.Utilities.joints

find_skinned_or_top_joints

def find_skinned_or_top_joints(namespace='')

module function · public name · maya_tools/Utilities/joints.py:4

Finds the topmost joint in the skinned joint hierarchy. If no skinClusters exist, walks up from any joint in the namespace and returns the highest ancestor. :param namespace: Namespace string with colon suffix (e.g., 'MyChar:') :return: Nam