forked from bartvdbraak/blender
98 lines
2.0 KiB
Python
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)
|