0


maya的重命名物体和材质工具(带ai过程)

对材质同样也有效

被AI干失业的卖衣服的小姐姐,开的士的小哥哥都可以再就业的易上手教程,

先看效果!

对物体命名也是,相当的美观

先提出需求我想在maya中批量重命名物体怎么办?AI给你弄个短代码 ,放进AI进化一下。。

  1. import maya.cmds as cmds
  2. allMat = cmds.ls(mat=True)
  3. for mat in allMat:
  4. cmds.rename("Name")

长代码,再次进化。。

  1. import maya.cmds as cmds
  2. class MayaRenameDialog:
  3. def __init__(self):
  4. self.char_input = ""
  5. self.num_input = 0
  6. def create_layout(self):
  7. self.window = cmds.window(title="Maya 重命名工具")
  8. layout = cmds.columnLayout()
  9. cmds.text(label="阿拉丁的重命名工具", align='center')
  10. cmds.text(label="前缀")
  11. self.prefix_field = cmds.textField()
  12. cmds.text(label="位数")
  13. self.digit_field = cmds.intField(value=4)
  14. cmds.button(label="重命名物体", command=self.rename_objects)
  15. cmds.button(label="重命名材质", command=self.rename_materials)
  16. return True
  17. def rename_objects(self, *args):
  18. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  19. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  20. selection = cmds.ls(selection=True)
  21. i = 1
  22. for obj in selection:
  23. new_name = self.char_input+str(i).zfill(self.num_input)
  24. cmds.rename(obj, new_name)
  25. i += 1
  26. def rename_materials(self, *args):
  27. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  28. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  29. materials = cmds.ls(mat=True)
  30. i = 1
  31. for mat in materials:
  32. new_name = self.char_input + str(i).zfill(self.num_input)
  33. cmds.rename(new_name)
  34. i += 1
  35. if __name__ == '__main__':
  36. dialog = MayaRenameDialog()
  37. dialog.create_layout()
  38. cmds.showWindow(dialog.window)

这代码不是太完美,继续问豆包AI。:

我发现它命名都是从3开始,而材质编辑器里有三个默认的材质球,这个我不想影响它们。

回答一

如果你不想影响 Maya 材质编辑器中的三个默认材质球,可以在重命名材质的代码中添加一个条件判断,排除这三个默认材质球。在这个版本中,定义了一个

  1. default_materials

列表,列出了三个默认材质球的名称。在重命名循环中,检查当前材质球是否在这个列表中,如果不在才进行重命名操作。这样就可以避免影响默认材质球。

以下是修改后的代码:

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. def create_layout(self):
  8. self.window = cmds.window(title="Maya 重命名工具")
  9. layout = cmds.columnLayout()
  10. cmds.text(label="阿拉丁的重命名工具", align='center')
  11. cmds.text(label="前缀")
  12. self.prefix_field = cmds.textField()
  13. cmds.text(label="位数")
  14. self.digit_field = cmds.intField(value=4)
  15. cmds.button(label="重命名物体", command=self.rename_objects)
  16. cmds.button(label="重命名材质", command=self.rename_materials)
  17. return True
  18. def rename_objects(self, *args):
  19. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  20. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  21. selection = cmds.ls(selection=True)
  22. i = 1
  23. for obj in selection:
  24. new_name = self.char_input+str(i).zfill(self.num_input)
  25. cmds.rename(obj, new_name)
  26. i += 1
  27. def rename_materials(self, *args):
  28. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  29. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  30. materials = cmds.ls(mat=True)
  31. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1'] # 这里列出默认的三个材质球名称
  32. i = 1
  33. for mat in materials:
  34. if mat not in default_materials:
  35. print("Before rename: {mat}")
  36. if cmds.lockNode(mat, query=True, lock=True):
  37. cmds.lockNode(mat, lock=False)
  38. print("解锁材质{mat}.")
  39. new_name = self.char_input + str(i).zfill(self.num_input)
  40. try:
  41. cmds.rename(mat, new_name)
  42. time.sleep(0.1) # 添加短暂的延迟
  43. except RuntimeError as e:
  44. if "Cannot rename a read only node." in str(e):
  45. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  46. i += 1
  47. if __name__ == '__main__':
  48. dialog = MayaRenameDialog()
  49. dialog.create_layout()
  50. cmds.showWindow(dialog.window)

回答二

以下是对这个问题的分析和解决方案:

分析

