class TestWindow(MayaQWidgetBaseMixin, QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("ID显示工具")
self.setFixedSize(320, 130)
定义一个类,设定宽高
QRadioButton单选,缩写QRB
QCheckBox复选,缩写QCB
main_layout = QVBoxLayout(self)
tip = QLabel("选择模型 → 勾选显示项 → 点击应用")
main_layout.addWidget(tip)
定义了一个主虚拟盒子
# 单选框(圆点样式)
row_radio = QHBoxLayout()
self.radio_cube = QRadioButton("方体")
self.radio_sphere = QRadioButton("球体")
self.radio_clear = QRadioButton("清除")
row_radio.addWidget(self.radio_cube)
row_radio.addWidget(self.radio_sphere)
row_radio.addWidget(self.radio_clear)
main_layout.addLayout(row_radio)
定义了一个横排的虚拟盒子,又定义了三个QRB单选框
self.radio_cube.clicked.connect(self.create_cube)
self.radio_sphere.clicked.connect(self.create_sphere)
self.radio_clear.clicked.connect(self.clear_poly)
通过click发送信号,触发函数
def create_cube(self):
cmds.select(clear=True)
cmds.polyCube()
清除选择,创建cube几何体
def clear_poly(self):
# 1. 获取所有变换节点
all_transforms = cmds.ls(transforms=True, long=True)
# 2. 定义白名单
notDelList = ["persp", "top", "front", "side"]
# 3. 筛选删除列表
delList = []
for i in all_transforms:
name = i.split("|")[-1]
if name not in notDelList:
delList.append(i)
# 4. 删除并清空选择
if delList:
cmds.delete(delList)
cmds.select(clear=True)
获取所有的变换节点,定义白名单并加入几个视角的摄像机,筛选删除列表再删除并且清空选择的
# 复选框(打勾样式)
row_check = QHBoxLayout()
self.VID = QCheckBox("顶点ID")
self.EID = QCheckBox("边ID")
self.FID = QCheckBox("面ID")
row_check.addWidget(self.VID)
row_check.addWidget(self.EID)
row_check.addWidget(self.FID)
main_layout.addLayout(row_check)
定义复选框并命名,将三个ID放入row这个虚拟盒子里面,再把第三层的虚拟盒子放入主虚拟盒子里面
def refresh_ids(self):
"""点击按钮才生效,不再实时刷新"""
sel = cmds.ls(selection=True, long=True)
if not sel:
cmds.warning("请先选择模型!")
return
点击按钮的时候没有获取到这个列表,就打印warning报警告
# 布局
main_layout = QVBoxLayout(self)
# 局部坐标轴 复选框
self.local_axis = QCheckBox("局部坐标轴")
# 实时刷新绑定
self.local_axis.stateChanged.connect(self.refresh_axis)
main_layout.addWidget(self.local_axis)
布局了一个主盒子,写复选框,给了一个桥