[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