MetaBox/Scripts/Modeling/Edit/PlugIt/PlugIt_Plug.py
2025-01-14 02:17:16 +08:00

1873 lines
66 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
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 math
from . import PlugIt_Global
import importlib
importlib.reload(PlugIt_Global)
from . import PlugIt_CSS
##---------------------------------------------------------------------------------------------------------------- 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
TOOLS_PATH = PlugIt_Global.ToolsPath
# ----------------------------------------------------------------------// I N I T V A R
VERSION = mc.about(v=True)
DebugMode = 1
WrapMode = 0
ONEFACE = 0
BendWrapMode = 0
WindowTitle = "P L U G - O p t i o n s"
MeshName = "noMeshName"
ScriptJobNum = ""
MelScript_ExtractFace = TOOLS_PATH + 'wzx_ExtractFace.mel'
if VERSION == "2024":
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots.mel'
if VERSION == "2023":
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots.mel'
if VERSION == "2025":
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots.mel'
elif VERSION == "2022" :
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots_2022.mel'
def AutoConnect(face):
selectedFace = face
# ______ get number of vertice in selected face
mc.ConvertSelectionToVertices()
mc.ls(sl=True)
vertexNumber = len(mc.filterExpand(ex=True, sm=31))
if vertexNumber < 5:
return
mc.select(selectedFace)
# ______ Found Vertice Number
face = mc.ls(sl=True)
mc.ConvertSelectionToEdges()
mc.sets(n="PlugIt_Temps_VertNum")
mc.select(mc.sets('Plug_EdgeBorder_set', int="PlugIt_Temps_VertNum"))
mc.delete("PlugIt_Temps_VertNum")
mc.ConvertSelectionToVertices()
allVert = mc.filterExpand(ex=True, sm=31)
numOfVert = len(allVert) - 2
# ______
mc.select(selectedFace)
mc.Triangulate()
mc.ConvertSelectionToContainedEdges()
listOfAllContainsEdge = mc.filterExpand(ex=True, sm=32)
listEdgesLen_Dict = {}
for edge in listOfAllContainsEdge:
# Get the world coordinates for the vertices that make up the current edge.
ps = mc.xform(edge, q=1, t=1, ws=1)
p1 = ps[0:3] # XYZ coords for point 1
p2 = ps[3:6]
# Some math
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
listEdgesLen_Dict[edge] = length
# Sort du plus petit au plus long
sorted_values = sorted(listEdgesLen_Dict.values()) # Sort the values
sorted_dict = {}
for i in sorted_values:
for k in listEdgesLen_Dict.keys():
if listEdgesLen_Dict[k] == i:
sorted_dict[k] = listEdgesLen_Dict[k]
sortenEdgeFromSelection = list(sorted_dict.keys())[:numOfVert] # get and keep based on vert num
mc.select(sortenEdgeFromSelection, d=True)
mc.Delete()
mc.SelectAll(d=True)
def PERFORM_PLUG(Plug_Path, oneFace, numberOfEdges):
# ---------------------------------------------------------------------------------------------------------// I N I T
global ONEFACE
ONEFACE = oneFace
NumberOfEdges = numberOfEdges
# ______________________________________________________________________________ Avoid ClashingName
ClashingName = 0
TargetMesh_OriginName = mc.ls(sl=True)[0].split(".f")[0]
if "|" in TargetMesh_OriginName:
ClashingName = 1
TargetMesh_OriginNameClashing = TargetMesh_OriginName.split("|")[-1]
TargetMesh_TempName = mc.rename(TargetMesh_OriginName, "PlugIt_TargetMesh")
targetMesh_faceSelected = mc.ls(sl=True)
# ______________________________________________________________________________ UNDO : Duplication Save for Delete Plug
if mc.objExists("PlugItDupSave_*"):
mc.select("PlugItDupSave_*")
mc.delete()
mc.select("PlugIt_TargetMesh")
mc.duplicate(n= "PlugIt_TargetMesh_DupSave")
mc.HideSelectedObjects()
mc.setAttr("PlugIt_TargetMesh_DupSave.hiddenInOutliner", 1)
try:
mel.eval("AEdagNodeCommonRefreshOutliners();")
except:
pass
parentSel = mc.ls(sl = True)
if parentSel == []:
pass
else:
mc.Unparent()
# ______________________________________________________________________________ Flat or Curve
if oneFace == 0:
mc.select(targetMesh_faceSelected)
faceSelection = mc.filterExpand(sm=34)
mc.select(faceSelection[0])
checkFaceA = mc.polyInfo(fn=True)
#print(checkFaceA)
XYZValues_FaceA = [checkFaceA[0][20], checkFaceA[0][21], checkFaceA[0][22], checkFaceA[0][23], checkFaceA[0][24],
checkFaceA[0][25]]
#print("XYZValues_FaceA = " + str(XYZValues_FaceA))
mc.select(faceSelection[1])
checkFaceB = mc.polyInfo(fn=True)
#print(checkFaceB)
XYZValues_FaceB = [checkFaceB[0][20], checkFaceB[0][21], checkFaceB[0][22], checkFaceB[0][23], checkFaceB[0][24],
checkFaceB[0][25]]
#print("XYZValues_FaceB = " + str(XYZValues_FaceB))
if XYZValues_FaceA == XYZValues_FaceB:
FACE_ANGLE_MODE = 0 #Flat
#print("FLAT")
else:
FACE_ANGLE_MODE = 1 # CURVE
#print("CURVE")
else:
FACE_ANGLE_MODE = 0 # Flat
#print("FLAT")
# ______________________________________________________________________________ Supp Selection Face
mc.select(targetMesh_faceSelected)
mc.ConvertSelectionToEdgePerimeter()
mc.sets(n="Mesh_EdgeBorder_set")
mc.select(targetMesh_faceSelected)
# ______________________________________________________________________________ Extract Mesh Faces
mc.ls(sl=True)
mel.eval('source "' + MelScript_ExtractFace + '"')
# ______________________________________________________________________________ AlignFace Pivot Mode
if oneFace == 0:
# ______ Create an empty plane
extractFace = mc.ls(sl=True)
dupFaceMatch = mc.duplicate(extractFace, n="PlugIt_DupFace_for_Match")
mc.ConvertSelectionToFaces()
mc.ConvertSelectionToContainedEdges()
mc.DeleteEdge()
mc.select(dupFaceMatch)
mc.ConvertSelectionToFaces()
#______ Align Pivot
from .Tools import BakeTransformations
BakeTransformations.BakeTransformations(optionBox=False)
else:
# ______ Align Pivot Classic
mc.select("PlugIt_TargetMesh1")
extractFace = "PlugIt_TargetMesh1"
dupFaceMatch = "PlugIt_TargetMesh1"
before = set(mc.ls(assemblies=True, l=True))
mc.select("PlugIt_TargetMesh1")
#TO FIX NO UV FACES BUG
mc.polyAutoProjection(caching=1, lm=0, pb=0, ibd=1, cm=1, l=2, sc=1, o=1, p=6, uvSetName="PlugIT_uvSet", ps=0.2, ws=0)
mc.polyUVSet(currentUVSet=True, uvSet='PlugIT_uvSet')
mc.select("PlugIt_TargetMesh1")
mc.ConvertSelectionToFaces()
mel.eval('createHair 8 8 2 0 0 0 0 5 0 2 2 2;')
mc.select("PlugIt_TargetMesh1Follicle*")
getFocilleNode = mc.ls(sl=True)
curveNodeName = mc.listRelatives(getFocilleNode, c=True, ad=True)[-1]
print(curveNodeName)
mc.select("PlugIt_TargetMesh1", curveNodeName)
mel.eval('source "' + MelScript_MatchPivot + '"')
# CLEAN
after = set(mc.ls(assemblies=True, l=True))
imported = after.difference(before)
mc.delete(imported)
# ______________________________________________________________________________ Import Plug
mc.file(Plug_Path, i=True)
mc.select("PlugIt_PlugCountNumber_*")
foundInfoNode = mc.ls(sl=True)
plugNumberEdges = int(foundInfoNode[0].split("_")[-1]) - 1
if 0 > plugNumberEdges:
pass
else:
# ____ Clean ExtraSecure
mc.select("Plug_ExtraSecure_set")
mc.DeleteEdge()
mc.delete("Plug_ExtraSecure_set")
# Fix set bug after innerBorderEdges deleting
mc.delete("Plug_Selection_set")
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.InvertSelection()
mc.sets(n="Plug_Selection_set")
if mc.objExists("PlugIt_PlugCountNumber_*"):
mc.delete("PlugIt_PlugCountNumber_*")
# ______________________________________________________________________________ Apply Mesh Shader
mc.select(TargetMesh_TempName)
theNodes = mc.ls(sl=True, dag=True, s=True)
shadeEng = mc.listConnections(theNodes, type="shadingEngine")
materials = mc.ls(mc.listConnections(shadeEng), materials=True)
mc.select("Plug_Mesh")
mc.hyperShade(a=materials[0])
# ---------------------------------------------------------------------------------------------------------// P L A C E M E N T
# ______________________________________________________________________________ Match Scale
objA = dupFaceMatch
objB = "Plug_Mesh"
objA_BoundRaw = mc.xform(objA, q=1, bb=1)
objB_BoundRaw = mc.xform(objB, q=1, bb=1)
objA_BoundAll = [objA_BoundRaw[3] - objA_BoundRaw[0], objA_BoundRaw[4] - objA_BoundRaw[1], objA_BoundRaw[5] - objA_BoundRaw[2]]
objA_Bound = sorted(objA_BoundAll)
if FACE_ANGLE_MODE == 0: #Flat Faces
moyenne = (objA_Bound[0] + objA_Bound[1])
else:
moyenne = (objA_Bound[0] + objA_Bound[1])/2 # divide by 2 to fix matchScale on curve rect ratio
objB_Bound = [objB_BoundRaw[3] - objB_BoundRaw[0]]
objBScaleOld = mc.xform(objB, q=1, s=1)
boundDifference = [moyenne / objB_Bound[0]]
objBScaleNew = [objBScaleOld[0] * boundDifference[0], objBScaleOld[1] * boundDifference[0], objBScaleOld[2] * boundDifference[0]]
mc.xform(objB, scale=objBScaleNew)
# ______________________________________________________________________________ Match Placement
piv = mc.xform(extractFace, piv=True, q=True, ws=True)
mc.xform(dupFaceMatch, ws=True, piv=(piv[0], piv[1], piv[2]))
mc.select(objB)
if oneFace ==0:
mc.rotate(0, 0, -90)
if oneFace == 1:
mc.rotate(90, 0, 0)
mc.FreezeTransformations()
mc.matchTransform(objB, dupFaceMatch, pos=True, rot=True)
mc.delete(dupFaceMatch)
# ---------------------------------------------------------------------------------------------------------// W R A P
if WrapMode == 0:
if oneFace == 0:
pass
mc.delete(extractFace)
else:
pass
else:
mc.select(extractFace)
mc.FreezeTransformations()
mc.ConvertSelectionToEdges()
mc.sets(rm="Mesh_EdgeBorder_set")
mc.duplicate(extractFace, n="PlugIt_wrapFlaten")
mc.select("PlugIt_wrapFlaten")
mc.scale(0, 1, 1, ls=True, cs=True, r=True)
blendShape = mc.blendShape(extractFace, 'PlugIt_wrapFlaten', n="PlugIt_wrapBlendShape")
mc.select("Mesh_EdgeBorder_set")
# ---------------------------------------------------------------------------------------------------------// M A T C H E D G E S C O U N T
PlugMesh_name = "Plug_Mesh"
TargetMesh_BorderEdges = "Mesh_EdgeBorder_set"
Plug_BorderEdges = "PlugIt_Plug_Border_Set"
# ______________________________________________________________________________ Count TargetMesh Edges Num
mc.select(TargetMesh_BorderEdges)
TargetMesh_edgeCount = len(mc.filterExpand(sm=32))
# ______________________________________________________________________________ Prepare PlugMesh BorderPerim + Add Division
nbrToAdd = TargetMesh_edgeCount - 4
PlugEdgeNbr = 4
d, r = divmod(nbrToAdd, PlugEdgeNbr)
divRepartList = [d + 1] * r + [d] * (PlugEdgeNbr - r)
mc.select("Plug_EdgeBorder_set")
Plug_EdgeBorder_name = mc.filterExpand(sm=32)
print("Plug_EdgeBorder_name = " +str(Plug_EdgeBorder_name))
edgesRepartition_Dict = {Plug_EdgeBorder_name[0]: divRepartList[0], Plug_EdgeBorder_name[1]: divRepartList[1], Plug_EdgeBorder_name[2]: divRepartList[2], Plug_EdgeBorder_name[3]: divRepartList[3]}
print("edgesRepartition_Dict = " + str(edgesRepartition_Dict))
for each in edgesRepartition_Dict:
mc.select(each)
mc.polySubdivideEdge(ws=0, s=0, dv=edgesRepartition_Dict[each], ch=1)
# ---------------------------------------------------------------------------------------------------------// I N S I D E C O N N E C T I O N S
# ______________________________________________________________________________ Found the face selection
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.ls(sl=True)
allFaces = mc.filterExpand(ex=True, sm=34)
allFaceSet_list = []
for each in allFaces:
mc.select(each)
setName = mc.sets(n="PlugIt_IndivFacesSaved_" + str(each))
allFaceSet_list.append(setName)
for each in allFaceSet_list:
AutoConnect(each)
mc.delete(each)
# WRAP
if WrapMode == 1:
# Clean Freeze
mc.select("Plug_Mesh")
mc.FreezeTransformations()
# Create ProxiWrap
import maya.internal.nodes.proximitywrap.node_interface as node_interface
target = "Plug_Mesh"
source = "PlugIt_wrapFlaten"
sourceShapes = mc.listRelatives(source, shapes=True)[0]
deformer = mc.deformer(target, type='proximityWrap', name=target + '_pWrap')[0]
proximity_interface = node_interface.NodeInterface(deformer)
proximity_interface.addDriver(sourceShapes)
# ProxiWrap Setting
mc.setAttr(deformer + '.maxDrivers', 1)
# Blend
mc.setAttr("PlugIt_wrapBlendShape." + str(extractFace[0]), 1)
# ---Combine
mc.select(TargetMesh_TempName, PlugMesh_name)
if ClashingName == 1:
meshName = TargetMesh_OriginNameClashing
else:
meshName = TargetMesh_OriginName
global MeshName
MeshName = meshName
mc.polyUnite(ch=0, mergeUVSets=1, centerPivot=1, name=meshName)
# ---------------------------------------------------------------------------------------------------------// B R I D G E
# Try to BridgeConnect properly first
mc.select("Plug_EdgeBorder_set", "Mesh_EdgeBorder_set")
bridgeNode = mc.polyBridgeEdge(ch=1, divisions=0, twist=0, taper=0, curveType=0, smoothingAngle=30)
# !!!!! si fonctionne mettre le nom du mesh pour eviter les doublon
if ClashingName == 0:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginName
else:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginNameClashing
mc.rename(bridgeNode, BridgeNodeName)
# Fix Plug_All_Face_set
mc.delete("Plug_AllFaces_set")
mc.select("Plug_Selection_set")
mc.GrowPolygonSelectionRegion()
mc.sets(n="Plug_AllFaces_set")
# 1 - Take one internal edge create len than compare until shorter one
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.sets(n="PlugIt_Temp")
mc.select(mc.sets('Plug_AllFaces_set', sub="PlugIt_Temp"))
mc.ConvertSelectionToContainedEdges()
internalEdge = mc.ls(sl=True)[0]
mc.delete("PlugIt_Temp")
# 2 - Test sur le nombre de countBridgeEdge_nrb
lenList = []
for each in range(0, TargetMesh_edgeCount + 1):
# Set Bridge Value
mc.setAttr(BridgeNodeName + ".bridgeOffset", each)
# Calculate internalEdge LENGHT
ps = mc.xform(internalEdge, q=1, t=1, ws=1)
p1 = ps[0:3]
p2 = ps[3:6]
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
lenList.append(length)
minimumLenght = min(lenList)
index = lenList.index(minimumLenght)
BridgeInitCount_nbr = index + TargetMesh_edgeCount + 1
mc.setAttr(BridgeNodeName + ".bridgeOffset", BridgeInitCount_nbr)
# Clean Plug EdgeBorder
mc.select("Plug_EdgeBorder_set")
mc.DeleteEdge()
# SET CONTROLLER
mc.select("Plug_Selection_set")
mc.ConvertSelectionToFaces()
mc.select("Plug_controler", add=True)
mc.CreateWrap()
#____ Clean NormalAngle Smooth
mc.select("Mesh_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.polySoftEdge(angle=45, ch=1)
# ---------------------------------------------------------------------------------------------------------// S C R I P T J O B
def autoBridgeOffset():
lenList = []
for each in range(0, TargetMesh_edgeCount + 1):
# Set Bridge Value
mc.setAttr(BridgeNodeName + ".bridgeOffset", each)
# Calculate internalEdge LENGHT
ps = mc.xform(internalEdge, q=1, t=1, ws=1)
p1 = ps[0:3]
p2 = ps[3:6]
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
lenList.append(length)
minimumLenght = min(lenList)
index = lenList.index(minimumLenght)
BridgeInitCount_nbr = index + TargetMesh_edgeCount + 1
mc.setAttr(BridgeNodeName + ".bridgeOffset", BridgeInitCount_nbr)
if oneFace == 0:
jobNum = mc.scriptJob(attributeChange=["Plug_controler.rotateX", autoBridgeOffset])
else:
jobNum = mc.scriptJob(attributeChange=["Plug_controler.rotateY", autoBridgeOffset])
global ScriptJobNum
ScriptJobNum = jobNum
# ______ Create Transform for Flip 1x1 axis info
if oneFace == 1:
mc.group(em=True, name='PlugIt_FlipY_info')
if mc.objExists("PlugIt_TargetMesh_DupSave"):
mc.matchTransform(meshName, 'PlugIt_TargetMesh_DupSave', piv=True)
mc.rename("PlugIt_TargetMesh_DupSave", "PlugItDupSave_" + meshName)
if mc.objExists("PlugIt_Plug_Shd"):
mc.delete("PlugIt_Plug_Shd")
if mc.objExists("Plug_ExtraSecure_set"):
mc.delete("Plug_ExtraSecure_set")
if mc.objExists("Plug_Hole_set"):
mc.delete("Plug_Hole_set")
if DebugMode == 0:
elementToHide = ("Plug_Mesh", "Mesh_EdgeBorder_set", "Plug_AllFaces_set", "Plug_EdgeBorder_set", "Plug_Selection_set")
for each in elementToHide:
mc.select(each)
mc.setAttr(each + ".hiddenInOutliner", 1)
try:
mel.eval("AEdagNodeCommonRefreshOutliners();")
except:
pass
mc.setAttr("Plug_controler.visibility", 0)
mc.select("Plug_controler")
mc.setToolTo('RotateSuperContext')
# Turn ON WireframeOnShade
panel = mc.getPanel(withFocus=True)
if not panel or "modelPanel" not in panel:
raise RuntimeError("No active model panel found")
mc.modelEditor(panel, e=1, wos=1)
showUI()
mc.flushUndo()
def PERFORM_1x1_PLUG(Plug_Path):
if mc.objExists("PlugIt_TargetMesh"):
mc.rename("PlugIt_TargetMesh", "newDebugMesh")
listToDel = ("PlugIt_TargetMesh*","hairSystem*", "hairSystem*Follicles", "hairSystem*OutputCurves*", "nucleus*", "Mesh_EdgeBorder_set*")
for each in listToDel:
if mc.objExists(each):
mc.delete(each)
# Avoid ClashingName
ClashingName = 0
TargetMesh_OriginName = mc.ls(sl=True)[0].split(".f")[0]
if "|" in TargetMesh_OriginName:
ClashingName = 1
TargetMesh_OriginNameClashing = TargetMesh_OriginName.split("|")[-1]
TargetMesh_TempName = mc.rename(TargetMesh_OriginName, "PlugIt_TargetMesh")
targetMesh_faceSelected = mc.ls(sl=True)
#DuplicationSave
if mc.objExists("PlugItDupSave_*"):
mc.select("PlugItDupSave_*")
mc.delete()
mc.select("PlugIt_TargetMesh")
mc.duplicate(n= "PlugIt_TargetMesh_DupSave")
parentSel = mc.ls(sl=True)
if parentSel == []:
pass
else:
mc.Unparent()
mc.HideSelectedObjects()
mc.setAttr("PlugIt_TargetMesh_DupSave.hiddenInOutliner", 1)
try:
mel.eval("AEdagNodeCommonRefreshOutliners();")
except:
pass
mc.select(targetMesh_faceSelected)
# ______ Supp selection Face
mc.select(targetMesh_faceSelected)
mc.ConvertSelectionToEdgePerimeter()
mc.sets(n="Mesh_EdgeBorder_set")
mc.select(targetMesh_faceSelected)
# ______ Extract Mesh Faces
# ______________________________________________________________________________ Extract Mesh Faces
mc.ls(sl=True)
MelScript_ExtractFace = TOOLS_PATH + 'wzx_ExtractFace.mel'
mel.eval('source "' + MelScript_ExtractFace + '"')
mc.select("PlugIt_TargetMesh1")
# ______ AlignFace Pivot Mode
extractFace = "PlugIt_TargetMesh1"
dupFaceMatch = "PlugIt_TargetMesh1"
before = set(mc.ls(assemblies=True, l=True))
mc.select("PlugIt_TargetMesh1")
#__________________________________________ TEST OWN
mc.ConvertSelectionToFaces()
mel.eval('createHair 8 8 2 0 0 0 0 5 0 2 2 2;')
mc.select("PlugIt_TargetMesh1Follicle*")
getFocilleNode = mc.ls(sl=True)
curveNodeName = mc.listRelatives(getFocilleNode, c=True, ad=True)[-1]
print(curveNodeName)
mc.select("PlugIt_TargetMesh1", curveNodeName)
if VERSION == "2023":
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots.mel'
elif VERSION == "2022":
MelScript_MatchPivot = TOOLS_PATH + 'performMatchPivots_2022.mel'
mel.eval('source "' + MelScript_MatchPivot + '"')
# CLEAN
after = set(mc.ls(assemblies=True, l=True))
imported = after.difference(before)
mc.delete(imported)
# ______ Import Plug
mc.file(Plug_Path, i=True)
# ______ Apply Mesh Shader
mc.select(TargetMesh_TempName)
theNodes = mc.ls(sl=True, dag=True, s=True)
shadeEng = mc.listConnections(theNodes, type="shadingEngine")
materials = mc.ls(mc.listConnections(shadeEng), materials=True)
mc.select("Plug_Mesh")
mc.hyperShade(a=materials[0])
# ----------------------------------------------------------------------// P L A C E M E N T
# ______ Match Scale
objA = dupFaceMatch
objB = "Plug_Mesh"
objA_BoundRaw = mc.xform(objA, q=1, bb=1)
objB_BoundRaw = mc.xform(objB, q=1, bb=1)
objA_BoundAll = [objA_BoundRaw[3] - objA_BoundRaw[0], objA_BoundRaw[4] - objA_BoundRaw[1],
objA_BoundRaw[5] - objA_BoundRaw[2]]
objA_Bound = sorted(objA_BoundAll)
moyenne = (objA_Bound[0] + objA_Bound[1])
objB_Bound = [objB_BoundRaw[3] - objB_BoundRaw[0]]
objBScaleOld = mc.xform(objB, q=1, s=1)
boundDifference = [moyenne / objB_Bound[0]]
objBScaleNew = [objBScaleOld[0] * boundDifference[0], objBScaleOld[1] * boundDifference[0],
objBScaleOld[2] * boundDifference[0]]
mc.xform(objB, scale=objBScaleNew)
# ______ Placement
piv = mc.xform(extractFace, piv=True, q=True, ws=True)
mc.xform(dupFaceMatch, ws=True, piv=(piv[0], piv[1], piv[2]))
mc.select(objB)
mc.rotate(90, 0, 0)
mc.FreezeTransformations()
mc.matchTransform(objB, dupFaceMatch, pos=True, rot=True)
# pNormal = mc.normalConstraint(objA, objB, worldUpType="scene", aimVector=(0, 1, 0), upVector=(0, 1, 0), weight=1)
# mc.delete(pNormal)
mc.delete(dupFaceMatch)
mc.select("Mesh_EdgeBorder_set")
# ----------------------------------------------------------------------// M A T C H E D G E S C O U N T
PlugMesh_name = "Plug_Mesh"
TargetMesh_BorderEdges = "Mesh_EdgeBorder_set"
Plug_BorderEdges = "PlugIt_Plug_Border_Set"
# ______ Count TargetMesh Edges Num
mc.select(TargetMesh_BorderEdges)
TargetMesh_edgeCount = len(mc.filterExpand(sm=32))
# ______ Prepare PlugMesh BorderPerim + Add Division
nbrToAdd = TargetMesh_edgeCount - 4
PlugEdgeNbr = 4
d, r = divmod(nbrToAdd, PlugEdgeNbr)
divRepartList = [d + 1] * r + [d] * (PlugEdgeNbr - r)
mc.select("Plug_EdgeBorder_set")
Plug_EdgeBorder_name = mc.filterExpand(sm=32)
edgesRepartition_Dict = {Plug_EdgeBorder_name[0]: divRepartList[0], Plug_EdgeBorder_name[1]: divRepartList[1],
Plug_EdgeBorder_name[2]: divRepartList[2], Plug_EdgeBorder_name[3]: divRepartList[3]}
for each in edgesRepartition_Dict:
mc.select(each)
mc.polySubdivideEdge(ws=0, s=0, dv=edgesRepartition_Dict[each], ch=1)
# ----------------------------------------------------------------------// I N S I D E C O N N E C T I O N S
# ______ Found the face selection
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
# ______ EXECTURE
mc.ls(sl=True)
allFaces = mc.filterExpand(ex=True, sm=34)
allFaceSet_list = []
for each in allFaces:
mc.select(each)
setName = mc.sets(n="PlugIt_IndivFacesSaved_" + str(each))
allFaceSet_list.append(setName)
for each in allFaceSet_list:
AutoConnect(each)
mc.delete(each)
# WRAP
if WrapMode == 1:
# Clean Freeze
mc.select("Plug_Mesh")
mc.FreezeTransformations()
# Create ProxiWrap
import maya.internal.nodes.proximitywrap.node_interface as node_interface
target = "Plug_Mesh"
source = "PlugIt_wrapFlaten"
sourceShapes = mc.listRelatives(source, shapes=True)[0]
deformer = mc.deformer(target, type='proximityWrap', name=target + '_pWrap')[0]
proximity_interface = node_interface.NodeInterface(deformer)
proximity_interface.addDriver(sourceShapes)
# ProxiWrap Setting
mc.setAttr(deformer + '.maxDrivers', 1)
# Blend
mc.setAttr("PlugIt_wrapBlendShape." + str(extractFace[0]), 1)
# ---Combine
mc.select(TargetMesh_TempName, PlugMesh_name)
if ClashingName == 1:
meshName = TargetMesh_OriginNameClashing
else:
meshName = TargetMesh_OriginName
global MeshName
MeshName = meshName
mc.polyUnite(ch=0, mergeUVSets=1, centerPivot=1, name=meshName)
# ----------------------------------------------------------------------// B R I D G E
# Try to BridgeConnect properly first
mc.select("Plug_EdgeBorder_set", "Mesh_EdgeBorder_set")
bridgeNode = mc.polyBridgeEdge(ch=1, divisions=0, twist=0, taper=0, curveType=0, smoothingAngle=30)
# !!!!! si fonctionne mettre le nom du mesh pour eviter les doublon
if ClashingName == 0:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginName
else:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginNameClashing
mc.rename(bridgeNode, BridgeNodeName)
# Fix Plug_All_Face_set
mc.delete("Plug_AllFaces_set")
mc.select("Plug_Selection_set")
mc.GrowPolygonSelectionRegion()
mc.sets(n="Plug_AllFaces_set")
# 1 - Take one internal edge create len than compare until shorter one
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.sets(n="PlugIt_Temp")
mc.select(mc.sets('Plug_AllFaces_set', sub="PlugIt_Temp"))
mc.ConvertSelectionToContainedEdges()
internalEdge = mc.ls(sl=True)[0]
mc.delete("PlugIt_Temp")
# 2 - Test sur le nombre de countBridgeEdge_nrb
lenList = []
for each in range(0, TargetMesh_edgeCount + 1):
# Set Bridge Value
mc.setAttr(BridgeNodeName + ".bridgeOffset", each)
# Calculate internalEdge LENGHT
ps = mc.xform(internalEdge, q=1, t=1, ws=1)
p1 = ps[0:3]
p2 = ps[3:6]
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
lenList.append(length)
minimumLenght = min(lenList)
index = lenList.index(minimumLenght)
BridgeInitCount_nbr = index + TargetMesh_edgeCount + 1
mc.setAttr(BridgeNodeName + ".bridgeOffset", BridgeInitCount_nbr)
#____ Clean Plug EdgeBorder
mc.select("Plug_EdgeBorder_set")
mc.DeleteEdge()
#____ Clean NormalAngle Smooth
mc.select("Mesh_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.polySoftEdge(angle=45, ch=1)
#CLEAN
if mc.objExists(MeshName):
mc.delete(MeshName, constructionHistory=True)
listToDelete = ("Mesh_EdgeBorder_set", "Plug_AllFaces_set", "Plug_EdgeBorder_set", "Plug_Selection_set", "Plug_Mesh")
for each in listToDelete:
if mc.objExists(each):
mc.delete(each)
if mc.objExists("Plug_Hole_set"):
mc.delete("Plug_Hole_set")
if mc.objExists("PlugIt_Plug_Shd"):
mc.delete("PlugIt_Plug_Shd")
if mc.objExists("PlugIt_Plug_Shd"):
mc.delete("PlugIt_Plug_Shd")
if mc.objExists("PlugIt_PlugCountNumber_*"):
mc.delete("PlugIt_PlugCountNumber_*")
if mc.objExists("PlugIt_TargetMesh_DupSave"):
mc.rename("PlugIt_TargetMesh_DupSave", "PlugItDupSave_" + meshName)
mc.select(meshName)
mel.eval('changeSelectMode -component;')
mel.eval('setComponentPickMask "Facet" true;')
# ____ Clean ExtraSecure
mc.select("Plug_ExtraSecure_set")
mc.DeleteEdge()
mc.delete("Plug_ExtraSecure_set")
mc.delete(meshName, constructionHistory=True)
mc.flushUndo()
def INIT_PERFORM_PLUG(Plug_Path, oneFace, numberOfEdges):
# ---------------------------------------------------------------------------------------------------------// I N I T
global ONEFACE
ONEFACE = oneFace
NumberOfEdges = numberOfEdges
# ______________________________________________________________________________ Avoid ClashingName
ClashingName = 0
TargetMesh_OriginName = mc.ls(sl=True)[0].split(".f")[0]
if "|" in TargetMesh_OriginName:
ClashingName = 1
TargetMesh_OriginNameClashing = TargetMesh_OriginName.split("|")[-1]
TargetMesh_TempName = mc.rename(TargetMesh_OriginName, "PlugIt_TargetMesh")
targetMesh_faceSelected = mc.ls(sl=True)
# ______________________________________________________________________________ UNDO : Duplication Save for Delete Plug
if mc.objExists("PlugItDupSave_*"):
mc.select("PlugItDupSave_*")
mc.delete()
mc.select("PlugIt_TargetMesh")
mc.duplicate(n= "PlugIt_TargetMesh_DupSave")
mc.HideSelectedObjects()
mc.setAttr("PlugIt_TargetMesh_DupSave.hiddenInOutliner", 1)
try:
mel.eval("AEdagNodeCommonRefreshOutliners();")
except:
pass
parentSel = mc.ls(sl = True)
if parentSel == []:
pass
else:
mc.Unparent()
# ______________________________________________________________________________ Flat or Curve
if oneFace == 0:
mc.select(targetMesh_faceSelected)
faceSelection = mc.filterExpand(sm=34)
mc.select(faceSelection[0])
checkFaceA = mc.polyInfo(fn=True)
#print(checkFaceA)
XYZValues_FaceA = [checkFaceA[0][20], checkFaceA[0][21], checkFaceA[0][22], checkFaceA[0][23], checkFaceA[0][24],
checkFaceA[0][25]]
#print("XYZValues_FaceA = " + str(XYZValues_FaceA))
mc.select(faceSelection[1])
checkFaceB = mc.polyInfo(fn=True)
#print(checkFaceB)
XYZValues_FaceB = [checkFaceB[0][20], checkFaceB[0][21], checkFaceB[0][22], checkFaceB[0][23], checkFaceB[0][24],
checkFaceB[0][25]]
#print("XYZValues_FaceB = " + str(XYZValues_FaceB))
if XYZValues_FaceA == XYZValues_FaceB:
FACE_ANGLE_MODE = 0 #Flat
#print("FLAT")
else:
FACE_ANGLE_MODE = 1 # CURVE
#print("CURVE")
else:
FACE_ANGLE_MODE = 0 # Flat
#print("FLAT")
# ______________________________________________________________________________ Supp Selection Face
mc.select(targetMesh_faceSelected)
mc.ConvertSelectionToEdgePerimeter()
mc.sets(n="Mesh_EdgeBorder_set")
mc.select(targetMesh_faceSelected)
# ______________________________________________________________________________ Extract Mesh Faces
mc.ls(sl=True)
mel.eval('source "' + MelScript_ExtractFace + '"')
# ______________________________________________________________________________ AlignFace Pivot Mode
if oneFace == 0:
# ______ Create an empty plane
extractFace = mc.ls(sl=True)
dupFaceMatch = mc.duplicate(extractFace, n="PlugIt_DupFace_for_Match")
mc.ConvertSelectionToFaces()
mc.ConvertSelectionToContainedEdges()
mc.DeleteEdge()
mc.select(dupFaceMatch)
mc.ConvertSelectionToFaces()
#______ Align Pivot
from .Tools import BakeTransformations
BakeTransformations.BakeTransformations(optionBox=False)
else:
# ______ Align Pivot Classic
mc.select("PlugIt_TargetMesh1")
extractFace = "PlugIt_TargetMesh1"
dupFaceMatch = "PlugIt_TargetMesh1"
before = set(mc.ls(assemblies=True, l=True))
mc.select("PlugIt_TargetMesh1")
# TO FIX NO UV FACES BUG
mc.polyAutoProjection(caching=1, lm=0, pb=0, ibd=1, cm=1, l=2, sc=1, o=1, p=6, uvSetName="PlugIT_uvSet", ps=0.2,
ws=0)
mc.polyUVSet(currentUVSet=True, uvSet='PlugIT_uvSet')
mc.select("PlugIt_TargetMesh1")
mc.ConvertSelectionToFaces()
mel.eval('createHair 8 8 2 0 0 0 0 5 0 2 2 2;')
mc.select("PlugIt_TargetMesh1Follicle*")
getFocilleNode = mc.ls(sl=True)
curveNodeName = mc.listRelatives(getFocilleNode, c=True, ad=True)[-1]
print(curveNodeName)
mc.select("PlugIt_TargetMesh1", curveNodeName)
mel.eval('source "' + MelScript_MatchPivot + '"')
# CLEAN
after = set(mc.ls(assemblies=True, l=True))
imported = after.difference(before)
mc.delete(imported)
# ______________________________________________________________________________ Import Plug
mc.file(Plug_Path, i=True)
mc.select("PlugIt_PlugCountNumber_*")
foundInfoNode = mc.ls(sl=True)
plugNumberEdges = int(foundInfoNode[0].split("_")[-1]) - 1
if 0 > plugNumberEdges:
pass
else:
# ____ Clean ExtraSecure
mc.select("Plug_ExtraSecure_set")
mc.DeleteEdge()
mc.delete("Plug_ExtraSecure_set")
# Fix set bug after innerBorderEdges deleting
mc.delete("Plug_Selection_set")
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.InvertSelection()
mc.sets(n="Plug_Selection_set")
if mc.objExists("PlugIt_PlugCountNumber_*"):
mc.delete("PlugIt_PlugCountNumber_*")
# ______________________________________________________________________________ Apply Mesh Shader
mc.select(TargetMesh_TempName)
theNodes = mc.ls(sl=True, dag=True, s=True)
shadeEng = mc.listConnections(theNodes, type="shadingEngine")
materials = mc.ls(mc.listConnections(shadeEng), materials=True)
mc.select("Plug_Mesh")
mc.hyperShade(a=materials[0])
# ---------------------------------------------------------------------------------------------------------// P L A C E M E N T
# ______________________________________________________________________________ Match Scale
objA = dupFaceMatch
objB = "Plug_Mesh"
objA_BoundRaw = mc.xform(objA, q=1, bb=1)
objB_BoundRaw = mc.xform(objB, q=1, bb=1)
objA_BoundAll = [objA_BoundRaw[3] - objA_BoundRaw[0], objA_BoundRaw[4] - objA_BoundRaw[1], objA_BoundRaw[5] - objA_BoundRaw[2]]
objA_Bound = sorted(objA_BoundAll)
if FACE_ANGLE_MODE == 0: #Flat Faces
moyenne = (objA_Bound[0] + objA_Bound[1])
else:
moyenne = (objA_Bound[0] + objA_Bound[1])/2 # divide by 2 to fix matchScale on curve rect ratio
objB_Bound = [objB_BoundRaw[3] - objB_BoundRaw[0]]
objBScaleOld = mc.xform(objB, q=1, s=1)
boundDifference = [moyenne / objB_Bound[0]]
objBScaleNew = [objBScaleOld[0] * boundDifference[0], objBScaleOld[1] * boundDifference[0], objBScaleOld[2] * boundDifference[0]]
mc.xform(objB, scale=objBScaleNew)
# ______________________________________________________________________________ Match Placement
piv = mc.xform(extractFace, piv=True, q=True, ws=True)
mc.xform(dupFaceMatch, ws=True, piv=(piv[0], piv[1], piv[2]))
mc.select(objB)
if oneFace ==0:
mc.rotate(0, 0, -90)
if oneFace == 1:
mc.rotate(90, 0, 0)
mc.FreezeTransformations()
mc.matchTransform(objB, dupFaceMatch, pos=True, rot=True)
mc.delete(dupFaceMatch)
# ---------------------------------------------------------------------------------------------------------// W R A P
if WrapMode == 0:
if oneFace == 0:
pass
mc.delete(extractFace)
else:
pass
else:
mc.select(extractFace)
mc.FreezeTransformations()
mc.ConvertSelectionToEdges()
mc.sets(rm="Mesh_EdgeBorder_set")
mc.duplicate(extractFace, n="PlugIt_wrapFlaten")
mc.select("PlugIt_wrapFlaten")
mc.scale(0, 1, 1, ls=True, cs=True, r=True)
blendShape = mc.blendShape(extractFace, 'PlugIt_wrapFlaten', n="PlugIt_wrapBlendShape")
mc.select("Mesh_EdgeBorder_set")
# ---------------------------------------------------------------------------------------------------------// M A T C H E D G E S C O U N T
PlugMesh_name = "Plug_Mesh"
TargetMesh_BorderEdges = "Mesh_EdgeBorder_set"
Plug_BorderEdges = "PlugIt_Plug_Border_Set"
# ______________________________________________________________________________ Count TargetMesh Edges Num
mc.select(TargetMesh_BorderEdges)
TargetMesh_edgeCount = len(mc.filterExpand(sm=32))
# ______________________________________________________________________________ Prepare PlugMesh BorderPerim + Add Division
nbrToAdd = TargetMesh_edgeCount - 4
PlugEdgeNbr = 4
d, r = divmod(nbrToAdd, PlugEdgeNbr)
divRepartList = [d + 1] * r + [d] * (PlugEdgeNbr - r)
mc.select("Plug_EdgeBorder_set")
Plug_EdgeBorder_name = mc.filterExpand(sm=32)
print("Plug_EdgeBorder_name = " +str(Plug_EdgeBorder_name))
edgesRepartition_Dict = {Plug_EdgeBorder_name[0]: divRepartList[0], Plug_EdgeBorder_name[1]: divRepartList[1], Plug_EdgeBorder_name[2]: divRepartList[2], Plug_EdgeBorder_name[3]: divRepartList[3]}
print("edgesRepartition_Dict = " + str(edgesRepartition_Dict))
for each in edgesRepartition_Dict:
mc.select(each)
mc.polySubdivideEdge(ws=0, s=0, dv=edgesRepartition_Dict[each], ch=1)
# ---------------------------------------------------------------------------------------------------------// I N S I D E C O N N E C T I O N S
# ______________________________________________________________________________ Found the face selection
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.ls(sl=True)
allFaces = mc.filterExpand(ex=True, sm=34)
allFaceSet_list = []
for each in allFaces:
mc.select(each)
setName = mc.sets(n="PlugIt_IndivFacesSaved_" + str(each))
allFaceSet_list.append(setName)
for each in allFaceSet_list:
AutoConnect(each)
mc.delete(each)
# WRAP
if WrapMode == 1:
# Clean Freeze
mc.select("Plug_Mesh")
mc.FreezeTransformations()
# Create ProxiWrap
import maya.internal.nodes.proximitywrap.node_interface as node_interface
target = "Plug_Mesh"
source = "PlugIt_wrapFlaten"
sourceShapes = mc.listRelatives(source, shapes=True)[0]
deformer = mc.deformer(target, type='proximityWrap', name=target + '_pWrap')[0]
proximity_interface = node_interface.NodeInterface(deformer)
proximity_interface.addDriver(sourceShapes)
# ProxiWrap Setting
mc.setAttr(deformer + '.maxDrivers', 1)
# Blend
mc.setAttr("PlugIt_wrapBlendShape." + str(extractFace[0]), 1)
# ---Combine
mc.select(TargetMesh_TempName, PlugMesh_name)
if ClashingName == 1:
meshName = TargetMesh_OriginNameClashing
else:
meshName = TargetMesh_OriginName
global MeshName
MeshName = meshName
mc.polyUnite(ch=0, mergeUVSets=1, centerPivot=1, name=meshName)
# ---------------------------------------------------------------------------------------------------------// B R I D G E
# Try to BridgeConnect properly first
mc.select("Plug_EdgeBorder_set", "Mesh_EdgeBorder_set")
bridgeNode = mc.polyBridgeEdge(ch=1, divisions=0, twist=0, taper=0, curveType=0, smoothingAngle=30)
# !!!!! si fonctionne mettre le nom du mesh pour eviter les doublon
if ClashingName == 0:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginName
else:
BridgeNodeName = "PlugIt_Bridge_" + TargetMesh_OriginNameClashing
mc.rename(bridgeNode, BridgeNodeName)
# Fix Plug_All_Face_set
mc.delete("Plug_AllFaces_set")
mc.select("Plug_Selection_set")
mc.GrowPolygonSelectionRegion()
mc.sets(n="Plug_AllFaces_set")
# 1 - Take one internal edge create len than compare until shorter one
mc.select("Plug_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.sets(n="PlugIt_Temp")
mc.select(mc.sets('Plug_AllFaces_set', sub="PlugIt_Temp"))
mc.ConvertSelectionToContainedEdges()
internalEdge = mc.ls(sl=True)[0]
mc.delete("PlugIt_Temp")
# 2 - Test sur le nombre de countBridgeEdge_nrb
lenList = []
for each in range(0, TargetMesh_edgeCount + 1):
# Set Bridge Value
mc.setAttr(BridgeNodeName + ".bridgeOffset", each)
# Calculate internalEdge LENGHT
ps = mc.xform(internalEdge, q=1, t=1, ws=1)
p1 = ps[0:3]
p2 = ps[3:6]
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
lenList.append(length)
minimumLenght = min(lenList)
index = lenList.index(minimumLenght)
BridgeInitCount_nbr = index + TargetMesh_edgeCount + 1
mc.setAttr(BridgeNodeName + ".bridgeOffset", BridgeInitCount_nbr)
# Clean Plug EdgeBorder
mc.select("Plug_EdgeBorder_set")
mc.DeleteEdge()
# SET CONTROLLER
mc.select("Plug_Selection_set")
mc.ConvertSelectionToFaces()
mc.select("Plug_controler", add=True)
mc.CreateWrap()
#____ Clean NormalAngle Smooth
mc.select("Mesh_EdgeBorder_set")
mc.ConvertSelectionToFaces()
mc.polySoftEdge(angle=45, ch=1)
# ---------------------------------------------------------------------------------------------------------// S C R I P T J O B
def autoBridgeOffset():
lenList = []
for each in range(0, TargetMesh_edgeCount + 1):
# Set Bridge Value
mc.setAttr(BridgeNodeName + ".bridgeOffset", each)
# Calculate internalEdge LENGHT
ps = mc.xform(internalEdge, q=1, t=1, ws=1)
p1 = ps[0:3]
p2 = ps[3:6]
length = math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2) + math.pow(p1[2] - p2[2], 2))
lenList.append(length)
minimumLenght = min(lenList)
index = lenList.index(minimumLenght)
BridgeInitCount_nbr = index + TargetMesh_edgeCount + 1
mc.setAttr(BridgeNodeName + ".bridgeOffset", BridgeInitCount_nbr)
if oneFace == 0:
jobNum = mc.scriptJob(attributeChange=["Plug_controler.rotateX", autoBridgeOffset])
else:
jobNum = mc.scriptJob(attributeChange=["Plug_controler.rotateY", autoBridgeOffset])
global ScriptJobNum
ScriptJobNum = jobNum
# ______ Create Transform for Flip 1x1 axis info
if oneFace == 1:
mc.group(em=True, name='PlugIt_FlipY_info')
if mc.objExists("PlugIt_TargetMesh_DupSave"):
mc.matchTransform(meshName, 'PlugIt_TargetMesh_DupSave', piv=True)
mc.rename("PlugIt_TargetMesh_DupSave", "PlugItDupSave_" + meshName)
if mc.objExists("PlugIt_Plug_Shd"):
mc.delete("PlugIt_Plug_Shd")
if mc.objExists("Plug_ExtraSecure_set"):
mc.delete("Plug_ExtraSecure_set")
if mc.objExists("Plug_Hole_set"):
mc.delete("Plug_Hole_set")
if DebugMode == 0:
elementToHide = ("Plug_Mesh", "Mesh_EdgeBorder_set", "Plug_AllFaces_set", "Plug_EdgeBorder_set", "Plug_Selection_set")
for each in elementToHide:
mc.select(each)
mc.setAttr(each + ".hiddenInOutliner", 1)
try:
mel.eval("AEdagNodeCommonRefreshOutliners();")
except:
pass
mc.setAttr("Plug_controler.visibility", 0)
mc.select("Plug_controler")
mc.setToolTo('RotateSuperContext')
# Turn ON WireframeOnShade
#panel = mc.getPanel(withFocus=True)
#if not panel or "modelPanel" not in panel:
# raise RuntimeError("No active model panel found")
#mc.modelEditor(panel, e=1, wos=1)
mc.flushUndo()
class PopUp_UI(QtWidgets.QDialog):
def __init__(self, parent=None):
super(PopUp_UI, self).__init__()
self.setMinimumSize(500, 255)
self.buildUI()
def buildUI(self):
##----------------------------------------------------------------------------------------/ U I V A L U E
self.setStyleSheet(PlugIt_Global.Theme)
iconButtonSize = PlugIt_Global.IconButtonSize
separatorWidth = 2
##----------------------------------------------------------------------------------------/ L A Y O U T S
self.MAIN_Lyt = QtWidgets.QVBoxLayout()
self.setLayout(self.MAIN_Lyt)
self.MAIN_Lyt.setContentsMargins(6, 6, 6, 6)
##---------------------------------------------------- Separator
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(2)
self.MAIN_Lyt.addWidget(separator)
self.MAIN_Lyt.addSpacing(1)
##----------------------------------------------------------------------------------------/ S E L E C T P L U G
self.SelectPlug_Btn = QtWidgets.QPushButton("- S E L E C T P L U G -")
self.SelectPlug_Btn.setObjectName("SaveSetting")
self.SelectPlug_Btn.setFixedHeight(22)
#self.SelectPlug_Btn.setStyleSheet("color:#909090;")
self.SelectPlug_Btn.setToolTip(" Select Plug Manipulator ")
self.SelectPlug_Btn.clicked.connect(self.SelectPlug)
self.MAIN_Lyt.addWidget(self.SelectPlug_Btn)
self.MAIN_Lyt.addSpacing(2)
##----------------------------------------------------------------------------------------/ O F F S E T S L I D E R
Offset_Hlyt = QtWidgets.QHBoxLayout()
self.MAIN_Lyt.addLayout(Offset_Hlyt)
##------------------------------------------------------------: LABEL
Offset_Label = QtWidgets.QLabel("Manual Offset : ")
Offset_Label.setStyleSheet("color:#909090;")
Offset_Label.setFont(QtGui.QFont('Calibri', 9))
Offset_Hlyt.addWidget(Offset_Label)
##------------------------------------------------------------: SLIDER
self.Offset_Slider = QtWidgets.QSlider()
self.Offset_Slider.setMinimum(0)
self.Offset_Slider.setMaximum(20)
bridgeValue = mc.getAttr("PlugIt_Bridge_" + MeshName + ".bridgeOffset")
self.Offset_Slider.setProperty("value", bridgeValue)
self.Offset_Slider.setOrientation(QtCore.Qt.Horizontal)
self.Offset_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.Offset_Slider.setTickInterval(1)
self.Offset_Slider.setFixedHeight(22)
self.Offset_Slider.valueChanged.connect(self.set_Slider)
Offset_Hlyt.addWidget(self.Offset_Slider)
##------------------------------------------------------------: SPINBOX
self.Offset_SpinBox = QtWidgets.QDoubleSpinBox()
self.Offset_SpinBox.setDecimals(0)
self.Offset_SpinBox.setFixedWidth(40)
self.Offset_SpinBox.setFixedHeight(18)
self.Offset_SpinBox.setRange(0, 20)
self.Offset_SpinBox.setValue(bridgeValue)
self.Offset_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.Offset_SpinBox.editingFinished.connect(self.set_SpinBox)
Offset_Hlyt.addWidget(self.Offset_SpinBox)
##---------------------------------------------------- Separator
self.MAIN_Lyt.addSpacing(3)
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(2)
self.MAIN_Lyt.addWidget(separator)
self.MAIN_Lyt.addSpacing(3)
##----------------------------------------------------------------------------------------/ F L I P
Flip_Hlyt = QtWidgets.QHBoxLayout()
self.MAIN_Lyt.addLayout(Flip_Hlyt)
self.FlipPlug_Btn = QtWidgets.QPushButton("- F l i p P l u g -")
self.FlipPlug_Btn.setObjectName("StoreSet")
self.FlipPlug_Btn.setFixedHeight(22)
self.FlipPlug_Btn.setStyleSheet("color:#909090;")
self.FlipPlug_Btn.clicked.connect(self.FlipPlug)
Flip_Hlyt.addWidget(self.FlipPlug_Btn)
self.ScaleManip_Btn = QtWidgets.QPushButton()
self.ScaleManip_Btn.setIcon(QtGui.QIcon(IconPath + "Scale_Gizmo.png"))
self.ScaleManip_Btn.setObjectName("TABSBTN")
self.ScaleManip_Btn.setFixedSize(20, 20)
self.ScaleManip_Btn.setIconSize(QtCore.QSize(20, 20))
self.ScaleManip_Btn.setToolTip(" Manually Scale Plug with Manipulator ")
self.ScaleManip_Btn.clicked.connect(self.SelectScaleManip)
Flip_Hlyt.addWidget(self.ScaleManip_Btn)
##----------------------------------------------------------------------------------------/ O P E R A T I O N
Smoot_Hlyt = QtWidgets.QHBoxLayout()
self.MAIN_Lyt.addLayout(Smoot_Hlyt)
self.Smooth_Btn = QtWidgets.QPushButton("- S m o o t h P l u g -")
self.Smooth_Btn.setObjectName("StoreSet")
self.Smooth_Btn.setFixedHeight(22)
self.Smooth_Btn.setStyleSheet("color:#909090;")
self.Smooth_Btn.clicked.connect(self.Smooth)
self.Smooth_Btn.setToolTip(" Mesh Smooth Plug's faces ")
Smoot_Hlyt.addWidget(self.Smooth_Btn)
self.Hole_Btn = QtWidgets.QPushButton("- O p e n H o l e -")
self.Hole_Btn.setObjectName("StoreSet")
self.Hole_Btn.setFixedHeight(22)
self.Hole_Btn.setStyleSheet("color:#909090;")
self.Hole_Btn.setToolTip(" Open the Hole selection set at the Plug creation ")
self.Hole_Btn.clicked.connect(self.OpenHole)
Smoot_Hlyt.addWidget(self.Hole_Btn)
self.Delete_Btn = QtWidgets.QPushButton()
self.Delete_Btn.setIcon(QtGui.QIcon(IconPath + "delete_ON.png"))
self.Delete_Btn.setToolTip(" Undo and Delete this Plug ")
self.Delete_Btn.setObjectName("TABSBTN")
self.Delete_Btn.setFixedSize(20, 20)
self.Delete_Btn.setIconSize(QtCore.QSize(20, 20))
self.Delete_Btn.clicked.connect(self.Delete)
Smoot_Hlyt.addWidget(self.Delete_Btn)
##---------------------------------------------------- Separator
self.MAIN_Lyt.addSpacing(3)
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(2)
self.MAIN_Lyt.addWidget(separator)
self.MAIN_Lyt.addSpacing(3)
##----------------------------------------------------------------------------------------/ W R A P M O D E
global ONEFACE
if ONEFACE == 0:
self.Wrap_Btn = QtWidgets.QPushButton("- W R A P M O D E -")
self.Wrap_Btn.setObjectName("StoreSet")
self.Wrap_Btn.setFixedHeight(22)
if BendWrapMode == 0:
self.Wrap_Btn.setStyleSheet("color:#909090;")
else:
self.Wrap_Btn.setStyleSheet("color:#202020; background-color : #65BEF1;")
self.Wrap_Btn.clicked.connect(self.add_WrapBend)
self.Wrap_Btn.setToolTip(" Mesh Smooth Plug's faces ")
self.MAIN_Lyt.addWidget(self.Wrap_Btn)
##----------------------------------------------------------------------------------------/ B E N D H S L I D E R
BendH_Lyt = QtWidgets.QHBoxLayout()
self.MAIN_Lyt.addLayout(BendH_Lyt)
##------------------------------------------------------------: LABEL
self.BendH_Label = QtWidgets.QLabel("Bend H : ")
if BendWrapMode == 1:
self.BendH_Label.setStyleSheet("color:#909090;")
else:
self.BendH_Label.setStyleSheet("color:#303030;")
self.BendH_Label.setFont(QtGui.QFont('Calibri', 9))
BendH_Lyt.addWidget(self.BendH_Label)
##------------------------------------------------------------: SLIDER
self.BendH_Slider = QtWidgets.QSlider()
self.BendH_Slider.setMinimum(-180)
self.BendH_Slider.setMaximum(180)
self.BendH_Slider.setOrientation(QtCore.Qt.Horizontal)
self.BendH_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.BendH_Slider.setTickInterval(1)
self.BendH_Slider.setFixedHeight(22)
self.BendH_Slider.valueChanged.connect(self.set_BendH_Slider)
if BendWrapMode == 1:
self.BendH_Slider.setStyleSheet("QSlider::handle:horizontal { background: #65BEF1; height: 1px;}")
else:
self.BendH_Slider.setStyleSheet("QSlider::handle:horizontal { background: #303030; height: 1px;}")
BendH_Lyt.addWidget(self.BendH_Slider)
##------------------------------------------------------------: SPINBOX
self.BendH_SpinBox = QtWidgets.QDoubleSpinBox()
self.BendH_SpinBox.setDecimals(0)
self.BendH_SpinBox.setFixedWidth(40)
self.BendH_SpinBox.setFixedHeight(18)
self.BendH_SpinBox.setRange(-180, 180)
self.BendH_SpinBox.setValue(0)
self.BendH_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.BendH_SpinBox.editingFinished.connect(self.set_BendH_SpinBox)
if BendWrapMode == 1:
self.BendH_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #909090; background-color: #242424; width: 60px;}")
else:
self.BendH_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #303030; background-color: #242424; width: 60px;}")
BendH_Lyt.addWidget(self.BendH_SpinBox)
self.BendH_Slider.setEnabled(0)
self.BendH_SpinBox.setEnabled(0)
##----------------------------------------------------------------------------------------/ B E N D V S L I D E R
BendV_Lyt = QtWidgets.QHBoxLayout()
self.MAIN_Lyt.addLayout(BendV_Lyt)
##------------------------------------------------------------: LABEL
self.BendV_Label = QtWidgets.QLabel("Bend V : ")
if BendWrapMode == 1:
self.BendV_Label.setStyleSheet("color:#909090;")
else:
self.BendV_Label.setStyleSheet("color:#303030;")
self.BendV_Label.setFont(QtGui.QFont('Calibri', 9))
BendV_Lyt.addWidget(self.BendV_Label)
##------------------------------------------------------------: SLIDER
self.BendV_Slider = QtWidgets.QSlider()
self.BendV_Slider.setMinimum(-180)
self.BendV_Slider.setMaximum(180)
self.BendV_Slider.setOrientation(QtCore.Qt.Horizontal)
self.BendV_Slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.BendV_Slider.setTickInterval(1)
self.BendV_Slider.setFixedHeight(22)
self.BendV_Slider.valueChanged.connect(self.set_BendV_Slider)
if BendWrapMode == 1:
self.BendV_Slider.setStyleSheet("QSlider::handle:horizontal { background: #65BEF1; height: 1px;}")
else:
self.BendV_Slider.setStyleSheet("QSlider::handle:horizontal { background: #303030; height: 1px;}")
BendV_Lyt.addWidget(self.BendV_Slider)
##------------------------------------------------------------: SPINBOX
self.BendV_SpinBox = QtWidgets.QDoubleSpinBox()
self.BendV_SpinBox.setDecimals(0)
self.BendV_SpinBox.setFixedWidth(40)
self.BendV_SpinBox.setFixedHeight(18)
self.BendV_SpinBox.setRange(-180, 180)
self.BendV_SpinBox.setValue(0)
self.BendV_SpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.BendV_SpinBox.editingFinished.connect(self.set_BendV_SpinBox)
if BendWrapMode == 1:
self.BendV_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #909090; background-color: #242424; width: 60px;}")
else:
self.BendV_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #303030; background-color: #242424; width: 60px;}")
BendV_Lyt.addWidget(self.BendV_SpinBox)
self.BendV_Slider.setEnabled(0)
self.BendV_SpinBox.setEnabled(0)
self.MAIN_Lyt.addStretch()
else:
pass
def SelectPlug(self):
mc.select("Plug_controler")
mc.setToolTo('Rotate')
mc.manipRotateContext("Rotate", edit=True, mode=0)
def FlipPlug(self):
if mc.objExists("PlugIt_FlipY_info"):
queryActalScaleX = mc.getAttr("Plug_controler.scaleX")
queryActalScaleY = mc.getAttr("Plug_controler.scaleY")* -1
else:
queryActalScaleX = mc.getAttr("Plug_controler.scaleX") * -1
queryActalScaleY = mc.getAttr("Plug_controler.scaleY")
queryActalScaleZ = mc.getAttr("Plug_controler.scaleZ")
mc.setAttr("Plug_controler.scale", queryActalScaleX, queryActalScaleY, queryActalScaleZ)
def SelectScaleManip(self):
mc.select("Plug_controler")
mc.setToolTo('Scale')
mc.manipScaleContext("Scale", edit=True, mode=0)
mc.manipScaleContext("Scale", edit=True, preventNegativeScale=0)
def Smooth(self):
mc.select("Plug_Selection_set")
mc.polySmooth()
def SelectPlug(self):
mc.select("Plug_controler")
mc.setToolTo('MoveSuperContext')
def OpenHole(self):
try:
mc.select("Plug_Hole_set")
mc.Delete()
except:
PlugIt_Global.WarningWindow("There no Hole set for this Plug.", 350)
return
def Delete(self):
mc.delete(MeshName)
mc.select("PlugIt_TargetMesh_DupSave")
mc.ShowSelectedObjects()
mc.rename("PlugIt_TargetMesh_DupSave", "mesh")
mc.deleteUI("P L U G - O p t i o n s")
def set_Slider(self):
SliderValue = self.Offset_Slider.value()
self.Offset_SpinBox.setValue(SliderValue)
mc.setAttr("PlugIt_Bridge_" + MeshName + ".bridgeOffset", SliderValue)
def set_SpinBox(self):
SpinBoxAValue = self.Offset_SpinBox.value()
self.Offset_Slider.setValue(SpinBoxAValue)
self.Offset_SpinBox.clearFocus()
def set_BendH_Slider(self):
SliderValue = self.BendH_Slider.value()
self.BendH_SpinBox.setValue(SliderValue)
mc.setAttr("PlugIt_Bend_1.curvature", SliderValue)
def set_BendH_SpinBox(self):
SpinBoxAValue = self.BendH_SpinBox.value()
self.BendH_Slider.setValue(SpinBoxAValue)
self.BendH_SpinBox.clearFocus()
def set_BendV_Slider(self):
SliderValue = self.BendV_Slider.value()
self.BendV_SpinBox.setValue(SliderValue)
mc.setAttr("PlugIt_Bend_2.curvature", SliderValue)
def set_BendV_SpinBox(self):
SpinBoxAValue = self.BendV_SpinBox.value()
self.BendV_Slider.setValue(SpinBoxAValue)
self.BendV_SpinBox.clearFocus()
# ___________________________________________________________________________ / WRAP BEND
def add_WrapBend(self):
global BendWrapMode
# _______________________________________/ BTN UPDATE
if BendWrapMode == 1:
self.BendH_Slider.setEnabled(0)
self.BendH_SpinBox.setEnabled(0)
self.BendV_Slider.setEnabled(0)
self.BendV_SpinBox.setEnabled(0)
self.BendH_Label.setStyleSheet("color:#303030;")
self.BendH_Slider.setStyleSheet("QSlider::handle:horizontal { background: #303030; height: 1px;}")
self.BendH_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #303030; background-color: #242424; width: 60px;}")
self.BendV_Label.setStyleSheet("color:#303030;")
self.BendV_Slider.setStyleSheet("QSlider::handle:horizontal { background: #303030; height: 1px;}")
self.BendV_SpinBox.setStyleSheet( "QDoubleSpinBox{font-size:13px; color : #303030; background-color: #242424; width: 60px;}")
BendWrapMode = 0
self.Wrap_Btn.setStyleSheet("color:#909090;")
mc.delete("PlugIt_Bend_1Handle")
mc.delete("PlugIt_Bend_2Handle")
else:
BendWrapMode = 1
self.Wrap_Btn.setStyleSheet("color:#202020; background-color : #65BEF1;")
mc.setAttr("Plug_controler.visibility", 1)
# _______________________________________/ CREATE BEND 1
mc.select("Plug_Selection_set")
mc.nonLinear(type='bend', curvature=0.0, n="PlugIt_Bend_1")
locatorSize = mc.getAttr("Plug_controler.boundingBoxMaxY")
mc.setAttr("PlugIt_Bend_1Handle.scaleX", locatorSize)
mc.setAttr("PlugIt_Bend_1Handle.scaleY", locatorSize)
mc.setAttr("PlugIt_Bend_1Handle.scaleZ", locatorSize)
mc.matchTransform("PlugIt_Bend_1Handle", "Plug_controler", pos=True, rot=True)
mc.parent("PlugIt_Bend_1Handle", "Plug_Mesh")
# _______________________________________/ CREATE BEND 2
mc.select("Plug_Selection_set")
mc.nonLinear(type='bend', curvature=0.0, n="PlugIt_Bend_2")
locatorSize = mc.getAttr("Plug_controler.boundingBoxMaxY")
mc.setAttr("PlugIt_Bend_2Handle.scaleX", locatorSize)
mc.setAttr("PlugIt_Bend_2Handle.scaleY", locatorSize)
mc.setAttr("PlugIt_Bend_2Handle.scaleZ", locatorSize)
mc.matchTransform("PlugIt_Bend_2Handle", "Plug_controler", pos=True, rot=True)
mc.parent("PlugIt_Bend_2Handle", "Plug_Mesh")
mc.setAttr("PlugIt_Bend_2Handle.rotateX", 90)
mc.setAttr("Plug_controler.visibility", 0)
#UPDATE UI
self.BendH_Slider.setEnabled(1)
self.BendH_SpinBox.setEnabled(1)
self.BendV_Slider.setEnabled(1)
self.BendV_SpinBox.setEnabled(1)
bend1Value = mc.getAttr("PlugIt_Bend_1.curvature")
self.BendH_Slider.setProperty("value", bend1Value)
self.BendH_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #909090; background-color: #242424; width: 60px;}")
self.BendH_Slider.setStyleSheet("QSlider::handle:horizontal { background: #65BEF1; height: 1px;}")
self.BendH_Label.setStyleSheet("color:#909090;")
bend2Value = mc.getAttr("PlugIt_Bend_2.curvature")
self.BendV_Slider.setProperty("value", bend2Value)
self.BendV_SpinBox.setStyleSheet("QDoubleSpinBox{font-size:13px; color : #909090; background-color: #242424; width: 60px;}")
self.BendV_Slider.setStyleSheet("QSlider::handle:horizontal { background: #65BEF1; height: 1px;}")
self.BendV_Label.setStyleSheet("color:#909090;")
mc.select(d = True)
def select_WrapBend_1(self):
mc.select("PlugIt_Bend_1Handle")
mc.setToolTo('scaleSuperContext')
def select_WrapBend_2(self):
mc.select("PlugIt_Bend_2Handle")
mc.setToolTo('scaleSuperContext')
def Dock(Widget, width=200, height=200, hp="free", show=True):
name = WindowTitle
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():
mc.scriptJob(kill = ScriptJobNum, force=True)
if mc.objExists(MeshName):
mc.delete(MeshName, constructionHistory=True)
listToDelete = ("Mesh_EdgeBorder_set", "Plug_AllFaces_set", "Plug_EdgeBorder_set", "Plug_Selection_set", "Plug_Mesh", "PlugIt_FlipY_info")
for each in listToDelete:
if mc.objExists(each):
mc.delete(each)
if mc.objExists(MeshName):
mc.select(MeshName)
if mc.objExists("PlugIt_TargetMesh_DupSave"):
mc.rename("PlugIt_TargetMesh_DupSave", "PlugItDupSave_" + MeshName)
mc.flushUndo()
def showUI():
ui = Dock(PopUp_UI)
ui.show()
##DELETE PopUp UI
if mc.window("Settings", exists=True):
mc.deleteUI("Settings")
if mc.window("WarningWindow", exists=True):
mc.deleteUI("WarningWindow")
if mc.window("Thumbnail Framing", exists=True):
mc.deleteUI("Thumbnail Framing")
if mc.window("Add Asset", exists=True):
mc.deleteUI("Add Asset")
if mc.window("Add New Tab", exists=True):
mc.deleteUI("Add New Tab")
if mc.window("Add New Sub Tab", exists=True):
mc.deleteUI("Add New Sub Tab")
##CLEAN Scene
if mc.objExists("PlugIt_Thumb_Group"):
mc.delete("PlugIt_Thumb_Group")
mc.delete("PlugIt_Thumb_shd")
mc.delete("PlugIt_ThumbScene_HDR")
mc.delete("AssetI_ThumbScene_place2dTexture")
if mc.objExists("PlugIt_Thumb_Scene_uiConfigurationScriptNode"):
mc.delete("PlugIt_Thumb_Scene_uiConfigurationScriptNode")
if mc.objExists("PlugIt_Thumb_Scene_sceneConfigurationScriptNode"):
mc.delete("PlugIt_Thumb_Scene_sceneConfigurationScriptNode")
# Get a pointer and convert it to Qt Widget object
qw = omui.MQtUtil.findWindow(WindowTitle)
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=[WindowTitle, atClose])
return ui