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

2125 lines
56 KiB
Python
Raw Normal View History

2025-01-14 02:59:09 +08:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
# import sys
"""
_____ _____ ______ _____ ______
/ ____| __ \| ____| /\ / ____| ____|_
| | | |__) | |__ / \ | (___ | |__ _| |_
| | | _ /| __| / /\ \ \___ \| __|_ _|
| |____| | \ \| |____ / ____ \ ____) | |____|_|
\_____|_| \_\______/_/ \_\_____/|______|
"""
import math
from MayaUndoRun import mayaUndoRun
import maya.cmds as mc
import maya.mel as mel
import maya.api.OpenMaya as om
import CreasePlusExcept as crepexcept
import CreasePlusBase as crep
import CreasePlusNodes
import importlib
# TODO remove reloads
# crep = importlib.reload(crep)
# CreasePlusNodes = importlib.reload(CreasePlusNodes)
# uses python maya 2
maya_useNewAPI = True
def cPmayaScriptDir():
return mc.internalVar(usd=True)
def cPmainDir():
return cPmayaScriptDir() + 'CreasePlus/'
# GLOBALS
__ = str(CreasePlusNodes)
__ = __[__.find(" \'") + 2:__.find("\' from")]
__ = __[__.rfind('.') + 1:]
global_CP_Nodes_pluginstr = __
# bool namespace
try:
global_cPboolNamespace
except:
global_cPboolNamespace = mc.namespace(add='cPbool', parent=':')
def cPaddToMayaNamespace(toRename, newname):
global global_cPboolNamespace
if not mc.namespace(exists=global_cPboolNamespace):
global_cPboolNamespace = mc.namespace(add='cPbool', parent=':')
return mc.rename(toRename, newname)
#####
def creasePlusShapeShifter():
sdir = mc.internalVar(
usd=True) + 'AMTools/AMTScripts/StartShapeShifter.mel'
ssExist = mel.eval('filetest -f "' + sdir + '";')
# welcome
if not ssExist:
mc.warning(
'unable to start ShapeShifter, you have to purchase or update ShapeShifter for CREASE+ support.\n'
)
return
mel.eval('source "' + sdir + '";')
def cPgetGoz():
if mc.about(win=True):
# for windows
assumed = "C:/Users/Public/Pixologic/GoZApps/Maya/GoZBrushFromMaya.mel"
gozTest = mel.eval("filetest -f " + "\"" + assumed + "\";")
sGoz = "source " + "\"" + assumed + "\";"
if gozTest == 0:
mc.warning("To use this feature you need Goz script from Pixologic Zbrush.\n")
return
else:
mel.eval(sGoz)
else:
# for mac
assumed = "/Users/Shared/Pixologic/GoZApps/Maya/GoZBrushFromMaya.mel"
gozTest = mel.eval("filetest -f " + "\"" + assumed + "\";")
sGoz = "source " + "\"" + assumed + "\";"
if gozTest == 0:
mc.warning("To use this feature you need Goz script from Pixologic Zbrush.\n")
return
else:
mel.eval(sGoz)
def creasePlusGoz():
osel = mc.ls(sl=True)
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelMesh)
for shapeStr in sel:
mc.select(shapeStr, r=True)
mel.eval(
'polyCleanupArgList 4 { "0","2","0","0","1","0","0","0","0","1e-005","0","1e-005","0","1e-005","0","-1","0","0" };'
)
if len(mc.ls(sl=True, fl=True)):
mel.eval(
'polyCleanupArgList 4 { "0","1","0","0","1","0","0","0","0","1e-005","0","1e-005","0","1e-005","0","-1","0","0" };'
)
mc.select(osel, r=True)
cPgetGoz()
@mayaUndoRun
def creasePlusSmooth30():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSel)
for shapeStr in sel:
mc.polySoftEdge(shapeStr, a=30, ch=True)
mc.select(
mc.listRelatives(sel, parent=True, fullPath=True, typ='transform'),
r=True)
# creasePlusDisplayHardEdges(0)
def creasePlusDisplayHardEdges(disp=0):
# disp = 0 for toggle
# = 1 to display hard edges
# = 2 for no display
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
for shapeStr in sel:
if disp == 0:
nodisp = mc.polyOptions(shapeStr, q=True, ae=True)[0]
if nodisp:
mc.polyOptions(shapeStr, hec=True)
else:
mc.polyOptions(shapeStr, ae=True)
elif disp == 1:
mc.polyOptions(shapeStr, hec=True)
elif disp == 2:
mc.polyOptions(shapeStr, ae=True)
else:
raise crepexcept.cPexcept('wrong kwarg value')
@mayaUndoRun
def creasePlusSelHardEdges():
sel = om.MGlobal.getActiveSelectionList()
selIt = om.MItSelectionList(sel)
finalSel = om.MSelectionList()
while not selIt.isDone():
obj = selIt.getDependNode()
if not obj.hasFn(om.MFn.kMesh):
obj = crep.cPgotoChild(obj, om.MFn.kMesh)
if not obj.hasFn(om.MFn.kMesh):
selIt.next()
continue
dagp = crep.cPshapeDagPath(obj)
edgeIter = om.MItMeshEdge(dagp)
while not edgeIter.isDone():
if not edgeIter.isSmooth:
finalSel.add(
(dagp, edgeIter.currentItem()), mergeWithExisting=False)
edgeIter.next()
selIt.next()
om.MGlobal.setActiveSelectionList(finalSel)
# @mayaUndoRun
def creasePlusToggleEdgeSmooth():
sel = om.MGlobal.getActiveSelectionList()
selIt = om.MItSelectionList(sel)
selIt.setFilter(om.MFn.kMeshEdgeComponent)
comps = []
while not selIt.isDone():
comps.append(selIt.getComponent())
selIt.next()
for comp in comps:
toHardList = []
toSoftenList = []
edgeIter = om.MItMeshEdge(comp[0], comp[1])
while not edgeIter.isDone():
compstring = comp[0].partialPathName() + '.e[' + str(
edgeIter.index()) + ']'
if edgeIter.isSmooth:
toHardList.append(compstring)
else:
toSoftenList.append(compstring)
edgeIter.next()
if len(toHardList):
mc.polySoftEdge(toHardList, a=0, ch=True)
if len(toSoftenList):
mc.polySoftEdge(toSoftenList, a=180, ch=True)
om.MGlobal.setActiveSelectionList(sel)
def cPdoPolyBevel(selStrings, nname):
if crep.getmayaver().num > 2016 or (crep.getmayaver().num == 2016 and crep.getmayaver().extnum == 2):
nodestr = mc.polyBevel3(
selStrings,
oaf=False,
af=True,
mia=0,
c=True,
f=0,
o=0,
sg=1,
ws=True,
sa=180,
sn=True,
ma=180,
at=180,
)[0]
else:
nodestr = mc.polyBevel3(
selStrings,
oaf=False,
af=True,
fn=1,
o=0,
sg=1,
ws=True,
sa=180,
)[0]
return mc.rename(nodestr, nname)
#
class CpMirrorStat:
axisStr = 'axis'
sideStr = 'side'
posStr = 'position'
dxs = 'dX'
dys = 'dY'
dzs = 'dZ'
def cPmirrorAttrs(nodeString, mirrorNodeStr):
axisStr = CpMirrorStat.axisStr
sideStr = CpMirrorStat.sideStr
posStr = CpMirrorStat.posStr
dxs = CpMirrorStat.dxs
dys = CpMirrorStat.dys
dzs = CpMirrorStat.dzs
if crep.getmayaver().num > 2016:
if mc.attributeQuery(axisStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + axisStr)
if mc.attributeQuery(sideStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + sideStr)
if mc.attributeQuery(posStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + posStr)
mc.addAttr(
nodeString,
ln=axisStr,
k=True,
at='enum',
en='X=0:Y=1:Z=2',
dv=0,
)
mc.addAttr(
nodeString,
ln=sideStr,
k=True,
at='enum',
en='+=0:-=1',
dv=0,
)
mc.addAttr(
nodeString,
ln=posStr,
k=True,
at='floatLinear',
dv=mc.getAttr(mirrorNodeStr + '.mirrorPosition'))
mc.connectAttr(nodeString + '.' + axisStr, mirrorNodeStr + '.axis')
mc.connectAttr(nodeString + '.' + sideStr,
mirrorNodeStr + '.axisDirection')
mc.connectAttr(nodeString + '.' + posStr,
mirrorNodeStr + '.mirrorPosition')
else:
if mc.attributeQuery(axisStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + axisStr)
if mc.attributeQuery(dxs , node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + dxs )
if mc.attributeQuery(dys , node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + dys )
if mc.attributeQuery(dzs , node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + dzs )
mc.addAttr(
nodeString,
ln=axisStr,
k=True,
at='enum',
en='+X=0:-X=1:+Y=2:-Y=3:+Z=4:-Z=5',
dv=0,
)
mc.addAttr(
nodeString,
ln=dxs,
k=True,
at='doubleLinear',
dv=0.5)
# dv=mc.getAttr(mirrorNodeStr + '.pivotX'))
mc.addAttr(
nodeString,
ln=dys,
k=True,
at='doubleLinear',
dv=0.5)
# dv=mc.getAttr(mirrorNodeStr + '.pivotY'))
mc.addAttr(
nodeString,
ln=dzs,
k=True,
at='doubleLinear',
dv=0.5)
# dv=mc.getAttr(mirrorNodeStr + '.pivotZ'))
mc.connectAttr(nodeString + '.' + axisStr, mirrorNodeStr + '.direction')
mc.connectAttr(nodeString + "." + dxs, mirrorNodeStr + '.pivotX')
mc.connectAttr(nodeString + "." + dys, mirrorNodeStr + '.pivotY')
mc.connectAttr(nodeString + "." + dzs, mirrorNodeStr + '.pivotZ')
def creasePlusMirrorCont(nodeString):
crep.global_cPmirrorCtxStr
axisStr = CpMirrorStat.axisStr
sideStr = CpMirrorStat.sideStr
posStr = CpMirrorStat.posStr
dxs = CpMirrorStat.dxs
dys = CpMirrorStat.dys
dzs = CpMirrorStat.dzs
cur = None
if mc.currentCtx() == crep.global_cPmirrorCtxStr:
cur = crep.cPmirrorIterIncVal()
else:
cur = crep.cPmirrorIterSetVal(0)
mc.dragAttrContext(crep.global_cPmirrorCtxStr, e=True, reset=True)
if crep.getmayaver().num > 2016:
if cur == 0:
mc.dragAttrContext(
crep.global_cPmirrorCtxStr, e=True, ct=nodeString + '.' + posStr)
else:
if cur == 0:
mc.setAttr(nodeString + "." + axisStr, 0)
elif cur == 1:
mc.setAttr(nodeString + "." + axisStr, 2)
elif cur == 2:
mc.setAttr(nodeString + "." + axisStr, 4)
mc.setToolTo(crep.global_cPmirrorCtxStr)
def cPhasMirrorHistory(shape):
dummy = om.MSelectionList()
dummy.add(shape)
dagFn = om.MFnDagNode(dummy.getDependNode(0))
dagFn.setObject(dagFn.parent(0))
transfrmStr = dagFn.partialPathName()
if mc.attributeQuery(CpMirrorStat.axisStr, node=transfrmStr, ex=True):
destPlugs = mc.connectionInfo(
transfrmStr + '.' + CpMirrorStat.axisStr, dfs=True)
for plugStr in destPlugs:
if mc.nodeType(cPplugNode(plugStr)) == 'polyMirror':
return True
else:
return False
return False
@mayaUndoRun
def creasePlusMirror():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelMesh)
crep.global_cPmirrorCtxStr
ctxActive = mc.currentCtx() == crep.global_cPmirrorCtxStr
if ctxActive and cPhasMirrorHistory(sel[0]):
transformStr = mc.listRelatives(
sel[0], parent=True, fullPath=True, typ='transform')[0]
creasePlusMirrorCont(transformStr)
return
transformNodes = []
for shapeStr in sel:
# shapeStr = "pCubeShape1"
transformStr = mc.listRelatives(
shapeStr, parent=True, fullPath=True, typ='transform')[0]
transformNodes.append(transformStr)
mirNode = mc.polyMirrorFace(shapeStr)[0]
# mc.polyMergeVertex(shapeStr, d=0.015, am=False)
cPmirrorAttrs(transformStr, mirNode)
mc.select(transformNodes, r=True)
creasePlusMirrorCont(transformStr)
class CpBoolOpStat:
title = 'boolOp'
unionStr = 'union'
diffStr = 'difference'
intersecStr = 'intersect'
def cPboolOpAttrs(nodeString, boolNodeStr):
mainAttrName = CpBoolOpStat.title
unionStr = CpBoolOpStat.unionStr
diffStr = CpBoolOpStat.diffStr
intersecStr = CpBoolOpStat.intersecStr
if mc.attributeQuery(mainAttrName, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + mainAttrName)
mc.addAttr(
nodeString,
ln=mainAttrName,
k=True,
at='enum',
en=unionStr + '=1:' + diffStr + '=2:' + intersecStr + '=3',
dv=2,
)
mc.connectAttr(nodeString + '.' + mainAttrName, boolNodeStr + '.operation')
# creasePlusBoolOpCont("polySurface1")
def creasePlusBoolOpCont(nodeString):
crep.global_cPboolOpCtxStr
mainAttrName = CpBoolOpStat.title
cur = None
if mc.currentCtx() == crep.global_cPboolOpCtxStr:
cur = crep.cPboolOpIterIncVal()
else:
cur = crep.cPboolOpIterSetVal(0)
mc.dragAttrContext(crep.global_cPboolOpCtxStr, e=True, reset=True)
if cur == 0:
mc.setAttr(nodeString + '.' + mainAttrName, 2)
elif cur == 1:
mc.setAttr(nodeString + '.' + mainAttrName, 1)
elif cur == 2:
mc.setAttr(nodeString + '.' + mainAttrName, 3)
mc.setToolTo(crep.global_cPboolOpCtxStr)
def cPhasBoolHistory(shape):
dummy = om.MSelectionList()
dummy.add(shape)
dagFn = om.MFnDagNode(dummy.getDependNode(0))
dagFn.setObject(dagFn.parent(0))
transfrmStr = dagFn.partialPathName()
if mc.attributeQuery(CpBoolOpStat.title, node=transfrmStr, ex=True):
destPlugs = mc.connectionInfo(
transfrmStr + '.' + CpBoolOpStat.title, dfs=True)
for plugStr in destPlugs:
if mc.nodeType(cPplugNode(plugStr)) == 'polyCBoolOp':
return True
else:
return False
return False
# @mayaUndoRun
def creasePlusToggleBoolGhost():
global global_cPboolNamespace
vs = mc.ls(global_cPboolNamespace + ":*", o=True, v=True)
ivs = mc.ls(global_cPboolNamespace + ":*", o=True, iv=True)
if (len(vs)):
mc.hide(vs)
elif (len(ivs)):
mc.showHidden(ivs)
@mayaUndoRun
def creasePlusBool(keepOperands=False):
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelMesh)
crep.global_cPboolOpCtxStr
ctxActive = mc.currentCtx() == crep.global_cPboolOpCtxStr
hasBoolHistory = cPhasBoolHistory(sel[0])
if ctxActive and hasBoolHistory or len(sel) == 1 and hasBoolHistory:
curTransfrm = mc.listRelatives(
sel[0],
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
creasePlusBoolOpCont(curTransfrm)
return
elif len(sel) < 2:
raise crepexcept.cPexcept(crep.CpMsg.kSelLeastTwoMesh)
if keepOperands:
for curShape in sel[1:]:
mc.setAttr(curShape + '.visibility', True)
mc.setAttr(curShape + '.hiddenInOutliner', False)
mc.setAttr(curShape + '.intermediateObject', False)
mc.setAttr(curShape + '.overrideShading', True)
mc.setAttr(curShape + '.overrideColor', 0)
mc.setAttr(curShape + '.overrideEnabled', False)
sel[1:] = mc.listRelatives(
mc.duplicate(sel[1:], renameChildren=True),
children=True,
fullPath=True,
noIntermediate=False,
typ='mesh')
newObj = mc.polyCBoolOp(
sel,
useCarveBooleans=True,
classification=1,
op=2,
preserveColor=False,
ch=True,
)
if mc.nodeType(newObj[0]) == 'mesh':
newObj[0] = mc.listRelatives(
newObj[0],
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
dummy = om.MSelectionList()
dummy.add(newObj[1])
depFn = om.MFnDependencyNode(dummy.getDependNode(0))
allPlugs = depFn.getConnections()
inShapeStrings = set()
fstShapeStr = None
for i in range(len(allPlugs)):
curPlug = allPlugs[i]
if not curPlug.isDestination:
continue
srcPlug = mc.connectionInfo(curPlug.name(), sfd=True)
srcShapeStr = cPplugNode(srcPlug)
if mc.nodeType(srcShapeStr) == 'mesh':
if fstShapeStr == None:
fstShapeStr = srcShapeStr
inShapeStrings.add(srcShapeStr)
global global_cPboolNamespace
for curShape in inShapeStrings:
# curShape = next(iter(inShapeStrings))
if curShape == fstShapeStr:
continue
# def creasePlusBool()
curTransfrm = mc.listRelatives(
curShape,
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
mc.setAttr(curShape + '.visibility', True)
mc.setAttr(curShape + '.hiddenInOutliner', False)
mc.setAttr(curShape + '.intermediateObject', False)
mc.setAttr(curShape + '.overrideEnabled', True)
mc.setAttr(curShape + '.overrideShading', False)
mc.setAttr(curShape + '.overrideColor', 4)
mc.xform(curShape,cp=True)
if not ((global_cPboolNamespace + ":") in curTransfrm):
curTransfrm = cPaddToMayaNamespace(
curTransfrm, global_cPboolNamespace + ":" +
curTransfrm[curTransfrm.rfind("|") + 1:])
mc.setAttr(curTransfrm + '.visibility', True)
cPboolOpAttrs(newObj[0], newObj[1])
creasePlusBoolOpCont(newObj[0])
mc.select(newObj[0], r=True)
# mel.eval("AEdagNodeCommonRefreshOutliners();")
if crep.getmayaver().num > 2016:
mel.eval(
'attributeEditorVisibilityStateChange(`workspaceControl -q -visible AttributeEditor`, "");'
)
@mayaUndoRun
def creasePlusPanelBool():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
#
if len(sel) < 2:
raise crepexcept.cPexcept(crep.CpMsg.kSelLeastTwoMesh)
dupl = mc.duplicate(sel, renameChildren=True)
newObj = mc.polyCBoolOp(
sel,
useCarveBooleans=True,
classification=1,
op=2,
preserveColor=False,
ch=True,
)[0]
newObj1 = mc.polyCBoolOp(
dupl,
useCarveBooleans=True,
classification=1,
op=3,
preserveColor=False,
ch=True,
)[0]
mc.select([newObj, newObj1], r=True)
mc.xform(mc.ls(sl=True),cp=True)
# mc.polyUnite()
class CpHBevelStat:
offsetStr = 'hOffset'
divStr = 'hDivisions'
miterStr = 'hMitering'
def cPhBevelAttrs(nodeString, bevelNodeStr):
offsetStr = CpHBevelStat.offsetStr
divStr = CpHBevelStat.divStr
miterStr = CpHBevelStat.miterStr
if crep.getmayaver().num > 2016 or (crep.getmayaver().num == 2016 and crep.getmayaver().extnum == 2):
if mc.attributeQuery(offsetStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + offsetStr)
if mc.attributeQuery(divStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + divStr)
if mc.attributeQuery(miterStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + miterStr)
mc.addAttr(
nodeString,
ln=offsetStr,
k=True,
at='doubleLinear',
hnv=True,
min=0,
dv=0,
)
mc.addAttr(
nodeString,
ln=divStr,
k=True,
at='long',
hnv=True,
min=0,
dv=1,
)
mc.addAttr(
nodeString,
ln=miterStr,
k=True,
at='enum',
en='Auto=0:Star=2:Round=3',
dv=0,
)
mc.connectAttr(nodeString + '.' + offsetStr, bevelNodeStr + '.offset')
mc.connectAttr(nodeString + '.' + divStr, bevelNodeStr + '.segments')
mc.connectAttr(nodeString + '.' + miterStr, bevelNodeStr + '.mitering')
else:
if mc.attributeQuery(offsetStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + offsetStr)
if mc.attributeQuery(divStr, node=nodeString, ex=True):
mc.deleteAttr(nodeString + '.' + divStr)
mc.addAttr(
nodeString,
ln=offsetStr,
k=True,
at='doubleLinear',
hnv=True,
min=0,
dv=0,
)
mc.addAttr(
nodeString,
ln=divStr,
k=True,
at='long',
hnv=True,
min=0,
dv=1,
)
mc.connectAttr(nodeString + '.' + offsetStr, bevelNodeStr + '.offset')
mc.connectAttr(nodeString + '.' + divStr, bevelNodeStr + '.segments')
def cPhasHBevelHistory(shape):
dummy = om.MSelectionList()
dummy.add(shape)
dagFn = om.MFnDagNode(dummy.getDependNode(0))
dagFn.setObject(dagFn.parent(0))
transfrmStr = dagFn.partialPathName()
if mc.attributeQuery(CpHBevelStat.offsetStr, node=transfrmStr, ex=True):
destPlugs = mc.connectionInfo(
transfrmStr + '.' + CpHBevelStat.offsetStr, dfs=True)
for plugStr in destPlugs:
if mc.nodeType(cPplugNode(plugStr)) == 'polyBevel3':
return True
else:
return False
return False
# creasePlusBool(keepOperands =True)
# creasePlusHBevelCont("polySurface1")
# creasePlusHBevelCont("pCube1")
def creasePlusHBevelCont(nodeString):
crep.global_hBevelCtxStr
offsetStr = CpHBevelStat.offsetStr
divStr = CpHBevelStat.divStr
cur = None
if mc.currentCtx() == crep.global_hBevelCtxStr:
cur = crep.cPhBevelIterIncVal()
else:
cur = crep.cPhBevelIterSetVal(0)
mc.dragAttrContext(crep.global_hBevelCtxStr, e=True, reset=True)
if cur == 0:
mc.dragAttrContext(
crep.global_hBevelCtxStr, e=True, ct=nodeString + '.' + offsetStr)
elif cur == 1:
mc.dragAttrContext(
crep.global_hBevelCtxStr, e=True, ct=nodeString + '.' + divStr)
mc.setToolTo(crep.global_hBevelCtxStr)
@mayaUndoRun
def creasePlusBakeHBL():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSel)
mc.setToolTo('moveSuperContext')
beveliTransforms = []
for shapeStr in sel:
(cpheNode, bevelNode, beveli)= cPisbevelCage(shapeStr)
if cpheNode and bevelNode and beveli:
beveliTrans = mc.listRelatives(beveli, parent=True, noIntermediate=False, typ='transform')[0]
mc.delete(beveliTrans + '.translate', icn=True)
mc.delete(beveliTrans + '.rotate' , icn=True)
mc.delete(beveliTrans + '.scale' , icn=True)
mc.delete(beveli, ch=True)
mc.select(beveli,r=True)
cPcleanAttrs()
beveliTransforms.append(beveliTrans)
try:
mc.delete(shapeStr)
except:
pass
else:
(cpheNode, bevelNode, beveli, beveliCage) = cPhasbevelCage(shapeStr)
if cpheNode and bevelNode and beveli and beveliCage:
beveliTrans = mc.listRelatives(beveli, parent=True, noIntermediate=False, typ='transform')[0]
mc.delete(beveliTrans + '.translate', icn=True)
mc.delete(beveliTrans + '.rotate' , icn=True)
mc.delete(beveliTrans + '.scale' , icn=True)
mc.delete(beveli, ch=True)
mc.select( beveli,r=True)
cPcleanAttrs()
beveliTransforms.append(beveliTrans)
try:
mc.delete(beveliCage)
except:
pass
if len(beveliTransforms) :
mc.select(beveliTransforms, r=True)
else:
mc.select( cl=True)
@mayaUndoRun
def creasePlusHBevel():
sel = om.MGlobal.getActiveSelectionList()
if sel.length() == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSel)
crep.global_hBevelCtxStr
ctxActive = mc.currentCtx() == crep.global_hBevelCtxStr
selIt = om.MItSelectionList(sel)
principalObjIdx = None
transformNodes = []
while not selIt.isDone():
(shape, __, edges, faces) = crep.cPgetShapeAndCoStrings(selIt)
if not shape:
selIt.next()
continue
shapeStr = shape.partialPathName()
(cpheNode, bevelNode, beveli)= cPisbevelCage(shapeStr)
if cpheNode and bevelNode and beveli:
creasePlusHBevelCont(
mc.listRelatives(
beveli,
parent=True,
noIntermediate=False,
typ='transform')[0]
)
return
dagFn = om.MFnDagNode(shape)
dagFn.setObject(dagFn.parent(0))
transfrmStr = dagFn.partialPathName()
transformNodes.append(transfrmStr)
if ctxActive and cPhasHBevelHistory(shapeStr):
creasePlusHBevelCont(transfrmStr)
return
else:
ctxActive = False
edgeStrings = None
if faces:
edgeStrings = crep.cPfaceToHardEdgeStrings(shape, faces)
elif edges:
edgeStrings = crep.cPedgeToStrings(shape, edges)
else:
edgeStrings = crep.cPhardEdgesStrings(shape)
#
if len(edgeStrings) == 0:
selIt.next()
continue
elif principalObjIdx == None:
principalObjIdx = len(transformNodes) - 1
# mc.polyMergeVertex(transfrmStr, d=0.015, am=False)
nname = 'hBevel'
nname = cPdoPolyBevel(edgeStrings, nname)
cPhBevelAttrs(transfrmStr, nname)
selIt.next()
# set selection
mc.select(transformNodes, r=True)
#
if principalObjIdx != None:
creasePlusHBevelCont(transformNodes[principalObjIdx])
else:
raise crepexcept.cPexcept(crep.CpMsg.kNoHardEdges)
def cPplugNode(plugStr):
return plugStr[:plugStr.find('.')]
def cPhasbevelCage(shpStr):
cpheNode = None
bevelNode = None
beveli = None
beveliCage = None
hists = mc.listHistory(shpStr , bf=False, f=False, lf=True)
for n in hists:
if mc.nodeType(n) == 'polyBevel3' and bevelNode == None:
bevelNode = n
elif mc.nodeType(n) == CreasePlusNodes.CpHeIds.kNodeName and cpheNode == None:
cpheNode= n
if cpheNode and bevelNode:
break
if cpheNode and bevelNode:
beveli = shpStr
if cpheNode and bevelNode and beveli:
plugs = mc.connectionInfo(bevelNode + '.inputPolymesh', sfd=True)
if isinstance(plugs, str) and mc.nodeType(cPplugNode(plugs)) == 'mesh':
beveliCage = cPplugNode(plugs)
else:
for plugStr in plugs:
if mc.nodeType(cPplugNode(plugStr)) == 'mesh':
beveliCage = cPplugNode(plugStr)
break
return (cpheNode, bevelNode, beveli, beveliCage)
def cPisbevelCage(cageshpstr):
cpheNode = None
bevelNode = None
beveli = None
plugs = mc.connectionInfo(cageshpstr + ".outMesh", dfs=True)
if isinstance(plugs, str) and mc.nodeType(cPplugNode(plugs)) == CreasePlusNodes.CpHeIds.kNodeName:
cpheNode = cPplugNode(plugs)
else:
for plugStr in plugs:
if mc.nodeType(cPplugNode(plugStr)) == CreasePlusNodes.CpHeIds.kNodeName:
cpheNode = cPplugNode(plugStr)
break
if cpheNode:
hists = mc.listHistory(cpheNode, bf=False, f=True, lf=True)
for n in hists:
if mc.nodeType(n) == 'polyBevel3':
bevelNode = n
break
beveli = hists[-1:][0]
if mc.nodeType(beveli) != 'mesh':
beveli = None
return (cpheNode, bevelNode, beveli)
def creasePlusHBevelLiveCmd():
global global_CP_Nodes_pluginstr
# mel.eval("print(" + global_CP_Nodes_pluginstr + " ;")
if not mc.pluginInfo(global_CP_Nodes_pluginstr, q=True, loaded=True):
try:
mc.loadPlugin(cPmainDir() + global_CP_Nodes_pluginstr + '.py')
except:
raise crepexcept.cPexcept(crep.CpMsg.kcPnodePluginNotLoaded)
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) != 1:
raise crepexcept.cPexcept(crep.CpMsg.kSelOneMesh)
sel = sel[0]
mc.select(sel, r=True)
(cpheNode, bevelNode, beveli)= cPisbevelCage(sel)
if cpheNode and bevelNode and beveli:
creasePlusHBevelCont(
mc.listRelatives(
beveli,
parent=True,
noIntermediate=False,
typ='transform')[0]
)
return
mc.xform(sel,cp=True)
creasePlusHBevel()
srcPlugs = mc.connectionInfo(sel + '.inMesh', sfd=True)
bevelNode = None
if isinstance(srcPlugs, str) and mc.nodeType(
cPplugNode(srcPlugs)) == 'polyBevel3':
bevelNode = cPplugNode(srcPlugs)
else:
for plugStr in srcPlugs:
if mc.nodeType(cPplugNode(plugStr)) == 'polyBevel3':
bevelNode = cPplugNode(plugStr)
break
srcPlugs = mc.connectionInfo(bevelNode + '.inputPolymesh', sfd=True)
sourceMesh = None
if isinstance(srcPlugs, str):
plugStr = srcPlugs
if mc.nodeType(cPplugNode(srcPlugs)) == 'mesh':
sourceMesh = cPplugNode(srcPlugs)
else:
plugStr = srcPlugs[0]
if mc.nodeType(cPplugNode(plugStr)) == 'mesh':
sourceMesh = cPplugNode(plugStr)
if not sourceMesh:
sourceMesh = mc.createNode('mesh')
mc.disconnectAttr(plugStr, bevelNode + '.inputPolymesh')
mc.connectAttr(plugStr, sourceMesh + '.inMesh')
mc.connectAttr(sourceMesh + '.outMesh', bevelNode + '.inputPolymesh')
sourcetrans = mc.listRelatives(
sourceMesh,
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
seltrans = mc.listRelatives(
sel,
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
mc.xform(sourcetrans,cp=True)
mc.connectAttr(seltrans + '.translate', sourcetrans + '.translate')
mc.connectAttr(seltrans + '.rotate', sourcetrans + '.rotate')
mc.connectAttr(seltrans + '.scale', sourcetrans + '.scale')
mc.disconnectAttr(seltrans + '.translate', sourcetrans + '.translate')
mc.disconnectAttr(seltrans + '.rotate', sourcetrans + '.rotate')
mc.disconnectAttr(seltrans + '.scale', sourcetrans + '.scale')
else:
mc.setAttr(sourceMesh + '.visibility', True)
mc.setAttr(sourceMesh + '.hiddenInOutliner', False)
mc.setAttr(sourceMesh + '.intermediateObject', False)
newtrans = mc.createNode('transform')
seltrans = mc.listRelatives(
sel,
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
mc.connectAttr(seltrans + '.translate', newtrans + '.translate')
mc.connectAttr(seltrans + '.rotate', newtrans + '.rotate')
mc.connectAttr(seltrans + '.scale', newtrans + '.scale')
mc.disconnectAttr(seltrans + '.translate', newtrans + '.translate')
mc.disconnectAttr(seltrans + '.rotate', newtrans + '.rotate')
mc.disconnectAttr(seltrans + '.scale', newtrans + '.scale')
mc.parent(sourceMesh, newtrans, shape=True, relative=True)
mc.setAttr(sourceMesh + '.overrideEnabled', True)
mc.setAttr(sourceMesh + '.overrideShading', False)
mc.setAttr(sourceMesh + '.overrideColor', 5)
idsnode = mc.createNode(CreasePlusNodes.CpHeIds.kNodeName)
mc.connectAttr(sourceMesh + '.outMesh', idsnode + '.i')
mc.connectAttr(idsnode + '.cl', bevelNode + '.inputComponents')
sourcetrans = mc.listRelatives(
sourceMesh,
parent=True,
fullPath=True,
noIntermediate=False,
typ='transform')[0]
seltrans = mc.listRelatives(
sel, parent=True, fullPath=True, noIntermediate=False,
typ='transform')[0]
mc.connectAttr(sourcetrans + '.translate', seltrans + '.translate')
mc.connectAttr(sourcetrans + '.rotate', seltrans + '.rotate')
mc.connectAttr(sourcetrans + '.scale', seltrans + '.scale')
mc.setAttr(seltrans + '.' + CpHBevelStat.offsetStr, 0.05)
mc.select(sourcetrans, r=True)
@mayaUndoRun
def creasePlusHBevelLive():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
for i in range(len(sel)):
mc.select(sel[i],r=True)
creasePlusHBevelLiveCmd()
if i != len(sel)-1:
mc.setToolTo("moveSuperContext")
def cPautoCenterpiv():
if len(mc.ls(sl=True)):
mc.xform(cp=True)
@mayaUndoRun
def creasePlusDrawCurve():
mc.setToolTo(crep.global_cPcurveCtxStr)
mc.scriptJob(cu=True, ro=True, e=['PostToolChanged', cPautoCenterpiv])
@mayaUndoRun
def creasePlusAttachCurve():
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelLeastTwoCurve)
newCurve = mc.attachCurve(
selCurve,
ch=False,
rpo=True,
kmk=True,
m=0,
bb=0.5,
bki=False,
p=0.1,
)[0]
# mc.delete(newCurve, ch=True)
mc.select(newCurve, r=True)
@mayaUndoRun
def creasePlusCloseCurve():
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelCurve)
for shapeStr in selCurve:
curveForm = mc.getAttr(shapeStr + '.form')
if mc.getAttr(shapeStr + '.degree') == 3:
# mc.closeCurve( rpo=True)
if curveForm == 0:
mc.closeCurve(
shapeStr,
ch=False,
ps=0,
rpo=True,
bb=0.5,
bki=True,
p=0.1,
)
else:
if curveForm == 0:
mc.closeCurve(
shapeStr,
ch=False,
ps=1,
rpo=True,
bb=0.5,
bki=False,
p=0.1,
)
mc.select(
mc.listRelatives(
selCurve, parent=True, fullPath=True, typ='transform'),
r=True)
@mayaUndoRun
def creasePlusCurveIntersect():
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) < 2:
raise crepexcept.cPexcept(crep.CpMsg.kSelLeastTwoCurve)
mel.eval('cutCurvePreset(0,1,0.01,6,0,1,0,1,2);')
mc.select(cl=True)
@mayaUndoRun
def creasePlusCurveDoubleCvs():
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelCurve)
for shapeStr in selCurve:
dummy = om.MSelectionList()
dummy.add(shapeStr)
curveFn = om.MFnNurbsCurve(dummy.getDependNode(0))
deg = curveFn.degree
# mc.select(mc.listRelatives(shapeStr,parent=True,fullPath=True, typ="transform")[0], r=True)
mel.eval('selectCurveCV all;')
# newNumCv = (len(mc.ls(sl=True ,fl=True)) * 2)
mc.rebuildCurve(
shapeStr,
ch=True,
rpo=True,
rt=0,
end=1,
kr=2,
kcp=False,
kep=True,
kt=False,
s=curveFn.numSpans * 2,
d=deg,
tol=0.01,
)
mc.select(mc.listRelatives(selCurve, parent=True, fullPath=True), r=True)
def cPsphereSegIntersect(
q,
v,
p,
r,
):
a = (v - q).length()**2
b = 2 * ((v - q) * (q - p))
c = p.length()**2 + q.length()**2 - 2 * (p * q) - r**2
sqr = b**2 - 4 * a * c
if sqr < 0 or a == 0:
return None
s = (-b + math.sqrt(sqr)) / (2 * a)
t = None
if sqr > 0:
t = (-b - math.sqrt(sqr)) / (2 * a)
# intp = q + (s*(v-q))
return (1 * s, 1 * t)
def cPsegInsideSphere(
q,
v,
p,
r,
):
a = (q - p).length()
b = (v - p).length()
if a < r and b < r:
return True
else:
return False
# do not use
def creasePlusCurveRebuild(numSeg, numCv=None):
if numCv != None:
numSeg = numCv - 1
if numSeg < 1:
raise crepexcept.cPexcept(crep.CpMsg.kInvalidFuncArgs)
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelCurve)
dummy = om.MSelectionList()
dummy.add(selCurve[0])
curveFn = om.MFnNurbsCurve(dummy.getDependNode(0))
polyline = curveFn.cvPositions()
polyline = [om.MVector(pt) for pt in polyline]
pllen = float(0)
for i in range(len(polyline) - 1):
p0 = polyline[i]
p1 = polyline[i + 1]
pllen += (p1 - p0).length()
param = pllen / float(numSeg)
# numCv = numSeg+1
i = 0
newPolyline = []
lastPt = polyline[i]
newPolyline.append(1 * lastPt)
while len(newPolyline) < numSeg and i < len(polyline) - 1:
while len(newPolyline) < numSeg and i < len(polyline) - 1:
p0 = polyline[i]
p1 = polyline[i + 1]
if cPsegInsideSphere(p0, p1, lastPt, 1 * param):
i += 1
continue
s = cPsphereSegIntersect(p0, p1, lastPt, 1 * param)[0]
# respt = p0 + s * (p1-p0)
if s == None:
i += 1
continue
if 0 <= s <= 1:
lastPt = p0 + s * (p1 - p0)
newPolyline.append(1 * lastPt)
break
i += 1
newPolyline.append(1 * polyline[len(polyline) - 1])
for pt in newPolyline:
mc.spaceLocator(p=[pt.x, pt.y, pt.z])
# cPhasCurveBevelHistory("curveShape4")
def cPhasCurveBevelHistory(shape):
# shape = "curveShape2"
srcPlugs = mc.connectionInfo(shape + '.create', sfd=True)
if isinstance(srcPlugs, str) and mc.nodeType(
cPplugNode(srcPlugs)) == CreasePlusNodes.CpCurveBevel.kNodeName:
return cPplugNode(srcPlugs)
else:
for plugStr in srcPlugs:
if mc.nodeType(cPplugNode(
plugStr)) == CreasePlusNodes.CpCurveBevel.kNodeName:
return cPplugNode(plugStr)
return None
def creasePlusCurveBevelCont(nodeString):
# crep.global_cPcurveBevelCtxStr
cur = None
if mc.currentCtx() == crep.global_cPcurveBevelCtxStr:
cur = crep.cPcurveBevelIterIncVal()
else:
cur = crep.cPcurveBevelIterSetVal(0)
mc.dragAttrContext(crep.global_cPcurveBevelCtxStr, e=True, reset=True)
if cur == 0:
mc.dragAttrContext(
crep.global_cPcurveBevelCtxStr, e=True, ct=nodeString + '.offset')
elif cur == 1:
mc.dragAttrContext(
crep.global_cPcurveBevelCtxStr,
e=True,
ct=nodeString + '.segments')
mc.setToolTo(crep.global_cPcurveBevelCtxStr)
@mayaUndoRun
def creasePlusCurveBevelCmd():
global global_CP_Nodes_pluginstr
if not mc.pluginInfo(global_CP_Nodes_pluginstr, q=True, loaded=True):
try:
mc.loadPlugin(cPmainDir() + global_CP_Nodes_pluginstr + '.py')
except:
raise crepexcept.cPexcept(crep.CpMsg.kcPnodePluginNotLoaded)
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) != 1:
raise crepexcept.cPexcept(crep.CpMsg.kWorksForOne)
selCurve = selCurve[0]
ctxActive = mc.currentCtx() == crep.global_cPcurveBevelCtxStr
node = None
try:
node = cPhasCurveBevelHistory(selCurve)
except:
node = None
if ctxActive and node != None:
creasePlusCurveBevelCont(node)
return
selCvs = mc.filterExpand(mc.ls(sl=True), sm=28, ex=True)
if selCvs == None:
raise crepexcept.cPexcept(crep.CpMsg.kSelCurveCv)
if len(selCvs) == 0:
if node != None:
creasePlusCurveBevelCont(node)
return
else:
raise crepexcept.cPexcept(crep.CpMsg.kSelCurveCv)
node = mc.createNode(CreasePlusNodes.CpCurveBevel.kNodeName)
newcurveShape = mc.createNode('nurbsCurve')
mc.setAttr(
node + '.cvs',
len(selCvs),
type='componentList',
*[curcv[curcv.find('.') + 1:] for curcv in selCvs])
mc.connectAttr(selCurve + '.worldSpace[0]', node + '.inc')
mc.connectAttr(node + '.out', newcurveShape + '.create')
#
creasePlusCurveBevelCont(node)
@mayaUndoRun
def creasePlusCurveToPolyCmd():
global global_CP_Nodes_pluginstr
if not mc.pluginInfo(global_CP_Nodes_pluginstr, q=True, loaded=True):
try:
mc.loadPlugin(cPmainDir() + global_CP_Nodes_pluginstr + '.py')
except:
raise crepexcept.cPexcept(crep.CpMsg.kcPnodePluginNotLoaded)
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelCurve)
for shapeStr in selCurve:
node = mc.createNode(CreasePlusNodes.CpCurveToPoly.kNodeName)
npoly = mc.createNode('mesh')
mc.connectAttr(shapeStr + '.worldSpace[0]', node + '.inc')
mc.connectAttr(node + '.out', npoly + '.inMesh')
mc.sets(npoly, e=1, forceElement='initialShadingGroup')
mc.select(
mc.listRelatives(npoly, parent=True, fullPath=True, typ='transform'),
r=True)
@mayaUndoRun
def creasePlusCurveSlice():
selCurve = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
selMesh = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(selCurve) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelCurve)
if len(selMesh) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelMesh)
dplane = crep.cPcameraDominantPlane()
curveDupl = mc.listRelatives(
mc.duplicate(selCurve[0], renameChildren=True),
children=True,
fullPath=True,
typ='nurbsCurve')[0]
dagFn = om.MFnDagNode()
dummy = om.MSelectionList()
dummy.add(curveDupl)
dagFn.setObject(dummy.getDependNode(0))
curveBb = dagFn.boundingBox
curvemin = curveBb.min
curvemax = curveBb.max
# print((curvemin)
curveWhd = (abs(curvemax.x - curvemin.x), abs(curvemax.y - curvemin.y),
abs(curvemax.z - curvemin.z))
curveMaxOffset = 0
if curveMaxOffset < curveWhd[0]:
curveMaxOffset = curveWhd[0]
if curveMaxOffset < curveWhd[1]:
curveMaxOffset = curveWhd[1]
if curveMaxOffset < curveWhd[2]:
curveMaxOffset = curveWhd[2]
curveDepth = 0
i = 1
finalSel = []
for shapeStr in selMesh:
# shapeStr = "pCubeShape1"
dummy.add(shapeStr)
dagFn.setObject(dummy.getDependNode(i))
bb = dagFn.boundingBox
bbmin = bb.min
bbmax = bb.max
bbWhd = (abs(bbmax.x - bbmin.x), abs(bbmax.y - bbmin.y),
abs(bbmax.z - bbmin.z))
bbMaxOffset = 0
if bbMaxOffset < bbWhd[0]:
bbMaxOffset = bbWhd[0]
if bbMaxOffset < bbWhd[1]:
bbMaxOffset = bbWhd[1]
if bbMaxOffset < bbWhd[2]:
bbMaxOffset = bbWhd[2]
curveDepth = bbMaxOffset
curveDepth += curveMaxOffset + curveDepth * 0.1
dirIdx = None
extrudeVec = None
axisCenter = None
if dplane == 'x':
dirIdx = 0
extrudeVec = [1, 0, 0]
axisCenter = bb.center.x
elif dplane == 'y':
dirIdx = 1
extrudeVec = [0, 1, 0]
axisCenter = bb.center.y
elif dplane == 'z':
dirIdx = 2
extrudeVec = [0, 0, 1]
axisCenter = bb.center.z
#
mel.eval(
'nurbsToPolygonsPref -f 3 -ucr 0 -uch 0 -pt 0 -m 0 -mt 0.1 -mrt 0;'
)
mc.optionVar(iv=('extrudeDirectionType', dirIdx))
mc.optionVar(fv=('extrudeLength', curveDepth))
nsurface = mc.extrude(
curveDupl,
ch=False,
rn=False,
po=1,
et=0,
upn=0,
direction=extrudeVec,
length=curveDepth,
ro=0,
sc=1,
dl=1,
)[0]
if mc.getAttr(curveDupl + '.form') == 1:
mel.eval('polyCloseBorder -ch 0 ' + nsurface)
mc.xform(nsurface, cp=True)
mc.delete(nsurface, ch=True)
if dplane == 'x':
mel.eval('move -rpr -moveX ' + str(axisCenter) + ';')
elif dplane == 'y':
mel.eval('move -rpr -moveY ' + str(axisCenter) + ';')
elif dplane == 'z':
mel.eval('move -rpr -moveZ ' + str(axisCenter) + ';')
mc.select([shapeStr, nsurface], r=True)
creasePlusPanelBool()
finalSel += mc.ls(sl=True)
i += 1
# creasePlusCurveSlice()
mc.delete(
mc.listRelatives(
curveDupl, parent=True, fullPath=True, typ='transform'))
# mc.delete(finalSel, ch=True) # delete final sel history
mc.select(finalSel, r=True)
def cPdoUnfold(shapeStr):
if crep.getmayaver().num > 2016:
mel.eval(
'u3dUnfold -ite 10 -p 1 -bi 1 -tf 1 -ms 1024 -rs 0 ' + shapeStr + ';')
else:
mel.eval(
'Unfold3D -u -ite 10 -p 1 -bi 1 -tf 1 -ms 1024 -rs 0 ' + shapeStr + ';')
@mayaUndoRun
def creasePlusMakeUv():
if not mc.pluginInfo('Unfold3D', q=True, loaded=True):
raise crepexcept.cPexcept("\'Unfold3D\' plugin must be loaded.\n")
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
for shapeStr in sel:
faces = mc.polyListComponentConversion(shapeStr, tf=True)
mc.polyProjection(
faces,
ch=True,
t='planar',
ibd=True,
kir=True,
md='c',
)
edgeStrings = crep.cPhardEdgesStrings(shapeStr)
if len(edgeStrings) == 0:
raise crepexcept.cPexcept(
shapeStr + ' has no hard edges, UV generation failed.\n')
mc.select(edgeStrings, r=True)
mc.polyMapCut(ch=True)
cPdoUnfold(shapeStr)
mc.select(
mc.listRelatives(parent=True, fullPath=True, typ='transform'), r=True)
if len(mc.ls(sl=True)):
print('DONE!')
# SUBD TOOLS
def cPapplyCrease(sel, val, clearcrease=False):
if clearcrease:
mc.polyCrease(sel, op=2)
mc.polyCrease(sel, v=val)
def cPdisplayNotSmooth(shapeStr):
mc.setAttr(shapeStr + '.displaySmoothMesh', 0)
def cPdisplaySmooth(shapeStr):
mc.setAttr(shapeStr + '.displaySmoothMesh', 2)
def cPsmoothGroupsSubDAttrs(shapeStr, nodestr1, nodestr2):
# shapeStr = "pCubeShape1"
transfrmStr = mc.listRelatives(
shapeStr, parent=True, fullPath=True, typ='transform')[0]
mc.addAttr(
transfrmStr,
k=True,
ln='baseDiv',
at='short',
dv=2,
hnv=True,
min=0,
softMaxValue=5,
)
mc.addAttr(
transfrmStr,
k=True,
ln='divisions',
at='short',
dv=1,
hnv=True,
min=0,
softMaxValue=5,
)
mc.connectAttr(transfrmStr + '.baseDiv', nodestr1 + '.divisions')
mc.connectAttr(transfrmStr + '.divisions', nodestr2 + '.divisions')
def cPshowCreaseEd():
mel.eval(
'python ("from maya.app.general import creaseSetEditor; creaseSetEditor.showCreaseSetEditor()");'
)
@mayaUndoRun
def creasePlusNocrease():
objsel = mc.filterExpand(mc.ls(sl=True), ex=True, sm=12)
if objsel != None:
mc.polyCrease(op=2)
else:
mc.polyCrease(mc.ls(sl=True), op=1)
@mayaUndoRun
def creasePlusSmoothGroupsSubD():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
mel.eval('LowQualityDisplay;')
for shapeStr in sel:
edgeStrings = crep.cPhardEdgesStrings(shapeStr)
if len(edgeStrings) == 0:
continue
mc.polyCrease(shapeStr, op=2)
mc.polyCrease(edgeStrings, v=5.0)
nnode1 = mc.polySmooth(shapeStr)[0]
mc.polyCrease(shapeStr, op=2)
nnode2 = mc.polySmooth(shapeStr)[0]
cPsmoothGroupsSubDAttrs(shapeStr, nnode1, nnode2)
mc.select(
mc.listRelatives(sel, parent=True, fullPath=True, typ='transform'),
r=True)
@mayaUndoRun
def creasePlusSubDpreset():
osel = mc.ls(sl=True)
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
mc.polyOptions(dce=False)
mel.eval('LowQualityDisplay;')
for shapeStr in sel:
smtlvl = cPsetCreaseSmoothLevel(shapeStr)
mc.setAttr(shapeStr + '.smoothLevel', 2)
smoothNode = mc.polySmooth(shapeStr)[0]
mc.setAttr(smoothNode + '.divisions', smtlvl)
mc.select(osel, r=True)
def cPupdateSmoothLvl():
edgesel = mc.filterExpand(mc.ls(sl=True), ex=True, sm=32)
if not edgesel:
raise crepexcept.cPexcept(crep.CpMsg.kNoSelEdge)
# mc.polyOptions(dce = False)
shapeStr = mc.listRelatives(
edgesel[0], parent=True, fullPath=True, typ='mesh')[0]
mc.setAttr(shapeStr + '.osdSmoothTriangles', 1)
cPsetCreaseSmoothLevel(shapeStr)
def cPsetCreaseSmoothLevel(shapeStr):
# shapeStr = "pCube1"
maxv = -1.0
vals = mc.polyCrease(shapeStr + '.e[*]', q=True, v=True)
for cur in vals:
if maxv < cur:
maxv = cur
# newlvl = math.ceil(maxv)
newlvl = float(int(maxv) + 1)
if newlvl < 1:
newlvl = 1
mc.setAttr(shapeStr + '.smoothLevel', newlvl)
# mc.setAttr(shapeStr + ".smoothLevel", newlvl + 1)
return newlvl
@mayaUndoRun
def creasePlusWeigthTool():
objsel = mc.filterExpand(mc.ls(sl=True), ex=True, sm=12)
edgesel = mc.filterExpand(mc.ls(sl=True), ex=True, sm=32)
if objsel == None and edgesel == None:
raise crepexcept.cPexcept(crep.CpMsg.kSelEdgeOrOneMesh)
if objsel != None:
edgesel = crep.cPhardEdgesStrings(
mc.listRelatives(
objsel[0], children=True, fullPath=True, typ='mesh')[0])
if len(edgesel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoHardEdges)
mc.polyOptions(dce=False)
shapeStr = mc.listRelatives(edgesel[0], parent=True, fullPath=True)[0]
mc.setAttr(shapeStr + '.osdSmoothTriangles', 1)
cPdisplaySmooth(shapeStr)
crep.global_cPcreaseCtxStr
mc.setToolTo(crep.global_cPcreaseCtxStr)
mc.scriptJob(cu=True, ro=True, e=['PostToolChanged', cPupdateSmoothLvl])
@mayaUndoRun
def creasePlusPhysicalCrease():
# sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
# if len(sel) == 0:
# raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
# mc.select(sel, r=True)
if mc.currentCtx() == crep.global_hBevelCtxStr:
creasePlusHBevel()
return None
creasePlusHBevel()
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
return None
for shapestr in sel:
transfrmStr = mc.listRelatives(shapestr, parent=True, type="transform")[0]
bevelNode = None
if mc.attributeQuery(CpHBevelStat.offsetStr, node=transfrmStr, ex=True):
destPlugs = mc.connectionInfo(
transfrmStr + '.' + CpHBevelStat.offsetStr, dfs=True)
for plugStr in destPlugs:
if mc.nodeType(cPplugNode(plugStr)) == 'polyBevel3':
bevelNode = cPplugNode(plugStr)
break
if bevelNode:
nname = 'pCrease'
nname = mc.rename(bevelNode, nname)
bevelNode = nname
if crep.getmayaver().num > 2016 or (crep.getmayaver().num == 2016 and crep.getmayaver().extnum == 2):
mc.setAttr(bevelNode + ".chamfer" , False)
else:
mc.setAttr(bevelNode + ".segments", 2)
else:
pass
@mayaUndoRun
def creasePlusCreasePreset(presetnum):
# presetnum == 1, 2, 3
sel = om.MGlobal.getActiveSelectionList()
if sel.length() == 0:
raise crepexcept.cPexcept(crep.CpMsg.kNoSel)
selIt = om.MItSelectionList(sel)
principalObjIdx = None
transformNodes = []
while not selIt.isDone():
(shape, __, edges, faces) = crep.cPgetShapeAndCoStrings(selIt)
if not shape:
selIt.next()
continue
shapeStr = shape.partialPathName()
dagFn = om.MFnDagNode(shape)
dagFn.setObject(dagFn.parent(0))
transfrmStr = dagFn.partialPathName()
transformNodes.append(transfrmStr)
edgeStrings = None
if faces:
edgeStrings = crep.cPfaceToHardEdgeStrings(shape, faces)
elif edges:
edgeStrings = crep.cPedgeToStrings(shape, edges)
else:
edgeStrings = crep.cPhardEdgesStrings(shape)
#
if len(edgeStrings) == 0:
selIt.next()
continue
elif principalObjIdx == None:
principalObjIdx = len(transformNodes) - 1
resetCrease = not(faces or edges)
if presetnum == 1:
cPapplyCrease(edgeStrings, 2.0, resetCrease)
cPsetCreaseSmoothLevel(shapeStr)
elif presetnum == 2:
cPapplyCrease(edgeStrings, 3.0, resetCrease)
cPsetCreaseSmoothLevel(shapeStr)
elif presetnum == 3:
cPapplyCrease(edgeStrings, 4.0, resetCrease)
cPsetCreaseSmoothLevel(shapeStr)
elif presetnum == 0:
cPapplyCrease(edgeStrings, 0.0, resetCrease)
cPsetCreaseSmoothLevel(shapeStr)
else:
raise crepexcept.cPexcept(crep.CpMsg.kInvalidFuncArgs)
cPdisplaySmooth(shapeStr)
selIt.next()
# set selection
mc.select(transformNodes, r=True)
#
if principalObjIdx == None:
raise crepexcept.cPexcept(crep.CpMsg.kNoHardEdges)
else:
mc.polyOptions(dce=False)
###############
@mayaUndoRun
def cPcleanAttrs():
sel = mel.eval(
'listRelatives -p -f `eval("listRelatives -p -f `polyListComponentConversion -tv`")`'
)
for trans in sel:
cusattr = mc.listAttr(trans, ud=True)
if cusattr != None:
for a in cusattr:
mel.eval('deleteAttr -at ' + a + ' ' + trans + ' ;')
def creasePlusLastCtx():
meshsel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
curvesel = crep.cPgetShapeStringsFromSel(om.MFn.kNurbsCurve)
if len(meshsel):
shapeStr = meshsel[0]
trnsfrm = mc.listRelatives(
meshsel[0], parent=True, fullPath=True, typ='transform')[0]
if cPhasHBevelHistory(shapeStr):
creasePlusHBevelCont(trnsfrm)
elif cPhasBoolHistory(shapeStr):
creasePlusBoolOpCont(trnsfrm)
elif cPhasMirrorHistory(shapeStr):
creasePlusMirrorCont(trnsfrm)
elif len(curvesel):
shapeStr = curvesel[0]
trnsfrm = mc.listRelatives(
curvesel[0], parent=True, fullPath=True, typ='transform')[0]
curvebvlnode = cPhasCurveBevelHistory(shapeStr)
if curvebvlnode != None:
creasePlusCurveBevelCont(curvebvlnode)
def cPcopyHBevelAttrs(srcnode, targetnode):
offsetStr = CpHBevelStat.offsetStr
divStr = CpHBevelStat.divStr
miterStr = CpHBevelStat.miterStr
a1 = mc.getAttr(srcnode + '.' + offsetStr)
a2 = mc.getAttr(srcnode + '.' + divStr)
a3 = mc.getAttr(srcnode + '.' + miterStr)
mc.setAttr(targetnode + '.' + offsetStr, a1)
mc.setAttr(targetnode + '.' + divStr, a2)
mc.setAttr(targetnode + '.' + miterStr, a3)
@mayaUndoRun
def creasePlusTransferHBevel():
sel = crep.cPgetShapeStringsFromSel(om.MFn.kMesh)
if len(sel) == 0:
raise crepexcept.cPexcept(crep.CpMsg.kSelMesh)
if not cPhasHBevelHistory(sel[0]):
raise crepexcept.cPexcept('no Hbevel history found on first object')
seltrans = mc.listRelatives(
sel[0], parent=True, fullPath=True, typ='transform')[0]
for shapeStr in sel[1:]:
if cPhasHBevelHistory(shapeStr):
cPcopyHBevelAttrs(seltrans,
mc.listRelatives(
shapeStr,
parent=True,
fullPath=True,
typ='transform')[0])
###############
def main():
return None
if __name__ == '__main__':
main()