#!/usr/bin/env python # -*- coding: utf-8 -*- import maya.cmds as cmds # Define minimum window width and height MIN_WINDOW_WIDTH = 300 # Increased from 200 to 300 MIN_WINDOW_HEIGHT = 300 # Function: Get and display UV sets def refresh_uv_sets(): selection = cmds.ls(selection=True) if not selection: cmds.warning("Please select an object first.") return selected_object = selection[0] uv_sets = cmds.polyUVSet(selected_object, query=True, allUVSets=True) cmds.textScrollList('uvList', edit=True, removeAll=True) for uv_set in uv_sets: cmds.textScrollList('uvList', edit=True, append=uv_set) # Function: Switch UV set def switch_uv_set(*args): selected_uv_set = cmds.textScrollList('uvList', query=True, selectItem=True) if selected_uv_set: selected_object = cmds.ls(selection=True) if selected_object: selected_object = selected_object[0] # Switch current UV set cmds.polyUVSet(selected_object, currentUVSet=True, uvSet=selected_uv_set[0]) print(f"Switched to UV set: {selected_uv_set[0]}") else: cmds.warning("Please select an object.") else: cmds.warning("Please select a UV set.") # Function: Delete selected UV set def delete_selected_uv_set(): selected_uv_set = cmds.textScrollList('uvList', query=True, selectItem=True) if selected_uv_set: cmds.polyUVSet(delete=True, uvSet=selected_uv_set[0]) refresh_uv_sets() # Function: Rename selected UV set def rename_selected_uv_set(new_name): selected_uv_set = cmds.textScrollList('uvList', query=True, selectItem=True) if selected_uv_set: if new_name: cmds.polyUVSet(rename=True, newUVSet=new_name, uvSet=selected_uv_set[0]) refresh_uv_sets() cmds.textFieldGrp('newNameField', edit=True, text='') # Clear input field content else: cmds.warning("Please enter a new name.") else: cmds.warning("Please select a UV set first.") # Function: Create new UV set def create_new_uv_set(new_name): if new_name: cmds.polyUVSet(create=True, uvSet=new_name) refresh_uv_sets() cmds.textFieldGrp('newNameField', edit=True, text='') # Clear input field content else: cmds.warning("Please enter a name for the new UV set.") # Function: Set UV set 1 name def set_uv_set1_name(*args): selected_uv_set = cmds.textScrollList('uvList', query=True, selectItem=True) if selected_uv_set: cmds.textFieldGrp("uvSet1", edit=True, text=selected_uv_set[0]) else: cmds.warning("Please select a UV set first.") # Function: Set UV set 2 name def set_uv_set2_name(*args): selected_uv_set = cmds.textScrollList('uvList', query=True, selectItem=True) if selected_uv_set: cmds.textFieldGrp("uvSet2", edit=True, text=selected_uv_set[0]) else: cmds.warning("Please select a UV set first.") # Function: UV set swap def UVsetSwap(*args): UVname1 = cmds.textFieldGrp("uvSet1", query=True, text=True) UVname2 = cmds.textFieldGrp("uvSet2", query=True, text=True) cmds.polyUVSet(query=True, allUVSets=True) cmds.polyUVSet(create=True, uvSet='TempUV') cmds.polyUVSet(copy=True, nuv='TempUV', uvSet=UVname1) cmds.polyUVSet(copy=True, nuv=UVname1, uvSet=UVname2) cmds.polyUVSet(copy=True, nuv=UVname2, uvSet='TempUV') cmds.polyUVSet(delete=True, uvSet='TempUV') refresh_uv_sets() # Refresh list after execution def UVsetReorder(*args): UVname1 = cmds.textFieldGrp("uvSet1", query=True, text=True) UVname2 = cmds.textFieldGrp("uvSet2", query=True, text=True) print("Reorder object is " + UVname1 + " + " + UVname2) cmds.polyUVSet(reorder=True, uvSet=UVname1, newUVSet=UVname2) UVobj = cmds.ls(sl=True) cmds.select(UVobj) refresh_uv_sets() # Refresh list after execution # Function: UV set transfer def get_object_name(*args): # Get currently selected object and fill its name in the text field selected = cmds.ls(sl=True) if selected: cmds.textField('objectNameField', edit=True, text=selected[0]) else: cmds.warning("No object selected.") def set_uv(*args): # Get source and target objects, perform UV transfer, and clean up history source_object = cmds.textField('objectNameField', query=True, text=True) target_object = cmds.ls(sl=True) if not source_object or not target_object: cmds.warning("Please ensure both source and target objects are selected.") return target_object = target_object[0] sample_space_dict = {'World': 0, 'Local': 1, 'UV': 5, 'Component': 4} sample_space = cmds.radioCollection('sampleSpaceRadio', query=True, select=True) sample_space = cmds.radioButton(sample_space, query=True, label=True) sample_space = sample_space_dict.get(sample_space, 0) cmds.transferAttributes(source_object, target_object, transferPositions=0, transferNormals=0, transferUVs=2, transferColors=0, sampleSpace=sample_space, searchMethod=3) cmds.delete(target_object, constructionHistory=True) # Clean up history def on_window_resize(*args): window_name = "UVSetEditor" # Get current window size current_width = cmds.window(window_name, query=True, width=True) current_height = cmds.window(window_name, query=True, height=True) # Check and limit window size if current_width < MIN_WINDOW_WIDTH: cmds.window(window_name, edit=True, width=MIN_WINDOW_WIDTH) if current_height < MIN_WINDOW_HEIGHT: cmds.window(window_name, edit=True, height=MIN_WINDOW_HEIGHT) def show(*args): window_name = "UVSetEditor" # Check if window exists, if so, delete it if cmds.window(window_name, exists=True): cmds.deleteUI('UV Set Editor', window=True) # Window # Create a new window and set its title and initial size window = cmds.window(window_name, title=" UV Set Editor", widthHeight=(MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT), sizeable=True, tlb=True) # tlb=True cmds.frameLayout(label='UV-Set') cmds.columnLayout(adjustableColumn=True) # Create a textScrollList control and set the selection change command cmds.textScrollList('uvList', numberOfRows=8, allowMultiSelection=False, width=280, selectCommand=switch_uv_set) cmds.textFieldGrp('newNameField', placeholderText=' Enter new name, then click Re to rename', width=280, columnAlign=[1, 'center'] ,columnWidth=[1,280]) cmds.rowLayout(numberOfColumns=4, columnWidth4=(65, 65, 65, 65), columnAttach4=('both', 'both', 'both', 'both')) cmds.button( label='Get', height=32, command=lambda x: refresh_uv_sets(),backgroundColor=(0.53, 0.81, 0.98)) cmds.button( label='Del', height=32, command=lambda x: delete_selected_uv_set()) cmds.button( label='New', height=32, command=lambda x: create_new_uv_set(cmds.textFieldGrp('newNameField', query=True, text=True))) cmds.button( label='Re', height=32, command=lambda x: rename_selected_uv_set(cmds.textFieldGrp('newNameField', query=True, text=True))) cmds.setParent( '..' ) cmds.setParent('..') # End current form layout cmds.frameLayout(label='UV-Swap') cmds.columnLayout(adjustableColumn=True, width=280) cmds.text(l='Enter UV set names in "uv1" and "uv2"', h=15) cmds.text(l=' UV swap or reorder swap. ', h=15) cmds.text(l='', h=5) cmds.rowLayout(numberOfColumns=3, columnWidth3=(65, 65, 130), columnAttach3=('both', 'both', 'both')) cmds.button(label='Get', height=25, command=set_uv_set1_name, backgroundColor=(0.53, 0.81, 0.98)) cmds.textFieldGrp("uvSet1", placeholderText='uv1', editable=True, width=200) cmds.setParent('..') cmds.rowLayout(numberOfColumns=3, columnWidth3=(65, 65, 130), columnAttach3=('both', 'both', 'both')) cmds.button(label='Get', height=25, command=set_uv_set2_name, backgroundColor=(0.53, 0.81, 0.98)) cmds.textFieldGrp("uvSet2", placeholderText='uv2', editable=True, width=200) cmds.setParent('..') cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1, 135), (2, 135)]) cmds.button(label='UV Swap', command=UVsetSwap, backgroundColor=(0.53, 0.81, 0.98)) cmds.button(label='Reorder Swap', command=UVsetReorder, backgroundColor=(0.53, 0.81, 0.98)) UVname1 = cmds.textFieldGrp("uvSet1", query=True, text=True) UVname2 = cmds.textFieldGrp("uvSet2", query=True, text=True) print("Now we have UVset = {}, {}".format(UVname1, UVname2)) cmds.setParent('..') # End current form layout # Separator cmds.separator(height=20, style='in') # Create a column layout, all child elements will be vertically arranged cmds.frameLayout(label='UV-Transfer') cmds.columnLayout(adjustableColumn=True, width=230, height=130) cmds.rowLayout(numberOfColumns=3, columnWidth3=(50, 100, 50)) cmds.button(label='Get', command=get_object_name, backgroundColor=(0.53, 0.81, 0.98), width=45) # Create a button that calls get_object_name function when clicked cmds.textField('objectNameField', enable=False, width=120) # Create a text field to display the name of the selected object cmds.button(label='Set', command=set_uv, backgroundColor=(0.53, 0.81, 0.98), width=45) # Create a button that calls set_uv function when clicked cmds.setParent('..') # End current form layout # cmds.frameLayout(label='Sample Space') cmds.text(l='Sample Space:', h=20, align='left') form = cmds.formLayout() cmds.radioCollection('sampleSpaceRadio') # Create a radio button group rb1 = cmds.radioButton(label='World', select=True) # Create a radio button rb2 = cmds.radioButton(label='Local') rb3 = cmds.radioButton(label='UV') rb4 = cmds.radioButton(label='Component') # Set form layout parameters to keep radio buttons horizontally aligned and centered when window size changes cmds.formLayout(form, edit=True, attachForm=[(rb1, 'left', 10), (rb4, 'right', 10)], attachControl=[(rb2, 'left', 5, rb1), (rb3, 'left', 5, rb2), (rb4, 'left', 5, rb3)]) cmds.setParent('..') # End current form layout cmds.scriptJob(event=["idle", on_window_resize], parent=window) # Listen for window resize events cmds.showWindow(window) # Show window