#!/usr/bin/env python # -*- coding: utf-8 -*- #UZAY CALISKAN拥有所有权利。 #请查看产品文件夹内的完整许可证(协议的一部分如下) #您不会: # 除存档或备份目的外,不复制产品; # 规避或禁用产品中可能包含或设定的任何访问控制技术、安全设备、程序、协议或技术保护机制; # 对产品或产品的任何部分进行黑客攻击、逆向工程、反编译、分解、修改或创作衍生作品; # 发布、销售、分发或以其他方式使产品可供他人使用、下载或复制; # 将产品或本协议下的任何权利转让或分许给任何第三方,无论是自愿的还是根据法律操作的; # 使用产品进行任何可能是诽谤、威胁、虐待、有害或侵犯他人隐私的目的,或者可能违反任何法律或导致民事或其他责任; # 误代表自己为财产的创造者或所有者; # 移除或修改产品中或产品上的任何专有通知、符号或标签; # 直接或间接地帮助、促进或鼓励任何第三方进行本协议禁止的任何活动。 import importlib import sys import maya.cmds as cmds import os from os import path as ospath from sys import path as syspath from sys import platform maya_version = int(cmds.about(version=True)) #MAYAPLUGINPATH maya_plugin_path = os.environ.get('MAYA_PLUG_IN_PATH') new_path = "" if maya_version == 2022: new_path = 'c:/dna_calibration/lib/Maya2022/windows' if maya_version == 2023: new_path = 'c:/dna_calibration/lib/Maya2023/windows' if maya_version == 2024: new_path = 'c:/dna_calibration/lib/Maya2024/windows' if maya_plugin_path: updated_path = maya_plugin_path + os.pathsep + new_path else: updated_path = new_path os.environ['MAYA_PLUG_IN_PATH'] = updated_path if maya_version < 2022 or maya_version > 2024: raise ValueError("Metapipe only works with MAYA 2022/2023/2024") ROOT_DIR = "c:/dna_calibration" MAIN_PATH = "c:/Arts and Spells/Metapipe Free 3.0.0" iconPath = MAIN_PATH + "/Icons/" MAYA_VERSION = maya_version ROOT_LIB_DIR = f"{ROOT_DIR}/lib/Maya{MAYA_VERSION}" if platform == "win32": LIB_DIR = f"{ROOT_LIB_DIR}/windows" elif platform == "linux": LIB_DIR = f"{ROOT_LIB_DIR}/linux" else: raise OSError( "OS not supported, please compile dependencies and add value to LIB_DIR" ) # Adds directories to path syspath.insert(0, ROOT_DIR) syspath.insert(0, LIB_DIR) sys.path.append(MAIN_PATH) sys.path.append("c:/Arts and Spells/Scripts") sys.path.append(ROOT_DIR + "/examples") #Dna Path dnaPath= "C:/Users/MONSTER/Documents/Megascans Library/Downloaded/DHI/h344NMUV_asset/1k/asset_source/MetaHumans/CustomDNA/SourceAssets/CustomDNA.dna" body_type= "m_med_nrw" sceneLodN = str(0) scenebodyLodN = str(0) CHARACTER_NAME = os.path.basename(dnaPath).split(".")[0] import time import maya.cmds as cmds import maya.OpenMayaUI as omui from shiboken2 import wrapInstance from PySide2 import QtWidgets, QtGui, QtCore from os import environ import logging import maya.OpenMaya as om from os import environ, makedirs #import dna_viewer cmds.select(clear=True) if maya_version == 2024: if sys.version_info < (3, 10, 8): cmds.confirmDialog(title="ERROR", message="Python 3.11.0 or above is required. Please download correct Python Version!") raise ValueError("Python 3.11.0 or above is required. Please download correct Python Version!") if maya_version == 2023: if sys.version_info < (3, 9, 7): raise ValueError("Python 3.9.7 or above is required. Please download correct Python Version!") if maya_version == 2022: if sys.version_info < (3, 7, 0): raise ValueError("Python 3.9.7 or above is required. Please download correct Python Version!") auto_keyframe_toggle = cmds.autoKeyframe(q=True, state=True) if auto_keyframe_toggle: raise ValueError("Auto Keyframe Toggle is On! Turn it of and try again.") global selChack selCheck=0 worldCheck=0 file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type def newScene(): if cmds.file(query=True, modified=True): result = cmds.confirmDialog( title="Save Changes?", message="Do you want to save changes to the current scene?", button=["Save", "Don't Save", "Cancel"], defaultButton="Save", cancelButton="Cancel", dismissString="Cancel") if result == "Save": # Save the current scene cmds.file(save=True, force=True) elif result == "Don't Save": # Discard changes and create a new scene cmds.file(new=True, force=True) else: # No unsaved changes, create a new scene directly cmds.file(new=True, force=True) if not cmds.objExists("metapipefreewindow"): cmds.createNode("transform", name="metapipefreewindow") leftPanelButtonV(0) def saveScene(): if cmds.objExists("LoadedDNAInfoNode") or cmds.objExists("rl4Embedded_Archetype") or cmds.objExists ("rl4Embedded_Archtype"): saveFileName = "Checkpoint" else: saveFileName = "Custom Head" # Define the file path for the .mb file file_path = f"{ROOT_DIR}/data/" + saveFileName + ".mb" # Save the current scene as an .mb file cmds.file(rename=file_path) cmds.file(save=True, type="mayaBinary") print(f"Saved as {file_path}") def loadScene(saveFileName): # Define the file path for the .mb file file_path = f"{ROOT_DIR}/data/" + saveFileName + ".mb" if os.path.isfile(file_path): if cmds.file(query=True, modified=True): result = cmds.confirmDialog( title="Save Changes?", message="Do you want to save changes to the current scene?", button=["Save", "Don't Save", "Cancel"], defaultButton="Save", cancelButton="Cancel", dismissString="Cancel") if result == "Save": # Save the current scene cmds.file(save=True, force=True) cmds.file(file_path, force=True, open=True) elif result == "Don't Save": # Discard changes and create a new scene cmds.file(file_path, force=True, open=True) else: # No unsaved changes, create a new scene directly cmds.file(file_path, force=True, open=True) else: cmds.confirmDialog(title="ERROR", message="Couldnt find any [Saved Scene]. You need to Save the scene to use this button.") raise ValueError("Couldnt find any [Saved Scene]. You need to Save the scene to use this button.") if not cmds.objExists("metapipefreewindow"): cmds.createNode("transform", name="metapipefreewindow") leftPanelButtonV(0) def openDNAViewer(): """ calib_check = f"{ROOT_DIR}/dna_calibration.mod" if not os.path.isfile(calib_check): cmds.confirmDialog(title="错误", message="请下载 Epic Games Dna Calibration 1.1.0 版本。版本不匹配或文件未找到!") raise ValueError("请下载 Epic Games Dna Calibration 1.1.0 版本。版本不匹配或文件未找到!") calib_check = f"{ROOT_DIR}/data/mh4/additional_assemble_script.py" if os.path.isfile(calib_check): cmds.confirmDialog(title="错误", message="请下载 Epic Games Dna Calibration 1.1.0 版本。版本不匹配或文件未找到!") raise ValueError("请下载 Epic Games Dna Calibration 1.1.0 版本。版本不匹配或文件未找到!") """ metapipe_vcheck = f"{ROOT_DIR}/Metapipe_Free.py" if os.path.isfile(metapipe_vcheck): cmds.confirmDialog(title="ERROR", message="Old Version file found. Please delete Metapipe_Free.py file in your dna_calibration path!") raise ValueError("Old Version file found. Please delete Metapipe_Free.py file in your dna_calibration path!") root_check = f"{ROOT_DIR}/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py" if not os.path.isfile(root_check): cmds.confirmDialog(title="ERROR", message="Please check ROOT_DIR path for the dna_calibration files! Files are not in ROOT_DIR") raise ValueError("Please check ROOT_DIR path for the dna_calibration files! Files are not in ROOT_DIR") dna_datas = f"{ROOT_DIR}/examples/datas_dna.py" if not os.path.isfile(dna_datas): cmds.confirmDialog(title="ERROR", message="Please save your preferences and try again") raise ValueError("Please save your preferences and try again") dna_viewer.show() cmds.createNode("transform", name="OpenedDNAInfoNode") leftPanelButtonV(1) def datasBuild(mod): from dna_viewer import DNA, RigConfig, build_rig file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type if mod == "gen": DATA_DIR = f"{ROOT_DIR}/data" dna = DNA(dnaPath) config = RigConfig( gui_path=f"{DATA_DIR}/gui.ma", analog_gui_path=f"{DATA_DIR}/analog_gui.ma", aas_path=f"{DATA_DIR}/additional_assemble_script.py") build_rig(dna=dna, config=config) if cmds.objExists("rl4Embedded_Archetype"): cmds.delete("rl4Embedded_Archetype") if cmds.objExists("rl4Embedded_Archtype"): cmds.delete("rl4Embedded_Archtype") elif mod=="rigged": DATA_DIR = f"{ROOT_DIR}/data" dna = DNA(dnaPath) config = RigConfig( gui_path=f"{DATA_DIR}/gui.ma", analog_gui_path=f"{DATA_DIR}/analog_gui.ma", aas_path=f"{DATA_DIR}/additional_assemble_script.py") build_rig(dna=dna, config=config) elif mod=="": #datas_dna.assemble_maya_scene() result = cmds.confirmDialog( title="Build DNA", message="Please choose Build DNA Option.", button=["Editable", "Rigged", "Cancel"], defaultButton="Editable", cancelButton="Cancel", dismissString="Cancel") if result == "Editable": DATA_DIR = f"{ROOT_DIR}/data" dna = DNA(dnaPath) config = RigConfig( gui_path=f"{DATA_DIR}/gui.ma", analog_gui_path=f"{DATA_DIR}/analog_gui.ma", aas_path=f"{DATA_DIR}/additional_assemble_script.py") build_rig(dna=dna, config=config) if cmds.objExists("rl4Embedded_Archetype"): cmds.delete("rl4Embedded_Archetype") if cmds.objExists("rl4Embedded_Archtype"): cmds.delete("rl4Embedded_Archtype") elif result == "Rigged": DATA_DIR = f"{ROOT_DIR}/data" dna = DNA(dnaPath) config = RigConfig( gui_path=f"{DATA_DIR}/gui.ma", analog_gui_path=f"{DATA_DIR}/analog_gui.ma", aas_path=f"{DATA_DIR}/additional_assemble_script.py") build_rig(dna=dna, config=config) def buildDNA(mod): file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type """calib_check = f"{ROOT_DIR}/dna_calibration.mod" if not os.path.isfile(calib_check): cmds.confirmDialog(title="ERROR", message="Please download Epic Games Dna Calibration 1.1.0 Version. Version is not matching or files are not found!") raise ValueError("Please download Epic Games Dna Calibration 1.1.0 Version. Version is not matching or files are not found!") calib_check = f"{ROOT_DIR}/UnrealFest.zip" if os.path.isfile(calib_check): cmds.confirmDialog(title="ERROR", message="Please download Epic Games Dna Calibration 1.1.0 Version. Version is not matching or files are not found!") raise ValueError("Please download Epic Games Dna Calibration 1.1.0 Version. Version is not matching or files are not found!")""" metapipe_vcheck = f"{ROOT_DIR}/Metapipe_Free.py" if os.path.isfile(metapipe_vcheck): cmds.confirmDialog(title="ERROR", message="Old Version file found. Please delete Metapipe_Free.py file in your dna_calibration path!") raise ValueError("Old Version file found. Please delete Metapipe_Free.py file in your dna_calibration path!") root_check = f"{ROOT_DIR}/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py" if not os.path.isfile(root_check): cmds.confirmDialog(title="ERROR", message="Please check ROOT_DIR path for the dna_calibration files! Files are not in ROOT_DIR") raise ValueError("Please check ROOT_DIR path for the dna_calibration files! Files are not in ROOT_DIR") dna_datas = f"{ROOT_DIR}/examples/datas_dna.py" if not os.path.isfile(dna_datas): cmds.confirmDialog(title="ERROR", message="Please save your preferences and try again") raise ValueError("Please save your preferences and try again") if not os.path.isfile(dnaPath): cmds.confirmDialog(title="ERROR", message="DNA not found. Please check your preferences and correct the DNA path.") raise ValueError("DNA not found. Please check your preferences and correct the DNA path.") # Create a progress window datasBuild(mod) cmds.createNode("transform", name="OpenedDNAInfoNode") if not cmds.objExists("metapipefreewindow"): cmds.createNode("transform", name="metapipefreewindow") leftPanelButtonV(1) def datasLoad(): file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type import datas_dna importlib.reload(datas_dna) datas_dna.load_dna_data() def loadDNA(): file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type dna_datas = f"{ROOT_DIR}/examples/datas_dna.py" #if not os.path.isfile(dna_datas): #raise ValueError("Please press Update button first") sys.path.append(f"{ROOT_DIR}/examples") if not os.path.isfile(dna_datas): cmds.confirmDialog(title="ERROR", message="Please save [Metapipe Preferences] again") raise ValueError("Please save [Metapipe Preferences] again") datasLoad() if not cmds.objExists("LoadedDNAInfoNode"): cmds.createNode("transform", name="LoadedDNAInfoNode") cmds.warning("Loaded Succesfully!") cmds.warning("Already Loaded!") leftPanelButtonV(2) unlock() def datasSave(): import datas_dna datas_dna.save_dna_data() def datasSaveRaw(): import datas_dna datas_dna.save_dna_data_raw() def saveDNA(): sys.path.append(f"{ROOT_DIR}/examples") datasSave() if not cmds.objExists("metapipefreewindow"): cmds.createNode("transform", name="metapipefreewindow") leftPanelButtonV(3) def prepare_export(): # Detach spine_04 from head_grp and move it to the top level of the Outliner cmds.parent('spine_04', w=True, r=True) if not cmds.namespace(exists="DHIhead"): cmds.namespace(add="DHIhead", parent=":") cmds.namespace(set="DHIhead") cmds.namespace(set=":") # Get a list of all the joints in the scene joints = cmds.ls(type="joint") # Add every joint to the "DHIhead" namespace and print a message if it already has the "DHIhead" prefix for joint in joints: if joint.startswith("DHIhead:"): print(joint + " is already in the DHIhead namespace") else: cmds.rename(joint, "DHIhead:" + joint) leftPanelButtonV(4) print("Ready") def fixbody(): # # # Transfer Body original skeleton to the new head Skeleton CD = 15 lower_CD = -1 minCD = 0 # Define the joint names and namespaces head_joint = "DHIhead:spine_04" body_joint = "spine_04_drv" # Split the joint names into their respective namespaces and joint names head_namespace, head_joint_name = head_joint.split(":") # Get the list of child joints for the head joint head_child_joints = cmds.listRelatives(head_joint, children=True, allDescendents=True,type="joint") body_child_joints = cmds.listRelatives(body_joint, children=True, allDescendents=True, type="joint") def move2target_joint(moving_joint, target_joint): lower_lip_rotation_pos = cmds.xform(moving_joint, query=True, worldSpace=True, rotatePivot=True) jaw_pos = cmds.xform(target_joint, query=True, worldSpace=True, rotatePivot=True) # Get the child joints child_joints = cmds.listRelatives(moving_joint, c=True, type="joint") # Store the initial positions of the child joints child_positions = [] if child_joints: for child_joint in child_joints: child_positions.append(cmds.xform(child_joint, q=True, ws=True, t=True)) # Set the translate and rotate pivot attributes of the "FACIAL_C_LowerLipRotation" joint to match those of "FACIAL_C_MouthUpper" cmds.xform(moving_joint, translation=jaw_pos, rotatePivot=lower_lip_rotation_pos, worldSpace=True) if child_joints: # Move each child joint back to its original position for i, child_joint in enumerate(child_joints): cmds.xform(child_joint, ws=True, t=child_positions[i]) moving_joint = body_joint target_joint = head_joint move2target_joint(moving_joint, target_joint) while CD >= minCD: joint_CD = [joint for joint in body_child_joints if cmds.getAttr(joint + ".chainDepth") == CD] for joint_name in joint_CD: drvname = joint_name.replace("_drv", "") # Build the joint names for the current joint head_current_joint = "{}:{}".format(head_namespace, drvname) if cmds.objExists(head_current_joint): if joint_name[-5] == "r": offnamer = joint_name.replace("_r_drv", "Off_r_drv") if cmds.objExists(offnamer): joint_name = offnamer if joint_name[-5] == "l": offnamel = joint_name.replace("_l_drv", "Off_l_drv") if cmds.objExists(offnamel): joint_name = offnamel moving_joint = joint_name target_joint = head_current_joint move2target_joint(moving_joint, target_joint) lower_CD -= 1 CD -= 1 cmds.createNode("transform", name="FixBodyInfoNode") leftPanelButtonV(6) def bind_skin(gender_mesh): # Body mesh_obj = cmds.ls(gender_mesh)[0] # Duplicate the mesh duplicated_mesh_obj = cmds.duplicate(mesh_obj)[0] cmds.select([duplicated_mesh_obj, "DHIbody:root"]) # Bind skin to the mesh skin_cluster = cmds.skinCluster("DHIbody:root", duplicated_mesh_obj)[0] cmds.select([mesh_obj, duplicated_mesh_obj]) cmds.copySkinWeights(noMirror=True, surfaceAssociation="closestPoint", influenceAssociation=["name", "oneToOne"]) cmds.delete(mesh_obj) cmds.rename(duplicated_mesh_obj, gender_mesh) gender=0 gender_mesh = body_type + "_body_lod0_mesh" def build_body(): cmds.createNode("transform", name="body_gen_node") leftPanelButtonV(5) Body_DRV = f"{ROOT_DIR}/data/Body_Drv.mb" if not os.path.isfile(Body_DRV): raise ValueError("Please prepare the body file first. Body_Drv file is not found") skeleton_file_path = f"{ROOT_DIR}/data/Body_Drv.mb" # Import the FBX file cmds.file(skeleton_file_path, i=True, ignoreVersion=True, mergeNamespacesOnClash=False) def add_chain_depth_attribute(joints): for joint in joints: if not cmds.attributeQuery('chainDepth', node=joint, exists=True): cmds.addAttr(joint, longName='chainDepth', attributeType='long', defaultValue=0) cmds.setAttr(joint + '.chainDepth', keyable=True) def set_chain_depth_value(joints, value): for joint in joints: cmds.setAttr(joint + '.chainDepth', value) # Get all joints in the scene all_joints = cmds.ls(type="joint") # Remove joints in the "DHIhead:spine_04" hierarchy (Avoid HEAD) exclude_joints = cmds.ls("DHIhead:spine_04", dag=True, type="joint") all_joints = cmds.ls("root_drv", dag=True, type="joint") add_chain_depth_attribute(all_joints) # Filter end joints (joints with no child joints) end_joints = [joint for joint in all_joints if not cmds.listRelatives(joint, children=True, type='joint')] # Set chainDepth attribute to 0 for all end joints set_chain_depth_value(all_joints, 100) set_chain_depth_value(end_joints, 0) parents1 = [] for joint_name in end_joints: p_joint = cmds.listRelatives(joint_name, parent=True, type="joint") if p_joint: children = cmds.listRelatives(p_joint, children=True, type="joint") or [] if all(cmds.getAttr(child + ".chainDepth") == 0 for child in children): parents1.append(p_joint[0]) set_chain_depth_value(parents1, 1) #Chaindepth add Attr Loop chainDepth = 1 while parents1: chainDepth += 1 new_parents = [] for joint_name in parents1: p_joint = cmds.listRelatives(joint_name, parent=True, type="joint") if p_joint: children = cmds.listRelatives(p_joint, children=True, type="joint") or [] if all(cmds.getAttr(child + ".chainDepth") < chainDepth for child in children): new_parents.append(p_joint[0]) if new_parents: set_chain_depth_value(new_parents, chainDepth) parents1 = new_parents else: break DHIBODY_name = 'DHIbody:root' bind_skin(gender_mesh) unlock() def connect_body(): bodyNS = "DHIbody:" headNS = "DHIhead:" for i in cmds.ls(type="joint"): if headNS in i: if i.replace(headNS,bodyNS) in cmds.ls(type="joint"): cmds.parentConstraint(i.replace(headNS,bodyNS),i,mo=True) cmds.scaleConstraint(i.replace(headNS,bodyNS),i,mo=True) def bindSkinC(): selected_objects = cmds.ls(selection=True) sel = selected_objects[0] cmds.select('DHIbody:root', add=True) cmds.skinCluster() cmds.rename(sel, body_type + "_binded_body_lod0_mesh") cmds.hide(body_type + "_body_lod0_mesh") def copySkin(): selected_objects = cmds.ls(selection=True) sel = selected_objects[0] cmds.select(clear=True) cmds.select(body_type + "_body_lod0_mesh", add=True) cmds.select(sel, add=True) cmds.copySkinWeights(noMirror=True, surfaceAssociation="closestPoint", influenceAssociation=["name", "oneToOne"]) cmds.delete(body_type + "_body_lod0_mesh") cmds.rename(sel, body_type + "_body_lod0_mesh") def shapeEdit(): import maya.mel as mel mel.eval("ShapeEditor") def findCustom(): selected_objects = cmds.ls(selection=True) for obj in selected_objects: poly_Match = 0 poly_count = cmds.polyEvaluate(obj, vertex=True) if poly_count == 24049: cmds.rename(obj, "custom_head_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_head",edit=True,enable=True) continue elif poly_count == 4246: cmds.rename(obj, "custom_teeth_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_teeth",edit=True,enable=True) continue elif poly_count == 660: cmds.rename(obj, "custom_saliva_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_saliva",edit=True,enable=True) continue elif poly_count == 770: if not cmds.objExists("custom_eyeLeft_lod0_mesh1"): cmds.rename(obj, "custom_eyeLeft_lod0_mesh0") poly_count = 1 elif poly_count == 552: cmds.rename(obj, "custom_eyeshell_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_eyeshell",edit=True,enable=True) continue elif poly_count == 2144: cmds.rename(obj, "custom_eyelashes_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_eyelashes",edit=True,enable=True) continue elif poly_count == 268: cmds.rename(obj, "custom_eyeEdge_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_eyeEdge",edit=True,enable=True) continue elif poly_count == 386: cmds.rename(obj, "_custom_cartilage_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_cartilage",edit=True,enable=True) continue elif poly_count == 30455: cmds.rename(obj, body_type + "_custom_body_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_body",edit=True,enable=True) continue elif poly_count == 54412: cmds.rename(obj, body_type + "_custom_combined_lod0_mesh") poly_Match = 1 cmds.symbolButton("gcustom_combined",edit=True,enable=True) continue if cmds.objExists("custom_eyeLeft_lod0_mesh0") and cmds.objExists("custom_eyeLeft_lod0_mesh1"): cmds.symbolButton("gcustom_eyeLeft",edit=True,enable=True) cmds.symbolButton("gcustom_eyeRight",edit=True,enable=True) cmds.xform("custom_eyeLeft_lod0_mesh0", centerPivots=True) cmds.xform("custom_eyeLeft_lod0_mesh1", centerPivots=True) pos1 = cmds.xform("custom_eyeLeft_lod0_mesh0", query=True, worldSpace=True, rotatePivot=True) pos2 = cmds.xform("custom_eyeLeft_lod0_mesh1", query=True, worldSpace=True, rotatePivot=True) # Check the model is in rigth or left if pos1[0] > 0 and pos2[0] > 0: print("Both eyes are on the positive X side of the origin") elif pos1[0] < 0 and pos2[0] < 0: print("Both eyes are on the negative X side of the origin") elif pos1[0] < 0 and pos2[0] > 0: if cmds.objExists("eyeRight") or cmds.objExists("eyeLeft"): print("Eye names already exist, Delete or rename them") else: cmds.rename("custom_eyeLeft_lod0_mesh0", "custom_eyeRight_lod0_mesh") cmds.rename("custom_eyeLeft_lod0_mesh1", "custom_eyeLeft_lod0_mesh") elif pos1[0] > 0 and pos2[0] < 0: if cmds.objExists("eyeRight") or cmds.objExists("eyeLeft"): print("Eye names already exist, Delete or rename them") else: cmds.rename("custom_eyeLeft_lod0_mesh0", "custom_eyeLeft_lod0_mesh") cmds.rename("custom_eyeLeft_lod0_mesh1", "eyeRight_lod0_mesh") elif pos1[0] == 0 or pos2[0] == 0: print("Eye is in the middle") def jointSelectionC(butName): print(butName) if cmds.objExists(butName): butNameS=butName if cmds.objExists("DHIhead:"+butName): butNameS="DHIhead:"+butName if cmds.objExists(butName+"_drv"): butNameS=butName+"_drv" global selCheck selected_objects = cmds.ls(selection=True) if butNameS not in selected_objects: cmds.symbolButton(butName, edit=True, image=iconPath + "JointButtonSelected.png") cmds.select(butNameS, add=True) selCheck=1 else: cmds.symbolButton(butName, edit=True, image=iconPath + "JointButton.png") cmds.select(butNameS, deselect=True) selCheck=0 def meshSelC(mesh, toggleN): if toggleN == 0: meshN = mesh + "_lod" + sceneLodN + "_mesh" selected_objects = cmds.ls(selection=True) if meshN not in selected_objects: cmds.symbolButton("g" + mesh,edit=True,image=iconPath + "UIGeo" + mesh + "Pressed.png") cmds.select(meshN, add=True) selCheck=1 else: cmds.symbolButton("g" + mesh,edit=True,image=iconPath + "UIGeo" + mesh + ".png") cmds.select(meshN, deselect=True) selCheck=0 if toggleN == 1: meshN = body_type + "_" + mesh + "_lod" + scenebodyLodN + "_mesh" selected_objects = cmds.ls(selection=True) if meshN not in selected_objects: cmds.symbolButton("g" + mesh,edit=True,image=iconPath + "UIGeo" + mesh + "Pressed.png") cmds.select(meshN, add=True) selCheck=1 else: cmds.symbolButton("g" + mesh,edit=True,image=iconPath + "UIGeo" + mesh + ".png") cmds.select(meshN, deselect=True) selCheck=0 if toggleN == 2: meshN = mesh + "_drv" selected_objects = cmds.ls(selection=True) if meshN not in selected_objects: cmds.symbolButton(mesh,edit=True,image=iconPath + "JointButtonHPressed.png") cmds.select(meshN, add=True) selCheck=1 else: cmds.symbolButton(mesh,edit=True,image=iconPath + "JointButtonH.png") cmds.select(meshN, deselect=True) selCheck=0 def selectAllGeo(toggleN): if toggleN==0: gheadMesh = ['head_lod' + sceneLodN + '_mesh', 'teeth_lod' + sceneLodN + '_mesh', 'saliva_lod' + sceneLodN + '_mesh', 'eyeLeft_lod' + sceneLodN + '_mesh', 'eyeshell_lod' + sceneLodN + '_mesh', 'eyelashes_lod' + sceneLodN + '_mesh', 'eyeEdge_lod' + sceneLodN + '_mesh', 'cartilage_lod' + sceneLodN + '_mesh', 'eyeRight_lod' + sceneLodN + '_mesh'] for obj in gheadMesh: if cmds.objExists(obj): cmds.select(obj, add=True) if toggleN==1: gheadMesh = ['head_lod' + sceneLodN + '_mesh', 'teeth_lod' + sceneLodN + '_mesh', 'saliva_lod' + sceneLodN + '_mesh', 'eyeLeft_lod' + sceneLodN + '_mesh', 'eyeshell_lod' + sceneLodN + '_mesh', 'eyelashes_lod' + sceneLodN + '_mesh', 'eyeEdge_lod' + sceneLodN + '_mesh', 'cartilage_lod' + sceneLodN + '_mesh', 'eyeRight_lod' + sceneLodN + '_mesh'] for obj in gheadMesh: if cmds.objExists("custom_" + obj): cmds.select("custom_" + obj, add=True) if toggleN==2: gbodyMesh = [body_type + "_body_lod" + scenebodyLodN + '_mesh',body_type + "_combined_lod" + scenebodyLodN + '_mesh',body_type + "_flipflops_lod" + scenebodyLodN + '_mesh'] for obj in gbodyMesh: if cmds.objExists(obj): cmds.select(obj, add=True) if toggleN==3: gbodyMesh = [body_type + "_custom_body_lod" + scenebodyLodN + '_mesh',body_type + "_custom_combined_lod" + scenebodyLodN + '_mesh',body_type + "_custom_flipflops_lod" + scenebodyLodN + '_mesh'] for obj in gbodyMesh: if cmds.objExists(obj): cmds.select(obj, add=True) def checkSceneSel(): if cmds.objExists("metapipefreewindow"): global toggleCheck selected_objects = cmds.ls(selection=True) gheadMesh = ['head_lod' + sceneLodN + '_mesh', 'teeth_lod' + sceneLodN + '_mesh', 'saliva_lod' + sceneLodN + '_mesh', 'eyeLeft_lod' + sceneLodN + '_mesh', 'eyeshell_lod' + sceneLodN + '_mesh', 'eyelashes_lod' + sceneLodN + '_mesh', 'eyeEdge_lod' + sceneLodN + '_mesh', 'cartilage_lod' + sceneLodN + '_mesh', 'eyeRight_lod' + sceneLodN + '_mesh'] gbodyMesh = [body_type + "_body_lod" + scenebodyLodN + '_mesh',body_type + "_combined_lod" + scenebodyLodN + '_mesh',body_type + "_flipflops_lod" + scenebodyLodN + '_mesh'] gcustomheadMesh = ['custom_head_lod0_mesh', 'custom_teeth_lod0_mesh', 'custom_saliva_lod0_mesh', 'custom_eyeLeft_lod0_mesh', 'custom_eyeshell_lod0_mesh', 'custom_eyelashes_lod0_mesh', 'custom_eyeEdge_lod0_mesh', 'custom_cartilage_lod0_mesh', 'custom_eyeRight_lod0_mesh'] gcustombodyMesh = [body_type + "_custom_body_lod0_mesh", body_type + "_custom_combined_lod0_mesh"] jointButs=["pelvis", "spine_01", "spine_02", "spine_03", "spine_04", "spine_05", "neck_02", "head", "clavicle_r", "clavicle_l", "thigh_r", "thigh_l", "calf_r", "calf_l", "foot_r", "foot_l", "upperarm_r", "upperarm_l", "lowerarm_r", "lowerarm_l", "hand_r", "hand_l", "FACIAL_C_Jaw", "FACIAL_C_TeethUpper", "FACIAL_C_TeethLower", "root", 'FACIAL_R_EyelidUpperB1', 'FACIAL_R_EyelidUpperA1', 'FACIAL_R_EyelidLowerA1', 'FACIAL_R_EyelidLowerB1', 'FACIAL_R_Eye', 'FACIAL_R_LipUpperOuter', 'FACIAL_R_LipUpper', 'FACIAL_R_LipLower', 'FACIAL_L_EyelidUpperB1', 'FACIAL_L_EyelidUpperA1', 'FACIAL_L_EyelidLowerA1', 'FACIAL_L_EyelidLowerB1', 'FACIAL_L_Eye', 'FACIAL_L_LipUpperOuter', 'FACIAL_R_LipUpper', 'FACIAL_R_LipLower', 'FACIAL_R_EyelidUpperB2', 'FACIAL_R_EyelidUpperA2', 'FACIAL_R_EyelidLowerA2', 'FACIAL_R_EyelidLowerB2', 'FACIAL_R_EyeCornerOuter', 'FACIAL_R_LipCorner', 'FACIAL_L_LipUpper', 'FACIAL_L_LipLower', 'FACIAL_L_EyelidUpperB2', 'FACIAL_L_EyelidUpperA2', 'FACIAL_L_EyelidLowerA2', 'FACIAL_L_EyelidLowerB2', 'FACIAL_L_EyeCornerOuter', 'FACIAL_L_LipCorner', 'FACIAL_L_LipUpper', 'FACIAL_L_LipLower', 'FACIAL_R_EyelidUpperB3', 'FACIAL_R_EyelidUpperA3', 'FACIAL_R_EyelidLowerA3', 'FACIAL_R_EyelidLowerB3', 'FACIAL_R_EyeCornerInner', 'FACIAL_R_LipLowerOuter', 'FACIAL_C_LipUpper', 'FACIAL_C_LipLower', 'FACIAL_L_EyelidUpperB3', 'FACIAL_L_EyelidUpperA3', 'FACIAL_L_EyelidLowerA3', 'FACIAL_L_EyelidLowerB3', 'FACIAL_L_EyeCornerInner', 'FACIAL_L_LipLowerOuter', 'FACIAL_C_LipUpper', 'FACIAL_C_LipLower'] handButs = ['index_01_r_drv', 'index_01_l_drv', 'index_02_r_drv', 'index_02_l_drv', 'index_03_r_drv', 'index_03_l_drv', 'middle_01_r_drv', 'middle_01_l_drv', 'middle_02_r_drv', 'middle_02_l_drv', 'middle_03_r_drv', 'middle_03_l_drv', 'ring_01_r_drv', 'ring_01_l_drv', 'ring_02_r_drv', 'ring_02_l_drv', 'ring_03_r_drv', 'ring_03_l_drv', 'pinky_01_r_drv', 'pinky_01_l_drv', 'pinky_02_r_drv', 'pinky_02_l_drv', 'pinky_03_r_drv', 'pinky_03_l_drv', 'thumb_01_r_drv', 'thumb_01_l_drv', 'thumb_02_r_drv', 'thumb_02_l_drv', 'thumb_03_r_drv', 'thumb_03_l_drv'] for obj in jointButs: cmds.symbolButton(obj, edit=True, image=iconPath + "JointButton.png") for obj in handButs: obj = obj.split("_drv") cmds.symbolButton(obj[0], edit=True, image=iconPath + "JointButtonH.png") for obj in gheadMesh: obj = obj.split('_lod' + sceneLodN + '_mesh') if not cmds.objExists(obj[0] + '_lod' + sceneLodN + '_mesh'): cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeo" + obj[0] + ".png", enable = False) else: cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeo" + obj[0] + ".png", enable = True) for obj in gbodyMesh: obj = obj.split('_lod' + scenebodyLodN + '_mesh') obj = obj[0].split(body_type + "_") if not cmds.objExists(body_type + "_" + obj[1] + '_lod' + scenebodyLodN + '_mesh'): cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeo" + obj[1] + ".png", enable = False) else: cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeo" + obj[1] + ".png", enable = True) for obj in gcustomheadMesh: objCheck=obj.replace("0",sceneLodN) if not cmds.objExists(objCheck): obj = obj.split('_lod0_mesh') cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeoC.png", enable = False) else: obj = obj.split('_lod0_mesh') cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeoC.png", enable = True) if toggleCheck == 0: cmds.symbolButton("gcustom_all",edit=True,enable=True, visible=True) for obj in gcustombodyMesh: objCheck=obj.replace("0",scenebodyLodN) if not cmds.objExists(objCheck): obj = obj.split('_lod0_mesh') obj = obj[0].split(body_type + "_") cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeoC.png", enable = False) else: obj = obj.split('_lod0_mesh') obj = obj[0].split(body_type + "_") cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeoC.png", enable = True) if toggleCheck == 1: cmds.symbolButton("gcustom_all",edit=True,enable=True, visible=True) for obj in selected_objects: if "DHIhead:" in obj: headObj = obj.split("DHIhead:") if headObj[1] in jointButs: cmds.symbolButton(headObj[1], edit=True, image=iconPath + "JointButtonSelected.png") if "_drv" in obj: bodyObj = obj.split("_drv") if bodyObj[0] in jointButs: cmds.symbolButton(bodyObj[0], edit=True, image=iconPath + "JointButtonSelected.png") if obj in jointButs: cmds.symbolButton(obj, edit=True, image=iconPath + "JointButtonSelected.png") if obj in handButs: obj = obj.split("_drv") cmds.symbolButton(obj[0], edit=True, image=iconPath + "JointButtonHPressed.png") if obj in gheadMesh: obj = obj.split('_lod' + sceneLodN + '_mesh') cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeo" + obj[0] + "Pressed.png") if obj in gcustomheadMesh: obj = obj.split('_lod' + sceneLodN + '_mesh') cmds.symbolButton("g" + obj[0],edit=True,image=iconPath + "UIGeoCPressed.png") if obj in gbodyMesh: obj = obj.split('_lod' + scenebodyLodN + '_mesh') obj = obj[0].split(body_type + "_") cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeo" + obj[1] + "Pressed.png") if obj in gcustombodyMesh: obj = obj.split('_lod' + scenebodyLodN + '_mesh') obj = obj[0].split(body_type + "_") cmds.symbolButton("g" + obj[1],edit=True,image=iconPath + "UIGeoCPressed.png") def sceneRT(*args): checkSceneSel() selection_change_callback = cmds.scriptJob(event=["SelectionChanged", sceneRT]) def newScene(): if cmds.file(query=True, modified=True): result = cmds.confirmDialog( title="Save Changes?", message="Do you want to save changes to the current scene?", button=["Save", "Don't Save", "Cancel"], defaultButton="Save", cancelButton="Cancel", dismissString="Cancel" ) if result == "Save": # Save the current scene cmds.file(save=True, force=True) elif result == "Don't Save": # Discard changes and create a new scene cmds.file(new=True, force=True) else: # No unsaved changes, create a new scene directly cmds.file(new=True, force=True) leftPanelButtonV(0) def import_obj(): # Open the import dialog with a filter set to OBJ files file_path = cmds.fileDialog2(fileFilter="Obj (*.obj)", dialogStyle=2, fileMode=1) # Check if the user selected a file if file_path: # Import the selected OBJ file into Maya try: cmds.file(file_path[0], i=True, type="OBJ", rpr="auto") print("OBJ file imported successfully:", file_path[0]) except Exception as e: print("Error importing OBJ file:", str(e)) def export_fbx(): if cmds.objExists("DHIbody:root"): # Set the path and filename for the FBX file path = f"{ROOT_DIR}/output" filename = "body.fbx" filepath = path + "/" + filename cmds.select(clear=True) cmds.select("body_rig", add=True) cmds.select("DHIbody:root", add=True) # Export the selected objects as FBX cmds.file(filepath, force=True, options="groups=0;ptgroups=0;materials=0;smoothing=1;normals=1", type='FBX export', exportSelected=True) filename = "head.fbx" filepath = path + "/" + filename cmds.select("DHIbody:spine_04", hi=True) # Select "DHIbody:spine_04" and its children cmds.delete() # Delete the selected objects cmds.select("DHIbody:thigh_r", hi=True) # Select "DHIbody:spine_04" and its children cmds.delete() # Delete the selected objects cmds.select("DHIbody:thigh_l", hi=True) # Select "DHIbody:spine_04" and its children cmds.delete() # Delete the selected objects # Parent "DHIhead:spine_04" under "DHIbody:spine_03" cmds.parent("DHIhead:spine_04", "DHIbody:spine_03") # Print the new parent of "DHIhead:spine_04" print(cmds.listRelatives("DHIhead:spine_04", parent=True)) cmds.select(clear=True) cmds.select("head_grp", add=True) cmds.select("DHIbody:root", add=True) # Export the selected objects as FBX cmds.file(filepath, force=True, options="groups=0;ptgroups=0;materials=0;smoothing=1;normals=1", type='FBX export', exportSelected=True) cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() cmds.undo() else: raise ValueError("Process is not finished! Body is missing") def unlock(): if cmds.objExists("body_gen_node") or cmds.objExists("root_drv"): gbodyMesh = [body_type + "_body_lod" + scenebodyLodN + '_mesh',body_type + "_combined_lod" + scenebodyLodN + '_mesh',body_type + "_flipflops_lod" + scenebodyLodN + '_mesh'] for obj in gbodyMesh: if cmds.objExists(obj): for attr in ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"]: cmds.setAttr(obj + "." + attr, lock=False) else: cmds.select("spine_04", hierarchy=True) selected_objects = cmds.ls(selection=True) gheadMesh = ['head_lod' + sceneLodN + '_mesh', 'teeth_lod' + sceneLodN + '_mesh', 'saliva_lod' + sceneLodN + '_mesh', 'eyeLeft_lod' + sceneLodN + '_mesh', 'eyeshell_lod' + sceneLodN + '_mesh', 'eyelashes_lod' + sceneLodN + '_mesh', 'eyeEdge_lod' + sceneLodN + '_mesh', 'cartilage_lod' + sceneLodN + '_mesh', 'eyeRight_lod' + sceneLodN + '_mesh'] for obj in selected_objects: if cmds.attributeQuery("radius", node=obj, exists=True): cmds.setAttr(obj + ".radius", 0.1) for obj in gheadMesh: if cmds.objExists(obj): for attr in ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"]: cmds.setAttr(obj + "." + attr, lock=False) cmds.select(clear=True) def headPanel(State): imagepath=iconPath + "JointButton.png" #LEFT BUTTONS cmds.image("im4",edit=True,visible=State) ebutTop = 325 ebutL = 157 ebutR = 50 ebutSpace=12 ebutWSpa=12 mbutTop = ebutTop + 105 mbutR = 92 mbutSpace=12 mbutWSpa=12 eyeList = ["", "CornerOuter", "CornerInner"] mouthList = ["R", "L", "C"] mouthSymList = ["UpperOuter", "Corner", "LowerOuter"] propers = ["Upper","Lower", "A", "B"] for i in range(3): for y in range(2): cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[3] + str(i+1), edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[2] + str(i+1), edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[2] + str(i+1), edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[3] + str(i+1), edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eye" + eyeList[i], edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Lip" + mouthSymList[i], edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[i] + "_LipUpper", edit=True, image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[i] + "_LipLower", edit=True, image=imagepath,visible=State) bodyParent =0 headSelJ = ["FACIAL_C_Jaw", "FACIAL_C_TeethUpper", "FACIAL_C_TeethLower", "neck_02", "head"] for i in range(len(headSelJ)): cmds.symbolButton(headSelJ[i], edit=True,visible=State) titleName = ["RIGHT EYE", "LEFT EYE", "MOUTH"] for i in range(3): cmds.text("title" + str(i+1), label= titleName[i], edit=True, p="formLay2",visible=State) cmds.formLayout( "formLay2", edit=True, attachForm=[("FACIAL_R_EyelidUpperB3", 'top', ebutTop), ("FACIAL_R_EyelidUpperB3", 'left', ebutR),("FACIAL_R_EyelidUpperB2", 'top', ebutTop), ("FACIAL_R_EyelidUpperB2", 'left', ebutR+ebutSpace),("FACIAL_R_EyelidUpperB1", 'top', ebutTop), ("FACIAL_R_EyelidUpperB1", 'left',ebutR+2*ebutSpace),("FACIAL_R_EyelidUpperA3", 'top', ebutTop+ebutWSpa), ("FACIAL_R_EyelidUpperA3", 'left', ebutR),("FACIAL_R_EyelidUpperA2", 'top', ebutTop+ebutWSpa), ("FACIAL_R_EyelidUpperA2", 'left', ebutR+ebutSpace),("FACIAL_R_EyelidUpperA1", 'top', ebutTop+ebutWSpa), ("FACIAL_R_EyelidUpperA1", 'left',ebutR+2*ebutSpace), ("FACIAL_R_EyelidLowerA3", 'top', ebutTop+4*ebutWSpa), ("FACIAL_R_EyelidLowerA3", 'left', ebutR),("FACIAL_R_EyelidLowerA2", 'top', ebutTop+4*ebutWSpa), ("FACIAL_R_EyelidLowerA2", 'left', ebutR+ebutSpace),("FACIAL_R_EyelidLowerA1", 'top', ebutTop+4*ebutWSpa), ("FACIAL_R_EyelidLowerA1", 'left',ebutR+2*ebutSpace),("FACIAL_R_EyelidLowerB3", 'top', ebutTop+5*ebutWSpa), ("FACIAL_R_EyelidLowerB3", 'left', ebutR),("FACIAL_R_EyelidLowerB2", 'top', ebutTop+5*ebutWSpa), ("FACIAL_R_EyelidLowerB2", 'left', ebutR+ebutSpace),("FACIAL_R_EyelidLowerB1", 'top', ebutTop+5*ebutWSpa), ("FACIAL_R_EyelidLowerB1", 'left',ebutR+2*ebutSpace), ("FACIAL_L_EyelidUpperB1", 'top', ebutTop), ("FACIAL_L_EyelidUpperB1", 'left', ebutL),("FACIAL_L_EyelidUpperB2", 'top', ebutTop), ("FACIAL_L_EyelidUpperB2", 'left', ebutL+ebutSpace),("FACIAL_L_EyelidUpperB3", 'top', ebutTop), ("FACIAL_L_EyelidUpperB3", 'left',ebutL+2*ebutSpace),("FACIAL_L_EyelidUpperA1", 'top', ebutTop+ebutWSpa), ("FACIAL_L_EyelidUpperA1", 'left', ebutL),("FACIAL_L_EyelidUpperA2", 'top', ebutTop+ebutWSpa), ("FACIAL_L_EyelidUpperA2", 'left', ebutL+ebutSpace),("FACIAL_L_EyelidUpperA3", 'top', ebutTop+ebutWSpa), ("FACIAL_L_EyelidUpperA3", 'left',ebutL+2*ebutSpace), ("FACIAL_L_EyelidLowerA1", 'top', ebutTop+4*ebutWSpa), ("FACIAL_L_EyelidLowerA1", 'left', ebutL),("FACIAL_L_EyelidLowerA2", 'top', ebutTop+4*ebutWSpa), ("FACIAL_L_EyelidLowerA2", 'left', ebutL+ebutSpace),("FACIAL_L_EyelidLowerA3", 'top', ebutTop+4*ebutWSpa), ("FACIAL_L_EyelidLowerA3", 'left',ebutL+2*ebutSpace),("FACIAL_L_EyelidLowerB1", 'top', ebutTop+5*ebutWSpa), ("FACIAL_L_EyelidLowerB1", 'left', ebutL),("FACIAL_L_EyelidLowerB2", 'top', ebutTop+5*ebutWSpa), ("FACIAL_L_EyelidLowerB2", 'left', ebutL+ebutSpace),("FACIAL_L_EyelidLowerB3", 'top', ebutTop+5*ebutWSpa), ("FACIAL_L_EyelidLowerB3", 'left',ebutL+2*ebutSpace), ("FACIAL_R_EyeCornerOuter", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_R_EyeCornerOuter", 'left', ebutR-ebutSpace),("FACIAL_R_Eye", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_R_Eye", 'left', ebutR+ebutSpace),("FACIAL_R_EyeCornerInner", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_R_EyeCornerInner", 'left', ebutR+3*ebutSpace), ("FACIAL_L_EyeCornerInner", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_L_EyeCornerInner", 'left', ebutL-ebutSpace),("FACIAL_L_Eye", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_L_Eye", 'left', ebutL+ebutSpace),("FACIAL_L_EyeCornerOuter", 'top', ebutTop+2.5*ebutWSpa), ("FACIAL_L_EyeCornerOuter", 'left', ebutL+3*ebutSpace), ("FACIAL_R_LipUpperOuter", 'top', mbutTop), ("FACIAL_R_LipUpperOuter", 'left', mbutR),("FACIAL_R_LipUpper", 'top', mbutTop), ("FACIAL_R_LipUpper", 'left', mbutR+ebutSpace),("FACIAL_C_LipUpper", 'top', mbutTop), ("FACIAL_C_LipUpper", 'left',mbutR+2*mbutSpace),("FACIAL_L_LipUpper", 'top', mbutTop), ("FACIAL_L_LipUpper", 'left', mbutR+3*mbutSpace),("FACIAL_L_LipUpperOuter", 'top', mbutTop), ("FACIAL_L_LipUpperOuter", 'left', mbutR+4*mbutSpace),("FACIAL_R_LipCorner", 'top', mbutTop+0.5*mbutWSpa), ("FACIAL_R_LipCorner", 'left',mbutR-mbutSpace), ("FACIAL_R_LipLowerOuter", 'top', mbutTop+mbutWSpa), ("FACIAL_R_LipLowerOuter", 'left', mbutR),("FACIAL_R_LipLower", 'top', mbutTop+mbutWSpa), ("FACIAL_R_LipLower", 'left', mbutR+ebutSpace),("FACIAL_C_LipLower", 'top', mbutTop+mbutWSpa), ("FACIAL_C_LipLower", 'left',mbutR+2*mbutSpace),("FACIAL_L_LipLower", 'top', mbutTop+mbutWSpa), ("FACIAL_L_LipLower", 'left', mbutR+3*mbutSpace),("FACIAL_L_LipLowerOuter", 'top', mbutTop+mbutWSpa), ("FACIAL_L_LipLowerOuter", 'left', mbutR+4*mbutSpace),("FACIAL_L_LipCorner", 'top', mbutTop+0.5*mbutWSpa), ("FACIAL_L_LipCorner", 'left',mbutR+5*mbutSpace), ("FACIAL_C_Jaw", 'top', bodyParent+117),("FACIAL_C_Jaw", 'left', 97),("FACIAL_C_TeethUpper", 'top', bodyParent+122), ("FACIAL_C_TeethUpper", 'left', 62),("FACIAL_C_TeethLower", 'top', bodyParent+138), ("FACIAL_C_TeethLower", 'left', 67), ("neck_02", 'top', bodyParent+167), ("neck_02", 'left', 127),("head", 'top', bodyParent+67),("head", 'left', bodyParent+127), ("title1", 'top', ebutTop-35), ("title1", 'left', 41),("title2", 'top', ebutTop-35), ("title2", 'left', 153),("title3", 'top', mbutTop-35), ("title3", 'left', 100)]) bodyParent=0 geoTop=515 geoLeft=20 geoSpace=20 geoLSpace=109 cgeoLeft=10 gheadMesh = ["head","teeth","saliva","eyeLeft","eyeshell","eyelashes","eyeEdge","cartilage","eyeRight", "all"] for i in range(len(gheadMesh)): cmds.symbolButton("g" + gheadMesh[i],edit=True,command=lambda x, i=i:meshSelC(gheadMesh[i],0),visible=State) cmds.symbolButton("g" + "custom_" + gheadMesh[i],edit=True,command=lambda x, i=i:meshSelC("custom_" + gheadMesh[i],0), visible=State) cmds.symbolButton("gall",edit=True,command=lambda x: selectAllGeo(0)) cmds.symbolButton("gcustom_all",edit=True,command=lambda x: selectAllGeo(1)) lodTop=675 lodLeft=20 lodSpace=25 for i in range(8): cmds.text("t" + str(i),edit=True, visible=State) if i == 0: cmds.symbolButton("lod" + str(i),edit=True, image=iconPath + "UIButtonEmptySRT.png", visible=State) else: cmds.symbolButton("lod" + str(i),edit=True, image=iconPath + "UIButtonEmptySRTPressed.png", visible=State) lodtL=10 lodtT=-20 cmds.canvas("c1", edit=True, visible=State) cmds.canvas("c2", edit=True, visible=State) cmds.formLayout( "formLay2", edit=True,visible=True, attachForm=[("c1", 'top',bodyParent+483), ("c1", 'left', 20),("c2", 'top',bodyParent+690), ("c2", 'left', 20), ("ghead", 'top', geoTop), ("ghead", 'left', geoLeft),("gteeth", 'top', geoTop+geoSpace), ("gteeth", 'left', geoLeft),("gsaliva", 'top', geoTop+2*geoSpace), ("gsaliva", 'left', geoLeft),("geyeLeft", 'top', geoTop+3*geoSpace), ("geyeLeft", 'left', geoLeft), ("geyeshell", 'top', geoTop), ("geyeshell", 'left', geoLeft+geoLSpace),("geyelashes", 'top', geoTop+geoSpace), ("geyelashes", 'left', geoLeft+geoLSpace),("geyeEdge", 'top', geoTop+2*geoSpace), ("geyeEdge", 'left', geoLeft+geoLSpace),("gcartilage", 'top', geoTop+3*geoSpace), ("gcartilage", 'left', geoLeft+geoLSpace), ("geyeRight", 'top', geoTop+4*geoSpace), ("geyeRight", 'left', geoLeft), ("gall", 'top', geoTop+4*geoSpace), ("gall", 'left', geoLeft +geoLSpace), ("gcustom_head", 'top', geoTop), ("gcustom_head", 'left', cgeoLeft),("gcustom_teeth", 'top', geoTop+geoSpace), ("gcustom_teeth", 'left', cgeoLeft),("gcustom_saliva", 'top', geoTop+2*geoSpace), ("gcustom_saliva", 'left', cgeoLeft),("gcustom_eyeLeft", 'top', geoTop+3*geoSpace), ("gcustom_eyeLeft", 'left', cgeoLeft), ("gcustom_eyeshell", 'top', geoTop), ("gcustom_eyeshell", 'left', cgeoLeft+geoLSpace),("gcustom_eyelashes", 'top', geoTop+geoSpace), ("gcustom_eyelashes", 'left', cgeoLeft+geoLSpace),("gcustom_eyeEdge", 'top', geoTop+2*geoSpace), ("gcustom_eyeEdge", 'left', cgeoLeft+geoLSpace),("gcustom_cartilage", 'top', geoTop+3*geoSpace), ("gcustom_cartilage", 'left', cgeoLeft+geoLSpace), ("gcustom_eyeRight", 'top', geoTop+4*geoSpace), ("gcustom_eyeRight", 'left', cgeoLeft), ("gcustom_all", 'top', geoTop+4*geoSpace), ("gcustom_all", 'left', cgeoLeft +geoLSpace)]) def bodyPanel(State): #LEFT BUTTONS bodyParent=0 cmds.image("im2",edit=True,image=iconPath + "UIBODY.png",visible=State) cmds.image("im3",edit=True,image=iconPath + "UIHAND.png",visible=State) jointButs=["pelvis", "spine_01", "spine_02", "spine_03", "spine_04", "spine_05", "neck_02", "head", "clavicle_r", "clavicle_l", "thigh_r", "thigh_l", "calf_r", "calf_l", "foot_r", "foot_l", "upperarm_r", "upperarm_l", "lowerarm_r", "lowerarm_l", "hand_r", "hand_l", "root"] for i in range(len(jointButs)): cmds.symbolButton(jointButs[i], edit=True,visible=State) cmds.canvas("c1", edit=True, visible=State) cmds.canvas("c2", edit=True, visible=State) geoTop=532 geoLeft=20 geoSpace=20 geoLSpace=109 cgeoLeft=10 gheadMesh = ["body","combined","flipflops", "all"] for i in range(len(gheadMesh)): cmds.symbolButton("g" + gheadMesh[i],edit=True,command=lambda x, i=i:meshSelC(gheadMesh[i],1),visible=State) cmds.symbolButton("g" + "custom_" + gheadMesh[i],edit=True,command=lambda x, i=i:meshSelC("custom_" + gheadMesh[i],1),visible=State) cmds.symbolButton("gall",edit=True,command=lambda x: selectAllGeo(2)) cmds.symbolButton("gcustom_all",edit=True,command=lambda x: selectAllGeo(3)) lodTop=675 lodLeft=20 lodSpace=25 for i in range(8): cmds.text("t" + str(i),edit=True, visible=State) if i == 0: cmds.symbolButton("lod" + str(i),edit=True, image=iconPath + "UIButtonEmptySRT.png", visible=State) else: cmds.symbolButton("lod" + str(i),edit=True, image=iconPath + "UIButtonEmptySRTPressed.png", visible=State) lodtL=10 lodtT=-20 cmds.formLayout( "formLay2", edit=True,visible=True, attachForm=[("im2", 'top', bodyParent+20), ("im2", 'left', 9),("im3", 'top', bodyParent+385), ("im3", 'left', 25), ("pelvis", 'top', bodyParent+187), ("pelvis", 'left', 117),("spine_01", 'top', bodyParent+167), ("spine_01", 'left', 117),("spine_02", 'top', bodyParent+147), ("spine_02", 'left', 117),("spine_03", 'top', bodyParent+127), ("spine_03", 'left', 117),("spine_04", 'top', bodyParent+107), ("spine_04", 'left', 117),("spine_05", 'top', bodyParent+87), ("spine_05", 'left', 117), ("neck_02", 'top', bodyParent+67), ("neck_02", 'left', 117),("head", 'top', bodyParent+47), ("head", 'left', 117),("clavicle_r", 'top', bodyParent+117), ("clavicle_r", 'left', 100),("clavicle_l", 'top', bodyParent+117), ("clavicle_l", 'left', 134), ("thigh_r", 'top', bodyParent+202), ("thigh_r", 'left', 100),("thigh_l", 'top', bodyParent+202), ("thigh_l", 'left', 134), ("calf_r", 'top', bodyParent+257), ("calf_r", 'left', 97),("calf_l", 'top', bodyParent+257), ("calf_l", 'left', 137),("foot_r", 'top', bodyParent+332), ("foot_r", 'left', 92),("foot_l", 'top', bodyParent+332), ("foot_l", 'left', 142),("upperarm_r", 'top', bodyParent+107), ("upperarm_r", 'left', 79),("upperarm_l", 'top', bodyParent+107), ("upperarm_l", 'left', 155), ("lowerarm_r", 'top', bodyParent+142), ("lowerarm_r", 'left', 54),("lowerarm_l", 'top', bodyParent+142), ("lowerarm_l", 'left', 180),("hand_r", 'top', bodyParent+172), ("hand_r", 'left', 35),("hand_l", 'top', bodyParent+172), ("hand_l", 'left', 200), ("root", 'top', bodyParent+347), ("root", 'left', 117), ("c1", 'top',bodyParent+510), ("c1", 'left', 20),("c2", 'top',bodyParent+690), ("c2", 'left', 20), ("gbody", 'top', geoTop), ("gbody", 'left', geoLeft),("gcombined", 'top', geoTop+geoSpace), ("gcombined", 'left', geoLeft),("gflipflops", 'top', geoTop+2*geoSpace), ("gflipflops", 'left', geoLeft), ("gall", 'top', geoTop+3*geoSpace), ("gall", 'left', geoLeft), ("gcustom_body", 'top', geoTop), ("gcustom_body", 'left', cgeoLeft),("gcustom_combined", 'top', geoTop+geoSpace), ("gcustom_combined", 'left', cgeoLeft),("gcustom_flipflops", 'top', geoTop+2*geoSpace), ("gcustom_flipflops", 'left', cgeoLeft), ("gcustom_all", 'top', geoTop+3*geoSpace), ("gcustom_all", 'left', cgeoLeft),]) hrIndexPos =[450,72] hlIndexPos =[450,167] hrjointButs=["index_0", "middle_0", "ring_0", "pinky_0", "thumb_0"] direx = ["r", "l"] for i in range(len(hrjointButs)): for y in range(3): for z in range(2): cmds.symbolButton(hrjointButs[i] + str(y+1) + "_" + direx[z], edit=True, command=lambda x, i=i,y=y,z=z:meshSelC(hrjointButs[i] + str(y+1) + "_" + direx[z],2), image=iconPath + "JointButtonH.png", visible=State) cmds.formLayout( "formLay2", edit=True, attachForm=[("index_01_r", 'top', hrIndexPos[0]), ("index_01_r", 'left', hrIndexPos[1]+2),("middle_01_r", 'top', hrIndexPos[0]+5), ("middle_01_r", 'left', hrIndexPos[1]-12),("ring_01_r", 'top', hrIndexPos[0]), ("ring_01_r", 'left', hrIndexPos[1]-22),("pinky_01_r", 'top', hrIndexPos[0]-8), ("pinky_01_r", 'left', hrIndexPos[1]-30),("thumb_01_r", 'top', hrIndexPos[0]-22), ("thumb_01_r", 'left', hrIndexPos[1]+12), ("index_02_r", 'top', hrIndexPos[0]+20), ("index_02_r", 'left', hrIndexPos[1]+5),("middle_02_r", 'top', hrIndexPos[0]+25), ("middle_02_r", 'left', hrIndexPos[1]-15),("ring_02_r", 'top', hrIndexPos[0]+18), ("ring_02_r", 'left', hrIndexPos[1]-30),("pinky_02_r", 'top', hrIndexPos[0]+2), ("pinky_02_r", 'left', hrIndexPos[1]-40),("thumb_02_r", 'top', hrIndexPos[0]-12), ("thumb_02_r", 'left', hrIndexPos[1]+26), ("index_03_r", 'top', hrIndexPos[0]+40), ("index_03_r", 'left', hrIndexPos[1]+10),("middle_03_r", 'top', hrIndexPos[0]+42), ("middle_03_r", 'left', hrIndexPos[1]-20),("ring_03_r", 'top', hrIndexPos[0]+32), ("ring_03_r", 'left', hrIndexPos[1]-36),("pinky_03_r", 'top', hrIndexPos[0]+12), ("pinky_03_r", 'left', hrIndexPos[1]-49),("thumb_03_r", 'top', hrIndexPos[0]-8), ("thumb_03_r", 'left', hrIndexPos[1]+39)]) cmds.formLayout( "formLay2", edit=True, attachForm=[("index_01_l", 'top', hlIndexPos[0]), ("index_01_l", 'left', hlIndexPos[1]-2),("middle_01_l", 'top', hlIndexPos[0]+5), ("middle_01_l", 'left', hlIndexPos[1]+12),("ring_01_l", 'top', hlIndexPos[0]), ("ring_01_l", 'left', hlIndexPos[1]+22),("pinky_01_l", 'top', hlIndexPos[0]-8), ("pinky_01_l", 'left', hlIndexPos[1]+30),("thumb_01_l", 'top', hlIndexPos[0]-22), ("thumb_01_l", 'left', hlIndexPos[1]-12), ("index_02_l", 'top', hlIndexPos[0]+20), ("index_02_l", 'left', hlIndexPos[1]-5),("middle_02_l", 'top', hlIndexPos[0]+25), ("middle_02_l", 'left', hlIndexPos[1]+15),("ring_02_l", 'top', hlIndexPos[0]+18), ("ring_02_l", 'left', hlIndexPos[1]+30),("pinky_02_l", 'top', hlIndexPos[0]+2), ("pinky_02_l", 'left', hlIndexPos[1]+40),("thumb_02_l", 'top', hlIndexPos[0]-12), ("thumb_02_l", 'left', hlIndexPos[1]-26), ("index_03_l", 'top', hlIndexPos[0]+40), ("index_03_l", 'left', hlIndexPos[1]-10),("middle_03_l", 'top', hlIndexPos[0]+42), ("middle_03_l", 'left', hlIndexPos[1]+20),("ring_03_l", 'top', hlIndexPos[0]+32), ("ring_03_l", 'left', hlIndexPos[1]+36),("pinky_03_l", 'top', hlIndexPos[0]+12), ("pinky_03_l", 'left', hlIndexPos[1]+49),("thumb_03_l", 'top', hlIndexPos[0]-8), ("thumb_03_l", 'left', hlIndexPos[1]-39)]) toggleCheck = 2 def togglePanel(): global toggleCheck if toggleCheck == 0: bodyPanel(False) headPanel(True) toggleCheck = 1 cmds.symbolButton("gcustom_all",edit=True, command=lambda x: selectAllGeo(1)) else: headPanel(False) bodyPanel(True) toggleCheck = 0 cmds.symbolButton("gcustom_all",edit=True, command=lambda x: selectAllGeo(3)) #LEFTPANELBUTTON def leftPanelButtonV(worldCheck): global toggleCheck imagepath=iconPath + "JointButton.png" worldCheck = 0 if cmds.objExists("spine_04") or cmds.objExists("OpenedDNAInfoNode"): worldCheck = 1 if cmds.objExists("LoadedDNAInfoNode"): worldCheck = 2 if cmds.objExists ("rl4Embedded_Archetype") or cmds.objExists ("rl4Embedded_Archtype"): worldCheck = 3 if cmds.objExists ("DHIhead:spine_04"): worldCheck = 4 if cmds.objExists("body_gen_node") or cmds.objExists("root_drv"): worldCheck = 5 if cmds.objExists("FixBodyInfoNode"): worldCheck = 6 #OPEN DNA if worldCheck==0: toggleCheck = 2 headPanel(False) bodyPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=80 for i in range(10): if i == 0: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [1,2,9]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,4,5,6,7,8]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout( "formLay", edit=True, attachForm=[("b10", 'top', butTop + 3*butH+offsetTop), ("b10", 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=False) cmds.symbolButton("Toggle", edit=True, enable=False) #LOAD DNA if worldCheck==1: toggleCheck = 2 headPanel(False) bodyPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=80 for i in range(10): if i in [0,1]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [2,9]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,4,5,6,7,8]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout( "formLay", edit=True, attachForm=[("b10", 'top', butTop + 3*butH+offsetTop), ("b10", 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=False) cmds.symbolButton("Toggle", edit=True, enable=False) #MODIFICATIONS if worldCheck==2: toggleCheck = 0 bodyPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=80 for i in range(10): if i in [2,9]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [0,1]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,4,5,6,7,8]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout( "formLay", edit=True, attachForm=[("b10", 'top', butTop + 3*butH+offsetTop), ("b10", 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=True) headPanel(True) #cmds.symbolButton("Toggle", edit=True, enable=False) #PREPARE TO EXPORT if worldCheck==3: toggleCheck = 2 headPanel(False) bodyPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=-80 for i in range(10): if i in [3,9]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [4,5,6,7,8]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [0,1,2]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=False) cmds.symbolButton("Toggle", edit=True, enable=False) #LOAD BODY if worldCheck==4: toggleCheck = 2 headPanel(False) bodyPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=-80 for i in range(10): if i in [4,9]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,5,6,7,8]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [0,1,2]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=False) cmds.symbolButton("Toggle", edit=True, enable=False) #BODY MODIFICATIONS if worldCheck==5: toggleCheck = 1 headPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=-80 for i in range(10): if i in [5,7,8,9]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,4,6]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [0,1,2]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=True) bodyPanel(True) cmds.symbolButton("Toggle", edit=True, enable=True) #FIXED BODY END if worldCheck==6: toggleCheck = 1 headPanel(False) #RIGHT BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=-80 for i in range(10): if i in [5,6,7,8,9]: StateVis = True StateEnab = True cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [3,4]: StateVis = True StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) if i in [0,1,2]: StateVis = False StateEnab = False cmds.symbolButton("b" + str(i+1), edit=True, image=iconPath + "UIButton" + str(i+1) + ".png", visible=StateVis ,enable=StateEnab) cmds.formLayout( "formLay", edit=True, attachForm=[("b" + str(i+1), 'top', butTop+i*butH+offsetTop), ("b" + str(i+1), 'left', butW)]) cmds.formLayout("formLay2", edit=True,visible=True) bodyPanel(True) cmds.symbolButton("Toggle", edit=True, enable=True) def yzUP(): # Get the current up axis from the preferences up_axis = cmds.upAxis(q=True, axis=True) # Toggle the up axis based on the current value if up_axis == 'y': cmds.upAxis(axis='z') final_up_axis = 'z' cmds.symbolButton("yUP", edit=True,image=iconPath + "Zup.png") else: cmds.upAxis(axis='y') final_up_axis = 'y' cmds.symbolButton("yUP",edit=True,image=iconPath + "Yup.png") # Print the final up axis print("Final up axis:", final_up_axis) def centerF(): selected_objects = cmds.ls(selection=True) for obj in selected_objects: if cmds.objExists(obj): cmds.xform(obj, translation=[0, 0, 0], worldSpace=True) def freezeF(): selected_objects = cmds.ls(selection=True) for obj in selected_objects: if cmds.objExists(obj): cmds.makeIdentity(obj, apply=True, t=1, r=1, s=1) def unlockF(): selected_objects = cmds.ls(selection=True) for obj in selected_objects: if cmds.objExists(obj): for attr in ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"]: cmds.setAttr(obj + "." + attr, lock=False) def lodLayerC(lodN): for i in range(8): cmds.symbolButton("lod"+str(i), edit=True, image=iconPath + "UIButtonEmptySRTPressed.png") cmds.setAttr("head_lod"+str(i)+"_layer" + ".visibility", False) if cmds.objExists("root_drv"): cmds.setAttr("body_lod"+str(i//2)+"_layer" + ".visibility", False) cmds.symbolButton("lod"+str(lodN), edit=True, image=iconPath + "UIButtonEmptySRT.png") cmds.setAttr("head_lod"+str(lodN)+"_layer" + ".visibility", True) if cmds.objExists("root_drv"): cmds.setAttr("body_lod"+str(lodN//2)+"_layer" + ".visibility", True) global sceneLodN sceneLodN = str(lodN) global scenebodyLodN scenebodyLodN = str(lodN//2) cmds.symbolButton("gcustom_all",edit=True,enable=False, visible=True) checkSceneSel() def codeblock (dnaPath, ROOT_DIR, CHARACTER_NAME, MAIN_PATH, body_type): #DATAS DNA output_file_path = os.path.join(f"{ROOT_DIR}/examples", "datas_dna.py") with open(f"{ROOT_DIR}/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py") as file: lines_all = file.readlines() lines = lines_all[43:204] lineslists = lines_all[217:220] linesload = lines_all[220:226] lines2 = lines_all[232:247] lines3 = lines_all[232:246] defload = ["def load_dna_data():\n"] defsave = ["def save_dna_data():\n"] defsaveraw = ["def save_dna_data_raw():\n"] lines = [line.replace('f"{ospath.dirname(ospath.abspath(__file__))}/..".replace("\\\\", "/")','"'+ROOT_DIR+'"') for line in lines] lines = [line.replace('f"{DNA_DIR}/{CHARACTER_NAME}.dna"', '"'+dnaPath+'"') for line in lines] lines = [line.replace('"Ada"','"'+CHARACTER_NAME+'"') for line in lines] linesload = [" " + line for line in linesload] lines2 = [" " + line for line in lines2] lines3 = [" " + line for line in lines3] code_block = ''.join(lines + lineslists + defload + linesload + defsave + lines2 + defsaveraw + lines3) with open(output_file_path, "w") as output_file: output_file.write(code_block) #DAT FILE file_path = os.path.join("c:/Arts and Spells/Scripts", "dat.py") tRoot = ["ROOT_DIR = " + '"' +ROOT_DIR+ '"' + "\n"] tMain = ["MAIN_PATH = " + '"' +MAIN_PATH+ '"' + "\n"] tDNA = ["dnaPath= " + '"' +dnaPath+ '"' + "\n"] tBody = ["body_type = " + '"' +body_type+ '"' + "\n"] tVer = ["MAYA_VERSION = " + '"' + str(MAYA_VERSION) + '"' + "\n"] dat_code_block = ''.join(tRoot + tMain + tDNA + tBody + tVer) directory = 'c:/Arts and Spells/Scripts' if not os.path.exists(directory): os.makedirs(directory) with open(file_path, "w") as datfile: datfile.write(dat_code_block) def savePref(textdnaPath, textROOT_DIR, textMAIN_PATH, textbody_type): global body_type global ROOT_DIR global MAIN_PATH global dnaPath character_dna = cmds.textField(textdnaPath, q=True, text=True) ROOT_DIR = cmds.textField(textROOT_DIR, q=True, text=True) MAIN_PATH = cmds.textField(textMAIN_PATH, q=True, text=True) body_type = cmds.textField(textbody_type, q=True, text=True) CHARACTER_DNA = ospath.abspath(character_dna) CHARACTER_DNA = CHARACTER_DNA.replace("\\", "/") CHARACTER_NAME = os.path.basename(CHARACTER_DNA).split(".")[0] chX=2 file_path = os.path.join("c:/Arts and Spells/Scripts", "dat.py") if os.path.exists(file_path): chX=0 else: chX=1 print(f"New DNA_DIR: {CHARACTER_DNA}") print(f"New DNA_Name: {CHARACTER_NAME}") print(f"New Body_Type: {body_type}") codeblock (CHARACTER_DNA, ROOT_DIR, CHARACTER_NAME, MAIN_PATH, body_type) if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type if chX==1: if cmds.window("prefWindow", exists=True): cmds.deleteUI("prefWindow", window=True) mFree_window() else: if cmds.window("prefWindow", exists=True): cmds.deleteUI("prefWindow", window=True) def prefUI(dnaPath, ROOT_DIR, MAIN_PATH, body_type): heightSpa=20 heightField=25 file_path = "c:/Arts and Spells/Scripts" + "/dat.py" if os.path.exists(file_path): import dat importlib.reload(dat) ROOT_DIR = dat.ROOT_DIR MAIN_PATH = dat.MAIN_PATH dnaPath = dat.dnaPath body_type = dat.body_type if cmds.window("prefWindow", exists=True): cmds.deleteUI("prefWindow", window=True) cmds.window("prefWindow", title="Metapipe Preferences", widthHeight=(200, 100), bgc=(0.3,0.3,0.3),resizeToFitChildren=True,sizeable=False) cmds.columnLayout(adjustableColumn=True) cmds.text(label="",height=25) cmds.text(label="DNA CALIBRATION PATH:",height=30, font="boldLabelFont") textROOT_DIR = cmds.textField(text=ROOT_DIR, bgc=(0.2,0.2,0.2), height=heightField) cmds.text(label="",height=heightSpa) cmds.text(label="METAPIPE FILES PATH:",height=30, font="boldLabelFont") textMAIN_PATH = cmds.textField(text=MAIN_PATH, bgc=(0.2,0.2,0.2),height=heightField) cmds.text(label="",height=heightSpa) cmds.text(label="METAHUMAN DNA FILE PATH:",height=30, font="boldLabelFont") textdnaPath = cmds.textField(text=dnaPath, bgc=(0.2,0.2,0.2),height=heightField) cmds.text(label="",height=heightSpa) cmds.text(label="METAHUMAN BODY TYPE:",height=30, font="boldLabelFont") textbody_type = cmds.textField(text=body_type, bgc=(0.2,0.2,0.2),height=heightField) cmds.text(label="",height=heightSpa) cmds.rowLayout(numberOfColumns=2, columnWidth2=(250, 200)) cmds.button(label="SAVE", command=lambda x: savePref(textdnaPath, textROOT_DIR, textMAIN_PATH, textbody_type)) cmds.button(label="Cancel", command=lambda x: cmds.deleteUI("prefWindow", window=True)) cmds.showWindow("prefWindow") def mFree_window(): # Create window window_name = "MetaPipe" if cmds.window(window_name, exists=True): cmds.deleteUI(window_name) cmds.window(window_name, title=window_name, width=1360, height=768, sizeable=True, resizeToFitChildren=True, menuBar=False, tlc=(0, 0), tb=False, tbm=False) layout = cmds.formLayout(bgc=(0,0,0)) cmds.image(image=iconPath + "UICover.png", p=layout) cmds.showWindow() mFree_window() time.sleep (1) def mFree_window(): #WINDOW window_name = "MetaPipe" if cmds.window(window_name, exists=True): cmds.deleteUI(window_name) cmds.window(window_name, title=window_name, wh=(1368, 768), sizeable=True, resizeToFitChildren=True, menuBar=False, tlc=(0, 0)) color = (0.135135, 0.360326, 0.715) backGr = (0.08, 0.08, 0.08) buttonColor = (0.25, 0.25, 0.25) layout = cmds.paneLayout(bgc=backGr, cn="quad", ps=[[1, 83,95], [2, 17, 95], [3, 1,5]], st=5) layout2 = cmds.paneLayout(bgc=backGr, cn="vertical2", ps=[[1, 20, 1], [2, 80, 1]], st=5, p=layout) formLay = cmds.formLayout("formLay", w=240, p=layout2) #LEFT PANEL #SETTINGS settings=cmds.symbolButton("settings",image=iconPath + "UISettings.png") cmds.popupMenu(parent="settings", button=1, mm=1) cmds.menuItem(label="New", command=lambda x:newScene()) cmds.menuItem(label="Starter Scene", command=lambda x:loadScene("Custom Head")) cmds.menuItem(label="Recent Scene", command=lambda x:loadScene("Checkpoint")) cmds.menuItem(label="Save Scene", command=lambda x:saveScene()) cmds.menuItem(label="Import...", command=lambda x:import_obj()) cmds.menuItem(label="Export", command=lambda x:export_fbx()) cmds.menuItem(label="Shape Editor", command=lambda x:shapeEdit()) cmds.menuItem(label="Selection Panel", command=lambda x:cmds.formLayout( formLay2, edit=True,visible = True)) cmds.menuItem(label="Preferences", command=lambda x:prefUI(dnaPath, ROOT_DIR, MAIN_PATH, body_type)) im1 = cmds.image(image=iconPath + "UI LOGO.png") #TOP yUP=cmds.symbolButton("yUP", command=lambda x: yzUP(),image=iconPath + "yUP.png") center0=cmds.symbolButton("center0", command=lambda x: centerF(),image=iconPath + "center.png") freeze0=cmds.symbolButton("freeze0", command=lambda x: freezeF(),image=iconPath + "freeze.png") unlock0=cmds.symbolButton("unlock0", command=lambda x: unlockF(),image=iconPath + "unlock.png") #BUTTONS butTop = 250 butH = 41 butW=44 offsetTop=0 b1=cmds.symbolButton("b1", command=lambda x: buildDNA("free"),image=iconPath + "UIButton1Pressed.png",enable=False) b2=cmds.symbolButton("b2",command=lambda x: loadDNA(), image=iconPath + "UIButton2Pressed.png", enable=False) b3=cmds.symbolButton("b3",command=lambda x: saveDNA(), image=iconPath + "UIButton3Pressed.png", enable=False) b4=cmds.symbolButton("b4",command=lambda x: prepare_export(), image=iconPath + "UIButton4Pressed.png", enable=False) b5=cmds.symbolButton("b5",command=lambda x: build_body(), image=iconPath + "UIButton5Pressed.png", enable=False) b8=cmds.symbolButton("b6",command=lambda x: fixbody(), image=iconPath + "UIButton6Pressed.png", enable=False) b9=cmds.symbolButton("b7",command=lambda x: connect_body(), image=iconPath + "UIButton7Pressed.png", enable=False) b6=cmds.symbolButton("b8",command=lambda x: bindSkinC(), image=iconPath + "UIButton8Pressed.png", enable=False) b7=cmds.symbolButton("b9",command=lambda x: copySkin(), image=iconPath + "UIButton9Pressed.png", enable=False) b10=cmds.symbolButton("b10",command=lambda x:findCustom(), image=iconPath + "UIButton10Pressed.png", enable=False) #MODIFY PANEL t1=cmds.text(label="MODIFY PANEL", height=30, font="boldLabelFont", p=formLay) #FORMLAY cmds.formLayout(formLay, edit=True, attachForm=[(t1, 'top', 695), (t1, 'left', 83), (im1, 'top', 20), (im1, 'left', 14), (settings, 'top', 15), (settings, 'left', 5),(yUP, 'top', 7), (yUP, 'left', 210), (center0, "top", 7), (center0, "left", 150), (freeze0, "top", 7), (freeze0, "left", 170), (unlock0, "top", 7), (unlock0, "left", 190)]) #MID PANEL 3D VIEWER panel_name = cmds.modelPanel(p=layout2) cmds.control(panel_name, edit=True) cmds.modelEditor(panel_name, edit=True, da="smoothShaded") cmds.grid(toggle=False) cmds.viewFit() #RIGHT PANEL bodyParent=0 formLay2 = cmds.formLayout("formLay2", w=240, p=layout) im2 = cmds.image("im2", image=iconPath + "UIBODY.png",visible=False) im3 = cmds.image("im3", image=iconPath + "UIHAND.png",visible=False) im4 = cmds.image("im4", image=iconPath + "UIHEAD.png",visible=False) cmds.symbolButton("Toggle", command=lambda x: togglePanel(), image=iconPath + "Toggle.png",visible=True) cmds.symbolButton("Close", command=lambda x: cmds.formLayout( formLay2, edit=True,visible = False), image=iconPath + "Close.png",visible=True) cmds.formLayout( formLay2, edit=True, attachForm=[("Toggle", 'top', 10), ("Toggle", 'left', 10),("Close", 'top', 10), ("Close", 'left', 210)]) #SKELETON HIERARCHY imagepath=iconPath + "JointButton.png" jointButs=["pelvis", "spine_01", "spine_02", "spine_03", "spine_04", "spine_05", "neck_02", "head", "clavicle_r", "clavicle_l", "thigh_r", "thigh_l", "calf_r", "calf_l", "foot_r", "foot_l", "upperarm_r", "upperarm_l", "lowerarm_r", "lowerarm_l", "hand_r", "hand_l", "FACIAL_C_Jaw", "FACIAL_C_TeethUpper", "FACIAL_C_TeethLower", "root"] for i in range(len(jointButs)): State=False cmds.symbolButton(jointButs[i], command=lambda x, i=i: jointSelectionC(jointButs[i]), image=imagepath,visible=State) #HANDS hrIndexPos =[450,72] hlIndexPos =[450,167] hrjointButs=["index_0", "middle_0", "ring_0", "pinky_0", "thumb_0"] direx = ["r", "l"] for i in range(len(hrjointButs)): for y in range(3): for z in range(2): cmds.symbolButton(hrjointButs[i] + str(y+1) + "_" + direx[z], visible=False) titleName = ["RIGHT EYE", "LEFT EYE", "MOUTH"] for i in range(3): cmds.text("title" + str(i+1), label= titleName[i],visible=State) #FACIAL / EYES / MOUTH ebutTop = 410 ebutL = 157 ebutR = 50 ebutSpace=12 ebutWSpa=12 mbutTop = 515 mbutR = 92 mbutSpace=12 mbutWSpa=12 eyeList = ["", "CornerOuter", "CornerInner"] mouthList = ["R", "L", "C"] mouthSymList = ["UpperOuter", "Corner", "LowerOuter"] propers = ["Upper","Lower", "A", "B"] for i in range(3): State=False for y in range(2): cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[3] + str(i+1), command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[3] + str(i+1)), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[2] + str(i+1), command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Eyelid" + propers[0] + propers[2] + str(i+1)), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[2] + str(i+1), command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[2] + str(i+1)), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[3] + str(i+1), command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Eyelid" + propers[1] + propers[3] + str(i+1)), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Eye" + eyeList[i], command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Eye" + eyeList[i]), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[y] + "_Lip" + mouthSymList[i], command=lambda x, y=y, i=i: jointSelectionC("FACIAL_" + mouthList[y] + "_Lip" + mouthSymList[i]), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[i] + "_LipUpper", command=lambda x, i=i: jointSelectionC("FACIAL_" + mouthList[i] + "_LipUpper"), image=imagepath,visible=State) cmds.symbolButton("FACIAL_" + mouthList[i] + "_LipLower", command=lambda x, i=i: jointSelectionC("FACIAL_" + mouthList[i] + "_LipLower"), image=imagepath,visible=State) #MESH SELECTION geoTop=562 geoLeft=20 geoSpace=20 geoLSpace=109 gheadMesh = ["head","teeth","saliva","eyeLeft","eyeshell","eyelashes","eyeEdge","cartilage","eyeRight", "all"] for i in range(len(gheadMesh)): State=False cmds.symbolButton("g" + gheadMesh[i],command=lambda x, i=i:meshSelC(gheadMesh[i],0),image=iconPath + "UIGeo" + gheadMesh[i] + ".png",visible=State) cmds.symbolButton("g" + "custom_" + gheadMesh[i],command=lambda x, i=i:meshSelC("custom_" + gheadMesh[i],0),image=iconPath + "UIGeoC.png",enable=False, visible=State) gheadMesh = ["body","combined","flipflops"] for i in range(len(gheadMesh)): State=False cmds.symbolButton("g" + gheadMesh[i],command=lambda x, i=i:meshSelC(gheadMesh[i],1),image=iconPath + "UIGeo" + gheadMesh[i] + ".png",visible=State) cmds.symbolButton("g" + "custom_" + gheadMesh[i],command=lambda x, i=i:meshSelC("custom_" + gheadMesh[i],1),image=iconPath + "UIGeoC.png",enable=False, visible=State) #LOD SELECTION lodTop=655 lodLeft=20 lodSpace=25 for i in range(8): cmds.symbolButton("lod" + str(i), command=lambda x, i=i: lodLayerC(i), image=iconPath + "UIButtonEmptyPressed.png",visible=False) cmds.text("t" + str(i), label=str(i), height=30, font="boldLabelFont", p=formLay2,visible=False) lodtL=10 lodtT=-20 #SEPERATION LINES cBGC=(0.4, 0.4, 0.4) c1=cmds.canvas("c1", height=1, width=200, bgc=cBGC, p=formLay2,visible=False) c2=cmds.canvas("c2", height=1, width=200, bgc=cBGC, p=formLay2,visible=False) #SELECTION PANEL t2=cmds.text("tSELECTION PANEL",label="SELECTION PANEL", height=30, font="boldLabelFont", p=formLay2) #FORMLAY2 cmds.formLayout( formLay2, edit=True, attachForm=[(im2, 'top', bodyParent+20), (im2, 'left', 9),(im3, 'top', bodyParent+20), (im3, 'left', 9),(im4, 'top', bodyParent+20), (im4, 'left', 49), ("lod0", 'top', lodTop), ("lod0", 'left', lodLeft),("lod1", 'top', lodTop), ("lod1", 'left', lodLeft+lodSpace),("lod2", 'top', lodTop), ("lod2", 'left', lodLeft+2*lodSpace),("lod3", 'top', lodTop), ("lod3", 'left', lodLeft+3*lodSpace), ("lod4", 'top', lodTop), ("lod4", 'left', lodLeft+4*lodSpace),("lod5", 'top', lodTop), ("lod5", 'left', lodLeft+5*lodSpace),("lod6", 'top', lodTop), ("lod6", 'left', lodLeft+6*lodSpace),("lod7", 'top', lodTop), ("lod7", 'left', lodLeft+7*lodSpace), ("t0", 'top', lodTop+lodtT), ("t0", 'left', lodLeft+lodtL),("t1", 'top', lodTop+lodtT), ("t1", 'left', lodLeft+lodSpace+lodtL),("t2", 'top', lodTop+lodtT), ("t2", 'left', lodLeft+2*lodSpace+lodtL),("t3", 'top', lodTop+lodtT), ("t3", 'left', lodLeft+3*lodSpace+lodtL), ("t4", 'top', lodTop+lodtT), ("t4", 'left', lodLeft+4*lodSpace+lodtL),("t5", 'top', lodTop+lodtT), ("t5", 'left', lodLeft+5*lodSpace+lodtL),("t6", 'top', lodTop+lodtT), ("t6", 'left', lodLeft+6*lodSpace+lodtL),("t7", 'top', lodTop+lodtT), ("t7", 'left', lodLeft+7*lodSpace+lodtL), (c1, 'top', 370), (c1, 'left', 20),(c2, 'top', 550), (c2, 'left', 20), (t2, 'top', 695), (t2, 'left', 76)]) cmds.formLayout("formLay2", edit=True,visible=False) #WINDOW CHECK if cmds.objExists ("spine_04"): if cmds.objExists ("rl4Embedded_Archetype"): leftPanelButtonV(3) else: leftPanelButtonV(1) else: leftPanelButtonV(0) file_path = "c:/Arts and Spells/Scripts/dat.py" if os.path.exists(file_path): cmds.showWindow() else: prefUI(dnaPath, ROOT_DIR, MAIN_PATH, body_type) checkSceneSel() if not cmds.objExists("metapipefreewindow"): cmds.createNode("transform", name="metapipefreewindow") def get_main_window(): main_window_ptr = omui.MQtUtil.mainWindow() return wrapInstance(int(main_window_ptr), QtWidgets.QWidget) #mFree_window()