479 lines
11 KiB
Python
479 lines
11 KiB
Python
|
#!/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()
|