blender/intern/python/modules/vrml/loader.py
2002-10-12 11:37:38 +00:00

98 lines
2.0 KiB
Python

# The VRML loader
# supports gzipped files
#
# TODO: better progress monitoring
import parser
def quiet(txt):
pass
debug = quiet
def debug1(txt):
print "Loader:", txt
g_last = 0
def getFileType(file):
"returns the file type string from 'file'"
file.seek(0)
magic = file.readline()
if magic[:3] == '\037\213\010':
file.seek(0)
return "gzip"
elif magic[:10] == '#VRML V2.0':
file.seek(0)
return "vrml"
else:
file.seek(0)
return ""
class Loader:
def __init__(self, url, progress = None):
self.url = url
self.debug = debug
self.fail = debug
self.monitor = debug
self.progress = progress
self.nodes = 0 # number of nodes parsed
def getGzipFile(self, file):
'''Return gzip file (only called when gzip type is recognised)'''
# we now have the local filename and the headers
# read the first few bytes, check for gzip magic number
self.monitor( "gzip-encoded file... loading gzip library")
try:
import gzip
file = gzip.open(file,"rb")
return file
except ImportError, value:
self.fail("Gzip library unavailable, compressed file cannot be read")
except:
self.fail("Failed to open Gzip file")
return None
def load(self):
self.debug("try: load file from %s" % self.url)
url = self.url
# XXX
try:
file = open(url, 'rb')
except IOError, val:
self.debug("couldn't open file %s" % url)
return None
if getFileType(file) == 'gzip':
file.close()
file = self.getGzipFile(url)
try:
data = file.read()
except MemoryError, value:
self.fail("Insufficient memory to load file as string", value)
return None
except IOError, value:
self.fail("I/O Error while reading data from file %s "% url)
p = parser.Parser(data)
if self.progress:
scenegraph = p.parse(self.progress)
print "progress"
else:
scenegraph = p.parse()
self.nodes = p.progresscount # progress
del p
return scenegraph
def load(url, progress = None):
l = Loader(url, progress)
return l.load()
def test(name = None):
if not name:
name = '/tmp/gna.wrl'
return load(name)