Maya 材质编辑器中默认有三个材质球(lambert1、particleCloud1、shaderGlow1),你代码中的循环从第一个材质开始处理,所以会对默认材质球进行操作。如果不想影响这三个默认材质球,可以在循环中跳过它们。

解决方案

  1. rename_materials

方法的循环中添加条件判断来跳过这三个默认材质球的处理,以下是修改后的代码:

代码中,在

  1. rename_materials

方法中,当材质球是默认的三个材质球时,使用

  1. continue

语句跳过当前循环,直接进入下一个材质球的处理,从而避免对默认材质球的重命名操作。

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. def create_layout(self):
  8. self.window = cmds.window(title="Maya 重命名工具")
  9. layout = cmds.columnLayout()
  10. cmds.text(label="阿拉丁的重命名工具", align='center')
  11. cmds.text(label="前缀")
  12. self.prefix_field = cmds.textField()
  13. cmds.text(label="位数")
  14. self.digit_field = cmds.intField(value=4)
  15. cmds.button(label="重命名物体", command=self.rename_objects)
  16. cmds.button(label="重命名材质", command=self.rename_materials)
  17. return True
  18. def rename_objects(self, *args):
  19. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  20. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  21. selection = cmds.ls(selection=True)
  22. i = 1
  23. for obj in selection:
  24. new_name = self.char_input + str(i).zfill(self.num_input)
  25. cmds.rename(obj, new_name)
  26. i += 1
  27. def rename_materials(self, *args):
  28. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  29. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  30. materials = cmds.ls(mat=True)
  31. i = 1
  32. for mat in materials:
  33. if mat in ["lambert1", "particleCloud1", "shaderGlow1"]:
  34. continue
  35. print("Before rename: {mat}")
  36. if cmds.lockNode(mat, query=True, lock=True):
  37. cmds.lockNode(mat, lock=False)
  38. print("解锁材质{mat}.")
  39. new_name = self.char_input + str(i).zfill(self.num_input)
  40. try:
  41. cmds.rename(mat, new_name)
  42. time.sleep(0.1)
  43. except RuntimeError as e:
  44. if "Cannot rename a read only node." in str(e):
  45. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  46. i += 1
  47. if __name__ == '__main__':
  48. dialog = MayaRenameDialog()
  49. dialog.create_layout()
  50. cmds.showWindow(dialog.window)

然而,还是不太完美!然后我想在代码中加入一个查找替换功能,并且在UI里面也对应有查找文本输入框替换文本输入框和一个按钮叫查找替换,继续叫AI给我进化。。。

这就更牛逼了!

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. self.find_text = ""
  8. self.replace_text = ""
  9. def create_layout(self):
  10. self.window = cmds.window(title="Maya 重命名工具")
  11. layout = cmds.columnLayout()
  12. cmds.text(label="阿拉丁的重命名工具", align='center')
  13. cmds.text(label="前缀")
  14. self.prefix_field = cmds.textField()
  15. cmds.text(label="位数")
  16. self.digit_field = cmds.intField(value=4)
  17. cmds.text(label="查找文本")
  18. self.find_field = cmds.textField()
  19. cmds.text(label="替换文本")
  20. self.replace_field = cmds.textField()
  21. cmds.button(label="查找替换", command=self.find_replace)
  22. cmds.button(label="重命名物体", command=self.rename_objects)
  23. cmds.button(label="重命名材质", command=self.rename_materials)
  24. return True
  25. def rename_objects(self, *args):
  26. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  27. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  28. selection = cmds.ls(selection=True)
  29. i = 1
  30. for obj in selection:
  31. new_name = self.char_input + str(i).zfill(self.num_input)
  32. cmds.rename(obj, new_name)
  33. i += 1
  34. def rename_materials(self, *args):
  35. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  36. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  37. materials = cmds.ls(mat=True)
  38. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1']
  39. i = 1
  40. for mat in materials:
  41. if mat not in default_materials:
  42. print("Before rename: {mat}")
  43. if cmds.lockNode(mat, query=True, lock=True):
  44. cmds.lockNode(mat, lock=False)
  45. print("解锁材质{mat}.")
  46. new_name = self.char_input + str(i).zfill(self.num_input)
  47. try:
  48. cmds.rename(mat, new_name)
  49. time.sleep(0.1)
  50. except RuntimeError as e:
  51. if "Cannot rename a read only node." in str(e):
  52. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  53. i += 1
  54. def find_replace(self, *args):
  55. self.find_text = cmds.textField(self.find_field, query=True, text=True)
  56. self.replace_text = cmds.textField(self.replace_field, query=True, text=True)
  57. selection = cmds.ls(selection=True)
  58. for obj in selection:
  59. current_name = obj
  60. new_name = current_name.replace(self.find_text, self.replace_text)
  61. cmds.rename(obj, new_name)
  62. if __name__ == '__main__':
  63. dialog = MayaRenameDialog()
  64. dialog.create_layout()
  65. cmds.showWindow(dialog.window)

