Maya脚本开发:实现选中物体名称在UI文本框显示
武器位置修复工具UI问题解决
我是一名新手程序员,正在编写Maya脚本实现武器位置修复工具。目前遇到的问题是:点击「Set Character」按钮选中物体后,无法将选中物体的名称显示在下方的不可编辑textField组件中。以下是修正后的完整代码,解决了这个问题并修复了其他潜在bug:
关键修正点
- 按钮命令改为绑定类的实例方法,避免全局函数调用的问题
- 将
nameSp改为实例方法,正确维护类的nameS属性,不再重新定义局部变量 - 在
nameSp中直接更新textField,显示选中物体的名称 - 其他工具方法(
weaponCor、noWeapon等)改为实例方法,统一访问类属性 - 增加选中判断和物体存在检查,避免无操作时报错
from maya import cmds import pymel.core as pm class drawUI(object): L = 'L' R = 'R' def __init__(self): # 检查窗口是否存在,避免重复创建 if pm.window("WeaponPositionFixWin", exists=True): pm.deleteUI("WeaponPositionFixWin") self.myWindow = pm.window("WeaponPositionFixWin", title="Weapon Position Fix") pm.columnLayout("basicTools", adjustableColumn=True) pm.gridLayout("CreateGrid", numberOfRowsColumns=(1, 1), cellWidthHeight=(180, 30), parent="basicTools") pm.separator(style='in') pm.text(label="Select object") self.ObjClass = pm.textField(text='Press Set Character', editable=False) # 绑定按钮到实例方法,用lambda传递self pm.button(c=lambda *args: self.nameSp(), label='Set Character', parent="CreateGrid") pm.separator(style='in') pm.button(c=lambda *args: self.weaponCor(side=self.R), label='Right Hand Weapon', parent="CreateGrid") pm.separator(style='in') pm.button(c=lambda *args: self.noRWeapon(side=self.R), label='Right Hand No Weapon', parent="CreateGrid") pm.separator(style='in') pm.button(c=lambda *args: self.weaponCor(side=self.L), label='Left Hand Weapon', parent="CreateGrid") pm.separator(style='in') pm.button(c=lambda *args: self.noWeapon(side=self.L), label='Left Hand No Weapon', parent="CreateGrid") pm.separator(style='in') pm.showWindow(self.myWindow) def nameSp(self): self.nameS = [] selected = pm.ls(sl=True, fl=True) if not selected: pm.warning("请先选中一个物体!") return CH = selected[0] # 更新textField显示选中物体名称 pm.textField(self.ObjClass, e=True, text=CH.name()) # 处理引用命名空间 if pm.referenceQuery(CH, isNodeReferenced=True): nameSpace = CH.split(':')[0] + ':' self.nameS.append(nameSpace) print(self.nameS[0]) def weaponCor(self, side): if not hasattr(self, 'nameS') or not self.nameS: pm.warning("请先点击Set Character设置角色!") return Target = pm.ls(sl=True, fl=True) if not Target: pm.warning("请先选中目标物体!") return Target = Target[0] name = self.nameS[0] Weapon = name + side + '_Weapon_ctrl' if not pm.objExists(Weapon): pm.warning(f"未找到控制器:{Weapon}") return pm.cutKey(Weapon) par = pm.parentConstraint(Target, Weapon, mo=False) startTime = pm.playbackOptions(query=True, minTime=True) endTime = pm.playbackOptions(query=True, maxTime=True) pm.bakeResults(Weapon, simulation=True, t=(startTime, endTime)) pm.showHidden(above=True) pm.delete(par) def noWeapon(self, side): if not hasattr(self, 'nameS') or not self.nameS: pm.warning("请先点击Set Character设置角色!") return pm.select(clear=True) name = self.nameS[0] src = name + 'Wrist_' + side trg = name + side + '_Weapon_ctrl' if not pm.objExists(src) or not pm.objExists(trg): pm.warning(f"未找到物体:{src} 或 {trg}") return pm.cutKey(trg) loc = pm.spaceLocator(n='reference')[0] pm.parent(loc, src) pm.xform(loc, t=(-0.08, 0, 0.035), ro=(0, 90, 180)) par = pm.parentConstraint(loc, trg, mo=0) startTime = pm.playbackOptions(query=True, minTime=True) endTime = pm.playbackOptions(query=True, maxTime=True) pm.bakeResults(trg, simulation=True, t=(startTime, endTime)) pm.showHidden(above=True) pm.delete(par, loc) def noRWeapon(self, side): if not hasattr(self, 'nameS') or not self.nameS: pm.warning("请先点击Set Character设置角色!") return pm.select(clear=True) name = self.nameS[0] src = name + 'Wrist_' + side trg = name + side + '_Weapon_ctrl' if not pm.objExists(src) or not pm.objExists(trg): pm.warning(f"未找到物体:{src} 或 {trg}") return pm.cutKey(trg) loc = pm.spaceLocator(n='reference')[0] pm.parent(loc, src) pm.xform(loc, t=(0.08, 0, -0.035), ro=(0, 90, 180)) par = pm.parentConstraint(loc, trg, mo=0) startTime = pm.playbackOptions(query=True, minTime=True) endTime = pm.playbackOptions(query=True, maxTime=True) pm.bakeResults(trg, simulation=True, t=(startTime, endTime)) pm.showHidden(above=True) pm.delete(par, loc) test = drawUI()
内容的提问来源于stack exchange,提问作者Valeriya Fedoseeva
相关产品推荐
相关产品推荐

