Revision: 18364
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18364
Author: campbellbarton
Date: 2009-01-06 13:30:28 +0100 (Tue, 06 Jan 2009)
Log Message:
-----------
Added support for EXTERNPROTO's and fixed a bug where relative Inline URL's
that included a path didn't load
Modified Paths:
--------------
trunk/blender/release/scripts/import_web3d.py
Modified: trunk/blender/release/scripts/import_web3d.py
===================================================================
--- trunk/blender/release/scripts/import_web3d.py 2009-01-06 10:31:25 UTC
(rev 18363)
+++ trunk/blender/release/scripts/import_web3d.py 2009-01-06 12:30:28 UTC
(rev 18364)
@@ -258,6 +258,10 @@
if lines[i].startswith('PROTO'):
words[:] = lines[i].split()
return NODE_NORMAL, i+1 # TODO - assumes the next line is a
'[\n', skip that
+ if lines[i].startswith('EXTERNPROTO'):
+ words[:] = lines[i].split()
+ return NODE_ARRAY, i+1 # TODO - assumes the next line is a
'[\n', skip that
+
'''
proto_type, new_i = is_protoline(i, words, proto_field_defs)
if new_i != -1:
@@ -437,6 +441,17 @@
except:
return None
+ def findSpecRecursive(self, spec):
+ self_real = self.getRealNode()
+ if spec == self_real.getSpec():
+ return self
+
+ for child in self_real.children:
+ if child.findSpecRecursive(spec):
+ return child
+
+ return None
+
def getPrefix(self):
if self.id:
return self.id[0]
@@ -453,6 +468,9 @@
def getProtoName(self):
return self.getSpecialTypeName('PROTO')
+
+ def getExternprotoName(self):
+ return self.getSpecialTypeName('EXTERNPROTO')
def getChildrenBySpec(self, node_spec): # spec could be Transform,
Shape, Appearance
self_real = self.getRealNode()
@@ -496,14 +514,19 @@
# where the parent of this object is not the
real parent
# - In this case we have added the proto as a
child to a node instancing it.
# This is a bit arbitary, but its how Proto's
are done with this importer.
- if child.getProtoName() == None:
+ if child.getProtoName() == None and
child.getExternprotoName() == None:
child.getSerialized(results, ancestry)
else:
- if DEBUG: print 'getSerialized() is
proto:', child.getProtoName(), self.getSpec()
- if child.getProtoName()==self.getSpec():
+ if DEBUG: print 'getSerialized() is
proto:', child.getProtoName(), child.getExternprotoName(), self.getSpec()
+
+ self_spec = self.getSpec()
+
+ if child.getProtoName() == self_spec or
child.getExternprotoName() == self_spec:
if DEBUG: "FoundProto!"
child.getSerialized(results,
ancestry)
+
+
return results
@@ -869,19 +892,52 @@
# print self.id, self.getFilename()
- # If we were an inline then try load the file
+ # Check if this node was an inline or externproto
+
+ url_ls = []
+
if self.node_type == NODE_NORMAL and self.getSpec() == 'Inline':
-
-
ancestry = [] # Warning! - PROTO's using this wont work
at all.
url = self.getFieldAsString('url', None, ancestry)
+ if url:
+ url_ls = [(url, None)]
del ancestry
+
+ elif self.getExternprotoName():
+ # externproto
+ url_ls = []
+ for f in self.fields:
+
+ if type(f)==str:
+ f = [f]
+
+ for ff in f:
+ for f_split in ff.split('"'):
+ # print f_split
+ # "someextern.vrml#SomeID"
+ if '#' in f_split:
+
+ f_split, f_split_id =
f_split.split('#') # there should only be 1 # anyway
+
+ url_ls.append(
(f_split, f_split_id) )
+ else:
+ url_ls.append(
(f_split, None) )
+
+
+ # Was either an Inline or an EXTERNPROTO
+ if url_ls:
- if url != None:
+ # print url_ls
+
+ for url, extern_key in url_ls:
+ print url
urls = []
urls.append( url )
urls.append(
BPySys.caseInsensitivePath(urls[-1]) )
+ urls.append( dirName(self.getFilename()) + url )
+ urls.append(
BPySys.caseInsensitivePath(urls[-1]) )
+
urls.append( dirName(self.getFilename()) +
baseName(url) )
urls.append(
BPySys.caseInsensitivePath(urls[-1]) )
@@ -918,7 +974,7 @@
lines.insert(0,
'root_node____')
lines.append('}')
'''
- ff =
open('/root/test.txt', 'w')
+ ff =
open('/tmp/test.txt', 'w')
ff.writelines([l+'\n'
for l in lines])
'''
@@ -926,9 +982,28 @@
child.setRoot(url) #
initialized dicts
child.parse(0)
+ # if
self.getExternprotoName():
+
+ if not extern_key: # if
none is spesified - use the name
+ extern_key =
self.getSpec()
+
+ if extern_key:
+
+
self.children.remove(child)
+ child.parent =
None
+
+ extern_child =
child.findSpecRecursive(extern_key)
+
+ if extern_child:
+
self.children.append(extern_child)
+
extern_child.parent = self
+
+ if
DEBUG: print "\tEXTERNPROTO ID found!:", extern_key
+ else:
+ print
"\tEXTERNPROTO ID not found!:", extern_key
+
# Watch it! - restore
lines
lines[:] = lines_old
-
return new_i
@@ -967,6 +1042,8 @@
self.getDefDict()[ key ] = self
key = self.getProtoName()
+ if not key: key = self.getExternprotoName()
+
proto_dict = self.getProtoDict()
if key != None:
proto_dict[ key ] = self
@@ -1167,12 +1244,12 @@
lines.append('}')
# Use for testing our parsed output, so we can check on line numbers.
-
+ '''
ff = open('/tmp/test.txt', 'w')
ff.writelines([l+'\n' for l in lines])
ff.close()
+ '''
-
# Now evaluate it
node_type, new_i = is_nodeline(0, [])
if not node_type:
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs
