##-------------------------------------------------------------------------- # Import Qt from project's unified Qt.py module import sys as _sys import os as _os # Add parent scripts directory to sys.path _modit_dir = _os.path.dirname(_os.path.abspath(__file__)) _scripts_dir = _modit_dir while _os.path.basename(_scripts_dir) != 'scripts' and _scripts_dir != _os.path.dirname(_scripts_dir): _scripts_dir = _os.path.dirname(_scripts_dir) if _scripts_dir not in _sys.path: _sys.path.insert(0, _scripts_dir) from Qt import QtWidgets, QtCore, QtGui, QtCompat # Use QtCompat for cross-version compatibility wrapInstance = QtCompat.wrapInstance QIcon = QtGui.QIcon QWidget = QtWidgets.QWidget 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)