##-------------------------------------------------------------------------- # Import Qt from project's unified Qt.py module import sys as _sys import os as _os # Add parent scripts directory to sys.path _modit_dir = _os.path.dirname(_os.path.abspath(__file__)) _scripts_dir = _modit_dir while _os.path.basename(_scripts_dir) != 'scripts' and _scripts_dir != _os.path.dirname(_scripts_dir): _scripts_dir = _os.path.dirname(_scripts_dir) if _scripts_dir not in _sys.path: _sys.path.insert(0, _scripts_dir) from Qt import QtWidgets, QtCore, QtGui, QtCompat # Use QtCompat for cross-version compatibility wrapInstance = QtCompat.wrapInstance QIcon = QtGui.QIcon QWidget = QtWidgets.QWidget from maya import cmds as mc import maya.mel as mel import json import os import maya.cmds as cmds from functools import partial import importlib from .. import ModIt_Global importlib.reload(ModIt_Global) from .. import ModIt_CSS importlib.reload(ModIt_CSS) ##______________________GLOBAL VAR ##PATH_SET IconPath = ModIt_Global.IconsPathThemeClassic PreferencePath = ModIt_Global.PreferencePath ToolsPath = ModIt_Global.ToolPath # ****************************************** # BUTTONS PARAMS # ****************************************** iconFixeSize = ModIt_Global.iconFixeSize iconButtonSize = ModIt_Global.iconButtonSize separatorWidth = ModIt_Global.separatorWidth ##JSON PREF DATA PRIM_MODE =(json.load(open(PreferencePath + 'Setting_Primitives_Placement.json',"r"))['PRIM_MODE']) PRIM_SIZE =(json.load(open(PreferencePath + 'Setting_Primitives_Size.json',"r"))['PRIM_SIZE']) class MyCustomBtn_Widget(QtWidgets.QPushButton): def __init__(self): super().__init__() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) def mousePressEvent(self, event): super().mousePressEvent(event) if event.button() == QtCore.Qt.RightButton: # emit the signal, we can grab the pos directly from the event, no need to get cursor position anymore self.customContextMenuRequested.emit(event.pos()) # make a call to mouseRelease event to restore button back to its original state self.mouseReleaseEvent(event) class PRIMITIVES_LAYOUT(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent=parent) SECTION_PRIMITIVES_LAYOUT = QtWidgets.QHBoxLayout() # MAIN SECTION_PRIMITIVES_LAYOUT.setContentsMargins(0,0,0,0) self.setLayout(SECTION_PRIMITIVES_LAYOUT) ##---------------------------------------------------- PRIMITIVES - CUBE #self.CubeBtn = QtWidgets.QPushButton() self.CubeBtn = MyCustomBtn_Widget() self.CubeBtn.setFixedSize(iconFixeSize, iconFixeSize) self.CubeBtn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.CubeBtn.setIcon(QtGui.QIcon(IconPath + "Prim_CUBE.png")) self.CubeBtn.clicked.connect(partial(self.Create_Cube, 1)) # 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.CubeBtn.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.CubeBtn.customContextMenuRequested.connect(self.showPopupCube) # CUBE M E N U I T E M S self.popupMenuCube = QtWidgets.QMenu() CubeMenu_Entry_1 = self.popupMenuCube.addAction("Cube sbdv 1") CubeMenu_Entry_2 = self.popupMenuCube.addAction("Cube sbdv 2") CubeMenu_Entry_3 = self.popupMenuCube.addAction("Cube sbdv 3") CubeMenu_Entry_4 = self.popupMenuCube.addAction("Cube sbdv 4") CubeMenu_Entry_1.triggered.connect(partial(self.Create_Cube, 1)) CubeMenu_Entry_2.triggered.connect(partial(self.Create_Cube, 2)) CubeMenu_Entry_3.triggered.connect(partial(self.Create_Cube, 3)) CubeMenu_Entry_4.triggered.connect(partial(self.Create_Cube, 4)) ##---------------------------------------------------- PRIMITIVES - SPHERE self.SphereBtn = MyCustomBtn_Widget() self.SphereBtn.setFixedSize(iconFixeSize, iconFixeSize) self.SphereBtn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.SphereBtn.setIcon(QtGui.QIcon(IconPath + "Prim_SPHERE.png")) self.SphereBtn.clicked.connect(partial(self.Create_Sphere, 16, 10)) # 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.SphereBtn.customContextMenuRequested.connect(self.showPopupSphere) # CUBE M E N U I T E M S self.popupMenuSphere = QtWidgets.QMenu() SphereMenu_Entry_1 = self.popupMenuSphere.addAction("Sphere sbdv 12") SphereMenu_Entry_2 = self.popupMenuSphere.addAction("Sphere sbdv 14") SphereMenu_Entry_3 = self.popupMenuSphere.addAction("Sphere sbdv 16") SphereMenu_Entry_4 = self.popupMenuSphere.addAction("Sphere sbdv 18") SphereMenu_Entry_5 = self.popupMenuSphere.addAction("Sphere sbdv 20") SphereMenu_Entry_6 = self.popupMenuSphere.addAction("Sphere sbdv 22") SphereMenu_Entry_1.triggered.connect(partial(self.Create_Sphere, 12, 6)) SphereMenu_Entry_2.triggered.connect(partial(self.Create_Sphere, 14, 8)) SphereMenu_Entry_3.triggered.connect(partial(self.Create_Sphere, 16, 10)) SphereMenu_Entry_4.triggered.connect(partial(self.Create_Sphere, 18, 10)) SphereMenu_Entry_5.triggered.connect(partial(self.Create_Sphere, 20, 12)) SphereMenu_Entry_6.triggered.connect(partial(self.Create_Sphere, 22, 12)) ##---------------------------------------------------- PRIMITIVES - CYLINDER self.CylinderBtn = MyCustomBtn_Widget() self.CylinderBtn.setObjectName("TABSBTN") self.CylinderBtn.setFixedSize(iconFixeSize, iconFixeSize) self.CylinderBtn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.CylinderBtn.setIcon(QtGui.QIcon(IconPath + "Prim_CYLINDRE.png")) self.CylinderBtn.clicked.connect(partial(self.Create_Cylinder, 2, 16)) # 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.CylinderBtn.customContextMenuRequested.connect(self.showPopupCylinder) # CUBE M E N U I T E M S self.popupMenuCylinder = QtWidgets.QMenu() CylinderMenu_Entry_0 = self.popupMenuCylinder.addAction("------------X") CylinderMenu_Entry_1 = self.popupMenuCylinder.addAction("Cylinder 8") CylinderMenu_Entry_2 = self.popupMenuCylinder.addAction("Cylinder 12") CylinderMenu_Entry_3 = self.popupMenuCylinder.addAction("Cylinder 16") CylinderMenu_Entry_4 = self.popupMenuCylinder.addAction("Cylinder 28") CylinderMenu_Entry_00 = self.popupMenuCylinder.addAction("------------Y") CylinderMenu_Entry_5 = self.popupMenuCylinder.addAction("Cylinder 8") CylinderMenu_Entry_6 = self.popupMenuCylinder.addAction("Cylinder 12") CylinderMenu_Entry_7 = self.popupMenuCylinder.addAction("Cylinder 16") CylinderMenu_Entry_8 = self.popupMenuCylinder.addAction("Cylinder 28") CylinderMenu_Entry_000 = self.popupMenuCylinder.addAction("------------Z") CylinderMenu_Entry_9 = self.popupMenuCylinder.addAction("Cylinder 8") CylinderMenu_Entry_10 = self.popupMenuCylinder.addAction("Cylinder 12") CylinderMenu_Entry_11 = self.popupMenuCylinder.addAction("Cylinder 16") CylinderMenu_Entry_12 = self.popupMenuCylinder.addAction("Cylinder 28") CylinderMenu_Entry_1.triggered.connect(partial(self.Create_Cylinder, 1, 8)) CylinderMenu_Entry_2.triggered.connect(partial(self.Create_Cylinder, 1, 12)) CylinderMenu_Entry_3.triggered.connect(partial(self.Create_Cylinder, 1, 16)) CylinderMenu_Entry_4.triggered.connect(partial(self.Create_Cylinder, 1, 28)) CylinderMenu_Entry_5.triggered.connect(partial(self.Create_Cylinder, 2, 8)) CylinderMenu_Entry_6.triggered.connect(partial(self.Create_Cylinder, 2, 12)) CylinderMenu_Entry_7.triggered.connect(partial(self.Create_Cylinder, 2, 16)) CylinderMenu_Entry_8.triggered.connect(partial(self.Create_Cylinder, 2, 28)) CylinderMenu_Entry_9.triggered.connect(partial(self.Create_Cylinder, 3, 8)) CylinderMenu_Entry_10.triggered.connect(partial(self.Create_Cylinder, 3, 12)) CylinderMenu_Entry_11.triggered.connect(partial(self.Create_Cylinder, 3, 16)) CylinderMenu_Entry_12.triggered.connect(partial(self.Create_Cylinder, 3, 28)) ##---------------------------------------------------- PRIMITIVES - PLANE self.PlaneBtn = MyCustomBtn_Widget() self.PlaneBtn.setObjectName("TABSBTN") self.PlaneBtn.setFixedSize(iconFixeSize, iconFixeSize) self.PlaneBtn.setIconSize(QtCore.QSize(iconButtonSize, iconButtonSize)) self.PlaneBtn.setIcon(QtGui.QIcon(IconPath + "Prim_PLANE.png")) self.PlaneBtn.clicked.connect(partial(self.Create_Plane, 2)) # 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.PlaneBtn.customContextMenuRequested.connect(self.showPopupPlane) # CUBE M E N U I T E M S self.popupMenuPlane = QtWidgets.QMenu() PlaneMenu_Entry_1 = self.popupMenuPlane.addAction("Plane X") PlaneMenu_Entry_2 = self.popupMenuPlane.addAction("Plane Y") PlaneMenu_Entry_3 = self.popupMenuPlane.addAction("Plane Z") PlaneMenu_Entry_1.triggered.connect(partial(self.Create_Plane, 1)) PlaneMenu_Entry_2.triggered.connect(partial(self.Create_Plane, 2)) PlaneMenu_Entry_3.triggered.connect(partial(self.Create_Plane, 3)) ##---------------------------------------------------- Add to Layout SECTION_PRIMITIVES_LAYOUT.addWidget(self.CubeBtn) SECTION_PRIMITIVES_LAYOUT.addWidget(self.SphereBtn) SECTION_PRIMITIVES_LAYOUT.addWidget(self.CylinderBtn) SECTION_PRIMITIVES_LAYOUT.addWidget(self.PlaneBtn) #------------------------------------------------ ##---------------------------------------------------- D E F I N I T I O N #------------------------------------------------ def BAM(self): print("BAMMM") # Data to be written dictionary = { "name": "Wizix", "Age": 32, "Tag": "wzx", } open(PreferencePath + 'TestFile.json', "w").write(json.dumps(dictionary, indent=3)) def BAM2(self): print("BAMMM2") # Data to be written entry = {"Age": 36} filename = PreferencePath + 'TestFile.json' lst = [{'alice': 24, 'bob': 27}] with open(filename, mode='w') as f: lst.append({'carl': 33}) json.dump(lst, f) def Create_Cube(self, subdiv): #_______________VAR MultiScale = (json.load(open(PreferencePath + 'Setting_Primitives_Size.json', "r"))['PRIM_SIZE']) InteractionMode = (json.load(open(PreferencePath + 'Setting_Primitives_Placement.json', "r"))['PRIM_MODE']) PRIM_TOPOF = (json.load(open(PreferencePath + 'Setting_Primitives_OnTopOf.json', "r"))['VALUE']) self.CubeBtn.update() RenameName = "Cube_001" if InteractionMode == 0: selection = mc.ls(sl=True) createCubePrim = mc.polyCube(w=10 * MultiScale, h=10 * MultiScale, d=10 * MultiScale, sx=subdiv, sy=subdiv, sz=subdiv, ax=[0, 1, 0], cuv=4, ch=1) if selection == []: #GRID MODE createCubePrim mc.select(createCubePrim) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') elif mc.objectType(selection[0]) == "mesh": #COMPONENT MODE mc.select(selection) mc.setToolTo('moveSuperContext') pos = mc.manipMoveContext('Move', query=True, position=True) createCubePrim mc.select(createCubePrim) # 1 - Place at component position mc.move(pos[0], pos[1], pos[2]) constr = mc.normalConstraint(selection, createCubePrim, aimVector=(0, 1, 0), worldUpType=0) mc.delete(constr) myObj = mc.rename(RenameName) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: #ON TOP OF MODE if PRIM_TOPOF == 1: createCubePrim mc.select(createCubePrim) mc.xform(ws=1, a=1, piv=[0, 0, 0]) mc.makeIdentity(apply=True) ##_______________Get Selection BBOX bbox = mc.exactWorldBoundingBox(selection) Ymin = bbox[1] YMax = bbox[4] # 0 - Init Freeze at Origin asset bbox = mc.exactWorldBoundingBox(createCubePrim) bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2] mc.xform(createCubePrim, piv=bottom, ws=True) mc.move(0, 0, 0, createCubePrim, rpr=True) mc.select(createCubePrim) mc.makeIdentity(apply=True, t=1, r=1, s=1) # 1 - Place at obj posion mc.matchTransform(createCubePrim, selection, pos=True) # 2 - Up to Top mc.move(YMax, createCubePrim, y=True, a=True) mc.select(createCubePrim[0]) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: pass else: #VERIF SELECTION SELECTION = mc.ls(sl=True) if SELECTION == []: ModIt_Global.WarningWindow("You should select a mesh", 250) return mc.SelectVertexMask() mc.SelectToggleMode() #ACTIVATE INTERACTIVE CREATION USER if mc.optionVar(q="createPolyPrimitiveAsTool") == 0: mc.ToggleCreatePolyPrimitivesAsTool() if mc.optionVar(q="polyPrimitiveAsToolExitOnComplete") == 0: mc.TogglePolyPrimitivesAsToolExitOnComplete() #ADD TO SNAP OBJECT ##KILL INTERACTIVE PRIM SCRIPT JOB JOB_NUMBER = (json.load(open(PreferencePath + 'JobNumber.json', "r"))['JOB_NUMBER']) try: mc.scriptJob(kill=JOB_NUMBER, force=True) except: pass mc.makeLive() #ACTIVATE INTERACTIVE et EXIT InteractiveModeScriptJob = mel.eval('int $jobNum = `scriptJob -ct "SomethingSelected" "makeLive -none;" -protected`;') open(PreferencePath + 'JobNumber.json', "w").write(json.dumps({"JOB_NUMBER": InteractiveModeScriptJob})) mc.createPolyCubeCtx("CreatePolyCubeCtx", e=True, w=10*MultiScale, h=10*MultiScale, d=10*MultiScale, sh=subdiv, sd=subdiv, sw=subdiv) mc.setToolTo("CreatePolyCubeCtx") def Create_Sphere(self, subdivA, subdivH): # _______________VAR MultiScale = (json.load(open(PreferencePath + 'Setting_Primitives_Size.json', "r"))['PRIM_SIZE']) InteractionMode = (json.load(open(PreferencePath + 'Setting_Primitives_Placement.json', "r"))['PRIM_MODE']) PRIM_TOPOF = (json.load(open(PreferencePath + 'Setting_Primitives_OnTopOf.json', "r"))['VALUE']) self.SphereBtn.update() RenameName = "Sphere_001" if InteractionMode == 0: selection = mc.ls(sl=True) createSpherePrim = mc.polySphere(r=5*MultiScale, sx=subdivA, sy=subdivH, ax=[0, 1, 0], cuv=2,ch=1) if selection == []: # GRID MODE createSpherePrim mc.select(createSpherePrim) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') elif mc.objectType(selection[0]) == "mesh": # COMPONENT MODE mc.select(selection) mc.setToolTo('moveSuperContext') pos = mc.manipMoveContext('Move', query=True, position=True) createSpherePrim mc.select(createSpherePrim) # 1 - Place at component position mc.move(pos[0], pos[1], pos[2]) constr = mc.normalConstraint(selection, createSpherePrim, aimVector=(0, 1, 0), worldUpType=0) mc.delete(constr) myObj = mc.rename(RenameName) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: # ON TOP OF MODE if PRIM_TOPOF == 1: createSpherePrim mc.select(createSpherePrim) mc.xform(ws=1, a=1, piv=[0, 0, 0]) mc.makeIdentity(apply=True) ##_______________Get Selection BBOX bbox = mc.exactWorldBoundingBox(selection) Ymin = bbox[1] YMax = bbox[4] # 0 - Init Freeze at Origin asset bbox = mc.exactWorldBoundingBox(createSpherePrim) bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2] mc.xform(createSpherePrim, piv=bottom, ws=True) mc.move(0, 0, 0, createSpherePrim, rpr=True) mc.select(createSpherePrim) mc.makeIdentity(apply=True, t=1, r=1, s=1) # 1 - Place at obj posion mc.matchTransform(createSpherePrim, selection, pos=True) # 2 - Up to Top mc.move(YMax, createSpherePrim, y=True, a=True) mc.select(createSpherePrim[0]) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: pass else: # VERIF SELECTION SELECTION = mc.ls(sl=True) if SELECTION == []: ModIt_Global.WarningWindow("You should select a mesh", 250) return mc.SelectVertexMask() mc.SelectToggleMode() # ACTIVATE INTERACTIVE CREATION USER if mc.optionVar(q="createPolyPrimitiveAsTool") == 0: mc.ToggleCreatePolyPrimitivesAsTool() if mc.optionVar(q="polyPrimitiveAsToolExitOnComplete") == 0: mc.TogglePolyPrimitivesAsToolExitOnComplete() # ADD TO SNAP OBJECT ##KILL INTERACTIVE PRIM SCRIPT JOB JOB_NUMBER = (json.load(open(PreferencePath + 'JobNumber.json', "r"))['JOB_NUMBER']) try: mc.scriptJob(kill=JOB_NUMBER, force=True) except: pass mc.makeLive() # ACTIVATE INTERACTIVE et EXIT InteractiveModeScriptJob = mel.eval( 'int $jobNum = `scriptJob -ct "SomethingSelected" "makeLive -none;" -protected`;') open(PreferencePath + 'JobNumber.json', "w").write(json.dumps({"JOB_NUMBER": InteractiveModeScriptJob})) mc.createPolySphereCtx("CreatePolySphereCtx", e=True, radius=5 * MultiScale, sh=subdivA, sw=subdivH) mc.setToolTo("CreatePolySphereCtx") mc.polySoftEdge(a=45, ch=1) def Create_Cylinder(self, axe, subdiv): # _______________VAR MultiScale = (json.load(open(PreferencePath + 'Setting_Primitives_Size.json', "r"))['PRIM_SIZE']) InteractionMode = (json.load(open(PreferencePath + 'Setting_Primitives_Placement.json', "r"))['PRIM_MODE']) PRIM_TOPOF = (json.load(open(PreferencePath + 'Setting_Primitives_OnTopOf.json', "r"))['VALUE']) self.CylinderBtn.update() RenameName = "Cylinder_001" if axe == 1: axValue = [1, 0, 0] elif axe == 2: axValue = [0, 1, 0] elif axe == 3: axValue = [0, 0, 1] if InteractionMode == 0: selection = mc.ls(sl=True) createCylinderPrim = mc.polyCylinder(r=5 * MultiScale, h=10* MultiScale, sy=1, sz=0, ax= axValue, sc=0, cuv=4, ch=1, sa=subdiv) if selection == []: # GRID MODE createCylinderPrim mc.select(createCylinderPrim) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') elif mc.objectType(selection[0]) == "mesh": # COMPONENT MODE mc.select(selection) mc.setToolTo('moveSuperContext') pos = mc.manipMoveContext('Move', query=True, position=True) createCylinderPrim mc.select(createCylinderPrim) # 1 - Place at component position mc.move(pos[0], pos[1], pos[2]) constr = mc.normalConstraint(selection, createCylinderPrim, aimVector=(0, 1, 0), worldUpType=0) mc.delete(constr) myObj = mc.rename(RenameName) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: # ON TOP OF MODE if PRIM_TOPOF == 1: createCylinderPrim mc.select(createCylinderPrim) mc.xform(ws=1, a=1, piv=[0, 0, 0]) mc.makeIdentity(apply=True) ##_______________Get Selection BBOX bbox = mc.exactWorldBoundingBox(selection) Ymin = bbox[1] YMax = bbox[4] # 0 - Init Freeze at Origin asset bbox = mc.exactWorldBoundingBox(createCylinderPrim) bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2] mc.xform(createCylinderPrim, piv=bottom, ws=True) mc.move(0, 0, 0, createCylinderPrim, rpr=True) mc.select(createCylinderPrim) mc.makeIdentity(apply=True, t=1, r=1, s=1) # 1 - Place at obj posion mc.matchTransform(createCylinderPrim, selection, pos=True) # 2 - Up to Top mc.move(YMax, createCylinderPrim, y=True, a=True) mc.select(createCylinderPrim[0]) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl= True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: pass else: # VERIF SELECTION SELECTION = mc.ls(sl=True) if SELECTION == []: ModIt_Global.WarningWindow("You should select a mesh", 250) return mc.SelectVertexMask() mc.SelectToggleMode() # ACTIVATE INTERACTIVE CREATION USER if mc.optionVar(q="createPolyPrimitiveAsTool") == 0: mc.ToggleCreatePolyPrimitivesAsTool() if mc.optionVar(q="polyPrimitiveAsToolExitOnComplete") == 0: mc.TogglePolyPrimitivesAsToolExitOnComplete() # ADD TO SNAP OBJECT ##KILL INTERACTIVE PRIM SCRIPT JOB JOB_NUMBER = (json.load(open(PreferencePath + 'JobNumber.json', "r"))['JOB_NUMBER']) try: mc.scriptJob(kill=JOB_NUMBER, force=True) except: pass mc.makeLive() # ACTIVATE INTERACTIVE et EXIT InteractiveModeScriptJob = mel.eval( 'int $jobNum = `scriptJob -ct "SomethingSelected" "makeLive -none;" -protected`;') open(PreferencePath + 'JobNumber.json', "w").write(json.dumps({"JOB_NUMBER": InteractiveModeScriptJob})) mc.createPolyCylinderCtx("CreatePolyCylinderCtx", e=True, radius=5 * MultiScale, height=10 * MultiScale , sa =subdiv) mc.setToolTo("CreatePolyCylinderCtx") mc.polySoftEdge(a=45, ch=1) def Create_Plane(self, axe): # _______________VAR MultiScale = (json.load(open(PreferencePath + 'Setting_Primitives_Size.json', "r"))['PRIM_SIZE']) InteractionMode = (json.load(open(PreferencePath + 'Setting_Primitives_Placement.json', "r"))['PRIM_MODE']) PRIM_TOPOF = (json.load(open(PreferencePath + 'Setting_Primitives_OnTopOf.json', "r"))['VALUE']) self.CubeBtn.update() RenameName = "Plane_001" if axe == 1: axValue = [1, 0, 0] elif axe == 2: axValue = [0, 1, 0] elif axe == 3: axValue = [0, 0, 1] if InteractionMode == 0: selection = mc.ls(sl=True) createPlanePrim = mc.polyPlane(w=10 * MultiScale, h=10 * MultiScale, sx=1, sy=1, ax=axValue, cuv=2, ch=1) if selection == []: # GRID MODE createPlanePrim mc.select(createPlanePrim) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl=True) mc.select(myObj) mc.setToolTo('moveSuperContext') elif mc.objectType(selection[0]) == "mesh": # COMPONENT MODE mc.select(selection) mc.setToolTo('moveSuperContext') pos = mc.manipMoveContext('Move', query=True, position=True) createPlanePrim mc.select(createPlanePrim) # 1 - Place at component position mc.move(pos[0], pos[1], pos[2]) constr = mc.normalConstraint(selection, createPlanePrim, aimVector=(0, 1, 0), worldUpType=0) mc.delete(constr) myObj = mc.rename(RenameName) mc.select(cl=True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: # ON TOP OF MODE if PRIM_TOPOF == 1: createPlanePrim mc.select(createPlanePrim) mc.xform(ws=1, a=1, piv=[0, 0, 0]) mc.makeIdentity(apply=True) ##_______________Get Selection BBOX bbox = mc.exactWorldBoundingBox(selection) Ymin = bbox[1] YMax = bbox[4] # 0 - Init Freeze at Origin asset bbox = mc.exactWorldBoundingBox(createPlanePrim) bottom = [(bbox[0] + bbox[3]) / 2, bbox[1], (bbox[2] + bbox[5]) / 2] mc.xform(createPlanePrim, piv=bottom, ws=True) mc.move(0, 0, 0, createPlanePrim, rpr=True) mc.select(createPlanePrim) mc.makeIdentity(apply=True, t=1, r=1, s=1) # 1 - Place at obj posion mc.matchTransform(createPlanePrim, selection, pos=True) # 2 - Up to Top mc.move(YMax, createPlanePrim, y=True, a=True) mc.select(createPlanePrim[0]) mc.CenterPivot() myObj = mc.rename(RenameName) mc.polySoftEdge(a=45, ch=1) mc.makeIdentity(apply=True) mc.select(cl=True) mc.select(myObj) mc.setToolTo('moveSuperContext') else: pass else: # VERIF SELECTION SELECTION = mc.ls(sl=True) if SELECTION == []: ModIt_Global.WarningWindow("You should select a mesh", 250) return mc.SelectVertexMask() mc.SelectToggleMode() # ACTIVATE INTERACTIVE CREATION USER if mc.optionVar(q="createPolyPrimitiveAsTool") == 0: mc.ToggleCreatePolyPrimitivesAsTool() if mc.optionVar(q="polyPrimitiveAsToolExitOnComplete") == 0: mc.TogglePolyPrimitivesAsToolExitOnComplete() # ADD TO SNAP OBJECT ##KILL INTERACTIVE PRIM SCRIPT JOB JOB_NUMBER = (json.load(open(PreferencePath + 'JobNumber.json', "r"))['JOB_NUMBER']) try: mc.scriptJob(kill=JOB_NUMBER, force=True) except: pass mc.makeLive() # ACTIVATE INTERACTIVE et EXIT InteractiveModeScriptJob = mel.eval( 'int $jobNum = `scriptJob -ct "SomethingSelected" "makeLive -none;" -protected`;') open(PreferencePath + 'JobNumber.json', "w").write(json.dumps({"JOB_NUMBER": InteractiveModeScriptJob})) mc.createPolyPlaneCtx("CreatePolyPlaneCtx", e=True, w=10 * MultiScale, h=10 * MultiScale, sh=1, sw=1) mc.setToolTo("CreatePolyPlaneCtx") def showPopupCube(self, position): self.popupMenuCube.exec_(self.CubeBtn.mapToGlobal(position)) self.CubeBtn.update() def showPopupSphere(self, position): self.popupMenuSphere.exec_(self.SphereBtn.mapToGlobal(position)) self.SphereBtn.update() def showPopupCylinder(self, position): self.popupMenuCylinder.exec_(self.CylinderBtn.mapToGlobal(position)) self.CylinderBtn.update() def showPopupPlane(self, position): self.popupMenuPlane.exec_(self.PlaneBtn.mapToGlobal(position)) self.PlaneBtn.update()