417 lines
17 KiB
Python
417 lines
17 KiB
Python
|
##--------------------------------------------------------------------------
|
||
|
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 mtoa.core as core
|
||
|
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 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
|
||
|
RessourcePath = ModIt_Global.RessourcePath
|
||
|
|
||
|
|
||
|
# ******************************************
|
||
|
# BUTTONS PARAMS
|
||
|
# ******************************************
|
||
|
iconFixeSize = 20
|
||
|
iconButtonSize = 20
|
||
|
separatorWidth = ModIt_Global.separatorWidth
|
||
|
|
||
|
##JSON PREF DATA
|
||
|
SCREW_MODE =(json.load(open(PreferencePath + 'Screw_Mode.json',"r"))['VALUE'])
|
||
|
SCREW_SIZE =(json.load(open(PreferencePath + 'MultiSize.json',"r"))['MULTISIZEVALUE'])
|
||
|
|
||
|
WIN_DISPLAY_SIZE =(json.load(open(PreferencePath + 'WinSize.json',"r"))['VALUE'])
|
||
|
|
||
|
|
||
|
class PLACEMENT_LAYOUT(QtWidgets.QWidget):
|
||
|
def __init__(self, parent=None):
|
||
|
super().__init__(parent=parent)
|
||
|
|
||
|
SECTION_PLACEMENT_LAYOUT = QtWidgets.QVBoxLayout() # MAIN
|
||
|
self.setLayout(SECTION_PLACEMENT_LAYOUT)
|
||
|
SECTION_PLACEMENT_LAYOUT.setContentsMargins(0,0,0,0)
|
||
|
|
||
|
|
||
|
##------------------------------------------------------------------------------------//
|
||
|
##------------------------------------------------------------------------------------------------------// T A B M O D E L I N G
|
||
|
###------------------------------------------------------------------------------------// SCREW
|
||
|
SCREW_Label = QtWidgets.QLabel(self)
|
||
|
SCREW_Label.setText(" - S C R E W / B O L T - ")
|
||
|
if WIN_DISPLAY_SIZE == 0: # 125
|
||
|
SCREW_Label.setFont(QtGui.QFont('Candara', 8))
|
||
|
else:
|
||
|
SCREW_Label.setFont(QtGui.QFont('Candara', 7))
|
||
|
|
||
|
SCREW_Label.setAlignment(QtCore.Qt.AlignCenter)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(SCREW_Label)
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(5)
|
||
|
|
||
|
###---------------------------------------------------- H LAYOUT
|
||
|
Parameters_Hlyt = QtWidgets.QHBoxLayout()
|
||
|
SECTION_PLACEMENT_LAYOUT.addLayout(Parameters_Hlyt)
|
||
|
|
||
|
|
||
|
|
||
|
###-------------------------------------------------------------------------------------------------- DRAG MODE
|
||
|
self.ImportDrag_btn = QtWidgets.QPushButton()
|
||
|
self.ImportDrag_btn.setObjectName("TABSBTN")
|
||
|
self.ImportDrag_btn.setFixedSize(iconFixeSize, iconFixeSize)
|
||
|
self.ImportDrag_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
|
||
|
self.ImportDrag_btn.clicked.connect(self.set_DragMode)
|
||
|
Parameters_Hlyt.addWidget(self.ImportDrag_btn)
|
||
|
|
||
|
|
||
|
###-------------------------------------------------------------------------------------------------- FACE MODE
|
||
|
self.ImportComponent_btn = QtWidgets.QPushButton()
|
||
|
self.ImportComponent_btn.setObjectName("TABSBTN")
|
||
|
self.ImportComponent_btn.setFixedSize(iconFixeSize, iconFixeSize)
|
||
|
self.ImportComponent_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize))
|
||
|
self.ImportComponent_btn.clicked.connect(self.set_FaceMode)
|
||
|
Parameters_Hlyt.addWidget(self.ImportComponent_btn)
|
||
|
|
||
|
if SCREW_MODE == 1:
|
||
|
self.ImportDrag_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Drag.png"))
|
||
|
self.ImportComponent_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Selection_OFF.png"))
|
||
|
else:
|
||
|
self.ImportDrag_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Drag_OFF.png"))
|
||
|
self.ImportComponent_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Selection.png"))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#####---------------------------------------------------- / SEPARATOR /
|
||
|
self.Separator = QtWidgets.QPushButton()
|
||
|
self.Separator.setFixedSize(separatorWidth,iconButtonSize)
|
||
|
self.Separator.setObjectName("Separator")
|
||
|
self.Separator.setIconSize(QtCore.QSize(26, iconButtonSize))
|
||
|
self.Separator.setIcon(QtGui.QIcon(IconPath + "SeparatorBtn.png"))
|
||
|
self.Separator.setEnabled(0)
|
||
|
Parameters_Hlyt.addWidget(self.Separator)
|
||
|
|
||
|
|
||
|
|
||
|
###-------------------------------------------------------------------------------------------------- SIZE SLIDER
|
||
|
Size_Title = QtWidgets.QLabel("Size ")
|
||
|
Parameters_Hlyt.addWidget(Size_Title)
|
||
|
|
||
|
self.Size_Slider = QtWidgets.QSlider()
|
||
|
self.Size_Slider.setMinimum(0.01)
|
||
|
self.Size_Slider.setMaximum(100)
|
||
|
self.Size_Slider.setProperty("value", SCREW_SIZE)
|
||
|
self.Size_Slider.setOrientation(QtCore.Qt.Horizontal)
|
||
|
self.Size_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
|
||
|
self.Size_Slider.setTickInterval(1)
|
||
|
self.Size_Slider.setFixedHeight(22)
|
||
|
self.Size_Slider.valueChanged.connect(self.set_MultiSize_Slider)
|
||
|
Parameters_Hlyt.addWidget(self.Size_Slider)
|
||
|
|
||
|
|
||
|
self.Size_SpinBox = QtWidgets.QDoubleSpinBox()
|
||
|
self.Size_SpinBox.setDecimals(2)
|
||
|
self.Size_SpinBox.setFixedWidth(40)
|
||
|
self.Size_SpinBox.setFixedHeight(18)
|
||
|
self.Size_SpinBox.setRange(0.01, 1000)
|
||
|
self.Size_SpinBox.setValue(SCREW_SIZE)
|
||
|
self.Size_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
|
||
|
self.Size_SpinBox.editingFinished.connect(self.set_MultiSize_SpinBox)
|
||
|
Parameters_Hlyt.addWidget(self.Size_SpinBox)
|
||
|
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(5)
|
||
|
|
||
|
|
||
|
##---------------------------------------------------- Separator
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(3)
|
||
|
separator = QtWidgets.QLabel('')
|
||
|
separator.setStyleSheet( "QLabel {background-color: #282828;}")
|
||
|
separator.setMaximumHeight(2)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(separator)
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(3)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
##--------------------------------------------------
|
||
|
##----------------------------------------------------------/ S C R E W / B O L T S
|
||
|
##--------------------------------------------------
|
||
|
separatorSpacingValue = 3
|
||
|
|
||
|
Screw_PNGList = []
|
||
|
Bolt_PNGList = []
|
||
|
Special_PNGList = []
|
||
|
SciFi_PNGList = []
|
||
|
|
||
|
##----------------------------------------------------------/ S C R E W
|
||
|
Screw_Base_path = RessourcePath + "Mesh/Screw"
|
||
|
listAllInFolder = os.listdir(Screw_Base_path)
|
||
|
|
||
|
for each in listAllInFolder:
|
||
|
full_screw_filePath = Screw_Base_path + "/" + each
|
||
|
#Find and keep only .png files
|
||
|
if full_screw_filePath.endswith(".png"):
|
||
|
Screw_PNGList.append(full_screw_filePath)
|
||
|
|
||
|
grid_Lyt = QtWidgets.QGridLayout()
|
||
|
SECTION_PLACEMENT_LAYOUT.addLayout(grid_Lyt)
|
||
|
|
||
|
gridIconSize = 40
|
||
|
positions = [(x, y) for x in range(10) for y in range(6)]
|
||
|
for each in Screw_PNGList:
|
||
|
Asset_ma_path = each.replace(".png", ".ma")
|
||
|
xPos = positions[Screw_PNGList.index(each)]
|
||
|
yPos = positions[Screw_PNGList.index(each)]
|
||
|
self.Asset_btn = QtWidgets.QPushButton()
|
||
|
self.Asset_btn.setFixedSize(gridIconSize, gridIconSize)
|
||
|
self.Asset_btn.setIconSize(QtCore.QSize(gridIconSize, gridIconSize))
|
||
|
self.Asset_btn.setIcon(QtGui.QIcon(each))
|
||
|
self.Asset_btn.clicked.connect(partial(self.set_Import, Asset_ma_path))
|
||
|
grid_Lyt.addWidget(self.Asset_btn, xPos[0], yPos[1])
|
||
|
|
||
|
|
||
|
##---------------------------------------------------- Separator
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
separator = QtWidgets.QLabel('')
|
||
|
separator.setStyleSheet( "QLabel {background-color: #3e3e3e; padding: 0; margin: 0; border-bottom: 1 solid #666; border-top: 1 solid #2a2a2a;}")
|
||
|
separator.setMaximumHeight(2)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(separator)
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
|
||
|
##----------------------------------------------------------/ B O L T S
|
||
|
Bolt_Base_path = RessourcePath + "Mesh/Bolt"
|
||
|
listAllInFolder = os.listdir(Bolt_Base_path)
|
||
|
|
||
|
for each in listAllInFolder:
|
||
|
full_Bolt_filePath = Bolt_Base_path + "/" + each
|
||
|
#Find and keep only .png files
|
||
|
if full_Bolt_filePath.endswith(".png"):
|
||
|
Bolt_PNGList.append(full_Bolt_filePath)
|
||
|
|
||
|
grid_Lyt = QtWidgets.QGridLayout()
|
||
|
SECTION_PLACEMENT_LAYOUT.addLayout(grid_Lyt)
|
||
|
|
||
|
gridIconSize = 40
|
||
|
positions = [(x, y) for x in range(10) for y in range(6)]
|
||
|
for each in Bolt_PNGList:
|
||
|
Asset_ma_path = each.replace(".png", ".ma")
|
||
|
xPos = positions[Bolt_PNGList.index(each)]
|
||
|
yPos = positions[Bolt_PNGList.index(each)]
|
||
|
self.Asset_btn = QtWidgets.QPushButton()
|
||
|
self.Asset_btn.setFixedSize(gridIconSize, gridIconSize)
|
||
|
self.Asset_btn.setIconSize(QtCore.QSize(gridIconSize, gridIconSize))
|
||
|
self.Asset_btn.setIcon(QtGui.QIcon(each))
|
||
|
self.Asset_btn.clicked.connect(partial(self.set_Import, Asset_ma_path))
|
||
|
grid_Lyt.addWidget(self.Asset_btn, xPos[0], yPos[1])
|
||
|
|
||
|
##---------------------------------------------------- Separator
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
separator = QtWidgets.QLabel('')
|
||
|
separator.setStyleSheet( "QLabel {background-color: #3e3e3e; padding: 0; margin: 0; border-bottom: 1 solid #666; border-top: 1 solid #2a2a2a;}")
|
||
|
separator.setMaximumHeight(2)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(separator)
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
|
||
|
|
||
|
|
||
|
##----------------------------------------------------------/ S C I - F I
|
||
|
SciFi_Base_path = RessourcePath + "Mesh/SciFi"
|
||
|
listAllInFolder = os.listdir(SciFi_Base_path)
|
||
|
|
||
|
for each in listAllInFolder:
|
||
|
full_SciFi_filePath = SciFi_Base_path + "/" + each
|
||
|
#Find and keep only .png files
|
||
|
if full_SciFi_filePath.endswith(".png"):
|
||
|
SciFi_PNGList.append(full_SciFi_filePath)
|
||
|
|
||
|
grid_Lyt = QtWidgets.QGridLayout()
|
||
|
SECTION_PLACEMENT_LAYOUT.addLayout(grid_Lyt)
|
||
|
|
||
|
gridIconSize = 40
|
||
|
positions = [(x, y) for x in range(10) for y in range(6)]
|
||
|
for each in SciFi_PNGList:
|
||
|
Asset_ma_path = each.replace(".png", ".ma")
|
||
|
xPos = positions[SciFi_PNGList.index(each)]
|
||
|
yPos = positions[SciFi_PNGList.index(each)]
|
||
|
self.Asset_btn = QtWidgets.QPushButton()
|
||
|
self.Asset_btn.setFixedSize(gridIconSize, gridIconSize)
|
||
|
self.Asset_btn.setIconSize(QtCore.QSize(gridIconSize, gridIconSize))
|
||
|
self.Asset_btn.setIcon(QtGui.QIcon(each))
|
||
|
self.Asset_btn.clicked.connect(partial(self.set_Import, Asset_ma_path))
|
||
|
grid_Lyt.addWidget(self.Asset_btn, xPos[0], yPos[1])
|
||
|
|
||
|
|
||
|
##---------------------------------------------------- Separator
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
separator = QtWidgets.QLabel('')
|
||
|
separator.setStyleSheet( "QLabel {background-color: #3e3e3e; padding: 0; margin: 0; border-bottom: 1 solid #666; border-top: 1 solid #2a2a2a;}")
|
||
|
separator.setMaximumHeight(2)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(separator)
|
||
|
SECTION_PLACEMENT_LAYOUT.addSpacing(separatorSpacingValue)
|
||
|
|
||
|
|
||
|
##----------------------------------------------------------/ S P E C I A L S
|
||
|
Special_Base_path = RessourcePath + "Mesh/Special"
|
||
|
listAllInFolder = os.listdir(Special_Base_path)
|
||
|
|
||
|
for each in listAllInFolder:
|
||
|
full_Special_filePath = Special_Base_path + "/" + each
|
||
|
#Find and keep only .png files
|
||
|
if full_Special_filePath.endswith(".png"):
|
||
|
Special_PNGList.append(full_Special_filePath)
|
||
|
|
||
|
grid_Lyt = QtWidgets.QGridLayout()
|
||
|
SECTION_PLACEMENT_LAYOUT.addLayout(grid_Lyt)
|
||
|
|
||
|
gridIconSize = 40
|
||
|
positions = [(x, y) for x in range(10) for y in range(6)]
|
||
|
for each in Special_PNGList:
|
||
|
Asset_ma_path = each.replace(".png", ".ma")
|
||
|
xPos = positions[Special_PNGList.index(each)]
|
||
|
yPos = positions[Special_PNGList.index(each)]
|
||
|
self.Asset_btn = QtWidgets.QPushButton()
|
||
|
self.Asset_btn.setFixedSize(gridIconSize, gridIconSize)
|
||
|
self.Asset_btn.setIconSize(QtCore.QSize(gridIconSize, gridIconSize))
|
||
|
self.Asset_btn.setIcon(QtGui.QIcon(each))
|
||
|
self.Asset_btn.clicked.connect(partial(self.set_Import, Asset_ma_path))
|
||
|
grid_Lyt.addWidget(self.Asset_btn, xPos[0], yPos[1])
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
self.AssetItPromo_btn = QtWidgets.QPushButton("- C u s t o m B o l t -")
|
||
|
self.AssetItPromo_btn.setObjectName("StoreSet")
|
||
|
self.AssetItPromo_btn.setFixedHeight(18)
|
||
|
self.AssetItPromo_btn.setStyleSheet("color:#808080;")
|
||
|
if WIN_DISPLAY_SIZE == 1: #150
|
||
|
self.AssetItPromo_btn.setFont(QtGui.QFont('Calibri', 6))
|
||
|
self.AssetItPromo_btn.clicked.connect(self.AssetItPromo)
|
||
|
SECTION_PLACEMENT_LAYOUT.addWidget(self.AssetItPromo_btn)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#------------------------------------------------
|
||
|
##---------------------------------------------------- D E F I N I T I O N
|
||
|
#------------------------------------------------
|
||
|
def AssetItPromo(self):
|
||
|
from . import ModIt_AssetIt
|
||
|
importlib.reload(ModIt_AssetIt)
|
||
|
ModIt_AssetIt.showUI()
|
||
|
|
||
|
|
||
|
def set_DragMode(self):
|
||
|
self.ImportDrag_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Drag.png"))
|
||
|
self.ImportComponent_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Selection_OFF.png"))
|
||
|
open(PreferencePath + 'Screw_Mode.json', "w").write(json.dumps({"VALUE": 1}))
|
||
|
|
||
|
def set_FaceMode(self):
|
||
|
self.ImportDrag_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Drag_OFF.png"))
|
||
|
self.ImportComponent_btn.setIcon(QtGui.QIcon(IconPath + "Placement_Selection.png"))
|
||
|
open(PreferencePath + 'Screw_Mode.json', "w").write(json.dumps({"VALUE": 2}))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def set_MultiSize_Slider(self):
|
||
|
SliderValue = self.Size_Slider.value()
|
||
|
self.Size_SpinBox.setValue(SliderValue)
|
||
|
|
||
|
|
||
|
def set_MultiSize_SpinBox(self):
|
||
|
SpinBoxAValue = self.Size_SpinBox.value()
|
||
|
self.Size_Slider.setValue(SpinBoxAValue)
|
||
|
self.Size_SpinBox.clearFocus()
|
||
|
open(PreferencePath + 'MultiSize.json', "w").write(json.dumps({"MULTISIZEVALUE": SpinBoxAValue}))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def set_Import(self, maPath):
|
||
|
SCREW_MODE = (json.load(open(PreferencePath + 'Screw_Mode.json', "r"))['VALUE'])
|
||
|
|
||
|
if SCREW_MODE == 1:
|
||
|
#VERIF THERE IS A MESH
|
||
|
listAllGeometrieScene = cmds.ls(type="mesh")
|
||
|
if listAllGeometrieScene == []:
|
||
|
ModIt_Global.WarningWindow("Drag Placement mode need at least one mesh in the scene.", 350)
|
||
|
return
|
||
|
|
||
|
from . import ModIt_DragTool
|
||
|
importlib.reload(ModIt_DragTool)
|
||
|
ModIt_DragTool.goPress(maPath)
|
||
|
|
||
|
else:
|
||
|
SaveSize_pref = json.load(open(PreferencePath + 'MultiSize.json', "r"))
|
||
|
MULTISIZEVALUE = (SaveSize_pref['MULTISIZEVALUE'])
|
||
|
|
||
|
|
||
|
selectionCheck = cmds.ls(sl=True)
|
||
|
if selectionCheck == []:
|
||
|
ModIt_Global.WarningWindow("On 'Place at Selection' mode : you should select component first.", 350)
|
||
|
return
|
||
|
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
pos = cmds.manipMoveContext('Move', query=True, position=True)
|
||
|
selection = cmds.ls(selection=True, l=True)
|
||
|
|
||
|
##_________________IMPORT L'ASSET
|
||
|
before = set(cmds.ls(assemblies=True))
|
||
|
cmds.file(maPath , i=True)
|
||
|
|
||
|
after = set(cmds.ls(assemblies=True))
|
||
|
imported = after.difference(before)
|
||
|
cmds.select(imported)
|
||
|
objImported = cmds.ls(sl=True)[0]
|
||
|
|
||
|
|
||
|
cmds.setAttr(objImported + ".scaleX", MULTISIZEVALUE)
|
||
|
cmds.setAttr(objImported + ".scaleY", MULTISIZEVALUE)
|
||
|
cmds.setAttr(objImported + ".scaleZ", MULTISIZEVALUE)
|
||
|
cmds.select(objImported)
|
||
|
cmds.makeIdentity(apply=True)
|
||
|
|
||
|
cmds.select(objImported)
|
||
|
cmds.makeIdentity(apply=True)
|
||
|
cmds.xform(ws=1, a=1, piv=[0, 0, 0])
|
||
|
|
||
|
cmds.move(pos[0], pos[1], pos[2], objImported)
|
||
|
constr = cmds.normalConstraint(selection, objImported, aimVector=(0, 1, 0), worldUpType=0)
|
||
|
cmds.delete(constr)
|
||
|
|
||
|
cmds.select(objImported)
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
|
||
|
|
||
|
|
||
|
|