剩下的就只排版一下界面美观一下即可了。哦哈哈!

我如何把窗口的尺寸和位置做个定义?xpos=100, ypos=100, defaultw=200, defaulth=200类似这样的

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. self.find_text = ""
  8. self.replace_text = ""
  9. def create_layout(self):
  10. # 指定窗口位置和尺寸
  11. self.window = cmds.window(title="Maya 重命名工具", widthHeight=(400, 200), topLeftCorner=(100, 100))
  12. layout = cmds.columnLayout()
  13. cmds.text(label="阿拉丁的重命名工具", align='center')
  14. cmds.text(label="前缀")
  15. self.prefix_field = cmds.textField()
  16. cmds.text(label="位数")
  17. self.digit_field = cmds.intField(value=4)
  18. cmds.text(label="查找文本")
  19. self.find_field = cmds.textField()
  20. cmds.text(label="替换文本")
  21. self.replace_field = cmds.textField()
  22. cmds.button(label="查找替换", command=self.find_replace)
  23. cmds.button(label="重命名物体", command=self.rename_objects)
  24. cmds.button(label="重命名材质", command=self.rename_materials)
  25. return True
  26. def rename_objects(self, *args):
  27. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  28. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  29. selection = cmds.ls(selection=True)
  30. i = 1
  31. for obj in selection:
  32. new_name = self.char_input + str(i).zfill(self.num_input)
  33. cmds.rename(obj, new_name)
  34. i += 1
  35. def rename_materials(self, *args):
  36. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  37. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  38. materials = cmds.ls(mat=True)
  39. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1']
  40. i = 1
  41. for mat in materials:
  42. if mat not in default_materials:
  43. print("Before rename: {mat}")
  44. if cmds.lockNode(mat, query=True, lock=True):
  45. cmds.lockNode(mat, lock=False)
  46. print("解锁材质{mat}.")
  47. new_name = self.char_input + str(i).zfill(self.num_input)
  48. try:
  49. cmds.rename(mat, new_name)
  50. time.sleep(0.1)
  51. except RuntimeError as e:
  52. if "Cannot rename a read only node." in str(e):
  53. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  54. i += 1
  55. def find_replace(self, *args):
  56. self.find_text = cmds.textField(self.find_field, query=True, text=True)
  57. self.replace_text = cmds.textField(self.replace_field, query=True, text=True)
  58. selection = cmds.ls(selection=True)
  59. for obj in selection:
  60. current_name = obj
  61. new_name = current_name.replace(self.find_text, self.replace_text)
  62. cmds.rename(obj, new_name)
  63. if __name__ == '__main__':
  64. dialog = MayaRenameDialog()
  65. dialog.create_layout()
  66. cmds.showWindow(dialog.window)

