MetaBox/Scripts/Modeling/Edit/CreasePlus/CreasePlusBase.py

479 lines
11 KiB
Python
Raw Normal View History

2025-01-14 02:59:09 +08:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
_____ _____ ______ _____ ______
/ ____| __ \| ____| /\ / ____| ____|_
| | | |__) | |__ / \ | (___ | |__ _| |_
| | | _ /| __| / /\ \ \___ \| __|_ _|
| |____| | \ \| |____ / ____ \ ____) | |____|_|
\_____|_| \_\______/_/ \_\_____/|______|
"""
import maya.cmds as cmds
import maya.api.OpenMaya as om
# uses python maya 2
maya_useNewAPI = True
class MayaVerObj():
def __init__(self):
self.num = None
self.extnum = 0
def cPwhatmayaversion():
verstring = cmds.about(v=True)
splited = verstring.split()
num = None
extnum = 0
for r in splited:
if "20" in r:
num = int(r)
break
i = -1
for r in splited:
i += 1
if r.lower() == "extension" or r.lower() == "ext":
j = i+1
for j in range(len(splited)):
if splited[j].isdigit():
extnum = int(splited[j])
break
break
if not num:
raise Exception("can't get maya version")
mayavobj = MayaVerObj()
mayavobj.num = num
mayavobj.extnum = extnum
return mayavobj
global_creasePlus_mayaver = cPwhatmayaversion()
def getmayaver():
global global_creasePlus_mayaver
return global_creasePlus_mayaver
class CpMsg:
kNoSel = 'nothing is selected'
kNoSelCurve = 'no curve(s) selected'
kNoSelMesh = 'no mesh(es) selected'
kNoSelEdge = 'no edge(s) selected'
kNoSelVert = 'no vertice(s) selected'
kNoSelFace = 'no face(s) selected'
kSelOneMesh = 'select one mesh'
kSelMesh = 'mesh(es) must be selected'
kSelEdge = 'edge(s) must be selected'
kSelFace = 'face(s) must be selected'
kSelVert = 'vertice(s) must be selected'
kSelEdgeOrOneMesh = 'select edge(s) or a mesh'
kSelCurveCv = 'curve cv(s) must be selected'
kWorksForOne = 'works just for one entity'
kNoHardEdges = 'no hard edge(s) were found'
kSelLeastTwoMesh = 'select at least two meshes'
kSelLeastTwoCurve = 'select at least two curves'
kInvalidFuncArgs = 'function called with invalid arguments'
kRequModelView = 'you are required to be in a modeling view/pan'
kWrongSel = 'wrong selection'
kcPnodePluginNotLoaded = \
'creasePlus nodes plugin must be loaded to use this command'
# obj assumed to be a parent
def cPgotoChild(obj, mfntyp):
dagn = om.MFnDagNode(obj)
for i in range(dagn.childCount()):
cur = dagn.child(i)
if cur.hasFn(mfntyp):
return cur
return om.MObject.kNullObj
def cPshapeDagPath(obj):
dagn = om.MFnDagNode(obj)
return dagn.getPath()
def cPhardEdgesStrings(shape):
sel = om.MSelectionList()
sel.add(shape)
dagp = sel.getDagPath(0)
edgeIter = om.MItMeshEdge(dagp)
selStrings = []
shapeString = dagp.partialPathName()
while not edgeIter.isDone():
if edgeIter.isSmooth == False:
selStrings.append(shapeString + '.e['
+ str(edgeIter.index()) + ']')
edgeIter.next()
return selStrings
def cPgetShapeStringsFromSel(mfntyp):
sel = om.MGlobal.getActiveSelectionList()
selIt = om.MItSelectionList(sel)
selStrings = []
dagFn = om.MFnDagNode()
while not selIt.isDone():
if selIt.itemType() != selIt.kDagSelectionItem:
selIt.next()
continue
obj = selIt.getDependNode()
if not obj.hasFn(mfntyp):
obj = cPgotoChild(obj, mfntyp)
if not obj.hasFn(mfntyp):
selIt.next()
continue
dagFn.setObject(obj)
selStrings.append(dagFn.partialPathName())
selIt.next()
return selStrings
def cPcameraDominantPlane():
activePan = cmds.getPanel(wf=True)
if cmds.getPanel(to=activePan) != 'modelPanel':
cmds.error(CpMsg.kRequModelView)
camPos = cmds.camera(cmds.modelEditor(activePan, q=True, cam=True),
q=True, p=True)
camTarget = cmds.camera(cmds.modelEditor(activePan, q=True, cam=True),
q=True, wci=True)
camDir = om.MVector(abs(camTarget[0] - camPos[0]), abs(camTarget[1]
- camPos[1]), abs(camTarget[2] - camPos[2]))
maxv = 0
ddir = 'x'
if maxv < camDir.x:
maxv = camDir.x
ddir = 'x'
if maxv < camDir.y:
maxv = camDir.y
ddir = 'y'
if maxv < camDir.z:
maxv = camDir.z
ddir = 'z'
return ddir
# cmds.ls(sl=True)
# get shape + v, e, f comps in a tuple
def cPgetShapeAndCoStrings(mselit):
shape = None
v = None
e = None
f = None
if mselit.itemType() != mselit.kDagSelectionItem:
return (shape, v, e, f)
hasComp = mselit.hasComponents()
if hasComp == True:
comp = mselit.getComponent()
if comp[0].node().hasFn(om.MFn.kMesh):
shape = comp[0]
if comp[1].hasFn(om.MFn.kMeshPolygonComponent):
f = comp[1]
elif comp[1].hasFn(om.MFn.kMeshEdgeComponent):
e = comp[1]
elif comp[1].hasFn(om.MFn.kMeshVertComponent):
v = comp[1]
else:
obj = mselit.getDependNode()
if not obj.hasFn(om.MFn.kMesh):
obj = cPgotoChild(obj, om.MFn.kMesh)
if obj.hasFn(om.MFn.kMesh):
shape = cPshapeDagPath(obj)
return (shape, v, e, f)
def cPfaceToHardEdgeStrings(dagp, faceComps):
edgeIds = set()
faceIt = om.MItMeshPolygon(dagp, faceComps)
meshFn = om.MFnMesh(dagp.node())
while not faceIt.isDone():
fEdges = faceIt.getEdges()
for idx in fEdges:
if not meshFn.isEdgeSmooth(idx):
edgeIds.add(idx)
faceIt.next(None) # maya api bug
shapeString = dagp.partialPathName()
return [shapeString + '.e[' + str(idx) + ']' for idx in edgeIds]
def cPedgeToStrings(dagp, edgeComps):
edgeStrings = []
edgeIt = om.MItMeshEdge(dagp, edgeComps)
shapeString = dagp.partialPathName()
while not edgeIt.isDone():
edgeStrings.append(shapeString + '.e[' + str(edgeIt.index())
+ ']')
edgeIt.next()
return edgeStrings
################################################################ CONTEXTS #################################################################
# draw curve ctx
try:
global_cPcurveCtxStr
except:
global_cPcurveCtxStr = cmds.curveCVCtx('cPcurveCtx', degree=1)
#
# booleanop context
try:
global_cPboolOpCtxStr
except:
global_cPboolOpCtxStr = cmds.dragAttrContext('cPboolOpCtx')
global_cPboolOpAttrCnt = 3
global_cPboolOpAttrIter = 0
def cPboolOpIterSetVal(val):
global global_cPboolOpAttrIter
global_cPboolOpAttrIter = val
return global_cPboolOpAttrIter % global_cPboolOpAttrCnt
def cPboolOpIterVal():
global global_cPboolOpAttrIter
return global_cPboolOpAttrIter % global_cPboolOpAttrCnt
def cPboolOpIterIncVal():
global global_cPboolOpAttrIter
global_cPboolOpAttrIter += 1
return global_cPboolOpAttrIter % global_cPboolOpAttrCnt
#
# mirror context
try:
global_cPmirrorCtxStr
except:
global_cPmirrorCtxStr = cmds.dragAttrContext('cPmirrorCtx')
global_cPmirrorAttrCnt = None
if getmayaver().num > 2016:
global_cPmirrorAttrCnt = 1
else:
global_cPmirrorAttrCnt = 3
global_cPmirrorAttrIter = 0
def cPmirrorIterSetVal(val):
global global_cPmirrorAttrIter
global_cPmirrorAttrIter = val
return global_cPmirrorAttrIter % global_cPmirrorAttrCnt
def cPmirrorIterVal():
global global_cPmirrorAttrIter
return global_cPmirrorAttrIter % global_cPmirrorAttrCnt
def cPmirrorIterIncVal():
global global_cPmirrorAttrIter
global_cPmirrorAttrIter += 1
return global_cPmirrorAttrIter % global_cPmirrorAttrCnt
#
# hbevel context
try:
global_hBevelCtxStr
except:
global_hBevelCtxStr = cmds.dragAttrContext('hBevelCtx')
global_hBevelAttrCnt = 2
global_hBevelAttrIter = 0
def cPhBevelIterSetVal(val):
global global_hBevelAttrIter
global_hBevelAttrIter = val
return global_hBevelAttrIter % global_hBevelAttrCnt
def cPhBevelIterVal():
global global_hBevelAttrIter
return global_hBevelAttrIter % global_hBevelAttrCnt
def cPhBevelIterIncVal():
global global_hBevelAttrIter
global_hBevelAttrIter += 1
return global_hBevelAttrIter % global_hBevelAttrCnt
#
# curvebevel context
try:
global_cPcurveBevelCtxStr
except:
global_cPcurveBevelCtxStr = cmds.dragAttrContext('cPcurveBvlCtx')
global_cPcurveBevelAttrCnt = 2
global_cPcurveBevelAttrIter = 0
def cPcurveBevelIterSetVal(val):
global global_cPcurveBevelAttrIter
global_cPcurveBevelAttrIter = val
return global_cPcurveBevelAttrIter % global_cPcurveBevelAttrCnt
def cPcurveBevelIterVal():
global global_cPcurveBevelAttrIter
return global_cPcurveBevelAttrIter % global_cPcurveBevelAttrCnt
def cPcurveBevelIterIncVal():
global global_cPcurveBevelAttrIter
global_cPcurveBevelAttrIter += 1
return global_cPcurveBevelAttrIter % global_cPcurveBevelAttrCnt
#
# crease tool context
try:
global_cPcreaseCtxStr
except:
global_cPcreaseCtxStr = cmds.polyCreaseCtx('cPcreaseCtx', es=True, r=True)
#
# physical crease context
try:
global_pCreaseCtxStr
except:
global_pCreaseCtxStr = cmds.dragAttrContext('pCreaseCtx')
global_pCreaseAttrCnt = 2
global_pCreaseAttrIter = 0
def cPpCreaseIterSetVal(val):
global global_pCreaseAttrIter
global_pCreaseAttrIter = val
return global_pCreaseAttrIter % global_pCreaseAttrCnt
def cPpCreaseIterVal():
global global_pCreaseAttrIter
return global_pCreaseAttrIter % global_pCreaseAttrCnt
def cPpCreaseIterIncVal():
global global_pCreaseAttrIter
global_pCreaseAttrIter += 1
return global_pCreaseAttrIter % global_pCreaseAttrCnt
#
def cPcontextUndo():
if cmds.currentCtx() == global_cPboolOpCtxStr:
# cmds.setToolTo('moveSuperContext')
cmds.dragAttrContext(global_cPboolOpCtxStr, e=True, reset=True)
cmds.setToolTo(global_cPboolOpCtxStr)
elif cmds.currentCtx() == global_hBevelCtxStr:
# cmds.setToolTo('moveSuperContext')
cmds.dragAttrContext(global_hBevelCtxStr, e=True, reset=True)
cmds.setToolTo(global_hBevelCtxStr)
elif cmds.currentCtx() == global_cPmirrorCtxStr:
# cmds.setToolTo('moveSuperContext')
cmds.dragAttrContext(global_cPmirrorCtxStr, e=True, reset=True)
cmds.setToolTo(global_cPmirrorCtxStr)
elif cmds.currentCtx() == global_cPcurveBevelCtxStr:
# cmds.setToolTo('moveSuperContext')
cmds.dragAttrContext(global_cPcurveBevelCtxStr, e=True, reset=True)
cmds.setToolTo(global_cPcurveBevelCtxStr)
elif cmds.currentCtx() == global_pCreaseCtxStr:
# cmds.setToolTo('moveSuperContext')
cmds.dragAttrContext(global_pCreaseCtxStr, e=True, reset=True)
cmds.setToolTo(global_pCreaseCtxStr)
try:
global_creasePlusCtxUndoJob
except:
global_creasePlusCtxUndoJob = cmds.scriptJob(event=['Undo', cPcontextUndo])
############################################################################################################
def main():
return None
if __name__ == '__main__':
main()