##-------------------------------------------------------------------------- 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) from . import ModIt_2Bevels_UI importlib.reload(ModIt_2Bevels_UI) ##______________________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 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) class MESH_LAYOUT(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent=parent) SECTION_MESH_LAYOUT = QtWidgets.QVBoxLayout() # MAIN SECTION_MESH_LAYOUT.setContentsMargins(10, 0, 5, 0) SECTION_MESH_LAYOUT.setSpacing(0) self.setLayout(SECTION_MESH_LAYOUT) MESH_HLyt_1 = QtWidgets.QHBoxLayout() MESH_HLyt_1.setContentsMargins(0,0,0,0) MESH_HLyt_1.setSpacing(0) SECTION_MESH_LAYOUT.addLayout(MESH_HLyt_1) ##------------------------------------------------------------------------------- SOFT/HARD EDGE ##---------------------------------------------------- SET SOFT EDGE self.SoftEdge_btn = QtWidgets.QPushButton() self.SoftEdge_btn.setFixedSize(iconFixeSize, iconFixeSize) self.SoftEdge_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SoftEdge_btn.setIcon(QtGui.QIcon(IconPath + "polySoftEdge.png")) self.SoftEdge_btn.setToolTip(" Soften Edge ") self.SoftEdge_btn.clicked.connect(self.SetSoftEdge) MESH_HLyt_1.addWidget(self.SoftEdge_btn) ##---------------------------------------------------- SET HARD EDGE self.HardEdge_btn = QtWidgets.QPushButton() self.HardEdge_btn.setFixedSize(iconFixeSize, iconFixeSize) self.HardEdge_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.HardEdge_btn.setIcon(QtGui.QIcon(IconPath + "polyHard.png")) self.HardEdge_btn.setToolTip(" Harden Edge ") self.HardEdge_btn.clicked.connect(self.SetHardEdge) MESH_HLyt_1.addWidget(self.HardEdge_btn) MESH_HLyt_1.addSpacing(5) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,30) self.Separator.setStyleSheet("background-color:#fba636;") MESH_HLyt_1.addWidget(self.Separator) MESH_HLyt_1.addSpacing(5) ##---------------------------------------------------- GET HARD EDGE self.SelectHardEdge_btn = MyCustomBtn_Widget() self.SelectHardEdge_btn.setFixedSize(iconFixeSize, iconFixeSize) self.SelectHardEdge_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SelectHardEdge_btn.setIcon(QtGui.QIcon(IconPath + "HardEdge.png")) self.SelectHardEdge_btn.setToolTip(" Get Hard Edges from Selection ") self.SelectHardEdge_btn.clicked.connect(self.GetHardEdges) MESH_HLyt_1.addWidget(self.SelectHardEdge_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.SelectHardEdge_btn.customContextMenuRequested.connect(self.showPopupEdgeAngle) # CUBE M E N U I T E M S self.popupMenuEdgeAngle = QtWidgets.QMenu() Angle_Entry_1 = self.popupMenuEdgeAngle.addAction("Smooth 30°") Angle_Entry_1.triggered.connect(partial(self.SetSoftHardAngle, 30)) Angle_Entry_2 = self.popupMenuEdgeAngle.addAction("Smooth 35°") Angle_Entry_2.triggered.connect(partial(self.SetSoftHardAngle, 35)) Angle_Entry_3 = self.popupMenuEdgeAngle.addAction("Smooth 40°") Angle_Entry_3.triggered.connect(partial(self.SetSoftHardAngle, 40)) Angle_Entry_4 = self.popupMenuEdgeAngle.addAction("Smooth 45°") Angle_Entry_4.triggered.connect(partial(self.SetSoftHardAngle, 45)) MESH_HLyt_1.addSpacing(12) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,30) self.Separator.setStyleSheet("background-color:#434343;") MESH_HLyt_1.addWidget(self.Separator) MESH_HLyt_1.addSpacing(12) ##------------------------------------------------------------------------------- SYMETRY ##---------------------------------------------------- SYM MERGE self.SymMerge_btn = MyCustomBtn_Widget() self.SymMerge_btn.setFixedSize(iconFixeSize, iconFixeSize) self.SymMerge_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SymMerge_btn.setIcon(QtGui.QIcon(IconPath + "SymMerge.png")) self.SymMerge_btn.setToolTip(" Symmetry based on Pivot and Merge ") self.SymMerge_btn.clicked.connect(partial(self.Symmetry, 4)) MESH_HLyt_1.addWidget(self.SymMerge_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.SymMerge_btn.customContextMenuRequested.connect(self.showPopupSymMerge) # CUBE M E N U I T E M S self.popupMenuSymMerge = QtWidgets.QMenu() SymMerge_Entry_1 = self.popupMenuSymMerge.addAction("X") SymMerge_Entry_1.triggered.connect(partial(self.Symmetry, 0)) SymMerge_Entry_2 = self.popupMenuSymMerge.addAction("Y") SymMerge_Entry_2.triggered.connect(partial(self.Symmetry, 1)) SymMerge_Entry_3 = self.popupMenuSymMerge.addAction("Z") SymMerge_Entry_3.triggered.connect(partial(self.Symmetry, 2)) MESH_HLyt_1.addSpacing(5) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,30) self.Separator.setStyleSheet("background-color:#ff5f70;") MESH_HLyt_1.addWidget(self.Separator) MESH_HLyt_1.addSpacing(5) ##---------------------------------------------------- SYM FLIP self.SymFlip_btn = MyCustomBtn_Widget() self.SymFlip_btn.setFixedSize(iconFixeSize, iconFixeSize) self.SymFlip_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SymFlip_btn.setIcon(QtGui.QIcon(IconPath + "SymFlip.png")) self.SymFlip_btn.setToolTip(" Flip on World Axis ") self.SymFlip_btn.clicked.connect(partial(self.FlipWorld, 4)) MESH_HLyt_1.addWidget(self.SymFlip_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.SymFlip_btn.customContextMenuRequested.connect(self.showPopupSymFlip) # CUBE M E N U I T E M S self.popupMenuSymFlip = QtWidgets.QMenu() SymFlip_Entry_1 = self.popupMenuSymFlip.addAction("X") SymFlip_Entry_1.triggered.connect(partial(self.FlipWorld, 0)) SymFlip_Entry_2 = self.popupMenuSymFlip.addAction("Y") SymFlip_Entry_2.triggered.connect(partial(self.FlipWorld, 1)) SymFlip_Entry_3 = self.popupMenuSymFlip.addAction("Z") SymFlip_Entry_3.triggered.connect(partial(self.FlipWorld, 2)) ##---------------------------------------------------- SYM PIVOT self.SymPivot_btn = MyCustomBtn_Widget() self.SymPivot_btn.setFixedSize(iconFixeSize, iconFixeSize) self.SymPivot_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SymPivot_btn.setIcon(QtGui.QIcon(IconPath + "SymPivot.png")) self.SymPivot_btn.setToolTip(" Flip based on Pivot ") self.SymPivot_btn.clicked.connect(partial(self.FlipPivot, 4)) MESH_HLyt_1.addWidget(self.SymPivot_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.SymPivot_btn.customContextMenuRequested.connect(self.showPopupSymPivot) # CUBE M E N U I T E M S self.popupMenuSymPivot = QtWidgets.QMenu() SymPivot_Entry_1 = self.popupMenuSymPivot.addAction("X") SymPivot_Entry_1.triggered.connect(partial(self.FlipPivot, 0)) SymPivot_Entry_2 = self.popupMenuSymPivot.addAction("Y") SymPivot_Entry_2.triggered.connect(partial(self.FlipPivot, 1)) SymPivot_Entry_3 = self.popupMenuSymPivot.addAction("Z") SymPivot_Entry_3.triggered.connect(partial(self.FlipPivot, 2)) MESH_HLyt_1.addSpacing(5) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,30) self.Separator.setStyleSheet("background-color:#ff5f70;") MESH_HLyt_1.addWidget(self.Separator) MESH_HLyt_1.addSpacing(5) ##---------------------------------------------------- BAKE SYM self.BakeSym_btn = MyCustomBtn_Widget() self.BakeSym_btn.setFixedSize(iconFixeSize, iconFixeSize) self.BakeSym_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.BakeSym_btn.setIcon(QtGui.QIcon(IconPath + "SymBakeInstance.png")) self.BakeSym_btn.setToolTip(" Bake Instances ") self.BakeSym_btn.clicked.connect(self.BakeInstance) MESH_HLyt_1.addWidget(self.BakeSym_btn) ## ______________________________________________________________________________________/ Separator SECTION_MESH_LAYOUT.addSpacing(4) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(2000,1) self.Separator.setStyleSheet("background-color:#434343;") SECTION_MESH_LAYOUT.addWidget(self.Separator) SECTION_MESH_LAYOUT.addSpacing(4) ##------------------------------------------------------------------------------- OPERATIONS MESH_HLyt_2 = QtWidgets.QHBoxLayout() MESH_HLyt_2.setContentsMargins(10,0,0,0) MESH_HLyt_2.setSpacing(5) SECTION_MESH_LAYOUT.addLayout(MESH_HLyt_2) Operation_VLyt = QtWidgets.QVBoxLayout() MESH_HLyt_2.addLayout(Operation_VLyt) Op_Line_1_Hlyt = QtWidgets.QHBoxLayout() Operation_VLyt.addLayout(Op_Line_1_Hlyt) Op_Line_2_Hlyt = QtWidgets.QHBoxLayout() Operation_VLyt.addLayout(Op_Line_2_Hlyt) ##---------------------------------------------------- COMBINE self.Combine_btn = MyCustomBtn_Widget() self.Combine_btn.setFixedSize(iconFixeSize, iconFixeSize) self.Combine_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Combine_btn.setIcon(QtGui.QIcon(IconPath + "Combine.png")) self.Combine_btn.setToolTip(" Combine ") self.Combine_btn.clicked.connect(self.Combine) Op_Line_1_Hlyt.addWidget(self.Combine_btn) ##---------------------------------------------------- SEPARATE self.Separate_btn = MyCustomBtn_Widget() self.Separate_btn.setFixedSize(iconFixeSize, iconFixeSize) self.Separate_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.Separate_btn.setIcon(QtGui.QIcon(IconPath + "Separate.png")) self.Separate_btn.setToolTip(" Separate ") self.Separate_btn.clicked.connect(self.Separate) Op_Line_1_Hlyt.addWidget(self.Separate_btn) ##---------------------------------------------------- DUPLICATE FACE self.DupFace_btn = MyCustomBtn_Widget() self.DupFace_btn.setFixedSize(iconFixeSize, iconFixeSize) self.DupFace_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.DupFace_btn.setIcon(QtGui.QIcon(IconPath + "FaceDupli.png")) self.DupFace_btn.setToolTip(" Duplicate Faces ") self.DupFace_btn.clicked.connect(self.DuplicatFace) Op_Line_2_Hlyt.addWidget(self.DupFace_btn) ##---------------------------------------------------- EXTRACT FACE self.ExtractFace_btn = MyCustomBtn_Widget() self.ExtractFace_btn.setFixedSize(iconFixeSize, iconFixeSize) self.ExtractFace_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.ExtractFace_btn.setIcon(QtGui.QIcon(IconPath + "FaceExtract.png")) self.ExtractFace_btn.setToolTip(" Extract Faces ") self.ExtractFace_btn.clicked.connect(self.ExtractFace) Op_Line_2_Hlyt.addWidget(self.ExtractFace_btn) MESH_HLyt_2.addSpacing(12) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,60) self.Separator.setStyleSheet("background-color:#434343;") MESH_HLyt_2.addWidget(self.Separator) MESH_HLyt_2.addSpacing(12) Bevels_VLyt = QtWidgets.QVBoxLayout() MESH_HLyt_2.addLayout(Bevels_VLyt) ##---------------------------------------------------- MIXED BEVEL self.BevelTwo_btn = QtWidgets.QPushButton() self.BevelTwo_btn.setFixedSize(iconFixeSize, iconFixeSize) self.BevelTwo_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.BevelTwo_btn.setIcon(QtGui.QIcon(IconPath + "2Bevel.png")) self.BevelTwo_btn.setToolTip(" Mixed Bevels / Shift+Click : Mixed Bevels on 2 borders ") self.BevelTwo_btn.clicked.connect(self.BevelVariable) Bevels_VLyt.addWidget(self.BevelTwo_btn) ##---------------------------------------------------- BEVEL VERTEX self.BevelVertex_btn = MyCustomBtn_Widget() self.BevelVertex_btn.setFixedSize(iconFixeSize, iconFixeSize) self.BevelVertex_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.BevelVertex_btn.setIcon(QtGui.QIcon(IconPath + "fillet.png")) self.BevelVertex_btn.setToolTip(" Bevel Vertex on open area (use Marking Menu to change segment/offset ") self.BevelVertex_btn.clicked.connect(self.BevelVertex) Bevels_VLyt.addWidget(self.BevelVertex_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.BevelVertex_btn.customContextMenuRequested.connect(self.showPopupBevelHotkey) # CUBE M E N U I T E M S self.popupMenuBevelHotkey = QtWidgets.QMenu() BevelHotkey_Entry = self.popupMenuBevelHotkey.addAction("Bevel Vertice Add Hotkey") BevelHotkey_Entry.triggered.connect(self.BevelVertex_Hotkey) MESH_HLyt_2.addSpacing(12) self.Separator = QtWidgets.QLabel() self.Separator.setFixedSize(1,60) self.Separator.setStyleSheet("background-color:#434343;") MESH_HLyt_2.addWidget(self.Separator) MESH_HLyt_2.addSpacing(12) Flow_VLyt = QtWidgets.QVBoxLayout() MESH_HLyt_2.addLayout(Flow_VLyt) ##---------------------------------------------------- EDGE FLOW self.EdgeFlow_btn = QtWidgets.QPushButton() self.EdgeFlow_btn.setFixedSize(iconFixeSize, iconFixeSize) self.EdgeFlow_btn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.EdgeFlow_btn.setIcon(QtGui.QIcon(IconPath + "fixFlow.png")) self.EdgeFlow_btn.setToolTip(" Fix Edge Flow ") self.EdgeFlow_btn.clicked.connect(self.EdgeFlow) Flow_VLyt.addWidget(self.EdgeFlow_btn) MESH_HLyt_2.addSpacing(20) ##---------------------------------------------------- Add to Layout #------------------------------------------------ ##---------------------------------------------------- D E F I N I T I O N # ------------------------------------------------ MENUS def showPopupEdgeAngle(self, position): self.popupMenuEdgeAngle.exec_(self.SelectHardEdge_btn.mapToGlobal(position)) self.SelectHardEdge_btn.update() def showPopupSymMerge(self, position): self.popupMenuSymMerge.exec_(self.SymMerge_btn.mapToGlobal(position)) self.SymMerge_btn.update() def showPopupSymFlip(self, position): self.popupMenuSymFlip.exec_(self.SymFlip_btn.mapToGlobal(position)) self.SymFlip_btn.update() def showPopupSymPivot(self, position): self.popupMenuSymPivot.exec_(self.SymPivot_btn.mapToGlobal(position)) self.SymPivot_btn.update() def showPopupBevelHotkey(self, position): self.popupMenuBevelHotkey.exec_(self.BevelVertex_btn.mapToGlobal(position)) self.BevelVertex_btn.update() #------------------------------------------------ ACTIONS def BAM(self): print("BAMMM") def SetHardEdge(self): mc.PolygonHardenEdge() def SetSoftEdge(self): mc.PolygonSoftenEdge() def SetSoftHardAngle(self, angle): myVar = str(angle) mel.eval('polyPerformAction "polySoftEdge -a ' + myVar + '" e 0;') def GetHardEdges(self): obSelName = str(mc.ls(sl=True)[0]) objSel = mc.ls(sl=True) mc.ConvertSelectionToEdgePerimeter() # verif if perim or nor verifPerim = mc.ls(sl=True) if verifPerim == []: mc.select(objSel) mc.polySelectConstraint(m=3, t=0x8000, sm=1) mc.polySelectConstraint(m=0) mel.eval('doMenuComponentSelectionExt(" ' + obSelName + '", "edge", 0);') else: # Store EdgePerim Set mc.sets(n="ModIt_EdgePerim_tempSet") mc.polySelectConstraint(m=3, t=0x8000, sm=1) mc.polySelectConstraint(m=0) # Store All HardEdge mc.sets(n="ModIt_AllHardEdge_tempSet") # Sub Perim Edge mc.select("ModIt_EdgePerim_tempSet") mc.sets(rm='ModIt_AllHardEdge_tempSet') mc.select("ModIt_AllHardEdge_tempSet") mc.delete("ModIt_AllHardEdge_tempSet") mc.delete("ModIt_EdgePerim_tempSet") mel.eval('doMenuComponentSelectionExt(" ' + obSelName + '", "edge", 0);') def BakeInstance(self): mc.ConvertInstanceToObject() def Symmetry(self, axis): # Store Sel selection = mc.ls(sl=True, fl=True, dag=True) selVerif = mc.ls(sl=True) #VERIR SEULEMENT 1 MESH try: mc.objectType(selection[1]) except: ModIt_Global.WarningWindow(" Symmetry is only working on Geometry Mesh.", 350) return if mc.objectType(selection[1]) != "mesh": ModIt_Global.WarningWindow(" Symmetry is only working on Geometry Mesh.", 350) return if len(selVerif) > 1: ModIt_Global.WarningWindow(" You should select ONE mesh only.", 350) return selection = selection[0] mc.undoInfo(openChunk=True, infinity=True) #AXIS Info if axis == 4: AXIS = (json.load(open(PreferencePath + 'Pref_SymAxis.json', "r"))['VALUE']) else: AXIS = axis ##_____________________________________ Pour avoir l'info de quel sens faire la sym # Clean if mc.objExists("ModItSymInfo"): mc.delete("ModItSymInfo") if mc.objExists("ModIt_Sym_Loc"): mc.delete("ModIt_Sym_Loc") # Dup and Center Piv mc.duplicate(n="ModItSymInfo") mc.CenterPivot() mc.FreezeTransformations() # PlaceLocator / Freeze mc.spaceLocator(p=[0, 0, 0], n="ModIt_Sym_Loc") mc.select("ModIt_Sym_Loc", "ModItSymInfo") mc.MatchTransform() mc.select("ModIt_Sym_Loc") mc.FreezeTransformations() # Mathc Locator / mc.select("ModIt_Sym_Loc", selection) mc.MatchTransform() # Analyz = VALUE + - if AXIS == 0: axisLetter = "X" elif AXIS == 1: axisLetter = "Y" elif AXIS == 2: axisLetter = "Z" locAxeValue = mc.getAttr("ModIt_Sym_Loc.translate" + axisLetter) if locAxeValue > 0: axisDir = -1 print("axisDir = " + str(axisDir)) if locAxeValue < 0: axisDir = 1 print("axisDir = " + str(axisDir)) if locAxeValue == 0: axisDir = 1 print("axisDir = " + str(axisDir)) # Clean if mc.objExists("ModItSymInfo"): mc.delete("ModItSymInfo") if mc.objExists("ModIt_Sym_Loc"): mc.delete("ModIt_Sym_Loc") ##_____________________________________ mc.select(selection) mc.polyMirrorFace(cutMesh=1, mirrorAxis= 1, axis= AXIS, axisDirection= axisDir, mergeMode=1, mergeThresholdType=1, mergeThreshold =1, mirrorPosition=0, smoothingAngle=30, flipUVs=0, ch=1) mc.delete(ch=True) mc.SelectVertexMask() mc.SelectToggleMode() mc.undoInfo(closeChunk=True) def FlipWorld(self, axis): INSTANCE_MODE = (json.load(open(PreferencePath + 'InstanceMode.json', "r"))['VALUE']) if INSTANCE_MODE == 0: mc.undoInfo(openChunk=True, infinity=True) selection = mc.ls(sl = True, fl = True, dag = True, hd = 1) #CLEAN if mc.objExists("DupliF"): mc.delete("DupliF") DupSel = mc.duplicate(rc= True) mel.eval('doGroup 0 1 1;') NewGroup = mc.ls(sl=True) mc.rename(NewGroup, "DupliF") # Group Named if axis == 0: mc.setAttr("DupliF.scaleX", -1) elif axis == 1: mc.setAttr("DupliF.scaleY", -1) elif axis == 2: mc.setAttr("DupliF.scaleZ", -1) elif axis == 4: AXIS = (json.load(open(PreferencePath + 'Pref_SymAxis.json', "r"))['VALUE']) if AXIS == 0: mc.setAttr("DupliF.scaleX", -1) elif AXIS == 1: mc.setAttr("DupliF.scaleY", -1) elif AXIS == 2: mc.setAttr("DupliF.scaleZ", -1) mc.select("DupliF") mc.FreezeTransformations() mc.delete(ch=True) mc.Ungroup() mc.undoInfo(closeChunk=True) else: mc.undoInfo(openChunk=True, infinity=True) selection = mc.ls(sl=True, fl=True, dag=True, hd=1) # CLEAN if mc.objExists("ModIt_DupliWorld_Instance"): mc.delete("ModIt_DupliWorld_Instance") mel.eval('doGroup 0 1 1;') # Group Named NewGroup = mc.ls(sl=True) mc.rename(NewGroup, "ModIt_DupliWorld_Instance") if axis == 0: mel.eval("instance; scale -r -1 1 1") elif axis == 1: mel.eval("instance; scale -r 1 -1 1") elif axis == 2: mel.eval("instance; scale -r 1 1 -1") elif axis == 4: AXIS = (json.load(open(PreferencePath + 'Pref_SymAxis.json', "r"))['VALUE']) if AXIS == 0: mel.eval("instance; scale -r -1 1 1") elif AXIS == 1: mel.eval("instance; scale -r 1 -1 1") elif AXIS == 2: mel.eval("instance; scale -r 1 1 -1") instanceRootGroup = mc.ls(sl=True) mc.select("ModIt_DupliWorld_Instance") mc.CenterPivot() mc.rename("ModIt_DupliWorld_Instance", "ModIt_InstanceOrigin_grp") mc.select(instanceRootGroup) mc.CenterPivot() mc.rename(instanceRootGroup, "ModIt_InstanceWorld_grp") mc.select(d=True) def FlipPivot(self, axis): INSTANCE_MODE = (json.load(open(PreferencePath + 'InstanceMode.json', "r"))['VALUE']) if INSTANCE_MODE == 0: mc.undoInfo(openChunk=True, infinity=True) mc.FreezeTransformations() mc.duplicate(rc= True) mc.rename("DupliF") if axis == 0: mc.setAttr("DupliF.scaleX", -1) elif axis == 1: mc.setAttr("DupliF.scaleY", -1) elif axis == 2: mc.setAttr("DupliF.scaleZ", -1) elif axis == 4: AXIS = (json.load(open(PreferencePath + 'Pref_SymAxis.json', "r"))['VALUE']) if AXIS == 0: mc.setAttr("DupliF.scaleX", -1) elif AXIS == 1: mc.setAttr("DupliF.scaleY", -1) elif AXIS == 2: mc.setAttr("DupliF.scaleZ", -1) mc.rename("DupliF", "DupliFlip") mc.FreezeTransformations() mc.delete(ch=True) mc.undoInfo(closeChunk=True) else: mc.undoInfo(openChunk=True, infinity=True) selection = mc.ls(sl=True, fl=True, dag=True, hd=1) # CLEAN if mc.objExists("ModIt_DupliWorld_Instance"): mc.delete("ModIt_DupliWorld_Instance") if axis == 0: mel.eval("instance; scale -r -1 1 1") elif axis == 1: mel.eval("instance; scale -r 1 -1 1") elif axis == 2: mel.eval("instance; scale -r 1 1 -1") elif axis == 4: AXIS = (json.load(open(PreferencePath + 'Pref_SymAxis.json', "r"))['VALUE']) if AXIS == 0: mel.eval("instance; scale -r -1 1 1") elif AXIS == 1: mel.eval("instance; scale -r 1 -1 1") elif AXIS == 2: mel.eval("instance; scale -r 1 1 -1") instanceRootGroup = mc.ls(sl=True) mc.rename(instanceRootGroup, "ModIt_InstanceWorld_grp") def Separate(self): mc.undoInfo(openChunk=True, infinity=True) testSelection = mc.ls(sl=True, l=True) if testSelection == []: print("ModIt Error : Nothing Selected") return else: mc.SeparatePolygon() getParent = mc.listRelatives(parent=True, f=True) separateSel = mc.ls(sl=True, l=True) mc.CenterPivot() addSelToNewSet = mc.sets(n='ModIt_Set_Separate') mc.delete(ch=True) mc.ungroup(getParent) mc.select('ModIt_Set_Separate') newSel = mc.ls(sl=True, l=True) mc.FreezeTransformations() mc.delete('ModIt_Set_Separate') mc.select(newSel[0]) mc.undoInfo(closeChunk=True) def Combine(self): mc.undoInfo(openChunk=True, infinity=True) try: mel.eval('source "' + ToolsPath + 'Combine.mel"') mc.CenterPivot() except: ModIt_Global.WarningWindow("You should select at least 2 meshes.", 300) return mc.undoInfo(closeChunk=True) def ExtractFace(self): #Verif Selection is Face checkSelectedComponent = mc.filterExpand(sm=34) if checkSelectedComponent == None: ModIt_Global.WarningWindow(" You should select Faces.", 300) return else: mel.eval('source "' + ToolsPath + 'ExtractFace.mel"') def DuplicatFace(self): #Verif Selection is Face checkSelectedComponent = mc.filterExpand(sm=34) if checkSelectedComponent == None: ModIt_Global.WarningWindow(" You should select Faces.", 300) return else: mel.eval('source "' + ToolsPath + 'DuplicateFace.mel"') def EdgeFlow(self): #Verif Selection is Edge checkSelectedComponent = mc.filterExpand(sm=32) if checkSelectedComponent == None: ModIt_Global.WarningWindow(" You should select Edges.", 300) return else: mc.polyEditEdgeFlow(ch=1, adjustEdgeFlow=1) def BevelVertex(self): #Verif Selection is Vertex checkSelectedComponent = mc.filterExpand(sm=31) if checkSelectedComponent == None: ModIt_Global.WarningWindow(" Works only for Vertex on border.", 300) return else: mc.undoInfo(openChunk=True, infinity=True) ###_________Selection VertexInitSelection = mc.ls(sl=True) mc.ConvertSelectionToFaces() mc.ConvertSelectionToContainedEdges() BorderAll = mc.sets(n="Border_Set") mc.select(VertexInitSelection) mc.ConvertSelectionToEdges() BorderToVerif = mc.sets(n="ToVerif_Set") # Return the union of two sets Verif = mc.sets("Border_Set", sub="ToVerif_Set") mc.select(Verif) EdgeSel = mc.ls(sl=True) mc.delete("Border_Set") mc.delete("ToVerif_Set") mc.polyExtrudeEdge(EdgeSel, kft=True, pvx=0, pvy=0, pvz=0, divisions=1, twist=0, taper=1, offset=0, thickness=0) mc.ConvertSelectionToFaces() extrudeFaces = mc.ls(sl=True) # mc.ToggleVisibilityAndKeepSelection() mc.ConvertSelectionToContainedEdges() edgeToBevel = mc.ls(sl=True) mel.eval('dR_DoCmd("bevelPress")') mc.undoInfo(closeChunk=True) def BevelVertex_Hotkey(self): sourceNote = ModIt_Global.ToolPath + "Hotkeys/BevelVertice_Hotkey.txt" print("sourceNote == " + str(sourceNote)) path = os.path.realpath(sourceNote) os.startfile(path) def BevelVariable(self): edgeSelect = mc.ls(sl=True, l=True) if edgeSelect == []: ModIt_Global.WarningWindow("You should select one edge", 250) return # Verif if component mode is edge just_the_selected_edges = cmds.filterExpand(sm=32) if just_the_selected_edges == None: ModIt_Global.WarningWindow("You should select 1 edge", 250) return else: if len(just_the_selected_edges) > 1: ModIt_Global.WarningWindow("You should select 1 edge only", 250) return # CHECK IF OPEN MESH AND IF SO STORE EDGES INFO mc.select(mc.listHistory(edgeSelect)[0]) mc.ConvertSelectionToEdgePerimeter() checkEdgesPerimt = mc.ls(sl=True) if checkEdgesPerimt == []: # SO OBJET PLEIN pass else: mc.sets(n="ModIt_PerimEdge_Save") mc.select(edgeSelect) # GET VERTEXS mc.ConvertSelectionToVertices() vertexOrgerList = [] for vertex in mc.ls(sl=1, fl=1): vertexOrgerList.append(vertex) # TEST VERTEX ONE vertexOne = vertexOrgerList[0] mc.select(vertexOne) mc.ConvertSelectionToEdges() mc.sets(n="ModIt_VertexOne_Edges") if mc.sets("ModIt_PerimEdge_Save", ii="ModIt_VertexOne_Edges") == False: print("VextexOne is : Close") VextexOne = False else: print("VextexOne is : Open") VextexOne = True # TEST VERTEX ONE vertexTwo = vertexOrgerList[1] mc.select(vertexTwo) mc.ConvertSelectionToEdges() mc.sets(n="ModIt_VertexTwo_Edges") if mc.sets("ModIt_PerimEdge_Save", ii="ModIt_VertexTwo_Edges") == False: print("VextexTwo is : Close") VextexTwo = False else: print("VextexTwo is : Open") VextexTwo = True if VextexOne == True: if mc.objExists("ModIt_PerimEdge_Save"): mc.delete("ModIt_PerimEdge_Save") if mc.objExists("ModIt_VertexTwo_Edges"): mc.delete("ModIt_VertexTwo_Edges") if mc.objExists("ModIt_VertexOne_Edges"): mc.delete("ModIt_VertexOne_Edges") ModIt_Global.WarningWindow("One side from the select edge is open which is not good topology for the tool", 500) return elif VextexTwo == True: if mc.objExists("ModIt_PerimEdge_Save"): mc.delete("ModIt_PerimEdge_Save") if mc.objExists("ModIt_VertexTwo_Edges"): mc.delete("ModIt_VertexTwo_Edges") if mc.objExists("ModIt_VertexOne_Edges"): mc.delete("ModIt_VertexOne_Edges") ModIt_Global.WarningWindow("One side from the select edge is open which is not good topology for the tool", 500) return if mc.objExists("ModIt_PerimEdge_Save"): mc.delete("ModIt_PerimEdge_Save") if mc.objExists("ModIt_VertexTwo_Edges"): mc.delete("ModIt_VertexTwo_Edges") if mc.objExists("ModIt_VertexOne_Edges"): mc.delete("ModIt_VertexOne_Edges") mc.undoInfo(openChunk=True, infinity=True) #CLEAN VERIF if mc.objExists("EdgePerimBefore_SET"): mc.delete("EdgePerimBefore_SET") if mc.objExists("EdgePerimAfter_SET"): mc.delete("EdgePerimAfter_SET") if mc.objExists("FaceToDel_SET"): mc.delete("FaceToDel_SET") if mc.objExists("OriginVertexSave_SET"): mc.delete("OriginVertexSave_SET") #START PROCEDURE mc.select(mc.listHistory(edgeSelect)[0]) objectName = mc.ls(sl=True, l=True) mc.select(edgeSelect) OriginVertexSave = mc.ConvertSelectionToVertices() mc.sets(n="OriginVertexSave_SET") # Get face shader mc.select(edgeSelect) mc.ConvertSelectionToFaces() cmds.hyperShade(shaderNetworksSelectMaterialNodes=True) getMaterial = cmds.ls(sl=True)[0] print(getMaterial) ## mc.select(edgeSelect) faceToDel = mc.ConvertSelectionToFaces() mc.sets(n="FaceToDel_SET") # Save PerimBefore mc.ConvertSelectionToEdgePerimeter() edgePerimBefore = mc.sets(n="EdgePerimBefore_SET") # Del Face to hole mc.select("FaceToDel_SET") mc.delete() mc.select("OriginVertexSave_SET") # Selected vertices vertexOrgerList = [] for vertex in mc.ls(sl=1, fl=1): vertexOrgerList.append(vertex) vertexOne = vertexOrgerList[0] ##____ BEVEL VERTEX : 1 ______________________________________ mc.select(vertexOne) ###_________Selection VertexInitSelection = mc.ls(sl=True) mc.ConvertSelectionToFaces() mc.ConvertSelectionToContainedEdges() BorderAll = mc.sets(n="Border_Set") mc.select(VertexInitSelection) mc.ConvertSelectionToEdges() BorderToVerif = mc.sets(n="ToVerif_Set") # Return the union of two sets Verif = mc.sets("Border_Set", sub="ToVerif_Set") mc.select(Verif) EdgeSel = mc.ls(sl=True) mc.delete("Border_Set") mc.delete("ToVerif_Set") mc.polyExtrudeEdge(EdgeSel, kft=True, pvx=0, pvy=0, pvz=0, divisions=1, twist=0, taper=1, offset=0, thickness=0) mc.ConvertSelectionToFaces() extrudeFaces = mc.ls(sl=True) mc.ConvertSelectionToContainedEdges() edgeToBevel = mc.ls(sl=True) mel.eval('dR_DoCmd("bevelPress")') mel.eval('string $getBevelNode[] = `listHistory -lv 1`;') mel.eval('setAttr ($getBevelNode[1] + ".segments") 4;') mc.setToolTo('moveSuperContext') ##____ BEVEL VERTEX : 2 ______________________________________ mc.select("OriginVertexSave_SET") ###_________Selection VertexInitSelection = mc.ls(sl=True) mc.ConvertSelectionToFaces() mc.ConvertSelectionToContainedEdges() BorderAll = mc.sets(n="Border_Set") mc.select(VertexInitSelection) mc.ConvertSelectionToEdges() BorderToVerif = mc.sets(n="ToVerif_Set") # Return the union of two sets Verif = mc.sets("Border_Set", sub="ToVerif_Set") mc.select(Verif) EdgeSel = mc.ls(sl=True) mc.delete("Border_Set") mc.delete("ToVerif_Set") mc.polyExtrudeEdge(EdgeSel, kft=True, pvx=0, pvy=0, pvz=0, divisions=1, twist=0, taper=1, offset=0, thickness=0) mc.ConvertSelectionToFaces() extrudeFaces = mc.ls(sl=True) mc.ConvertSelectionToContainedEdges() edgeToBevel = mc.ls(sl=True) mel.eval('dR_DoCmd("bevelPress")') mel.eval('string $getBevelNode[] = `listHistory -lv 1`;') mel.eval('setAttr ($getBevelNode[1] + ".segments") 4;') mc.setToolTo('moveSuperContext') ##____ FILL HOLE and CONNECT ______________________________________ # Get sel to Bridge then mc.select("EdgePerimBefore_SET") mc.FillHole() mc.sets(n="EdgePerimAfter_SET") mc.ConvertSelectionToContainedFaces() mc.delete() setDiff = mc.sets("EdgePerimBefore_SET", sub="EdgePerimAfter_SET") mc.select(setDiff) # BRIDGE mc.polyBridgeEdge(divisions=0) mc.ConvertSelectionToFaces() mc.polySoftEdge(angle=45) # Fill Holes mc.select("EdgePerimBefore_SET") mc.FillHole() mc.ConvertSelectionToContainedFaces() mc.hyperShade(assign=str(getMaterial)) mc.select("EdgePerimAfter_SET") mc.polySoftEdge(angle=0) #Clear mc.SelectNone() # Deselect All mc.delete("EdgePerimBefore_SET") mc.delete("EdgePerimAfter_SET") mc.delete("FaceToDel_SET") mc.delete("OriginVertexSave_SET") # 1 - GET ALL BEVEL NODE typ = "polyBevel3" nodes = [] print("objectName here = " + str(objectName)) for obj in objectName: for node in mc.listHistory(obj): if mc.nodeType(node) == typ: nodes.append(node) BevelA_node = nodes[0] BevelB_node = nodes[1] print(BevelA_node) print(BevelB_node) mc.undoInfo(closeChunk=True) #---------------------- UI #Pour eviter la boucle infinie avec le atClose qui clean la THumbScene if mc.window("Bevel2", exists=True): mc.deleteUI("Bevel2") importlib.reload(ModIt_2Bevels_UI) ModIt_2Bevels_UI.SEND_INFO(str(BevelA_node), str(BevelB_node)) ModIt_2Bevels_UI.showUI()