或者跟c4d里的python一样看齐,

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. self.find_text = ""
  8. self.replace_text = ""
  9. def create_layout(self, xpos, ypos, defaultw, defaulth):
  10. self.window = cmds.window(title="Maya 重命名工具", widthHeight=(defaultw, defaulth), topLeftCorner=(xpos, ypos))
  11. layout = cmds.columnLayout()
  12. cmds.text(label="阿拉丁的重命名工具", align='center')
  13. cmds.text(label="前缀")
  14. self.prefix_field = cmds.textField()
  15. cmds.text(label="位数")
  16. self.digit_field = cmds.intField(value=4)
  17. cmds.text(label="查找文本")
  18. self.find_field = cmds.textField()
  19. cmds.text(label="替换文本")
  20. self.replace_field = cmds.textField()
  21. cmds.button(label="查找替换", command=self.find_replace)
  22. cmds.button(label="重命名物体", command=self.rename_objects)
  23. cmds.button(label="重命名材质", command=self.rename_materials)
  24. return True
  25. def rename_objects(self, *args):
  26. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  27. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  28. selection = cmds.ls(selection=True)
  29. i = 1
  30. for obj in selection:
  31. new_name = self.char_input + str(i).zfill(self.num_input)
  32. cmds.rename(obj, new_name)
  33. i += 1
  34. def rename_materials(self, *args):
  35. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  36. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  37. materials = cmds.ls(mat=True)
  38. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1']
  39. i = 1
  40. for mat in materials:
  41. if mat not in default_materials:
  42. print("Before rename: {mat}")
  43. if cmds.lockNode(mat, query=True, lock=True):
  44. cmds.lockNode(mat, lock=False)
  45. print("解锁材质{mat}.")
  46. new_name = self.char_input + str(i).zfill(self.num_input)
  47. try:
  48. cmds.rename(mat, new_name)
  49. time.sleep(0.1)
  50. except RuntimeError as e:
  51. if "Cannot rename a read only node." in str(e):
  52. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  53. i += 1
  54. def find_replace(self, *args):
  55. self.find_text = cmds.textField(self.find_field, query=True, text=True)
  56. self.replace_text = cmds.textField(self.replace_field, query=True, text=True)
  57. selection = cmds.ls(selection=True)
  58. for obj in selection:
  59. current_name = obj
  60. new_name = current_name.replace(self.find_text, self.replace_text)
  61. cmds.rename(obj, new_name)
  62. if __name__ == '__main__':
  63. dialog = MayaRenameDialog()
  64. dialog.create_layout(xpos=100, ypos=100, defaultw=300, defaulth=200)
  65. cmds.showWindow(dialog.window)

越来越喜欢编代码了!来来来!继续问AI!现在在ui排布的界面里,查找文本和替换文本以及他们的输入框都是另起一行排布的我想让它们保持在同一行怎么做到? cmds.text(label="查找文本") self.find_field = cmds.textField() cmds.text(label="替换文本") self.replace_field = cmds.textField()

豆包AI: 在 Maya 的

  1. cmds

中可以使用

  1. rowLayout

(行布局)来将多个 UI 元素放在同一行。以下是修改后的代码:

  1. import maya.cmds as cmds
  2. import time
  3. class MayaRenameDialog:
  4. def __init__(self):
  5. self.char_input = ""
  6. self.num_input = 0
  7. self.find_text = ""
  8. self.replace_text = ""
  9. def create_layout(self, xpos=100, ypos=100, defaultw=200, defaulth=200):
  10. self.window = cmds.window(title="Maya 重命名工具", widthHeight=(defaultw, defaulth), topLeftCorner=(xpos, ypos))
  11. layout = cmds.columnLayout()
  12. cmds.text(label="阿拉丁的重命名工具", align='center')
  13. cmds.text(label="前缀")
  14. self.prefix_field = cmds.textField()
  15. cmds.text(label="位数")
  16. self.digit_field = cmds.intField(value=4)
  17. # 创建行布局用于放置查找和替换相关的元素
  18. find_replace_row = cmds.rowLayout(numberOfColumns=3)
  19. cmds.text(label="查找文本")
  20. self.find_field = cmds.textField()
  21. cmds.text(label="替换文本")
  22. self.replace_field = cmds.textField()
  23. cmds.setParent('..') # 返回上一级布局
  24. cmds.button(label="查找替换", command=self.find_replace)
  25. cmds.button(label="重命名物体", command=self.rename_objects)
  26. cmds.button(label="重命名材质", command=self.rename_materials)
  27. return True
  28. def rename_objects(self, *args):
  29. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  30. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  31. selection = cmds.ls(selection=True)
  32. i = 1
  33. for obj in selection:
  34. new_name = self.char_input + str(i).zfill(self.num_input)
  35. cmds.rename(obj, new_name)
  36. i += 1
  37. def rename_materials(self, *args):
  38. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  39. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  40. materials = cmds.ls(mat=True)
  41. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1']
  42. i = 1
  43. for mat in materials:
  44. if mat not in default_materials:
  45. print("Before rename: {mat}")
  46. if cmds.lockNode(mat, query=True, lock=True):
  47. cmds.lockNode(mat, lock=False)
  48. print("解锁材质{mat}.")
  49. new_name = self.char_input + str(i).zfill(self.num_input)
  50. try:
  51. cmds.rename(mat, new_name)
  52. time.sleep(0.1)
  53. except RuntimeError as e:
  54. if "Cannot rename a read only node." in str(e):
  55. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  56. i += 1
  57. def find_replace(self, *args):
  58. self.find_text = cmds.textField(self.find_field, query=True, text=True)
  59. self.replace_text = cmds.textField(self.replace_field, query=True, text=True)
  60. selection = cmds.ls(selection=True)
  61. for obj in selection:
  62. current_name = obj
  63. new_name = current_name.replace(self.find_text, self.replace_text)
  64. cmds.rename(obj, new_name)
  65. if __name__ == '__main__':
  66. dialog = MayaRenameDialog()
  67. dialog.create_layout(xpos=100, ypos=100, defaultw=200, defaulth=200)
  68. cmds.showWindow(dialog.window)

