##-------------------------------------------------------------------------- ## ScriptName : PlugIt ## Author : Wizix ## LastUpdate : 13/02/23 ## Version : 3.0.2 ##-------------------------------------------------------------------------- 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 import maya.cmds as cmds 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 from . import PlugIt_Global import importlib importlib.reload(PlugIt_Global) from . import PlugIt_CSS importlib.reload(PlugIt_CSS) from . import PlugIt_Widgets import importlib importlib.reload(PlugIt_Widgets) from . import PlugIt_Setting importlib.reload(PlugIt_Setting) from . import PlugIt_AddAsset importlib.reload(PlugIt_AddAsset) from . import PlugIt_NewTab importlib.reload(PlugIt_NewTab) from . import PlugIt_NewSecondTab importlib.reload(PlugIt_NewSecondTab) from . import PlugIt_SavePopUp importlib.reload(PlugIt_SavePopUp) ##---------------------------------------------------------------------------------------------------------------- G L O B A L V A R I A B L E S IconPath = PlugIt_Global.IconsPathThemeClassic PreferencePath = PlugIt_Global.PreferencePath LIBRARY_PATH = PlugIt_Global.LIBRARY_PATH ASSET_FAVOURITES_PATH = PlugIt_Global.ASSET_FAVOURITES_PATH ACTIVESUBTAB = 0 ACTIVESUBTAB_NAME = "" MAYA_VERSION = mc.about(v=True) MAIN_TAB_OPEN =(json.load(open(PreferencePath + 'TAB_MAIN_ID.json',"r"))['VALUE']) if MAIN_TAB_OPEN ==0: TAB_OPEN_SECOND = (json.load(open(PreferencePath + 'TAB_PLUGIT_SECOND_ID.json',"r"))['VALUE']) else: TAB_OPEN_SECOND = (json.load(open(PreferencePath + 'TAB_USER_SECOND_ID.json',"r"))['VALUE']) ##---------------------------------------------------------------------------------------------------------------- B U I L D U I class PlugIt_UI(QtWidgets.QDialog): def __init__(self, parent=None): super(PlugIt_UI, self).__init__() self.allListWidets = [] self.setMinimumSize(300, 400) self.buildUI() self.firstTab.setCurrentIndex(MAIN_TAB_OPEN) self.secondTab.setCurrentIndex(TAB_OPEN_SECOND) open(PreferencePath + 'ScriptJob_1x1.json', "w").write(json.dumps({"VALUE": 1111})) def buildUI(self): ##_________________________________________________________________________________ UI VALUE self.setStyleSheet(PlugIt_Global.Theme) iconButtonSize = PlugIt_Global.IconButtonSize separatorWidth = 1 ##_________________________________________________________________________________ LAYOUTS self.MAIN_Lyt = QtWidgets.QVBoxLayout() self.setLayout(self.MAIN_Lyt) self.MAIN_Lyt.setContentsMargins(6, 6, 6, 6) self.TOOLBAR_HLyt = QtWidgets.QHBoxLayout() self.MAIN_Lyt.addLayout(self.TOOLBAR_HLyt) ##_________________________________________________________________________________ TOOLBAR ## BTN SETTING self.SettingBTN = QtWidgets.QPushButton() self.SettingBTN.setFixedSize(iconButtonSize,iconButtonSize) self.SettingBTN.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SettingBTN.setIcon(QtGui.QIcon(IconPath + "BatchProcess.png")) self.SettingBTN.clicked.connect(self.Setting_Window) self.SettingBTN.setToolTip(" Setting Window ") self.TOOLBAR_HLyt.addWidget(self.SettingBTN) ## SEPARATOR self.Separator = QtWidgets.QPushButton() self.Separator.setFixedSize(separatorWidth,iconButtonSize) self.Separator.setObjectName("Separator") self.Separator.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png")) self.Separator.setEnabled(0) self.TOOLBAR_HLyt.addWidget(self.Separator) ## BTN UNDO PLUG self.UndoPlug_Btn = QtWidgets.QPushButton() self.UndoPlug_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.UndoPlug_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.UndoPlug_Btn.setIcon(QtGui.QIcon(IconPath + "Undo_ON.png")) self.UndoPlug_Btn.clicked.connect(self.UndoPlug) self.UndoPlug_Btn.setToolTip(" Undo last Plug ") self.TOOLBAR_HLyt.addWidget(self.UndoPlug_Btn) ## BTN LIBRARY FOLDER self.LibFolderBTN = QtWidgets.QPushButton() self.LibFolderBTN.setFixedSize(iconButtonSize,iconButtonSize) self.LibFolderBTN.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.LibFolderBTN.setIcon(QtGui.QIcon(IconPath + "Folder2.png")) self.LibFolderBTN.clicked.connect(self.OpenLibFolder) self.LibFolderBTN.setToolTip(" Open Library Folder ") self.TOOLBAR_HLyt.addWidget(self.LibFolderBTN) ## SEPARATOR self.Separator = QtWidgets.QPushButton() self.Separator.setFixedSize(separatorWidth,iconButtonSize) self.Separator.setObjectName("Separator") self.Separator.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png")) self.Separator.setEnabled(0) self.TOOLBAR_HLyt.addWidget(self.Separator) PLUG_MODE = (json.load(open(PreferencePath + 'PLUG_MODE.json', "r"))['VALUE']) ## MODE : CLASSIC self.ModeClassic_Btn = QtWidgets.QPushButton() self.ModeClassic_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.ModeClassic_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) if PLUG_MODE == 0: self.ModeClassic_Btn.setIcon(QtGui.QIcon(IconPath + "Plug_Mode_ON.png")) else: self.ModeClassic_Btn.setIcon(QtGui.QIcon(IconPath + "Plug_Mode_OFF.png")) self.ModeClassic_Btn.clicked.connect(self.set_ModeClassic) self.ModeClassic_Btn.setToolTip(" Classic Mode : Insert Plugs on clean mesh with options ") self.TOOLBAR_HLyt.addWidget(self.ModeClassic_Btn) ## MODE : x1 self.ModeX1_Btn = QtWidgets.QPushButton() self.ModeX1_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.ModeX1_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) if PLUG_MODE == 1: self.ModeX1_Btn.setIcon(QtGui.QIcon(IconPath + "x1Mode_ON.png")) else: self.ModeX1_Btn.setIcon(QtGui.QIcon(IconPath + "x1Mode_OFF.png")) self.ModeX1_Btn.clicked.connect(self.set_ModeX1) self.ModeX1_Btn.setToolTip(" x1 Mode : Quick one click insert Plugs on one face ") self.TOOLBAR_HLyt.addWidget(self.ModeX1_Btn) ## MODE : DRAG self.ModeDrag_Btn = QtWidgets.QPushButton() self.ModeDrag_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.ModeDrag_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) if PLUG_MODE == 2: self.ModeDrag_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_ON.png")) else: self.ModeDrag_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_OFF.png")) self.ModeDrag_Btn.clicked.connect(self.set_ModeDrag) self.ModeDrag_Btn.setToolTip(" Drag Mode : Drag Plug placement on NGon face // SHIFT = Scale // CTRL = Rotate ") VERSION = mc.about(v=True) #WAITING FOR PYMEL 2024 SUPPORT if VERSION == "2024": pass else: self.TOOLBAR_HLyt.addWidget(self.ModeDrag_Btn) ## SEPARATOR self.Separator = QtWidgets.QPushButton() self.Separator.setFixedSize(separatorWidth,iconButtonSize) self.Separator.setObjectName("Separator") self.Separator.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png")) self.Separator.setEnabled(0) self.TOOLBAR_HLyt.addWidget(self.Separator) ## BTN CREATE PLUG self.CreatePlugBTN = QtWidgets.QPushButton() self.CreatePlugBTN.setFixedSize(iconButtonSize,iconButtonSize) self.CreatePlugBTN.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.CreatePlugBTN.setIcon(QtGui.QIcon(IconPath + "AddAsset2.png")) self.CreatePlugBTN.setToolTip(" Create Plug ") self.CreatePlugBTN.clicked.connect(self.SavedBefore_PlugCreation) self.TOOLBAR_HLyt.addWidget(self.CreatePlugBTN, alignment=QtCore.Qt.AlignRight) ##---------------------------------------------------- SEPARATOR : Horizontal self.MAIN_Lyt.addSpacing(2) separator = QtWidgets.QLabel('') separator.setStyleSheet( "QLabel {background-color: #313131; padding: 0; margin: 0; border-bottom: 1 solid #262626; border-top: 1 solid #313131;}") separator.setMaximumHeight(1) self.MAIN_Lyt.addWidget(separator) self.MAIN_Lyt.addSpacing(2) ##----------------------------------------------------------------------------------------/ D R A G M O D E : O P T I O N B A R self.DragMode_WIDGET = QtWidgets.QWidget() self.MAIN_Lyt.addWidget(self.DragMode_WIDGET) self.DragMode_VMAINLyt = QtWidgets.QVBoxLayout(self.DragMode_WIDGET) self.DragMode_VMAINLyt.setContentsMargins(0, 0, 0, 0) self.DragMode_HLyt = QtWidgets.QHBoxLayout() self.DragMode_VMAINLyt.addLayout(self.DragMode_HLyt) self.DragMode_HLyt.setContentsMargins(0, 0, 0, 0) self.DragMode_HLyt.setSpacing(5)# BETWEEN SECTIONS self.DragMode_HLyt.setAlignment(QtCore.Qt.AlignTop) ## BTN FLIP DRAGMODE_FLIP = (json.load(open(PreferencePath + 'DRAGMODE_Flip.json', "r"))['VALUE']) self.DragOption_Flip_Btn = QtWidgets.QPushButton() self.DragOption_Flip_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.DragOption_Flip_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) if DRAGMODE_FLIP == 0: self.DragOption_Flip_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_FlipOption_OFF.png")) else: self.DragOption_Flip_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_FlipOption_ON.png")) self.DragOption_Flip_Btn.clicked.connect(self.set_ModeDrag_Flip) self.DragOption_Flip_Btn.setToolTip(" Positive or Negative Plug ") self.DragMode_HLyt.addWidget(self.DragOption_Flip_Btn) ## Separator : Vertical self.Separator = QtWidgets.QPushButton() self.Separator.setFixedSize(separatorWidth,iconButtonSize) self.Separator.setObjectName("Separator") self.Separator.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png")) self.Separator.setEnabled(0) self.DragMode_HLyt.addWidget(self.Separator) ##_________________________________________________________________________________ ## SCALE SLIDER DRAGMODE_SIZE = (json.load(open(PreferencePath + 'DRAGMODE_Size.json', "r"))['VALUE']) ##------------------------------------------------------------: LABEL Scale_Label = QtWidgets.QLabel("Size : ") Scale_Label.setStyleSheet("color:#909090;") Scale_Label.setFont(QtGui.QFont('Calibri', 9)) self.DragMode_HLyt.addWidget(Scale_Label) ##------------------------------------------------------------: SLIDER self.Scale_Slider = QtWidgets.QSlider() self.Scale_Slider.setMinimum(10) self.Scale_Slider.setMaximum(1000) self.Scale_Slider.setProperty("value", DRAGMODE_SIZE*100) self.Scale_Slider.setOrientation(QtCore.Qt.Horizontal) self.Scale_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove) self.Scale_Slider.setTickInterval(1) self.Scale_Slider.setFixedHeight(22) self.Scale_Slider.valueChanged.connect(self.set_Slider) self.DragMode_HLyt.addWidget(self.Scale_Slider) ##------------------------------------------------------------: SPINBOX self.Scale_SpinBox = QtWidgets.QDoubleSpinBox() self.Scale_SpinBox.setDecimals(2) self.Scale_SpinBox.setFixedWidth(45) self.Scale_SpinBox.setFixedHeight(18) self.Scale_SpinBox.setRange(0.1, 1000) self.Scale_SpinBox.setValue(DRAGMODE_SIZE) self.Scale_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.Scale_SpinBox.editingFinished.connect(self.set_SpinBox) self.DragMode_HLyt.addWidget(self.Scale_SpinBox) ##_________________________________________________________________________________ ROTATE LINE self.DragMode_HLyt2 = QtWidgets.QHBoxLayout() self.DragMode_VMAINLyt.addLayout(self.DragMode_HLyt2) self.DragMode_HLyt2.setContentsMargins(0, 0, 0, 0) self.DragMode_HLyt2.setSpacing(5)# BETWEEN SECTIONS self.DragMode_HLyt2.setAlignment(QtCore.Qt.AlignTop) ## BTN ROTATE STEP self.DragOption_Rotate_Btn = QtWidgets.QPushButton() self.DragOption_Rotate_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.DragOption_Rotate_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.DragOption_Rotate_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_RotateStep_ON.png")) self.DragOption_Rotate_Btn.clicked.connect(self.set_Defualt15Rotate) self.DragOption_Rotate_Btn.setToolTip(" Set Rotate Step to Default 15° ") self.DragMode_HLyt2.addWidget(self.DragOption_Rotate_Btn) ## Separator : Vertical self.Separator = QtWidgets.QPushButton() self.Separator.setFixedSize(separatorWidth,iconButtonSize) self.Separator.setObjectName("Separator") self.Separator.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png")) self.Separator.setEnabled(0) self.DragMode_HLyt2.addWidget(self.Separator) DRAGMODE_ROTATE = (json.load(open(PreferencePath + 'DRAGMODE_Rotate.json', "r"))['VALUE']) ##------------------------------------------------------------: LABEL Rotation_Label = QtWidgets.QLabel("Rotation Step : ") Rotation_Label.setStyleSheet("color:#909090;") Rotation_Label.setFont(QtGui.QFont('Calibri', 9)) self.DragMode_HLyt2.addWidget(Rotation_Label) ##------------------------------------------------------------: SLIDER self.Rotation_Slider = QtWidgets.QSlider() self.Rotation_Slider.setMinimum(1) self.Rotation_Slider.setMaximum(9000) self.Rotation_Slider.setProperty("value", DRAGMODE_ROTATE*100) self.Rotation_Slider.setOrientation(QtCore.Qt.Horizontal) self.Rotation_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove) self.Rotation_Slider.setTickInterval(1) self.Rotation_Slider.setFixedHeight(22) self.Rotation_Slider.valueChanged.connect(self.set_Slider_Rotate) self.DragMode_HLyt2.addWidget(self.Rotation_Slider) ##------------------------------------------------------------: SPINBOX self.Rotation_SpinBox = QtWidgets.QDoubleSpinBox() self.Rotation_SpinBox.setDecimals(0) self.Rotation_SpinBox.setFixedWidth(45) self.Rotation_SpinBox.setFixedHeight(18) self.Rotation_SpinBox.setRange(1, 9000) self.Rotation_SpinBox.setValue(DRAGMODE_ROTATE) self.Rotation_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.Rotation_SpinBox.editingFinished.connect(self.set_SpinBox_Rotate) self.DragMode_HLyt2.addWidget(self.Rotation_SpinBox) ##_________________________________________________________________________________ OPTION HIDE/SHOW DRAGMODE_VISIBILITY = (json.load(open(PreferencePath + 'DRAGMODE_Widget.json', "r"))['VALUE']) if DRAGMODE_VISIBILITY == 0: self.DragMode_WIDGET.hide() else: self.DragMode_WIDGET.show() ##_________________________________________________________________________________ TABS self.firstTab = QtWidgets.QTabWidget(self) try: self.firstLevelFolderList = os.listdir(LIBRARY_PATH) except: os.mkdir(str(LIBRARY_PATH)) os.mkdir(str(LIBRARY_PATH) + "/MAINTAB") os.mkdir(str(LIBRARY_PATH) + "/MAINTAB" + "/SecondTab") self.firstLevelFolderList = os.listdir(LIBRARY_PATH) PlugIt_Global.WarningWindow("The Script lost link to your Asset Library folder. A default new one is create.", 500) #EMPTY FOLDER CHOOSEN if self.firstLevelFolderList == [] : os.mkdir(str(LIBRARY_PATH) + "/MAINTAB") os.mkdir(str(LIBRARY_PATH) + "/MAINTAB" + "/SecondTab") from . import PlugIt_UI import importlib importlib.reload(PlugIt_UI) PlugIt_UI.showUI() #FIRST LEVEL TABS for i in self.firstLevelFolderList: firstTab_path = LIBRARY_PATH + "/" + i try: self.secondLevelFolderList = os.listdir(firstTab_path) self.secondTab = QtWidgets.QTabWidget(self) if self.secondLevelFolderList == []: os.mkdir(str(firstTab_path) + "/SecondTab") from . import PlugIt_UI import importlib importlib.reload(PlugIt_UI) PlugIt_UI.showUI() #SECOND LEVEL TABS for j in self.secondLevelFolderList: secondTab_path = firstTab_path + "/" + j os.listdir(secondTab_path) widget = PlugIt_Widgets.PlugIt_ListWidget(path=secondTab_path, parent=self) self.allListWidets.append(widget) self.addTabAuto(parentTabWidget=self.secondTab, childWidget=widget, tabName=j) self.secondTab.setCurrentIndex(TAB_OPEN_SECOND) #ADD TABS BUTTON SECOND TAB plus_lb2 = QtWidgets.QLabel("") self.secondTab.addTab(plus_lb2, "+") plus_index2 = self.secondTab.indexOf(plus_lb2) self.secondTab.setTabEnabled(plus_index2, True) self.addTabAuto(parentTabWidget=self.firstTab, childWidget=self.secondTab, tabName=i) self.secondTab.currentChanged.connect(partial(self.get_SubTabIndex, self.secondTab)) self.secondTab.currentChanged.connect(self.SaveTabChange) self.secondTab.currentChanged.connect(self.Add_New_Second_Tabs) except: widget = PlugIt_Widgets.PlugIt_ListWidget(path=firstTab_path, parent=self) self.allListWidets.append(widget) self.addTabAuto(parentTabWidget=self.firstTab, childWidget=widget, tabName=i) ##TABS SETTING self.firstTab.currentChanged.connect(self.SaveTabChange) self.secondTab.currentChanged.connect(self.Add_New_Tabs) self.MAIN_Lyt.addWidget(self.firstTab) ##_________________________________________________________________________________ TAB FAVOURITE favouriteFilePath = ASSET_FAVOURITES_PATH with open(favouriteFilePath, 'r+') as file: pathString = file.read() self.favouritesWidget = PlugIt_Widgets.PlugIt_ListWidget(path=pathString, parent=self) self.allListWidets.append(self.favouritesWidget) self.firstTab.addTab(self.favouritesWidget, "❤") ##_________________________________________________________________________________ SLIDER SliderUserPref = open(PreferencePath + 'SliderUserPref.json', "r") SliderUserValue_pref = json.load(SliderUserPref) SLIDER_VALUE = (SliderUserValue_pref['SLIDER_VALUE']) self.sizeSlider = QtWidgets.QSlider() self.sizeSlider.setMaximum(18)#18 self.sizeSlider.setMinimum(5)#6 self.sizeSlider.setProperty("value", SLIDER_VALUE) self.sizeSlider.setOrientation(QtCore.Qt.Horizontal) self.sizeSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) self.sizeSlider.setTickInterval(1) self.sizeSlider.valueChanged.connect(self.adjustIconSize) self.adjustIconSize() self.MAIN_Lyt.addWidget(self.sizeSlider) ##_________________________________________________________ ##____________________________________________________________________________________________________ DEFINITIONS ##_________________________________________________________ def SavedBefore_PlugCreation(self): ArnoldIsLoad = mc.pluginInfo("mtoa.mll", query=True, loaded=True) if ArnoldIsLoad == False: PlugIt_Global.WarningWindow("Arnold Mtoa Module should be load to create Plug") # if mc.objExists("PlugIt_ThumbScene"): # importlib.reload(PlugIt_AddAsset) # PlugIt_AddAsset.showUI() else: PlugIt_SavePopUp.showUI() def set_ModeClassic(self): open(PreferencePath + 'PLUG_MODE.json', "w").write(json.dumps({"VALUE" : 0})) self.ModeClassic_Btn.setIcon(QtGui.QIcon(IconPath + "Plug_Mode_ON.png")) self.ModeX1_Btn.setIcon(QtGui.QIcon(IconPath + "x1Mode_OFF.png")) self.ModeDrag_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_OFF.png")) self.DragMode_WIDGET.hide() open(PreferencePath + 'DRAGMODE_Widget.json', "w").write(json.dumps({"VALUE": 0})) SCRIPT_JOB_PREVIOUS = (json.load(open(PreferencePath + 'ScriptJob_1x1.json', "r"))['VALUE']) if SCRIPT_JOB_PREVIOUS == 1111: pass else: mc.scriptJob(kill=SCRIPT_JOB_PREVIOUS, force=True) open(PreferencePath + 'ScriptJob_1x1.json', "w").write(json.dumps({"VALUE": 1111})) def set_ModeX1(self): #if MAYA_VERSION == "2022": # PlugIt_Global.WarningWindow("The x1 mode can only works with Maya 2023 version and higher.", 500) #else: open(PreferencePath + 'PLUG_MODE.json', "w").write(json.dumps({"VALUE" : 1})) self.ModeClassic_Btn.setIcon(QtGui.QIcon(IconPath + "Plug_Mode_OFF.png")) self.ModeX1_Btn.setIcon(QtGui.QIcon(IconPath + "x1Mode_ON.png")) self.ModeDrag_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_OFF.png")) self.DragMode_WIDGET.hide() open(PreferencePath + 'DRAGMODE_Widget.json', "w").write(json.dumps({"VALUE": 1})) def set_ModeDrag(self): open(PreferencePath + 'PLUG_MODE.json', "w").write(json.dumps({"VALUE" : 2})) self.ModeClassic_Btn.setIcon(QtGui.QIcon(IconPath + "Plug_Mode_OFF.png")) self.ModeX1_Btn.setIcon(QtGui.QIcon(IconPath + "x1Mode_OFF.png")) self.ModeDrag_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_ON.png")) self.DragMode_WIDGET.show() open(PreferencePath + 'DRAGMODE_Widget.json', "w").write(json.dumps({"VALUE": 2})) SCRIPT_JOB_PREVIOUS = (json.load(open(PreferencePath + 'ScriptJob_1x1.json', "r"))['VALUE']) if SCRIPT_JOB_PREVIOUS == 1111: pass else: mc.scriptJob(kill=SCRIPT_JOB_PREVIOUS, force=True) open(PreferencePath + 'ScriptJob_1x1.json', "w").write(json.dumps({"VALUE": 1111})) def set_ModeDrag_Flip(self): DRAGMODE_FLIP = (json.load(open(PreferencePath + 'DRAGMODE_Flip.json', "r"))['VALUE']) if DRAGMODE_FLIP == 0: open(PreferencePath + 'DRAGMODE_Flip.json', "w").write(json.dumps({"VALUE" : 1})) self.DragOption_Flip_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_FlipOption_ON.png")) else: open(PreferencePath + 'DRAGMODE_Flip.json', "w").write(json.dumps({"VALUE": 0})) self.DragOption_Flip_Btn.setIcon(QtGui.QIcon(IconPath + "DragMode_FlipOption_OFF.png")) def set_Slider(self): SliderValue = self.Scale_Slider.value()/100 self.Scale_SpinBox.setValue(SliderValue) open(PreferencePath + 'DRAGMODE_Size.json', "w").write(json.dumps({"VALUE": SliderValue})) def set_SpinBox(self): SpinBoxAValue = self.Scale_SpinBox.value()*100 self.Scale_Slider.setValue(SpinBoxAValue) self.Scale_SpinBox.clearFocus() def set_Slider_Rotate(self): SliderValue = self.Rotation_Slider.value()/100 self.Rotation_SpinBox.setValue(SliderValue) open(PreferencePath + 'DRAGMODE_Rotate.json', "w").write(json.dumps({"VALUE": SliderValue})) def set_SpinBox_Rotate(self): SpinBoxAValue = self.Rotation_SpinBox.value()*100 self.Rotation_Slider.setValue(SpinBoxAValue) self.Rotation_SpinBox.clearFocus() def set_Defualt15Rotate(self): open(PreferencePath + 'DRAGMODE_Rotate.json', "w").write(json.dumps({"VALUE": 15})) self.Rotation_Slider.setProperty("value", 1500) def UndoPlug(self): mc.undoInfo(openChunk=True, infinity=True, chunkName="UndoPlug") if mc.objExists("PlugItDupSave_*"): mc.select("PlugItDupSave_*") meshSelect = mc.ls(sl=True)[0] mc.setAttr(meshSelect + ".hiddenInOutliner", 0) mel.eval("AEdagNodeCommonRefreshOutliners();") meshName = meshSelect.split("PlugItDupSave_")[1] mc.select(meshSelect) mc.FreezeTransformations() mc.select(meshSelect, meshName) mc.MatchTransform() mc.delete(meshName) mc.select(meshSelect) mc.ShowSelectedObjects() mc.rename(meshSelect, meshName) mc.select(d=True) if mc.objExists("P_Creation_Ctrl"): mc.delete("P_Creation_Ctrl") if mc.objExists("Plug_AllFaces_set"): mc.delete("Plug_AllFaces_set") if mc.objExists("Plug_EdgeBorder_set"): mc.delete("Plug_EdgeBorder_set") if mc.objExists("Plug_Selection_set"): mc.delete("Plug_Selection_set") if mc.objExists("PlugIt_Plug_Shd"): mc.delete("PlugIt_Plug_Shd") else: print("No Undo Possible") mc.undoInfo(closeChunk=True, chunkName="UndoPlug") def SaveTabChange(self): getFirstTabIndex = self.firstTab.currentIndex() getTabName = self.firstTab.tabText(getFirstTabIndex) FirstTabinfoToSave = {"VALUE" : getFirstTabIndex} s = json.dumps(FirstTabinfoToSave) open(PreferencePath + 'TAB_MAIN_ID.json', "w").write(s) FavTabSave = {"TAB_ACTIVE_NAME" : str(getTabName)} s = json.dumps(FavTabSave) open(PreferencePath + 'KnowFavTab.json', "w").write(s) if getFirstTabIndex == 0: getSecondTabIndex = int(ACTIVESUBTAB) SecondTabinfoToSave = {"VALUE" : getSecondTabIndex} s = json.dumps(SecondTabinfoToSave) open(PreferencePath + 'TAB_PLUGIT_SECOND_ID.json', "w").write(s) else: getSecondTabIndex = int(ACTIVESUBTAB) SecondTabinfoToSave = {"VALUE" : getSecondTabIndex} s = json.dumps(SecondTabinfoToSave) open(PreferencePath + 'TAB_USER_SECOND_ID.json', "w").write(s) def addTabAuto(self, parentTabWidget, childWidget, tabName, insert=False): if insert: parentTabWidget.insertTab(parentTabWidget.count()-3, childWidget, tabName) else: parentTabWidget.addTab(childWidget, tabName) index = parentTabWidget.indexOf(childWidget) def tabPlusButtonClicked(self, parentTabWidget, index): self.tabMenu.popup(QtGui.QCursor.pos(), None) self.closeAction.triggered.connect(partial(self.closeTab, parentTabWidget, index)) def mousePressEvent(self, event): # Override the default Qt function to clearFocus when the clicked widget is not a QLineEdit focused_widget = QtWidgets.QApplication.focusWidget() if isinstance(focused_widget, QtWidgets.QLineEdit): focused_widget.clearFocus() QtWidgets.QMainWindow.mousePressEvent(self, event) def QlineEditClear(self): self.researchBar.clearFocus() def adjustIconSize(self): iconSize = self.sizeSlider.value() * 14 gridSize = iconSize + 5 for i in self.allListWidets: try: i.setGridSize(QtCore.QSize(gridSize, gridSize)) for g in i.buttons: g.setIconSize(QtCore.QSize(iconSize, iconSize)) SliderValueInfoToSave = {"SLIDER_VALUE": self.sizeSlider.value()} s = json.dumps(SliderValueInfoToSave) open(PreferencePath + 'SliderUserPref.json', "w").write(s) except: pass def Setting_Window(self): PlugIt_Setting.showUI() def Refresh(self): from . import PlugIt_UI import importlib importlib.reload(PlugIt_UI) ui = PlugIt_UI.showUI() def OpenLibFolder(self): os.startfile(LIBRARY_PATH) def Add_New_Tabs(self): NumberOfFolder = len(os.listdir(LIBRARY_PATH)) indexValue = int(NumberOfFolder)+2 if self.firstTab.currentIndex() == indexValue: self.firstTab.setCurrentIndex(0) PlugIt_NewTab.showUI() def get_SubTabIndex(self, tab, *args): global ACTIVESUBTAB global ACTIVESUBTAB_NAME SUBINDEX = str(tab.currentIndex()) SUBINDEX_NAME = tab.tabText(int(SUBINDEX)) ACTIVESUBTAB = SUBINDEX ACTIVESUBTAB_NAME = SUBINDEX_NAME return ACTIVESUBTAB + ACTIVESUBTAB_NAME def Add_New_Second_Tabs(self): FirstTabIndex = self.firstTab.currentIndex() FirstTabName = self.firstTab.tabText(FirstTabIndex) NumberOfFolder = len(os.listdir(LIBRARY_PATH + "/" + FirstTabName)) indexValue = int(NumberOfFolder) if ACTIVESUBTAB_NAME == "+" : self.secondTab.setCurrentIndex(0) PlugIt_NewSecondTab.showUI(FirstTabName) def PLUG(self): from . import PlugIt_Plug importlib.reload(PlugIt_Plug) PlugIt_Plug.showUI() def initSceneFirstPlugBug(): print("LAUCHN INIT SCENE") mc.polyCube(n ="PlugIt_InitCube", w =10, h= 10, d= 10, sx= 4, sy= 4, sz= 4) mc.select ("PlugIt_InitCube.f[22]") from . import PlugIt_Plug importlib.reload(PlugIt_Plug) PlugIt_Plug.INIT_PERFORM_PLUG(LIBRARY_PATH + "/PLUGIT/1 - Round/Plug_Circle_01/Plug_Circle_01.ma", 1, 4) #CLEAN if mc.objExists("PlugIt_InitCube"): mc.delete("PlugIt_InitCube") if mc.objExists("Plug_Mesh"): mc.delete("Plug_Mesh") if mc.objExists("PlugIt_FlipY_info"): mc.delete("PlugIt_FlipY_info") print("LAUCHN INIT SCENE - DONE") return def Dock(Widget, width=200, height=200, hp="free", show=True): name = PlugIt_Global.PlugItTitle label = getattr(Widget, "label", name) try: cmds.deleteUI(name) except RuntimeError: pass dockControl = cmds.workspaceControl( name, 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: cmds.evalDeferred( lambda *args: cmds.workspaceControl( dockControl, edit=True, widthProperty="free", restore=True ) ) return child def atClose(): if mc.window("P L U G - O p t i o n s", exists=True): mc.deleteUI("P L U G - O p t i o n s") if mc.window("Plug Creation", exists=True): mc.deleteUI("Plug Creation") if mc.objExists("PlugIt_Thumb_Group"): mc.delete("PlugIt_Thumb_Group") SCRIPT_JOB_PREVIOUS = (json.load(open(PreferencePath + 'ScriptJob_1x1.json', "r"))['VALUE']) if SCRIPT_JOB_PREVIOUS == 1111: pass else: mc.scriptJob(kill=SCRIPT_JOB_PREVIOUS, force=True) open(PreferencePath + 'ScriptJob_1x1.json', "w").write(json.dumps({"VALUE": 1111})) def showUI(): ui = Dock(PlugIt_UI) ui.show() #FirstLaunch = (json.load(open(PreferencePath + 'FirstLaunch.json', "r"))['VALUE']) #if FirstLaunch == 0: #open(PreferencePath + 'FirstLaunch.json', "w").write(json.dumps({"VALUE": 1})) #PyMel Test #try: #import pymel.core as pm #pm.sphere(n="PlugIt_PyMel_Check") #pm.delete("PlugIt_PyMel_Check") #except: #WarningWindow("You don't have PyMel install. You should install PyMel using this link : ", 450) #return ##DELETE PopUp UI if mc.window("P L U G - O p t i o n s", exists=True): mc.deleteUI("P L U G - O p t i o n s") ##CLEAN Scene if mc.objExists("PlugIt_Thumb_Group"): mc.delete("PlugIt_Thumb_Group") # Get a pointer and convert it to Qt Widget object qw = omui.MQtUtil.findWindow(PlugIt_Global.PlugItTitle) try: widget = wrapInstance(int(qw), QWidget) # Create a QIcon object icon = QIcon(IconPath + "PlugIt_Window_Ico.png") # Assign the icon widget.setWindowIcon(icon) except: pass #Pour si on reload alos qu'il est dock mc.setToolTo("Move") mc.scriptJob(uiDeleted=[PlugIt_Global.PlugItTitle, atClose]) return ui ##_____________________________________________WARNING POP UP def WarningWindow(message, size, *args): BackgroundColor = 0.16 # ________________// if mc.window("WarningWindow", exists=True): mc.deleteUI("WarningWindow") mc.window("WarningWindow", title=' Warning ', s=False, vis=True, rtf=False) mc.columnLayout(adj=True, rs=3, bgc=[BackgroundColor, BackgroundColor, BackgroundColor]) mc.separator(h=8, style='none') mc.text(l=" " + message + " ", al="center") mc.separator(h=8, style='none') mc.button(l="Install PyMel", c= PyMelLink) mc.window("WarningWindow", e=True, wh=(size, 80)) qw = omui.MQtUtil.findWindow("WarningWindow") widget = wrapInstance(int(qw), QWidget) icon = QIcon(IconPath + "Windows_Ico_Warning.png") widget.setWindowIcon(icon) mc.showWindow() def PyMelLink(*args): QtGui.QDesktopServices.openUrl( QtCore.QUrl("https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2022/ENU/Maya-Scripting/files/GUID-2AA5EFCE-53B1-46A0-8E43-4CD0B2C72FB4-htm.html")) initSceneFirstPlugBug()