miMayaPlugins/snapToClosest/python/ui.py
2024-10-01 19:59:07 +08:00

181 lines
6.0 KiB
Python

from PySide2 import QtWidgets, QtCore
from maya import OpenMayaUI
from maya import cmds
try:
import shiboken
except ImportError:
import shiboken2 as shiboken
def getMayaWindow():
ptr = OpenMayaUI.MQtUtil.mainWindow()
return shiboken.wrapInstance(long(ptr), QtWidgets.QMainWindow)
class SnapWindow(QtWidgets.QDialog):
def closeExistingWindow(self):
""" Close window if exists """
for qt in QtWidgets.QApplication.topLevelWidgets():
try:
if qt.__class__.__name__ == self.__class__.__name__:
qt.close()
except Exception:
pass
def __init__(self, parent=getMayaWindow()):
self.closeExistingWindow()
super(SnapWindow, self).__init__(parent)
self.setWindowTitle("Snap")
self.setWindowFlags(QtCore.Qt.Window)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setFixedWidth(600)
self.createUI()
self.layoutUI()
def createUI(self):
self.lineEdit = QtWidgets.QLineEdit()
self.lineEdit.setEnabled(False)
self.setButton = QtWidgets.QPushButton("Set")
self.setButton.clicked.connect(self.setter)
self.modeRadioGrp = QtWidgets.QButtonGroup()
self.vertexMode = QtWidgets.QRadioButton('Vertex')
self.normalMode = QtWidgets.QRadioButton('Normal')
self.surfaceMode = QtWidgets.QRadioButton('Surface')
self.normalMode.setChecked(True)
self.modeRadioGrp.addButton(self.vertexMode)
self.modeRadioGrp.addButton(self.normalMode)
self.modeRadioGrp.addButton(self.surfaceMode)
self.modeRadioGrp.setId(self.vertexMode, 1)
self.modeRadioGrp.setId(self.normalMode, 2)
self.modeRadioGrp.setId(self.surfaceMode, 3)
self.distanceLE = QtWidgets.QLineEdit("99999")
self.distanceLock = QtWidgets.QCheckBox("Lock")
self.distanceLock.stateChanged.connect(self.lockDistance)
self.customVectorCheck = QtWidgets.QCheckBox("Use custom vector")
self.customVectorCheck.stateChanged.connect(
self.changeCustomVectorState)
self.customVectorX = QtWidgets.QLineEdit("0")
self.customVectorY = QtWidgets.QLineEdit("0")
self.customVectorZ = QtWidgets.QLineEdit("0")
self.customVectorX.setEnabled(False)
self.customVectorY.setEnabled(False)
self.customVectorZ.setEnabled(False)
self.tbdCheckBox = QtWidgets.QCheckBox("Test both directions")
self.snapButton = QtWidgets.QPushButton("Snap")
self.snapButton.setFixedHeight(40)
self.snapButton.clicked.connect(self.snap)
def layoutUI(self):
topLayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.LeftToRight)
topLayout.addWidget(QtWidgets.QLabel("Snap Target : "))
topLayout.addWidget(self.lineEdit)
topLayout.addWidget(self.setButton)
modeLayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.LeftToRight)
modeLayout.addWidget(QtWidgets.QLabel("Snap Mode : "))
modeLayout.addWidget(self.vertexMode)
modeLayout.addWidget(self.normalMode)
modeLayout.addWidget(self.surfaceMode)
distLayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.LeftToRight)
distLayout.addWidget(QtWidgets.QLabel("Max Search Radius : "))
distLayout.addWidget(self.distanceLE)
distLayout.addWidget(self.distanceLock)
cvLayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.LeftToRight)
cvLayout.addWidget(self.customVectorCheck)
cvLayout.addWidget(self.customVectorX)
cvLayout.addWidget(self.customVectorY)
cvLayout.addWidget(self.customVectorZ)
cvLayout.addWidget(self.tbdCheckBox)
mainLayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.TopToBottom)
mainLayout.addLayout(topLayout)
mainLayout.addLayout(modeLayout)
mainLayout.addLayout(distLayout)
mainLayout.addLayout(cvLayout)
mainLayout.addWidget(self.snapButton)
self.setLayout(mainLayout)
def changeCustomVectorState(self):
if self.customVectorCheck.checkState() == QtCore.Qt.CheckState.Checked:
self.customVectorX.setEnabled(True)
self.customVectorY.setEnabled(True)
self.customVectorZ.setEnabled(True)
else:
self.customVectorX.setEnabled(False)
self.customVectorY.setEnabled(False)
self.customVectorZ.setEnabled(False)
def lockDistance(self):
if self.distanceLock.checkState() == QtCore.Qt.CheckState.Checked:
self.distanceLE.setEnabled(False)
else:
self.distanceLE.setEnabled(True)
def snap(self):
target = self.lineEdit.text()
if target == "":
return
check = self.modeRadioGrp.checkedId()
if check == 1:
snapMode = "vertex"
elif check == 2:
snapMode = "normal"
else:
snapMode = "surface"
# directions
if self.tbdCheckBox.checkState() == QtCore.Qt.CheckState.Checked:
testBothDirections = True
else:
testBothDirections = False
maxSearchRadius = float(self.distanceLE.text())
if self.customVectorCheck.checkState() == QtCore.Qt.CheckState.Checked:
nx = float(self.customVectorX.text())
ny = float(self.customVectorY.text())
nz = float(self.customVectorZ.text())
cmds.snapToClosest(
target,
mode=snapMode,
r=maxSearchRadius,
cv=True,
cvx=nx,
cvy=ny,
cvz=nz,
tbd=testBothDirections)
else:
cmds.snapToClosest(
target,
mode=snapMode,
r=maxSearchRadius,
tbd=testBothDirections)
def setter(self):
self.lineEdit.setText(cmds.ls(sl=True, fl=True, long=True)[0])
def main():
snap = SnapWindow()
snap.show()
snap.raise_()
if __name__ == "__main__":
main()