## PLUG CREATION 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 import sys from mtoa.cmds.arnoldRender import arnoldRender # Special cases for different Maya versions try: from shiboken2 import wrapInstance except ImportError: from shiboken import wrapInstance try: from PySide2.QtGui import QIcon from PySide2.QtWidgets import QWidget except ImportError: from PySide.QtGui import QIcon, QWidget import importlib from . import PlugIt_Global importlib.reload(PlugIt_Global) from . import PlugIt_CSS importlib.reload(PlugIt_CSS) from .PlugIt_Creation import PlugIt_CameraThumb importlib.reload(PlugIt_CameraThumb) ##PATH_SET IconPath = PlugIt_Global.IconsPathThemeClassic PreferencePath = PlugIt_Global.PreferencePath PlugIt_Creation_PATH = PlugIt_Global.AssetCreationPath LIBRARY_PATH = PlugIt_Global.LIBRARY_PATH ##GLOBAL VAR WindowsTitle = "Plug Creation" ACTIVEMAINTAB = "USER" ACTIVESUBTAB_NAME = "" RENDERDONE = False RENDERERCHOICE = "Arnold" PLUGNAME = "Plug Name" HOLE_SET = 0 def SEND_INFO(SecondTabActiveName): global ACTIVESUBTAB_NAME ACTIVESUBTAB_NAME = SecondTabActiveName return ACTIVESUBTAB_NAME class AddAsset_UI(QtWidgets.QDialog): def __init__(self, parent=None): super(AddAsset_UI, self).__init__() self.setMinimumSize(360, 350) self.buildUI() def buildUI(self): #if mc.objExists("PlugIt_ThumbScene"): # pass #else: #######_______________________________________________// I M P O R T S C E N E mc.file(PlugIt_Creation_PATH + "Thumb_Creation/Plug_Creation_Scene_Init.ma", rnn=True, o=True, ignoreVersion=True, force = True) mc.file(rename= PlugIt_Creation_PATH + "Thumb_Creation/Plug_Creation_Scene.ma") mc.file(save=True, type="mayaAscii", force = True) PLUG_MAINLyt = QtWidgets.QVBoxLayout(self) PLUG_MAINLyt.setSpacing(10) self.setStyleSheet(PlugIt_Global.Theme) ##UI - Preferences iconButtonSize = PlugIt_Global.IconButtonSize #######_______________________________________________// T I T L E Title_Lbl = QtWidgets.QLabel(self) Title_Lbl.setText(" - P L U G C R E A T I O N - ") Title_Lbl.setFont(QtGui.QFont('Candara', 8)) Title_Lbl.setAlignment(QtCore.Qt.AlignCenter) PLUG_MAINLyt.addWidget(Title_Lbl) ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) #######_______________________________________________// T U T O Tuto_Lyt = QtWidgets.QHBoxLayout() PLUG_MAINLyt.addLayout(Tuto_Lyt) self.Tuto_Btn = QtWidgets.QPushButton() self.Tuto_Btn.setObjectName("MasterBtn") self.Tuto_Btn.setText("H O W T O C R E A T E P L U G ?") self.Tuto_Btn.setStyleSheet("QPushButton {color: #65BEF1; border-color: #65BEF1; }" ) self.Tuto_Btn.setFixedHeight(30) self.Tuto_Btn.clicked.connect(self.link_Tuto) self.Tuto_Btn.setToolTip("Link to tutorial on how to create your custom Plug") Tuto_Lyt.addWidget(self.Tuto_Btn) Tuto_Lyt.addSpacing(10) ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) #######_______________________________________________// N A M E PlugName_Lyt = QtWidgets.QHBoxLayout() PLUG_MAINLyt.addLayout(PlugName_Lyt) self.PlugNameField = QtWidgets.QLineEdit() self.PlugNameField.setObjectName("AssetNameField") self.PlugNameField.setAlignment(QtCore.Qt.AlignCenter) self.PlugNameField.setText(PLUGNAME) self.PlugNameField.setFont(QtGui.QFont('Calibri', 9)) #self.PlugNameField.setStyleSheet("QLineEdit{color: #71CCFF;}") self.PlugNameField.setFixedHeight(25) PlugName_Lyt.addWidget(self.PlugNameField) #AssetName Empty if self.PlugNameField.text() == "Plug Name": self.PlugNameField.clear() self.PlugNameField.setPlaceholderText("Plug Name") self.PlugNameFieldEnterBtn = QtWidgets.QPushButton() self.PlugNameFieldEnterBtn.setFixedSize(0,0) self.PlugNameFieldEnterBtn.setIconSize(QtCore.QSize(0, 0)) self.PlugNameFieldEnterBtn.setIcon(QtGui.QIcon(IconPath + "Apply.png")) self.PlugNameFieldEnterBtn.setToolTip(" Validate Asset Name ") self.PlugNameFieldEnterBtn.clicked.connect(self.AssetNameValidate) self.PlugNameFieldEnterBtn.setShortcut(QtGui.QKeySequence("Return")) PlugName_Lyt.addWidget(self.PlugNameFieldEnterBtn) ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) #######_______________________________________________// T A B C H O I C E ##FOLDER COMBO self.secondLevelFolderList = os.listdir(LIBRARY_PATH + "/" + ACTIVEMAINTAB) Folder_HLyt = QtWidgets.QHBoxLayout() Folder_HLyt.setSpacing(6) PLUG_MAINLyt.addLayout(Folder_HLyt) try: FoundIndex = self.secondLevelFolderList.index(str(ACTIVESUBTAB_NAME)) except: FoundIndex = 0 Folder_Lbl = QtWidgets.QLabel(self) Folder_Lbl.setText(" F o l d e r : ") Folder_Lbl.setFont(QtGui.QFont('Candara', 7)) Folder_Lbl.setFixedWidth(59) Folder_HLyt.addWidget(Folder_Lbl) self.Folder_Combo = QtWidgets.QComboBox() self.Folder_Combo.addItems(self.secondLevelFolderList) self.Folder_Combo.setFixedHeight(25) #self.Folder_Combo.setEditable(True) #self.Folder_Combo.lineEdit().setAlignment(QtCore.Qt.AlignCenter) #self.Folder_Combo.lineEdit().setFont(QtGui.QFont('Calibri', 9)) #self.Folder_Combo.lineEdit().setReadOnly(True) #self.Folder_Combo.currentIndexChanged.connect(self.SET_Theme) self.Folder_Combo.setCurrentIndex(FoundIndex) Folder_HLyt.addWidget(self.Folder_Combo) Folder_HLyt.addSpacing(10) ## BTN ADD #self.Folder_Btn = QtWidgets.QPushButton() #self.Folder_Btn.setFixedSize(iconButtonSize,iconButtonSize) #self.Folder_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) #self.Folder_Btn.setIcon(QtGui.QIcon(IconPath + "AddAsset2.png")) #self.Folder_Btn.clicked.connect(self.OpenLibFolder) #self.Folder_Btn.setToolTip(" Open Library Folder ") #Folder_HLyt.addWidget(self.Folder_Btn) ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) #######_______________________________________________// S E T H O L E SetHole_Lyt = QtWidgets.QHBoxLayout() SetHole_Lyt.setSpacing(5) PLUG_MAINLyt.addLayout(SetHole_Lyt) self.SetHole_Btn = QtWidgets.QPushButton() self.SetHole_Btn.setObjectName("MasterBtn") self.SetHole_Btn.setText("SET HOLE") if HOLE_SET == 1: self.SetHole_Btn.setStyleSheet("QPushButton {color: #65BEF1; border-color: #65BEF1; }" ) self.SetHole_Btn.setFixedHeight(30) self.SetHole_Btn.clicked.connect(self.set_Hole) self.SetHole_Btn.setToolTip("Create and Add asset to Library") SetHole_Lyt.addWidget(self.SetHole_Btn) ## BTN LIBRARY FOLDER self.HoldeDel_Btn = QtWidgets.QPushButton() self.HoldeDel_Btn.setFixedSize(iconButtonSize,iconButtonSize) self.HoldeDel_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.HoldeDel_Btn.setIcon(QtGui.QIcon(IconPath + "delete_ON.png")) self.HoldeDel_Btn.clicked.connect(self.set_Hole_Delete) self.HoldeDel_Btn.setToolTip(" Open Library Folder ") SetHole_Lyt.addWidget(self.HoldeDel_Btn) ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) #######_______________________________________________// C O N C A V E ##FOLDER COMBO Concave_HLyt = QtWidgets.QHBoxLayout() Concave_HLyt.setSpacing(6) PLUG_MAINLyt.addLayout(Concave_HLyt) Concave_HLyt.addSpacing(25) ## BTN LIBRARY FOLDER self.Concave_Btn = QtWidgets.QPushButton() self.Concave_Btn.setFixedSize(iconButtonSize, iconButtonSize) self.Concave_Btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Concave_Btn.setIcon(QtGui.QIcon(IconPath + "Concave.png")) #self.Concave_Btn.clicked.connect(self.set_Hole_Delete) self.Concave_Btn.setToolTip(" Open Library Folder ") Concave_HLyt.addWidget(self.Concave_Btn) Concave_Lbl = QtWidgets.QLabel(self) Concave_Lbl.setText(" Does the mesh have Concave borders? Yes ") #Concave_Lbl.setFont(QtGui.QFont('Candara', 7)) #Concave_Lbl.setFixedWidth(300) Concave_HLyt.addWidget(Concave_Lbl, alignment=QtCore.Qt.AlignRight) self.ClayRenderBTN = QtWidgets.QCheckBox() self.ClayRenderBTN.setFixedSize(iconButtonSize, iconButtonSize) self.ClayRenderBTN.setCheckable(1) #self.ClayRenderBTN.setChecked(CLAYRENDER) #self.ClayRenderBTN.toggled.connect(self.set_ClayRenderBTN) Concave_HLyt.addWidget(self.ClayRenderBTN) Concave_HLyt.addStretch() ##---------------------------------------------------- SEPARATOR : Horizontal PLUG_MAINLyt.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) PLUG_MAINLyt.addWidget(separator) PLUG_MAINLyt.addSpacing(2) ##_______________________________________ CREATE ASSET BTN CreateAssetBtn = QtWidgets.QPushButton() CreateAssetBtn.setObjectName("MasterBtn") CreateAssetBtn.setText(" - CREATE PLUG - ") CreateAssetBtn.setFixedHeight(30) CreateAssetBtn.clicked.connect(self.CREATE_PLUG) CreateAssetBtn.setToolTip("Create and Add asset to Library") PLUG_MAINLyt.addWidget(CreateAssetBtn) PLUG_MAINLyt.addStretch() #Folder_HLyt.addStretch() def set_Hole(self): self.SetHole_Btn.setStyleSheet("QPushButton {color: #65BEF1; border-color: #65BEF1; }") mc.sets(n = "Plug_Hole_set") mc.select(d = True) def set_Hole_Delete(self): self.SetHole_Btn.setStyleSheet("") def AssetNameValidate(self): AssetName = self.PlugNameField.text() if ":" in AssetName: PlugIt_Global.WarningWindow("You can't use ' : ' character in Asset Name", 250) return else: self.PlugNameField.clearFocus() def link_Tuto(self): QtGui.QDesktopServices.openUrl( QtCore.QUrl("https://www.youtube.com/watch?v=ZSYQKoUaja4")) def GetComboTAB1(self): content = self.TAB1_Combo.currentText() self.secondLevelFolderList = os.listdir(LIBRARY_PATH + "/" + content) self.Folder_Combo.clear() self.Folder_Combo.addItems(self.secondLevelFolderList) def updatingProgressBar(self): self.step += 1 self.progress_dialog.setLabelText("{0} : {1}(of {2})".format(self.opName,self.step, self.number_of_operations)) self.progress_dialog.setValue(self.step) QtCore.QCoreApplication.processEvents() def CREATE_PLUG(self): #__________________________ V A R I A B L E S USER_PATH = PlugIt_Global.LIBRARY_PATH + "/USER/" get_PlugName = self.PlugNameField.text() get_FolderName = self.Folder_Combo.currentText() #__________________________U I I N F O V E R I F I C A T I O N S if get_PlugName == "": PlugIt_Global.WarningWindow("You should enter a Plug name", 250) return else: self.PlugNameField.clearFocus() if ":" in get_PlugName: PlugIt_Global.WarningWindow("You can't use ' : ' character in Plug Name", 250) return #try: ## Check if Asset Already EXIST # os.mkdir(PLUG_PATH) #except: # PlugIt_Global.WarningWindow("A Plug with this name already exist in this folder", 400) # return # __________________________P L U G V E R I F I C A T I O N S # ______________________________ WARNINGS - SELECTION VERIF meshSelection = mc.ls(sl=True) if meshSelection == []: PlugIt_Global.WarningWindow("You should select your Plug Mesh", 400) return if len(meshSelection) > 1: PlugIt_Global.WarningWindow("Plug should be 1 mesh only", 300) return # ______________________________ MESH VERIF # Verif ExteriorBorder and InnerBorder mc.select("Plug_EdgeBorder_set") mc.ConvertSelectionToFaces() mc.ConvertSelectionToEdgePerimeter() if len(mc.filterExpand(sm=32)) != 8: print("STOP - Borders Compromise") PlugIt_Global.WarningWindow("STOP - Borders Compromise. Verify there no extra vertex on red faces", 300) return #__________________________ P R O G R E S S B A R self.number_of_operations = 3 self.step = 0 self.opName = "Plug Creation Process Starting" self.progress_dialog = QtWidgets.QProgressDialog("Batch Process", "", 0, self.number_of_operations, self) self.progress_dialog.setWindowTitle("Plug Creation...") self.progress_dialog.setCancelButton(None) self.progress_dialog.setValue(0) self.progress_dialog.setMinimumSize(550, 80) self.progress_dialog.setWindowModality(QtCore.Qt.WindowModal) self.progress_dialog.show() # PROGRESBAR UPDATING self.updatingProgressBar() self.opName = "Arnold Thumb Render Start" # ______________________________ CLEAN MESH mc.move(0, 0, 0, meshSelection[0] + ".scalePivot", meshSelection[0] + ".rotatePivot", rpr=True) mc.makeIdentity(meshSelection, apply=True) mc.select(meshSelection) mc.delete(ch=True) mc.rename(meshSelection[0], "Plug_Mesh") mc.parent("Plug_controler", "Plug_Mesh") mc.delete("Plug_Mesh_grp") # ______________________________ SET CREATION # PROGRESBAR UPDATING self.updatingProgressBar() self.opName = "Arnold Thumb Render Start" # Plug_AllFaces_set mc.select("Plug_Mesh") mc.ConvertSelectionToFaces() mc.sets(n="Plug_AllFaces_set") # Plug_Selection_set mc.select("Plug_EdgeBorder_set") mc.ConvertSelectionToFaces() mc.InvertSelection() mc.sets(n="Plug_Selection_set") # Plug_ExtraSecure_set mc.select("Plug_EdgeBorder_set") mc.ConvertSelectionToFaces() mc.ConvertSelectionToEdgePerimeter() mc.sets(n="Plug_ExtraSecure_set") mc.select("Plug_EdgeBorder_set") mc.sets(rm="Plug_ExtraSecure_set") # ______________________________ COUNT NUMBER mc.select("Plug_EdgeBorder_set") mc.ConvertSelectionToFaces() mc.GrowPolygonSelectionRegion() mc.ConvertSelectionToEdgePerimeter() mc.sets(n="Plug_borderCount_set") mc.select("Plug_EdgeBorder_set") mc.sets(rm="Plug_borderCount_set") mc.select("Plug_borderCount_set") plugBorderCount = len(mc.filterExpand(sm=32)) mc.delete("Plug_borderCount_set") mc.createNode('transform', n='PlugIt_PlugCountNumber_' + str(plugBorderCount)) # __________________ A R N O L D T H U M B R E N D E R mc.select("Plug_Mesh") mc.hyperShade(assign="PlugIt_Thumb_shd") mc.delete("BorderVerif_shd") PLUG_PATH = USER_PATH + get_FolderName + "/" + get_PlugName DESTPATH = PLUG_PATH + '/' + get_PlugName imgSize = 268 mc.setAttr('defaultRenderGlobals.currentRenderer', 'arnold', type='string') # Set curent render mc.setAttr('defaultArnoldDriver.aiTranslator', 'png', type='string') # Set the TIF image format mc.setAttr('defaultArnoldDriver.prefix', DESTPATH, type='string') # TO SAVE IMG TO DESTINATION PATH mc.setAttr('defaultArnoldRenderOptions.renderDevice', 0) # CPU rendering mc.setAttr('defaultArnoldRenderOptions.AASamples', 5) # SAMPLING mc.setAttr('defaultArnoldRenderOptions.GIDiffuseSamples', 2) mc.setAttr('defaultArnoldRenderOptions.GISpecularSamples', 2) mc.setAttr('defaultArnoldRenderOptions.GITransmissionSamples', 0) mc.setAttr('defaultArnoldRenderOptions.GISssSamples', 0) mc.setAttr('defaultArnoldRenderOptions.GIVolumeSamples', 0) mc.setAttr('defaultArnoldRenderOptions.GIDiffuseDepth', 2) mc.setAttr("defaultResolution.width", imgSize) mc.setAttr("defaultResolution.height", imgSize) mc.setAttr("defaultResolution.deviceAspectRatio", 1) mc.setAttr("defaultResolution.pixelAspect", 1) mc.colorManagementPrefs(e=True, outputTransformEnabled=True, outputUseViewTransform=True) # Color Management Prefs mc.arnoldRender(width=imgSize, height=imgSize, camera="PlugIt_RenderThumbCam") # render and save the image # FIX "_1" naming : old_name = DESTPATH + '_1.png' new_name = DESTPATH + '.png' if os.path.exists(new_name): os.remove(new_name) os.rename(old_name, new_name) # ______________________________ ASSIGN SHADER mc.select("Plug_Mesh") mc.hyperShade(assign="PlugIt_Plug_Shd") # ______________________________ S A V E P L U G mc.select("Plug_Mesh", "PlugIt_PlugCountNumber_*") mc.file(DESTPATH + ".ma", force=True, options="v = 0", type="mayaAscii", exportSelected=True) # __________________________ E N D I N G # PROGRESBAR UPDATING self.updatingProgressBar() self.opName = "Plug Created." self.progress_dialog.close() from . import PlugIt_UI import importlib importlib.reload(PlugIt_UI) ui = PlugIt_UI.showUI() mc.flushUndo() def Dock(Widget, width=200, height=200, hp="free", show=True): label = getattr(Widget, "label", WindowsTitle) try: cmds.deleteUI(WindowsTitle) except RuntimeError: pass dockControl = cmds.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: cmds.evalDeferred( lambda *args: cmds.workspaceControl( dockControl, edit=True, widthProperty="free", restore=True ) ) return child def atClose(): if mc.window("Thumbnail Framing", exists=True): mc.deleteUI("Thumbnail Framing") def showUI(): ui = Dock(AddAsset_UI) ui.show() if mc.window("Thumbnail Framing", exists=True): mc.deleteUI("Thumbnail Framing") # 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 + "Windows_Ico2.png") # Assign the icon widget.setWindowIcon(icon) mc.scriptJob(uiDeleted=[WindowsTitle, atClose]) return ui