Revision: 64321
http://sourceforge.net/p/brlcad/code/64321
Author: ejno
Date: 2015-03-01 08:47:07 +0000 (Sun, 01 Mar 2015)
Log Message:
-----------
repair ONX_Model UUID issues on platforms for which ON_CreateUuid() is
unimplemented
Modified Paths:
--------------
brlcad/trunk/src/conv/3dm/conv3dm-g.cpp
brlcad/trunk/src/conv/3dm/conv3dm-g.hpp
Modified: brlcad/trunk/src/conv/3dm/conv3dm-g.cpp
===================================================================
--- brlcad/trunk/src/conv/3dm/conv3dm-g.cpp 2015-03-01 07:30:30 UTC (rev
64320)
+++ brlcad/trunk/src/conv/3dm/conv3dm-g.cpp 2015-03-01 08:47:07 UTC (rev
64321)
@@ -169,6 +169,38 @@
}
+// ONX_Model::Audit() fails to repair UUID issues on some platforms
+// because ON_CreateUuid() is not implemented.
+// This function repairs nil and duplicate UUIDs.
+static void
+repair_model_uuids(ONX_Model &model)
+{
+ std::set<ON_UUID, conv3dm::UuidCompare> uuids;
+ uuids.insert(ROOT_UUID);
+
+ for (int i = 0; i < model.m_idef_table.Count(); ++i) {
+ ON_UUID &idef_uuid = model.m_idef_table[i].m_uuid;
+
+ while (!uuids.insert(idef_uuid).second)
+ idef_uuid = generate_uuid();
+ }
+
+ for (int i = 0; i < model.m_object_table.Count(); ++i) {
+ ON_UUID &object_uuid = model.m_object_table[i].m_attributes.m_uuid;
+
+ while (!uuids.insert(object_uuid).second)
+ object_uuid = generate_uuid();
+ }
+
+ for (int i = 0; i < model.m_layer_table.Count(); ++i) {
+ ON_UUID &layer_uuid = model.m_layer_table[i].m_layer_id;
+
+ while (!uuids.insert(layer_uuid).second)
+ layer_uuid = generate_uuid();
+ }
+}
+
+
static const char *
get_object_suffix(const ON_Object &object)
{
@@ -299,21 +331,11 @@
{
-bool RhinoConverter::UuidCompare::operator()(const ON_UUID &left,
- const ON_UUID &right) const
+inline bool
+UuidCompare::operator()(const ON_UUID &left,
+ const ON_UUID &right) const
{
-#define COMPARE(a, b) do { if ((a) != (b)) return (a) < (b); } while (false)
-
- COMPARE(left.Data1, right.Data1);
- COMPARE(left.Data2, right.Data2);
- COMPARE(left.Data3, right.Data3);
-
- for (int i = 0; i < 8; ++i)
- COMPARE(left.Data4[i], right.Data4[i]);
-
-#undef COMPARE
-
- return false;
+ return ON_UuidCompare(&left, &right) == -1;
}
@@ -430,7 +452,7 @@
}
-inline const std::set<ON_UUID, RhinoConverter::UuidCompare> &
+inline const std::set<ON_UUID, UuidCompare> &
RhinoConverter::ObjectManager::get_members(const ON_UUID &uuid) const
{
return m_obj_map.at(uuid).m_members;
@@ -557,22 +579,27 @@
void
RhinoConverter::clean_model()
{
- if (!m_model.Audit(false, NULL, &m_log, NULL))
+ m_model.Polish(); // fill in defaults
+
+ int repair_count = 0;
+ int num_problems = m_model.Audit(true, &repair_count, &m_log, NULL);
+
+ if (!num_problems)
return;
m_log.Print("WARNING: Model is NOT valid. Attempting repairs.\n");
- m_model.Polish(); // fill in defaults
+ // repair remaining UUID issues
+ if (num_problems != repair_count) {
+ repair_model_uuids(m_model);
+ num_problems = m_model.Audit(true, &repair_count, NULL, NULL);
+ }
- int repair_count = 0;
- int num_problems = m_model.Audit(true, &repair_count, NULL, NULL); //
repair
-
- m_log.Print("Repaired %d of %d problems.\n", repair_count, num_problems);
-
- if (!m_model.Audit(false, NULL, &m_log, NULL))
+ if (num_problems != repair_count) {
+ m_log.Print("Remaining problems:\n");
+ m_model.Audit(false, NULL, &m_log, NULL);
+ } else
m_log.Print("Repair successful; model is now valid.\n");
- else
- m_log.Print("WARNING: Repair unsuccessful; model is still NOT
valid.\n");
}
Modified: brlcad/trunk/src/conv/3dm/conv3dm-g.hpp
===================================================================
--- brlcad/trunk/src/conv/3dm/conv3dm-g.hpp 2015-03-01 07:30:30 UTC (rev
64320)
+++ brlcad/trunk/src/conv/3dm/conv3dm-g.hpp 2015-03-01 08:47:07 UTC (rev
64321)
@@ -40,6 +40,11 @@
{
+struct UuidCompare {
+ bool operator()(const ON_UUID &left, const ON_UUID &right) const;
+};
+
+
class RhinoConverter
{
public:
@@ -56,11 +61,7 @@
private:
class Color;
- struct UuidCompare {
- bool operator()(const ON_UUID &left, const ON_UUID &right) const;
- };
-
class ObjectManager
{
public:
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits