[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31857] trunk/blender/source/blender/ collada/DocumentExporter.cpp: Bug #23715: patch by Jan Diederich to avoid having duplicate IDs after they are translated .

Arystanbek Dyussenov arystan.d at gmail.com
Fri Sep 10 17:24:34 CEST 2010


Revision: 31857
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31857
Author:   kazanbas
Date:     2010-09-10 17:24:10 +0200 (Fri, 10 Sep 2010)

Log Message:
-----------
Bug #23715: patch by Jan Diederich to avoid having duplicate IDs after they are translated.
For example, object ID names "1a", "2a", "3a", will be exported as "_a", "_a2", "_a3". Thanks Jan!

Modified Paths:
--------------
    trunk/blender/source/blender/collada/DocumentExporter.cpp

Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-09-10 14:54:50 UTC (rev 31856)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-09-10 15:24:10 UTC (rev 31857)
@@ -230,22 +230,56 @@
 241,  242,  243,  244,  245,  246,  95,  248,
 249,  250,  251,  252,  253,  254,  255};
 
+typedef std::map< std::string, std::vector<std::string> > map_string_list;
+map_string_list global_id_map;
+
 /** Look at documentation of translate_map */
 static std::string translate_id(const std::string &id)
 {
 	if (id.size() == 0)
 	{ return id; }
 	std::string id_translated = id;
-	int offset = 0;
-	// prepend '_' if the first character is illegal and not '_' already
-	if (id[0] != '_' && translate_start_name_map[(unsigned int)id[0]] == '_')
+	id_translated[0] = translate_start_name_map[(unsigned int)id_translated[0]];
+	for (unsigned int i=1; i < id_translated.size(); i++)
 	{
-		id_translated.insert(0, 1, '_');
-		offset = 1;
+		id_translated[i] = translate_name_map[(unsigned int)id_translated[i]];
 	}
-	for (unsigned int i=offset; i < id_translated.size(); i++)
+	// It's so much workload now, the if() should speed up things.
+	if (id_translated != id)
 	{
-		id_translated[i] = translate_name_map[(unsigned int)id_translated[i]];
+		// Search duplicates
+		map_string_list::iterator iter = global_id_map.find(id_translated);
+		if (iter != global_id_map.end())
+		{
+			unsigned int i = 0;
+			bool found = false;
+			for (i=0; i < iter->second.size(); i++)
+			{
+				if (id == iter->second[i])
+				{ 
+					found = true;
+					break;
+				}
+			}
+			bool convert = false;
+			if (found)
+			{
+			  if (i > 0)
+			  { convert = true; }
+			}
+			else
+			{ 
+				convert = true;
+				global_id_map[id_translated].push_back(id);
+			}
+			if (convert)
+			{
+				std::stringstream out;
+				out << ++i;
+				id_translated += out.str();
+			}
+		}
+		else { global_id_map[id_translated].push_back(id); }
 	}
 	return id_translated;
 }
@@ -2567,6 +2601,8 @@
 
 void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
 {
+	global_id_map.clear();
+
 	COLLADABU::NativeString native_filename =
 		COLLADABU::NativeString(std::string(filename));
 	COLLADASW::StreamWriter sw(native_filename);





More information about the Bf-blender-cvs mailing list