How can I avoid getting my shaders and shading engine named as MAT1 and MATSG1 and so on?

79 Views Asked by At

So basically this is the code I have written which is getting the required paired meshes of character in maya and I need to assign similar shader to Leg, Arm and Hand respectively.

And I was able to get meshes with different shaders and I assign the same to both of them.

but I am facing error while renaming them , the first time it's working fine but If i am trying to run this script again , it's chanding name with incremented counts like Hand_MAT1 & Hand_MATSG1.

I even tried deleting existing shaders but that doesn't works as well instead it deleted every information of those meshes.

How can i achieve it ? Any help would be great.

Thanks & Regards

import maya.cmds as cmds

transforms = cmds.ls(transforms=True)
shading_engines = {}
selected_body_parts = ["Arm","Leg","Hand"]
valid_failed_list = []
selected_transforms = []

for transform in transforms:
   if "LT_" in transform or "RT_" in transform:
       if "Hand" in transform or "Arm" in transform or "Leg" in transform:
            shapes = cmds.listRelatives(transform, shapes=True)
            if shapes:
               shading_engine = cmds.listConnections(shapes[0], type="shadingEngine")
               if shading_engine:
                    shading_engine_name = shading_engine[0]
                    shader_name = \
                            cmds.connectionInfo("%s.surfaceShader" % shading_engine_name, sfd=1).split(".")[0]
                    selected_transforms.append(transform)
                    shading_engines[transform] = [shading_engine[0], shader_name]


for transform in selected_transforms:
    if "LT_" in transform or "RT_" in transform:
                paired_transform = transform.replace("LT_", "RT_") if "LT_" in transform else transform.replace(
                    "RT_", "LT_")
                if paired_transform in shading_engines.keys():
                    if shading_engines[transform][0] != shading_engines[paired_transform][0] or \
                            shading_engines[transform][1] != shading_engines[paired_transform][1] or \
                            shading_engines[transform][0] != (transform.split('_')[1] + '_MATSG') or \
                            shading_engines[transform][1] != (transform.split('_')[1] + '_MAT'):
                        valid_failed_list.append(transform)
                        


for body_part in selected_transforms:
    first_shader = shading_engines.get(body_part)[0]
    for transform in valid_failed_list:
        if body_part.split('_')[1] in transform:
            shapes = cmds.listRelatives(transform,shapes=True)
            if shapes:
               cmds.sets(shapes[0],e=True,forceElement=first_shader)

for k, v in shading_engines.items():
            old_shading_engine_name = v[0]
            old_shader_name = v[1]
            body_part = k.split("_")[1]
            new_shading_engine_name = "{}_MATSG".format(body_part)
            new_shader_name = "{}_MAT".format(body_part)
            
            
            if cmds.objExists(old_shading_engine_name):
                cmds.rename(old_shading_engine_name, new_shading_engine_name)
            
            if cmds.objExists(old_shader_name):
                cmds.rename(old_shader_name, new_shader_name)
0

There are 0 best solutions below