<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">from MinMax import *
from math import log

class SimToWrl:

    def __init__(self, strDir):
        self.strMyDoc = "C:\\Documents and Settings\\Mike\\My Documents\\"
        if(strDir == ""):
            strDir = "213_hw\\poisson\\"
        self.strMyDir = self.strMyDoc+strDir
        self.m_scales = [100.0, 100.0, 100.0]

    def __clamper(self, val):
        if(val &gt; self.fClamp):
            return self.fClamp
        if(val &lt; -self.fClamp):
            return -self.fClamp
        return val

    def __NearPow__(self):
	return lambda fVal: 10**int(log(fVal)/log(10))

    def handleRanges(self):
        indices = self.myMinMax.getRangeOrder()
        ranges = self.myMinMax.getRange()
        nearPow = self.__NearPow__()
        fScaleAdjust = nearPow(ranges[indices[0]]/ranges[indices[1]])
        self.m_scales[indices[1]] *= fScaleAdjust
        self.m_scales[indices[2]] *= fScaleAdjust
        fScaleAdjust = nearPow(ranges[indices[1]]/ranges[indices[2]])
        self.m_scales[indices[2]] *= fScaleAdjust
        return
        
    def convertData(self, strPrefix, strNumber):
        self.m_scales = [100.0, 100.0, 100.0]
        xFile = open(self.strMyDir+"x."+strNumber)
        xVals = map(lambda strX: float(strX), xFile.readlines())
        xFile.close()
        yFile = open(self.strMyDir+"y."+strNumber)
        yVals = map(lambda strY: float(strY), yFile.readlines())
        yFile.close()
        datFile = open(self.strMyDir+strPrefix+"."+strNumber)
        datVals = map(lambda strX: float(strX), datFile.readlines())
        self.datVals = datVals
        datFile.close()
        self.formattedTriples = map(lambda j: map(lambda i: [xVals[i], yVals[j], datVals[j*len(xVals)+i]], range(0, len(xVals))), range(0, len(yVals)))
        self.currTriples = reduce(lambda x,y: x+y, self.formattedTriples, [])
        self.myMinMax = MinMax(3)
        reduce(lambda x,y: x.accumVal(y), self.currTriples, self.myMinMax)
        print 'Ranges are '+`self.myMinMax.getRange()`
        self.nX = len(xVals)
        self.nY = len(yVals)
        print 'nX is '+`self.nX`
        print 'nY is '+`self.nY`
        self.handleRanges()
        self.spitData(strPrefix, strNumber)

    def convertDataClamp(self, strPrefix, strNumber, fClamp):
        self.m_scales = [100.0, 100.0, 100.0]
        self.fClamp = fClamp
        xFile = open(self.strMyDir+"x."+strNumber)
        xVals = map(lambda strX: float(strX), xFile.readlines())
        xFile.close()
        yFile = open(self.strMyDir+"y."+strNumber)
        yVals = map(lambda strY: float(strY), yFile.readlines())
        yFile.close()
        datFile = open(self.strMyDir+strPrefix+"."+strNumber)
        datVals = map(lambda strX: float(strX), datFile.readlines())
        datVals = map(lambda val: self.__clamper(val), datVals)
        datFile.close()
        self.formattedTriples = map(lambda j: map(lambda i: [xVals[i], yVals[j], datVals[i*len(yVals)+j]], range(0, len(xVals))), range(0, len(yVals)))
        self.currTriples = reduce(lambda x,y: x+y, self.formattedTriples, [])
        self.myMinMax = MinMax(3)
        reduce(lambda x,y: x.accumVal(y), self.currTriples, self.myMinMax)
        print 'Ranges are '+`self.myMinMax.getRange()`
        self.nX = len(xVals)
        self.nY = len(yVals)
        self.handleRanges()
        self.spitData(strPrefix, strNumber)

    def __writeHeader__(self, oFile):
        oFile.write("#VRML V1.0 ascii\n")
        oFile.write("Separator {\n  NormalBinding { value PER_FACE_INDEXED }\n")
        oFile.write("  MaterialBinding { value PER_FACE_INDEXED }\n")
        oFile.write("  ShapeHints {vertexOrdering COUNTERCLOCKWISE\n")
        oFile.write("    shapeType SOLID faceType CONVEX\n    creaseAngle 0}\n")
        oFile.write("  Info { string \" glom name untitled\" }\n")
        oFile.write("  Coordinate3 { point [\n")


    def spitData(self, strPrefix, nNumber):
        oFile = open(self.strMyDir+strPrefix+"_"+nNumber+".wrl","w")
        self.__writeHeader__(oFile)
        s = self.m_scales
        oFile.writelines(map(lambda ENT: "\t\t"+`s[0]*ENT[0]`+" "+`s[1]*ENT[1]`+" "+`s[2]*ENT[2]`+",\n", self.currTriples))
        oFile.write("\t\t"+`self.currTriples[-1][0]*s[0]`+" "+`self.currTriples[-1][1]*s[1]`+" "+`self.currTriples[-1][2]*s[2]`+"]\n")
        oFile.write("  }\n")
        oFile.write("          Material {\n")
        oFile.write("    ambientColor [\n")
        oFile.write("          0.874510 0.874510 0.874510]\n")
        oFile.write("    diffuseColor [\n")
        oFile.write("          0.874510 0.874510 0.874510]\n")
        oFile.write("  }\n")
        oFile.write("  IndexedFaceSet {\n")
        oFile.write("     coordIndex [\n")
        for j in range(0, self.nY-1):
            for i in range(0, self.nX-1):
                nNum = i+self.nX*j
                oFile.write("\t\t"+reduce(lambda x,y: `y`+","+x, [-1,nNum+1, nNum, nNum+self.nX, nNum+self.nX+1], "")+"\n")
        oFile.write("]\n")
        oFile.write("}\n}\n")
        oFile.close()
                               
            
</pre></body></html>