And this is my script, fixSelfIntersectABC, for auto polyAverageVertex on alembic cache. I'm just wondering how I can use this on a coupled scene. This script is used by importing a bone and muscle alembic cache that has self intersections into an empty scene, grouping all the objects into one "import" group, selecting the group, setting the frame range, and letting it run. Then, you select the visible nodes from the first "import" group and the "splicerGrp" that now has no self intersections and export to a new ABC that you use in layered.
import maya.cmds as cmds
import maya.mel as mel
from datetime import datetime
def preProcessSelfIntersectingMeshes(startFrame=-5, endFrame=0):
sel = cmds.ls(sl=1)
selfIntersectingMeshList = []
for i in range(startFrame, endFrame + 1):
cmds.currentTime(i)
cmds.select(sel)
mel.eval('ZivaSelectSelfIntersections;')
zivaIntersectPtSel = cmds.ls(sl=1)
for j in zivaIntersectPtSel:
myMeshName = j.split('.', 1)[0]
selfIntersectingMeshList.append(myMeshName)
selfIntersectingMeshList = list(set(selfIntersectingMeshList))
return selfIntersectingMeshList
def list_contains(a, b):
c = []
for x in a:
for y in b:
if x == y:
c.append(x)
continue
return c
def fixSelfIntersectABC(startFrame=-5, endFrame=0):
startTime = datetime.now()
alembicGroupedNode = cmds.ls(sl=1)[0]
allFrameSplitsGrp = cmds.group(n=alembicGroupedNode + '_frameSplitterGrp', em=1, w=1)
allSplicersGrp = cmds.group(n=alembicGroupedNode + '_splicerGrp', em=1, w=1)
allABCMeshes = []
cmds.select(cl=1)
for og in cmds.listRelatives(alembicGroupedNode, ad=1, typ='transform'):
allABCMeshes.append(og)
for og in allABCMeshes:
cmds.select(og, add=1)
myPreprocessedMeshList = preProcessSelfIntersectingMeshes(startFrame, endFrame)
taskList = list_contains(myPreprocessedMeshList, allABCMeshes)
print(taskList)
cmds.select(cl=1)
for og in taskList:
ogSplicer = cmds.duplicate(og, n=og + '_splicer')[0]
cmds.parent(ogSplicer, allSplicersGrp)
cmds.select(ogSplicer)
mel.eval('UnlockNormals;')
cmds.delete(ch=1)
mySplitGrp = cmds.group(em=1, n=og + "_splitGrp")
cmds.parent(mySplitGrp, allFrameSplitsGrp)
blendShapeList = []
blendShapeDict = {}
for i in range(startFrame, endFrame + 1):
cmds.currentTime(i)
print('FRAME = ' + str(cmds.currentTime(q=1)))
cmds.select(og)
dupeName = og + '_frame_' + str(i)
myDupe = cmds.duplicate(n=dupeName)[0]
blendShapeList.append(dupeName)
# myDupe = cmds.duplicate(n=og + '_frame_' + str(i))
cmds.parent(myDupe, mySplitGrp)
cmds.delete(og) ###################
cmds.select(cl=1)
for toBlend in cmds.listRelatives(mySplitGrp, ad=1, typ='transform'):
lenName = len(toBlend)
lastSuffix = toBlend[lenName - 3:]
if lastSuffix != 'Grp':
cmds.select(toBlend, add=1)
print(toBlend)
cmds.select(ogSplicer, add=1)
ogSplicerBlendShape = cmds.blendShape(n=ogSplicer + '_blendShape', origin='world')[0]
cmds.currentTime(startFrame)
#########################
for i in blendShapeList:
afterFrame = i.split('frame', 1)[1]
getFrame = "".join(c for c in afterFrame if c.isdecimal())
posOrNeg = 'pos'
try:
afterFrame.split('_-', 1)[1]
posOrNeg = 'neg'
except:
pass
usableFrame = 0
if posOrNeg == 'pos':
usableFrame = getFrame
else:
usableFrame = ('-' + str(getFrame))
usableFrameToInt = int(usableFrame)
blendShapeDict[usableFrameToInt] = i
#set all to 0
for i in range(startFrame, endFrame + 1):
cmds.currentTime(i)
for key, value in blendShapeDict.items():
startFrameAdjust = 0
if startFrame < 0:
startFrameAdjust = abs(startFrame)
elif startFrame > 0:
startFrameAdjust = -startFrame
# usableIter = i + startFrameAdjust
usableIter = key + startFrameAdjust
if i == key:
cmds.blendShape(ogSplicerBlendShape, e=1, w=(usableIter, 1.0))
cmds.setKeyframe(ogSplicerBlendShape + '.w[' + str(usableIter) + ']')
else:
cmds.blendShape(ogSplicerBlendShape, e=1, w=(usableIter, 0.0))
cmds.setKeyframe(ogSplicerBlendShape + '.w[' + str(usableIter) + ']')
#auto split
for toBlend in cmds.listRelatives(mySplitGrp, ad=1, typ='transform'):
lenName = len(toBlend)
lastSuffix = toBlend[lenName - 3:]
if lastSuffix != 'Grp':
cmds.select(toBlend)
# print(toBlend)
autoAverageVerts()
cmds.hide(allFrameSplitsGrp)
cmds.currentTime(startFrame)
print('TIME TO COMPLETE = ' + str(datetime.now() - startTime))
def autoAverageVerts(sel='None', iterCt=0, iterLimit=100):
if sel == 'None':
sel = cmds.ls(sl=1)
mel.eval('ZivaSelectSelfIntersections;')
mel.eval('ConvertSelectionToVertices')
selVerts = cmds.ls(sl=1)
lenSelVerts = len(selVerts)
if (lenSelVerts > 0):
if (iterCt < iterLimit):
cmds.polyAverageVertex(selVerts, i=1, ch=0)
iterCt += 1
print('iterCt = ' + str(iterCt))
autoAverageVerts(sel[0], iterCt)
else:
print(sel[0] + ' TOO MANY self intersections even after iterLimit : ' + str(iterLimit))
else:
print(sel[0] + ' CLEAN self intersections, took X iterations : ' + str(iterCt))
return
fixSelfIntersectABC(-5, 35)