MetaBox/Scripts/Modeling/Edit/ModIt/Tools/ModIt_DupRadial_UI.py
2025-01-14 02:23:34 +08:00

506 lines
16 KiB
Python

##--------------------------------------------------------------------------
## ScriptName : ModIt 3.0
## Author : Wizix
## StartDate : 2022/09/09
## LastUpdate : 2022/13/09
## Version : 0.0.1
##-------------------------------------------------------------------------- I M P O R T
from PySide2 import QtWidgets, QtCore, QtGui
from maya import cmds as mc
import maya.mel as mel
import json
from ..Qt import QtWidgets, QtCore, QtCompat
import os
from maya import OpenMayaUI as omui
from functools import partial
# Special cases for different Maya versions
from shiboken2 import wrapInstance
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QWidget
##---------------------------------------- Import Modules
import importlib
from .. import ModIt_Global
importlib.reload(ModIt_Global)
from .. import ModIt_CSS
importlib.reload(ModIt_CSS)
##---------------------------------------- Import Classes
##-------------------------------------------------------------------------- G L O B A L V A R
##PATH_SET
IconPath = ModIt_Global.IconsPathThemeClassic
PreferencePath = ModIt_Global.PreferencePath
ToolsPath = ModIt_Global.ToolPath
WindowsTitle = "Radial Duplication"
Num = ""
##UI INFO
# ________________//
# ___________________________________________
# ________________//
def SEND_INFO(NumVersion):
global Num
Num = NumVersion
return Num
class Radial_UI(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Radial_UI, self).__init__()
self.setMinimumSize(460, 230)
self.buildUI()
def buildUI(self):
##UI - Preferences
iconFixeSize = 22
iconButtonSize = 20
# ________________//
# ___________________________________________## UI
# ________________//
LINEAR_MLyt = QtWidgets.QVBoxLayout(self)
self.setStyleSheet(ModIt_Global.Theme)
Title = QtWidgets.QLabel(" - R a d i a l D u p l i c a t i o n - ")
Title.setAlignment(QtCore.Qt.AlignCenter)
LINEAR_MLyt.addWidget(Title)
LINEAR_MLyt.addSpacing(10)
Linear_HLyt = QtWidgets.QHBoxLayout()
LINEAR_MLyt.addLayout(Linear_HLyt)
# ___________________________________________## LOCATOR ORIGN
self.LocatorOrign_btn = QtWidgets.QPushButton()
self.LocatorOrign_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.LocatorOrign_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.LocatorOrign_btn.setIcon(QtGui.QIcon(IconPath + "Locator_orign.png"))
self.LocatorOrign_btn.setToolTip(" Get Origin Locator ")
self.LocatorOrign_btn.clicked.connect(self.get_locatorOrign)
Linear_HLyt.addWidget(self.LocatorOrign_btn)
# ___________________________________________## NUMBER OF INSTANCES
# ___________________________________________##
SliderNumber_HLyt = QtWidgets.QHBoxLayout(self)
Linear_HLyt.addLayout(SliderNumber_HLyt)
Number_label = QtWidgets.QLabel(" Number ")
SliderNumber_HLyt.addWidget(Number_label)
self.Number_Slider = QtWidgets.QSlider()
self.Number_Slider.setMinimum(1)
self.Number_Slider.setMaximum(100)
try:
getValue = mc.getAttr("ModIt_Duplicate_Radial" + str(Num) + "_Distribute.pointCount")
except:
getValue = 10
self.Number_Slider.setProperty("value", getValue)
self.Number_Slider.setOrientation(QtCore.Qt.Horizontal)
self.Number_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.Number_Slider.setTickInterval(1)
self.Number_Slider.setFixedHeight(22)
self.Number_Slider.valueChanged.connect(self.SliderNumber_Action)
SliderNumber_HLyt.addWidget(self.Number_Slider)
self.Number_SpinBox = QtWidgets.QDoubleSpinBox()
self.Number_SpinBox.setDecimals(1)
self.Number_SpinBox.setFixedWidth(40)
self.Number_SpinBox.setFixedHeight(18)
self.Number_SpinBox.setRange(0, 1000)
self.Number_SpinBox.setValue(getValue)
self.Number_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.Number_SpinBox.editingFinished.connect(self.SpinBoxA_Action)
SliderNumber_HLyt.addWidget(self.Number_SpinBox)
# ___________________________________________## LOCATOR CIBLE
self.LocatorTarget_btn = QtWidgets.QPushButton()
self.LocatorTarget_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.LocatorTarget_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.LocatorTarget_btn.setIcon(QtGui.QIcon(IconPath + "Locator_cible.png"))
self.LocatorTarget_btn.setToolTip(" Get Target Locator ")
self.LocatorTarget_btn.clicked.connect(self.get_locatorTarget)
Linear_HLyt.addWidget(self.LocatorTarget_btn)
LINEAR_MLyt.addSpacing(4)
self.Separator = QtWidgets.QLabel()
self.Separator.setFixedSize(5000,1)
self.Separator.setStyleSheet("background-color:#434343;")
LINEAR_MLyt.addWidget(self.Separator)
LINEAR_MLyt.addSpacing(4)
TitleR = QtWidgets.QLabel(" - R a n d o m - ")
TitleR.setAlignment(QtCore.Qt.AlignCenter)
LINEAR_MLyt.addWidget(TitleR)
LINEAR_MLyt.addSpacing(10)
# ___________________________________________## RANDOM POSITION
# ___________________________________________##
SliderRandomP_HLyt = QtWidgets.QHBoxLayout(self)
LINEAR_MLyt.addLayout(SliderRandomP_HLyt)
Random_label = QtWidgets.QLabel("Position XYZ ")
SliderRandomP_HLyt.addWidget(Random_label)
try:
getValueP = mc.getAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.positionX")
except:
getValueP = 0
self.RandomP_Slider = QtWidgets.QSlider()
self.RandomP_Slider.setMinimum(0)
self.RandomP_Slider.setMaximum(100)
self.RandomP_Slider.setProperty("value", getValueP)
self.RandomP_Slider.setOrientation(QtCore.Qt.Horizontal)
self.RandomP_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.RandomP_Slider.setTickInterval(1)
self.RandomP_Slider.setFixedHeight(22)
self.RandomP_Slider.valueChanged.connect(self.SliderPosRandom_Action)
SliderRandomP_HLyt.addWidget(self.RandomP_Slider)
self.RandomP_SpinBox = QtWidgets.QDoubleSpinBox()
self.RandomP_SpinBox.setDecimals(1)
self.RandomP_SpinBox.setFixedWidth(40)
self.RandomP_SpinBox.setFixedHeight(18)
self.RandomP_SpinBox.setRange(0, 1000)
self.RandomP_SpinBox.setValue(getValueP)
self.RandomP_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.RandomP_SpinBox.editingFinished.connect(self.SpinPosRandom_Action)
SliderRandomP_HLyt.addWidget(self.RandomP_SpinBox)
# ___________________________________________## RANDOM ROTATION X
# ___________________________________________##
SliderRandomRx_HLyt = QtWidgets.QHBoxLayout(self)
LINEAR_MLyt.addLayout(SliderRandomRx_HLyt)
Random_label = QtWidgets.QLabel("Rotation X ")
SliderRandomRx_HLyt.addWidget(Random_label)
try:
getValueR = mc.getAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationX")
except:
getValueR = 0
self.RandomRx_Slider = QtWidgets.QSlider()
self.RandomRx_Slider.setMinimum(0)
self.RandomRx_Slider.setMaximum(360)
self.RandomRx_Slider.setProperty("value", getValueR)
self.RandomRx_Slider.setOrientation(QtCore.Qt.Horizontal)
self.RandomRx_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.RandomRx_Slider.setTickInterval(1)
self.RandomRx_Slider.setFixedHeight(22)
self.RandomRx_Slider.valueChanged.connect(self.SliderRotRandomX_Action)
SliderRandomRx_HLyt.addWidget(self.RandomRx_Slider)
self.RandomRx_SpinBox = QtWidgets.QDoubleSpinBox()
self.RandomRx_SpinBox.setDecimals(1)
self.RandomRx_SpinBox.setFixedWidth(40)
self.RandomRx_SpinBox.setFixedHeight(18)
self.RandomRx_SpinBox.setRange(0, 1000)
self.RandomRx_SpinBox.setValue(getValueR)
self.RandomRx_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.RandomRx_SpinBox.editingFinished.connect(self.SpinRotRandomX_Action)
SliderRandomRx_HLyt.addWidget(self.RandomRx_SpinBox)
# ___________________________________________## RANDOM ROTATION Y
# ___________________________________________##
SliderRandomRy_HLyt = QtWidgets.QHBoxLayout(self)
LINEAR_MLyt.addLayout(SliderRandomRy_HLyt)
Random_label = QtWidgets.QLabel("Rotation Y ")
SliderRandomRy_HLyt.addWidget(Random_label)
try:
getValueR = mc.getAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationY")
except:
getValueR = 0
self.RandomRy_Slider = QtWidgets.QSlider()
self.RandomRy_Slider.setMinimum(0)
self.RandomRy_Slider.setMaximum(360)
self.RandomRy_Slider.setProperty("value", getValueR)
self.RandomRy_Slider.setOrientation(QtCore.Qt.Horizontal)
self.RandomRy_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.RandomRy_Slider.setTickInterval(1)
self.RandomRy_Slider.setFixedHeight(22)
self.RandomRy_Slider.valueChanged.connect(self.SliderRotRandomY_Action)
SliderRandomRy_HLyt.addWidget(self.RandomRy_Slider)
self.RandomRy_SpinBox = QtWidgets.QDoubleSpinBox()
self.RandomRy_SpinBox.setDecimals(1)
self.RandomRy_SpinBox.setFixedWidth(40)
self.RandomRy_SpinBox.setFixedHeight(18)
self.RandomRy_SpinBox.setRange(0, 1000)
self.RandomRy_SpinBox.setValue(getValueR)
self.RandomRy_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.RandomRy_SpinBox.editingFinished.connect(self.SpinRotRandomY_Action)
SliderRandomRy_HLyt.addWidget(self.RandomRy_SpinBox)
# ___________________________________________## RANDOM ROTATION Z
# ___________________________________________##
SliderRandomRz_HLyt = QtWidgets.QHBoxLayout(self)
LINEAR_MLyt.addLayout(SliderRandomRz_HLyt)
Random_label = QtWidgets.QLabel("Rotation Z ")
SliderRandomRz_HLyt.addWidget(Random_label)
try:
getValueR = mc.getAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationZ")
except:
getValueR = 0
self.RandomRz_Slider = QtWidgets.QSlider()
self.RandomRz_Slider.setMinimum(0)
self.RandomRz_Slider.setMaximum(360)
self.RandomRz_Slider.setProperty("value", getValueR)
self.RandomRz_Slider.setOrientation(QtCore.Qt.Horizontal)
self.RandomRz_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.RandomRz_Slider.setTickInterval(1)
self.RandomRz_Slider.setFixedHeight(22)
self.RandomRz_Slider.valueChanged.connect(self.SliderRotRandomZ_Action)
SliderRandomRz_HLyt.addWidget(self.RandomRz_Slider)
self.RandomRz_SpinBox = QtWidgets.QDoubleSpinBox()
self.RandomRz_SpinBox.setDecimals(1)
self.RandomRz_SpinBox.setFixedWidth(40)
self.RandomRz_SpinBox.setFixedHeight(18)
self.RandomRz_SpinBox.setRange(0, 1000)
self.RandomRz_SpinBox.setValue(getValueR)
self.RandomRz_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.RandomRz_SpinBox.editingFinished.connect(self.SpinRotRandomZ_Action)
SliderRandomRz_HLyt.addWidget(self.RandomRz_SpinBox)
#---------------------------------
LINEAR_MLyt.addSpacing(6)
self.BakeButton = QtWidgets.QPushButton()
self.BakeButton.setText(" B A K E ")
self.BakeButton.setFixedHeight(22)
self.BakeButton.setObjectName("StoreSet")
self.BakeButton.clicked.connect(self.Bake)
LINEAR_MLyt.addWidget(self.BakeButton)
LINEAR_MLyt.addStretch()
def SliderNumber_Action(self):
NumberValue = self.Number_Slider.value()
self.Number_SpinBox.setValue(NumberValue)
self.SpinBoxA_Action()
def SpinBoxA_Action(self):
SpinBoxAValue = self.Number_SpinBox.value()
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Distribute.pointCount", SpinBoxAValue)
self.Number_Slider.setValue(SpinBoxAValue)
self.Number_SpinBox.clearFocus()
def SliderPosRandom_Action(self):
NumberValue = self.RandomP_Slider.value()
self.RandomP_SpinBox.setValue(NumberValue)
self.SpinPosRandom_Action()
def SpinPosRandom_Action(self):
SpinBoxValue = self.RandomP_SpinBox.value()
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.positionX", SpinBoxValue)
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.positionY", SpinBoxValue)
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.positionZ", SpinBoxValue)
self.RandomP_Slider.setValue(SpinBoxValue)
self.RandomP_SpinBox.clearFocus()
def SliderRotRandomX_Action(self):
NumberValue = self.RandomRx_Slider.value()
self.RandomRx_SpinBox.setValue(NumberValue)
self.SpinRotRandomX_Action()
def SpinRotRandomX_Action(self):
SpinBoxValue = self.RandomRx_SpinBox.value()
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationX", SpinBoxValue)
self.RandomRx_Slider.setValue(SpinBoxValue)
self.RandomRx_SpinBox.clearFocus()
def SliderRotRandomY_Action(self):
NumberValue = self.RandomRy_Slider.value()
self.RandomRy_SpinBox.setValue(NumberValue)
self.SpinRotRandomY_Action()
def SpinRotRandomY_Action(self):
SpinBoxValue = self.RandomRy_SpinBox.value()
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationY", SpinBoxValue)
self.RandomRy_Slider.setValue(SpinBoxValue)
self.RandomRy_SpinBox.clearFocus()
def SliderRotRandomZ_Action(self):
NumberValue = self.RandomRz_Slider.value()
self.RandomRz_SpinBox.setValue(NumberValue)
self.SpinRotRandomZ_Action()
def SpinRotRandomZ_Action(self):
SpinBoxValue = self.RandomRz_SpinBox.value()
mc.setAttr("ModIt_Duplicate_Radial" + str(Num) + "_Random.rotationZ", SpinBoxValue)
self.RandomRz_Slider.setValue(SpinBoxValue)
self.RandomRz_SpinBox.clearFocus()
def get_locatorOrign(self):
mc.select("ModIt_Radial_OrignLoc" + str(Num))
def get_locatorTarget(self):
mc.select("ModIt_Radial_Loc" + str(Num))
def Bake(self):
MashInstancer = "ModIt_Duplicate_Radial" + Num + "_Instancer"
mc.select(MashInstancer)
import maya.mel as mel
mel.eval('MASHBakeGUI;')
mc.select(MashInstancer)
import MASHbakeInstancer;
MASHbakeInstancer.MASHbakeInstancer(False)
mc.deleteUI("mashBakeStill", window=True)
mc.select("ModIt_Duplicate_Radial" + Num + "_Instancer_objects")
mc.CenterPivot()
mc.delete(ch=True)
mc.rename("ModIt_Radial_1")
mc.delete("ModIt_Radial_OrignLoc" + Num)
if mc.window("Radial Duplication", exists=True):
mc.deleteUI("Radial Duplication")
def Dock(Widget, width=200, height=200, hp="free", show=True):
label = getattr(Widget, "label", WindowsTitle)
try:
mc.deleteUI(WindowsTitle)
except RuntimeError:
pass
dockControl = mc.workspaceControl(
WindowsTitle,
initialWidth=width,
minimumWidth=False,
widthProperty=hp,
heightProperty=hp,
label=label
)
dockPtr = omui.MQtUtil.findControl(dockControl)
dockWidget = QtCompat.wrapInstance(int(dockPtr), QtWidgets.QWidget)
dockWidget.setAttribute(QtCore.Qt.WA_DeleteOnClose)
child = Widget(dockWidget)
dockWidget.layout().addWidget(child)
if show:
mc.evalDeferred(
lambda *args: mc.workspaceControl(
dockControl,
edit=True,
widthProperty="free",
restore=True
)
)
return child
def showUI():
ui = Dock(Radial_UI)
ui.show()
# Get a pointer and convert it to Qt Widget object
qw = omui.MQtUtil.findWindow(WindowsTitle)
widget = wrapInstance(int(qw), QWidget)
# Create a QIcon object
icon = QIcon(IconPath + "ModIt_Window_Ico.png")
# Assign the icon
widget.setWindowIcon(icon)
return ui