#!/usr/bin/env python
""" """
# Script information for the file.
__author__ = "Hendrix Demers (hendrix.demers@mail.mcgill.ca)"
__version__ = ""
__date__ = ""
__copyright__ = "Copyright (c) 2009 Hendrix Demers"
__license__ = ""
# Standard library modules.
import logging
# Third party modules.
# Local modules.
import casinotools.fileformat.FileReaderWriterTools as FileReaderWriterTools
#import casinotools.fileformat.casino3.SampleSubtrate as SampleSubtrate
import casinotools.fileformat.casino3.SampleObjectFactory as SampleObjectFactory
import casinotools.fileformat.casino3.SampleTree as SampleTree
import casinotools.fileformat.casino3.Region as Region
import casinotools.fileformat.casino3.Version as Version
# Globals and constants variables.
OFFSET_ROTATION_Y = "offset_rotation_y"
OFFSET_ROTATION_Z = "offset_rotation_z"
[docs]class ShapeError(Exception): pass
[docs]class Sample(FileReaderWriterTools.FileReaderWriterTools):
def __init__(self):
self._file = None
self._startPosition = 0
self._endPosition = 0
self._filePathname = ""
self._fileDescriptor = 0
self._sampleObjects = []
self._regions = []
self._offsets = {}
[docs] def read(self, file):
self._file = file
self._startPosition = file.tell()
self._filePathname = file.name
self._fileDescriptor = file.fileno()
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "read", file.tell())
tagID = b"*CASINOSAMPLE%%"
if self.findTag(file, tagID):
self._version = self.readInt(file)
if self._version >= 3010301:
return self._read_3131(file)
else:
raise "version_not_supported"
def _read_3131(self, file):
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "_read_3131", file.tell())
tagID = b"*SUBSTRATE%%%%%"
if self.findTag(file, tagID):
self._useSubstrate = self.readInt(file)
self._substrate = SampleObjectFactory.CreateObjectFromType(SampleObjectFactory.SHAPE_SUBSTRATE)
self._substrate.read(file)
tagID = b"*SAMPLEOBJECTS%"
if self.findTag(file, tagID):
self._count = self.readInt(file)
for dummy in range(self._count):
type = self.readInt(file)
sampleObject = SampleObjectFactory.CreateObjectFromType(type)
sampleObject.read(file)
if self._version >= 30200002:
objectId = self.readInt(file)
self.addSampleObjectWithId(sampleObject, objectId)
else:
self.addSampleObject(sampleObject)
if self._version < 30107001:
tagID = b"*MAC%%%%%%%%%%%"
if self.findTag(file, tagID):
#float MAC[100][100][3]
#file.read((char*)&MAC,sizeof(MAC[0][0][0]*100*100*3));
numberElements = 100 * 100 * 3
self._mac = self.readFloatList(file, numberElements)
tagID = b"*SAMPLEDATA%%%%"
if self.findTag(file, tagID):
self._maxSampleTreeLevel = self.readInt(file)
if self._version >= Version.SIM_OPTIONS_VERSION_3_1_8_2:
self._offsets[OFFSET_ROTATION_Y] = file.tell()
self._rotationAngleY_deg = self.readDouble(file)
self._offsets[OFFSET_ROTATION_Z] = file.tell()
self._rotationAngleZ_deg = self.readDouble(file)
self._presence = self.readInt(file)
if self._presence:
self._sampleTree = SampleTree.SampleTree()
self._sampleTree.read(file)
tagID = b"*REGIONDATA%%%%"
if self.findTag(file, tagID):
self._numberRegions = self.readInt(file)
#return
for dummy in range(self._numberRegions):
regionInfo = Region.Region()
regionInfo.read(file)
self.addRegion(regionInfo)
# TODO calculate regions for the sample's triangles.
[docs] def addSampleObject(self, sampleObject):
self._sampleObjects.append(sampleObject)
[docs] def addSampleObjectWithId(self, sampleObject, objectId):
self._sampleObjects.append(sampleObject)
[docs] def addRegion(self, region):
self._regions.append(region)
[docs] def getRegions(self):
return self._regions
[docs] def getShapes(self):
return self._sampleObjects
[docs] def getFirstSphereShape(self):
for shape in self._sampleObjects:
type = shape.getType()
if type == SampleObjectFactory.SHAPE_SPHERE:
return shape
raise ShapeError("Shape not found.")
[docs] def getPlaneShapes(self):
shapes = []
for shape in self._sampleObjects:
type = shape.getType()
if type == SampleObjectFactory.SHAPE_PLANE:
shapes.append(shape)
return shapes
[docs] def getVersion(self):
return self._version
[docs] def getRotationY_deg(self):
return self._rotationAngleY_deg
[docs] def setRotationY_deg(self, rotationAngle_deg):
self._rotationAngleY_deg = rotationAngle_deg
[docs] def modifyRotationY_deg(self, rotationAngle_deg):
self._file.seek(self._offsets[OFFSET_ROTATION_Y])
self.writeDouble(self._file, rotationAngle_deg)
self._rotationAngleY_deg = rotationAngle_deg
[docs] def getRotationZ_deg(self):
return self._rotationAngleZ_deg
[docs] def setRotationZ_deg(self, rotationAngle_deg):
self._rotationAngleZ_deg = rotationAngle_deg
[docs] def modifyRotationZ_deg(self, rotationAngle_deg):
self._file.seek(self._offsets[OFFSET_ROTATION_Z])
self.writeDouble(self._file, rotationAngle_deg)
self._rotationAngleZ_deg = rotationAngle_deg
[docs] def write(self, file):
pass
[docs] def export(self, exportFile):
# todo: implement the export method.
self._exportHeader(exportFile)
self._exportVersion(exportFile)
self._exportSubstrate(exportFile)
self._exportSampleObjects(exportFile)
self._exportSampleData(exportFile)
self._exportRegionData(exportFile)
def _exportHeader(self, exportFile):
line = "-"*80
self.writeLine(exportFile, line)
line = "%s" % ("Sample")
self.writeLine(exportFile, line)
line = "-"*40
self.writeLine(exportFile, line)
def _exportVersion(self, exportFile):
version = self.getVersion()
versionString = self._extractVersionString(version)
line = "File version: %s (%i)" % (versionString, version)
self.writeLine(exportFile, line)
def _exportSubstrate(self, exportFile):
text = self._extractBooleanString(self._useSubstrate)
line = "Use substract: %s" % (text)
self.writeLine(exportFile, line)
self._substrate.export(exportFile)
def _exportSampleObjects(self, exportFile):
line = "number of sample objects: %i" % (self._count)
self.writeLine(exportFile, line)
sampleObjectID = 0
for sampleObject in self._sampleObjects:
sampleObjectID += 1
line = "Sample object: %i" % (sampleObjectID)
self.writeLine(exportFile, line)
sampleObject.export(exportFile)
def _exportSampleData(self, exportFile):
line = "Maximum sample tree level: %i" % (self._maxSampleTreeLevel)
self.writeLine(exportFile, line)
line = "Sample rotation angle Y (deg): %g" % (self._rotationAngleY_deg)
self.writeLine(exportFile, line)
line = "Sample rotation angle Z (deg): %g" % (self._rotationAngleZ_deg)
self.writeLine(exportFile, line)
text = self._extractBooleanString(self._presence)
line = "Presence: %s" % (text)
self.writeLine(exportFile, line)
if self._presence:
self._sampleTree.export(exportFile)
def _exportRegionData(self, exportFile):
line = "number of regions: %i" % (self._numberRegions)
self.writeLine(exportFile, line)
sampleRegionID = 0
for region in self._regions:
sampleRegionID += 1
line = "Sample region: %i" % (sampleRegionID)
self.writeLine(exportFile, line)
region.export(exportFile)