返回列表
mayaAPI

滑杆缩放联动

self.setWindowTitle("几何体创建-缩放工具箱")
self.setMinimumSize(100, 100)

创建一个QDialog,名为几何体缩放工具箱。定义初始尺寸。

main_layout = QVBoxLayout(self)

# 布局比例:文字15% 滑块75% 输入框10%
one = 15
two = 75
three = 10

定义了一个竖排版,布局比例为100%

# 整体缩放 映射 0.1~10.0 小数
self.sliderS = QSlider(Qt.Horizontal)
self.sliderS.setRange(1, 100)
self.sliderS.setValue(10)
self.line_scale = QLineEdit("1.0") # str
scale_layout = QHBoxLayout()
self.QLabel = QLabel("整体缩放:")
scale_layout.addWidget(self.QLabel, stretch=one)
scale_layout.addWidget(self.sliderS, stretch=two)
scale_layout.addWidget(self.line_scale, stretch=three)

定义了这个类的滑杆,为滑杆缩放,范围为1-100

定义了输入框,初始值为1.0

定义了一个虚拟盒子

stretch:百分比占比

# 按钮
btn_layout = QHBoxLayout()
self.btn_1 = QPushButton("创建方体")
self.btn_2 = QPushButton("创建球体")
self.btn_3 = QPushButton("创建柱体")
self.btn_4 = QPushButton("创建锥体")
btn_layout.addWidget(self.btn_1)
btn_layout.addWidget(self.btn_2)
btn_layout.addWidget(self.btn_3)
btn_layout.addWidget(self.btn_4)

定义了一个布局,又定义了四个按钮并起名

# 布局
main_layout.addLayout(scale_layout)
main_layout.addLayout(btn_layout)

进行布局

# 桥接
self.sliderS.valueChanged.connect(self.sliderChange)
self.line_scale.textChanged.connect(self.textChange)

self.btn_1.clicked.connect(self.cre_cube)
self.btn_2.clicked.connect(self.cre_sphere)
self.btn_3.clicked.connect(self.cre_cylinder)
self.btn_4.clicked.connect(self.cre_Cone)

第一个桥接的是滑杆,当值被改变后,连接下一个

第二个是输入框,文字改变后连接

后四个都是按钮,点击后连接

def sliderChange(self, value):
# 滑块值转小数 0.1~10.0
val = value * 0.1
self.line_scale.setText(f"{val:.1f}")
self.changeNum()

 联动滑杆与输入框。换算后保留小数后一位进行传值

def textChange(self, text):
# 提升鲁棒性,防止乱输入
try:
val = float(text) # str→ float "1"→1
if 0.1 <= val <= 10.0:
self.sliderS.setValue(int(val * 10)) # 10
self.changeNum()

如果是正确的,就执行下面的语句。如果是错误的就pass(无反应,不报错)

def cre_cube(self):
obj = cmds.polyCube(
n = "myCube",
w=1, h=1, d=1
)[0]
cmds.select(obj)
self.changeNum()

定义了一个类函数cre_cube

创建了一个几何体,起名为myCube,并选择,改变它的数值

selected = cmds.ls(selection=True, long=True)
if not selected:
return

若获取到,就执行。若未获取到,就返回

def changeNum(self):
# 获取当前缩放值
try:
scale = float(self.line_scale.text()) # 类函数,获取值
except:
return

将获取到的值转化为小数的,赋值给scale

# 获取选中物体
selected = cmds.ls(selection=True, long=True)
if not selected:
return

# 缩放选中物体
cmds.scale(
scale, scale, scale,
selected,
absolute=True
)

获取选中的,未获取到就return

缩放xyz轴。absolute:按相对缩放

# 运行窗口
global window1
# 每次只运行1个窗口
try:
window1.close()
except:
pass
window1 = sliderTool_Scale()

最后定义一个window1,实例化这个类