#StemCache
#==========
#Base class for particle data gathering
import math
#============================================
class StemCache( ):
def __init__( self ):
self.data = []
self.dataStr = ''
self.dataPath = ''
def reset(self, pnum):
self.data = []
self.dataStr = ''
print "I am resetting"
print "self.data is %s" % self.data
print "self.dataStr is '%s'" % self.dataStr
self.data = ([1] * pnum)
newLength = len(self.data)
print "the new length of self.data is %s" % newLength
def addIndiv(self, particleNum, pos):
if self.data[particleNum] == 1:
self.data[particleNum] = []
self.data[particleNum].append(pos[0])
self.data[particleNum].append(pos[1])
self.data[particleNum].append(pos[2])
def getIndiv(self, particleNum):
return self.data[particleNum]
def length(self):
return len(self.data)
def setDataPath(self, fullpath):
self.dataPath = fullpath
print("set path = %s" % self.dataPath)
def writeToFile(self):
print("write path = %s" % self.dataPath)
fileid = open(self.dataPath, 'w')
fileid.write(self.dataStr)
fileid.close()
return self.dataPath
#StemCurveWriter
#=================
#gathers, parses, and writes data to MEL file to generate
#curves and extrusions based on particle data
import StemCache as SC
import maya.cmds as mc
import ProjectUtilities as PU
#============================================
class StemCurveWriter(SC.StemCache):
def updateIndivCache(self, tnode):
pnum = mc.particle(tnode, q = True, count = True)
for n in range(pnum):
pname = tnode + ".pt[%s]" % n
pos = mc.getParticleAttr(pname,at = 'position')
self.addIndiv(n, pos)
def writeStemCurves(self):
numPart = len(self.data)
path = "/stuhome/maya/projects/vsfx705/data/particleDistance.txt"
input = open(path, 'r')
distances = input.readlines()
input.close()
melcmd = ''
melcmd += 'circle -c 0 0 0 -nr 0 1 0 -sw 360 -r 0.1 -ch 1;\n'
for n in range(numPart):
particle = self.getIndiv(n)
melcmd += 'curve -d 1 '
numFrames = len(particle)/3
for i in range(numFrames):
melcmd += '-p %1.3f %1.3f %1.3f ' % (particle[i*3],particle[(i*3)+1],particle[(i*3)+2])
melcmd += ';\n'
melcmd += 'setAttr "makeNurbCircle1.radius" %s; \n' % distances[n]
melcmd += 'extrude -ch false -po 0 -et 2 -ucp 1 -fpt 1 -upn 1 -rsp 1 "nurbsCircle1" "curve%s";\n\n' % (n+1)
self.dataStr = melcmd
return melcmd
#============================================
pCache = StemCurveWriter()
projUtils = PU.ProjectUtilities()
def particlesToStemCurves(tnode, startAt, endFrame):
pCache.setDataPath(projUtils.getDataDir() + "/" + projUtils.getSceneName() + ".mel");
pnum = mc.particle(tnode, q = True, count = True)
for currFrame in range(endFrame):
currFrame += 1;
mc.currentTime(currFrame);
print("frame %s" % currFrame)
if currFrame == 1:
pCache.reset(pnum)
if currFrame >= startAt and currFrame <= endFrame:
pCache.updateIndivCache(tnode)
if currFrame == endFrame:
return pCache.writeStemCurves()
def writeToFile():
return pCache.writeToFile()