Files
Nexus/2025/scripts/modeling_tools/ModIt/Modeling/Section_UTILITIES.py
2025-12-05 08:08:44 +08:00

235 lines
9.4 KiB
Python

##--------------------------------------------------------------------------
try:
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from shiboken6 import wrapInstance
except ImportError:
from PySide2 import QtWidgets, QtCore, QtGui
from shiboken2 import wrapInstance
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QWidget
import shiboken2
from maya import cmds as mc
import maya.mel as mel
import json
import os
import maya.cmds as cmds
from functools import partial
import importlib
from .. import ModIt_Global
importlib.reload(ModIt_Global)
from .. import ModIt_CSS
importlib.reload(ModIt_CSS)
##______________________GLOBAL VAR
##PATH_SET
IconPath = ModIt_Global.IconsPathThemeClassic
PreferencePath = ModIt_Global.PreferencePath
ToolsPath = ModIt_Global.ToolPath
# ******************************************
# BUTTONS PARAMS
# ******************************************
iconFixeSize = 32
iconButtonSize = 32
separatorWidth = ModIt_Global.separatorWidth
##JSON PREF DATA
PRIM_MODE =(json.load(open(PreferencePath + 'Setting_Primitives_Placement.json',"r"))['PRIM_MODE'])
PRIM_SIZE =(json.load(open(PreferencePath + 'Setting_Primitives_Size.json',"r"))['PRIM_SIZE'])
class MyCustomBtn_Widget(QtWidgets.QPushButton):
def __init__(self):
super().__init__()
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
def mousePressEvent(self, event):
super().mousePressEvent(event)
if event.button() == QtCore.Qt.RightButton:
# emit the signal, we can grab the pos directly from the event, no need to get cursor position anymore
self.customContextMenuRequested.emit(event.pos())
# make a call to mouseRelease event to restore button back to its original state
self.mouseReleaseEvent(event)
#def enterEvent(self, event):
# print("ENTER EVENT")
#def leaveEvent(self, event):
# print("LEAVE EVENT")
class UTILITIES_LAYOUT(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
SECTION_UTILITIES_LAYOUT = QtWidgets.QHBoxLayout() # MAIN
SECTION_UTILITIES_LAYOUT.setContentsMargins(10,0,0,10)
SECTION_UTILITIES_LAYOUT.setSpacing(0)
self.setLayout(SECTION_UTILITIES_LAYOUT)
##-------------------------------------------------------------------------------- HISTORY
self.DelHistory_btn = MyCustomBtn_Widget()
self.DelHistory_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.DelHistory_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.DelHistory_btn.setIcon(QtGui.QIcon(IconPath + "Util_Historique.png"))
self.DelHistory_btn.setToolTip(" Delete History on Selection ")
self.DelHistory_btn.clicked.connect(mc.DeleteHistory)
SECTION_UTILITIES_LAYOUT.addWidget(self.DelHistory_btn)
# C O N N E C T P O P U P M E N U T O O U R B U T T O N
self.DelHistory_btn.customContextMenuRequested.connect(self.showPopup_DelHisto)
# CUBE M E N U I T E M S
self.popupMenu_DelHisto = QtWidgets.QMenu()
DelHisto_Entry_1 = self.popupMenu_DelHisto.addAction("Delete All")
DelHisto_Entry_1.triggered.connect(mc.DeleteAllHistory)
##-------------------------------------------------------------------------------- FREEZE
self.FreezeTransform_btn = MyCustomBtn_Widget()
self.FreezeTransform_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.FreezeTransform_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.FreezeTransform_btn.setIcon(QtGui.QIcon(IconPath + "Util_FreezeT.png"))
self.FreezeTransform_btn.setToolTip(" Freeze Transformation on Selection ")
self.FreezeTransform_btn.clicked.connect(mc.FreezeTransformations)
SECTION_UTILITIES_LAYOUT.addWidget(self.FreezeTransform_btn)
##-------------------------------------------------------------------------------- CENTER PIVOT
self.CenterPivot_btn = MyCustomBtn_Widget()
self.CenterPivot_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.CenterPivot_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.CenterPivot_btn.setIcon(QtGui.QIcon(IconPath + "Util_AlignPivot.png"))
self.CenterPivot_btn.setToolTip(" Center Pivot ")
self.CenterPivot_btn.clicked.connect(mc.CenterPivot)
SECTION_UTILITIES_LAYOUT.addWidget(self.CenterPivot_btn)
# C O N N E C T P O P U P M E N U T O O U R B U T T O N
self.CenterPivot_btn.customContextMenuRequested.connect(self.showPopup_CenterPivot)
# CUBE M E N U I T E M S
self.popupMenu_CenterPivot = QtWidgets.QMenu()
CenterPivot_Entry_1 = self.popupMenu_CenterPivot.addAction("Center Pivot at Base")
CenterPivot_Entry_1.triggered.connect(self.PivotBottom)
CenterPivot_Entry_2 = self.popupMenu_CenterPivot.addAction("Center Pivot at Base and Grid")
CenterPivot_Entry_2.triggered.connect(self.PivotGrid)
##-------------------------------------------------------------------------------- OPTIMIZE
self.Optimize_btn = QtWidgets.QPushButton()
self.Optimize_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.Optimize_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.Optimize_btn.setIcon(QtGui.QIcon(IconPath + "Util_Optimize.png"))
self.Optimize_btn.setToolTip(" Optimize Scene ")
self.Optimize_btn.clicked.connect(mc.OptimizeScene)
SECTION_UTILITIES_LAYOUT.addWidget(self.Optimize_btn)
##-------------------------------------------------------------------------------- BTOA
self.BtoA_btn = MyCustomBtn_Widget()
self.BtoA_btn.setFixedSize(iconFixeSize, iconFixeSize)
self.BtoA_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
self.BtoA_btn.setIcon(QtGui.QIcon(IconPath + "Util_BtoA.png"))
self.BtoA_btn.setToolTip(" Match Position and Rotation ")
self.BtoA_btn.clicked.connect(self.MatchPosRot)
SECTION_UTILITIES_LAYOUT.addWidget(self.BtoA_btn)
# C O N N E C T P O P U P M E N U T O O U R B U T T O N
self.BtoA_btn.customContextMenuRequested.connect(self.showPopup_BtoA)
# CUBE M E N U I T E M S
self.popupMenu_BtoA = QtWidgets.QMenu()
BtoA_Entry_1 = self.popupMenu_BtoA.addAction("Match All Transforms")
BtoA_Entry_1.triggered.connect(mc.MatchTransform)
BtoA_Entry_2 = self.popupMenu_BtoA.addAction("Match Pivots")
BtoA_Entry_2.triggered.connect(mc.MatchPivots)
SECTION_UTILITIES_LAYOUT.addSpacing(4)
self.Separator = QtWidgets.QLabel()
self.Separator.setFixedSize(1,30)
self.Separator.setStyleSheet("background-color:#434343;")
SECTION_UTILITIES_LAYOUT.addWidget(self.Separator)
SECTION_UTILITIES_LAYOUT.addSpacing(4)
##-------------------------------------------------------------------------------- SHOW
self.DisplayShow_btn = QtWidgets.QPushButton()
self.DisplayShow_btn.setFixedSize(30, 30)
self.DisplayShow_btn.setIconSize(QtCore.QSize(30, 30))
self.DisplayShow_btn.setIcon(QtGui.QIcon(IconPath + "Display_Show.png"))
self.DisplayShow_btn.setToolTip(" Show All Hidden Object ")
self.DisplayShow_btn.clicked.connect(mc.ShowAll)
SECTION_UTILITIES_LAYOUT.addWidget(self.DisplayShow_btn)
##-------------------------------------------------------------------------------- HIDE
self.DisplayHide_btn = QtWidgets.QPushButton()
self.DisplayHide_btn.setFixedSize(30, 30)
self.DisplayHide_btn.setIconSize(QtCore.QSize(30, 30))
self.DisplayHide_btn.setIcon(QtGui.QIcon(IconPath + "Display_Hide.png"))
self.DisplayHide_btn.setToolTip(" Hide Unselected Objects ")
self.DisplayHide_btn.clicked.connect(mc.HideUnselectedObjects)
SECTION_UTILITIES_LAYOUT.addWidget(self.DisplayHide_btn)
#------------------------------------------------
##---------------------------------------------------- D E F I N I T I O N
#------------------------------------------------ MENU
def showPopup_CenterPivot(self, position):
self.popupMenu_CenterPivot.exec_(self.CenterPivot_btn.mapToGlobal(position))
self.CenterPivot_btn.update()
def showPopup_DelHisto(self, position):
self.popupMenu_DelHisto.exec_(self.DelHistory_btn.mapToGlobal(position))
self.DelHistory_btn.update()
def showPopup_BtoA(self, position):
self.popupMenu_BtoA.exec_(self.BtoA_btn.mapToGlobal(position))
self.BtoA_btn.update()
#------------------------------------------------ ACTIONS
def BAM(self):
print("BAMMM")
def PivotBottom(self):
sel = mc.ls(sl=True)
bbox = mc.exactWorldBoundingBox(sel)
bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2]
mc.xform(sel, piv=bottom, ws=True)
def PivotGrid(self):
sel = mc.ls(sl=True)
bbox = mc.exactWorldBoundingBox(sel)
bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2]
mc.xform(sel, piv=bottom, ws=True)
mc.move(0, 0, 0, sel, rpr=True)
def MatchPosRot(self):
mc.undoInfo(openChunk=True, infinity=True)
mc.MatchTranslation()
mc.MatchRotation()
mc.undoInfo(closeChunk=True)