运行一下,额。。错误 # Error: RuntimeError: file <maya console> line 26: Too many children in layout: rowLayout5 #

直接复制,再提问 豆包AI 。

你可以尝试以下方法来解决这个问题:

  1. 检查rowLayout中的子元素数量,确保没有添加过多的元素。如果可能的话,减少子元素的数量或者使用其他布局方式来组织这些元素。
  2. 确认每个子元素都被正确地添加到布局中,并且没有重复添加。
  3. 检查是否有其他布局嵌套在这个rowLayout中,可能导致子元素数量的混乱。

以下是修改后的代码,确保只在

  1. rowLayout

中添加必要的元素:额,这里它傻逼了,陷入了死循环的修改状态,手动👀看一下。

最后整理完ui的代码如下:

  1. import maya.cmds as cmds
  2. import time
  3. import re
  4. class MayaRenameDialog:
  5. def __init__(self):
  6. self.char_input = ""
  7. self.num_input = 0
  8. self.find_text = ""
  9. self.replace_text = ""
  10. self.prefix_to_add = ""
  11. self.suffix_to_add = ""
  12. self.index_to_add = 0
  13. self.orderNUM = None
  14. self.num_input = None
  15. def create_layout(self, xpos=100, ypos=100, defaultw=350, defaulth=100):
  16. self.window = cmds.window(title="Maya 重命名工具", widthHeight=(defaultw, defaulth), topLeftCorner=(xpos, ypos))
  17. layout = cmds.columnLayout()
  18. cmds.text(label="阿拉丁的重命名工具", align='center')
  19. # 创建行布局用于放置“重命名按钮”相关的元素
  20. rename_row = cmds.rowLayout(numberOfColumns=4)
  21. cmds.text(label="重命名", parent=rename_row)
  22. self.prefix_field = cmds.textField(parent=rename_row)
  23. cmds.text(label="位数", parent=rename_row)
  24. self.digit_field = cmds.intField(value=4, parent=rename_row)
  25. cmds.setParent('..') # 返回上一级布局
  26. # 创建行布局用于放置“重命名物体和材质按钮”相关的元素
  27. renameObjMatBT_row = cmds.rowLayout(numberOfColumns=2)
  28. cmds.button(label="重命名物体", command=self.rename_objects, parent=renameObjMatBT_row)
  29. cmds.button(label="重命名材质", command=self.rename_materials, parent=renameObjMatBT_row)
  30. cmds.setParent('..') # 返回上一级布局
  31. # 创建行布局用于放置“查找和替换”相关的元素
  32. find_replace_row = cmds.rowLayout(numberOfColumns=5)
  33. cmds.text(label="查找文本", parent=find_replace_row)
  34. self.find_field = cmds.textField(parent=find_replace_row)
  35. cmds.text(label="替换文本", parent=find_replace_row)
  36. self.replace_field = cmds.textField(parent=find_replace_row)
  37. cmds.button(label="查找替换", command=self.find_replace, parent=find_replace_row)
  38. cmds.setParent('..') # 返回上一级布局
  39. # 创建行布局用于增加前缀的元素
  40. add_prefix_row = cmds.rowLayout(numberOfColumns=3)
  41. cmds.text(label="增加前缀", parent=add_prefix_row)
  42. self.prefix_to_add_field = cmds.textField(parent=add_prefix_row)
  43. cmds.button(label="应用前缀", command=self.add_prefix, parent=add_prefix_row)
  44. cmds.setParent('..') # 返回上一级布局
  45. # 创建行布局用于增加后缀的元素
  46. add_suffix_row = cmds.rowLayout(numberOfColumns=3)
  47. cmds.text(label="增加后缀", parent=add_suffix_row)
  48. self.suffix_to_add_field = cmds.textField(parent=add_suffix_row)
  49. cmds.button(label="应用后缀", command=self.add_suffix, parent=add_suffix_row)
  50. cmds.setParent('..') # 返回上一级布局
  51. # 创建行布局用于增加序号的元素
  52. add_index_row = cmds.rowLayout(numberOfColumns=4)
  53. cmds.text(label="增加序号", parent=add_index_row)
  54. self.orderNUM = cmds.intField(parent=add_index_row)
  55. cmds.button(label="应用序号", command=self.add_index, parent=add_index_row)
  56. cmds.button(label="删除序号", command=self.delete_index, parent=add_index_row)
  57. cmds.setParent('..') # 返回上一级布局
  58. return True
  59. def rename_objects(self, *args):
  60. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  61. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  62. selection = cmds.ls(selection=True)
  63. i = 1
  64. for obj in selection:
  65. new_name = self.char_input +'_'+ str(i).zfill(self.num_input)
  66. cmds.rename(obj, new_name)
  67. i += 1
  68. def rename_materials(self, *args):
  69. self.char_input = cmds.textField(self.prefix_field, query=True, text=True)
  70. self.num_input = cmds.intField(self.digit_field, query=True, value=True)
  71. materials = cmds.ls(mat=True)
  72. default_materials = ['lambert1', 'particleCloud1', 'shaderGlow1']
  73. i = 1
  74. for mat in materials:
  75. if mat not in default_materials:
  76. print("Before rename: {mat}")
  77. if cmds.lockNode(mat, query=True, lock=True):
  78. cmds.lockNode(mat, lock=False)
  79. print("解锁材质{mat}.")
  80. new_name = self.char_input + str(i).zfill(self.num_input)
  81. try:
  82. cmds.rename(mat, new_name)
  83. time.sleep(0.1)
  84. except RuntimeError as e:
  85. if "Cannot rename a read only node." in str(e):
  86. print("错误重命名{mat}. 它可能被锁定或者是只读状态.")
  87. i += 1
  88. def find_replace(self, *args):
  89. self.find_text = cmds.textField(self.find_field, query=True, text=True)
  90. self.replace_text = cmds.textField(self.replace_field, query=True, text=True)
  91. selection = cmds.ls(selection=True)
  92. for obj in selection:
  93. current_name = obj
  94. new_name = current_name.replace(self.find_text, self.replace_text)
  95. cmds.rename(obj, new_name)
  96. def add_prefix(self, *args):
  97. self.prefix_to_add = cmds.textField(self.prefix_to_add_field, query=True, text=True)
  98. selection = cmds.ls(selection=True)
  99. for obj in selection:
  100. current_name = obj
  101. new_name = self.prefix_to_add + '_'+ current_name
  102. cmds.rename(obj, new_name)
  103. def add_suffix(self, *args):
  104. self.suffix_to_add = cmds.textField(self.suffix_to_add_field, query=True, text=True)
  105. selection = cmds.ls(selection=True)
  106. for obj in selection:
  107. current_name = obj
  108. last_underscore_index = current_name.rfind('_')
  109. if last_underscore_index!= -1:
  110. new_name = current_name[:last_underscore_index] + '_' + self.suffix_to_add + current_name[last_underscore_index:]
  111. else:
  112. new_name = current_name + '_' + self.suffix_to_add
  113. cmds.rename(obj, new_name)
  114. def add_index(self, *args):
  115. self.num_input = cmds.intField(self.orderNUM, query=True, value=True)
  116. selection = cmds.ls(selection=True)
  117. i = 1
  118. for obj in selection:
  119. current_name = obj
  120. new_name = current_name + '_' + str(i).zfill(self.num_input)
  121. cmds.rename(obj, new_name)
  122. i += 1
  123. def delete_index(self, *args):
  124. selection = cmds.ls(selection=True)
  125. for obj in selection:
  126. current_name = obj
  127. last_underscore_index = current_name.rfind('_')
  128. if last_underscore_index!= -1:
  129. new_name = current_name[:last_underscore_index]
  130. else:
  131. new_name = current_name
  132. cmds.rename(obj, new_name)
  133. if __name__ == '__main__':
  134. dialog = MayaRenameDialog()
  135. dialog.create_layout(xpos=100, ypos=100, defaultw=350, defaulth=160)
  136. cmds.showWindow(dialog.window)
标签: python maya

本文转载自: https://blog.csdn.net/zszwebart/article/details/142134018
版权归原作者 阿拉丁的梦 所有, 如有侵权,请联系我们删除。

“maya的重命名物体和材质工具(带ai过程)”的评论:

还没有评论