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 Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs