[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18364] trunk/blender/release/scripts/ import_web3d.py: Added support for EXTERNPROTO' s and fixed a bug where relative Inline URL's that included a path didn' t load

Campbell Barton ideasman42 at gmail.com
Tue Jan 6 13:30:30 CET 2009


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:





More information about the Bf-blender-cvs mailing list