Revision: 65089
          http://sourceforge.net/p/brlcad/code/65089
Author:   ejno
Date:     2015-05-28 21:35:29 +0000 (Thu, 28 May 2015)
Log Message:
-----------
refactoring Section code (in progress); better management of grid IDs

Modified Paths:
--------------
    brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp

Modified: brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp
===================================================================
--- brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp    2015-05-28 
21:14:47 UTC (rev 65088)
+++ brlcad/trunk/src/libgcv/conv/fastgen4/fastgen4_write.cpp    2015-05-28 
21:35:29 UTC (rev 65089)
@@ -31,6 +31,7 @@
 #include <set>
 #include <sstream>
 #include <stdexcept>
+#include <map>
 
 #include "../../plugin.h"
 
@@ -65,29 +66,31 @@
 };
 
 
-class RecordWriter
+class FastgenWriter
 {
 public:
-    RecordWriter();
-    virtual ~RecordWriter();
+    class Record;
+    class SectionWriter;
 
+    FastgenWriter(const std::string &path);
+    ~FastgenWriter();
+
     void write_comment(const std::string &value);
 
+private:
+    static const std::size_t MAX_GROUP_ID = 49;
+    static const std::size_t MAX_SECTION_ID = 999;
 
-protected:
-    class Record;
-    virtual std::ostream &get_ostream() = 0;
-
-
-private:
+    std::size_t m_next_section_id[MAX_GROUP_ID + 1];
     bool m_record_open;
+    std::ofstream m_ostream, m_colors_ostream;
 };
 
 
-class RecordWriter::Record
+class FastgenWriter::Record
 {
 public:
-    Record(RecordWriter &writer);
+    Record(FastgenWriter &writer);
     ~Record();
 
     template <typename T> Record &operator<<(const T &value);
@@ -95,33 +98,19 @@
     Record &non_zero(fastf_t value);
     Record &text(const std::string &value);
 
+    static std::string truncate_float(fastf_t value);
 
+
 private:
     static const std::size_t FIELD_WIDTH = 8;
     static const std::size_t RECORD_WIDTH = 10;
 
     std::size_t m_width;
-    RecordWriter &m_writer;
+    FastgenWriter &m_writer;
 };
 
 
-inline RecordWriter::RecordWriter() :
-    m_record_open(false)
-{}
-
-
-inline RecordWriter::~RecordWriter()
-{}
-
-
-void
-RecordWriter::write_comment(const std::string &value)
-{
-    (Record(*this) << "$COMMENT").text(" ").text(value);
-}
-
-
-RecordWriter::Record::Record(RecordWriter &writer) :
+FastgenWriter::Record::Record(FastgenWriter &writer) :
     m_width(0),
     m_writer(writer)
 {
@@ -132,16 +121,16 @@
 }
 
 
-inline RecordWriter::Record::~Record()
+FastgenWriter::Record::~Record()
 {
-    if (m_width) m_writer.get_ostream().put('\n');
+    if (m_width) m_writer.m_ostream.put('\n');
 
     m_writer.m_record_open = false;
 }
 
 
-template <typename T> RecordWriter::Record &
-RecordWriter::Record::operator<<(const T &value)
+template <typename T> FastgenWriter::Record &
+FastgenWriter::Record::operator<<(const T &value)
 {
     if (++m_width > RECORD_WIDTH)
        throw std::logic_error("logic error: invalid record width");
@@ -156,29 +145,24 @@
     if (str_val.size() > FIELD_WIDTH)
        throw std::invalid_argument("length exceeds field width");
 
-    m_writer.get_ostream() << std::left << std::setw(FIELD_WIDTH) << str_val;
+    m_writer.m_ostream << std::left << std::setw(FIELD_WIDTH) << str_val;
     return *this;
 }
 
 
-RecordWriter::Record &
-RecordWriter::Record::operator<<(fastf_t value)
+FastgenWriter::Record &
+FastgenWriter::Record::operator<<(fastf_t value)
 {
-    std::ostringstream sstream;
-    sstream << std::fixed << std::showpoint << value;
-    return operator<<(sstream.str().substr(0, FIELD_WIDTH));
+    return operator<<(truncate_float(value));
 }
 
 
 // ensure that the truncated value != 0.0
-RecordWriter::Record &
-RecordWriter::Record::non_zero(fastf_t value)
+FastgenWriter::Record &
+FastgenWriter::Record::non_zero(fastf_t value)
 {
-    std::ostringstream sstream;
-    sstream << std::fixed << std::showpoint << value;
+    std::string result = truncate_float(value);
 
-    std::string result = sstream.str().substr(0, FIELD_WIDTH);
-
     if (result.find_first_not_of("-0.") == std::string::npos) {
        result = "0.0";
        result.append(FIELD_WIDTH - result.size() - 1, '0');
@@ -189,38 +173,26 @@
 }
 
 
-RecordWriter::Record &
-RecordWriter::Record::text(const std::string &value)
+FastgenWriter::Record &
+FastgenWriter::Record::text(const std::string &value)
 {
     m_width = RECORD_WIDTH;
-    m_writer.get_ostream() << value;
+    m_writer.m_ostream << value;
     return *this;
 }
 
 
-class FastgenWriter : public RecordWriter
+std::string
+FastgenWriter::Record::truncate_float(fastf_t value)
 {
-public:
-    FastgenWriter(const std::string &path);
-    ~FastgenWriter();
+    std::ostringstream sstream;
+    sstream << std::fixed << std::showpoint << value;
+    return sstream.str().substr(0, FIELD_WIDTH);
+}
 
 
-protected:
-    virtual std::ostream &get_ostream();
-
-
-private:
-    friend class Section;
-
-    static const std::size_t MAX_GROUP_ID = 49;
-    static const std::size_t MAX_SECTION_ID = 999;
-
-    std::size_t m_next_section_id[MAX_GROUP_ID + 1];
-    std::ofstream m_ostream, m_colors_ostream;
-};
-
-
 FastgenWriter::FastgenWriter(const std::string &path) :
+    m_record_open(false),
     m_ostream(path.c_str(), std::ofstream::out),
     m_colors_ostream((path + ".colors").c_str(), std::ofstream::out)
 {
@@ -232,66 +204,58 @@
 }
 
 
-inline FastgenWriter::~FastgenWriter()
+FastgenWriter::~FastgenWriter()
 {
     Record(*this) << "ENDDATA";
 }
 
 
-inline std::ostream &
-FastgenWriter::get_ostream()
+void
+FastgenWriter::write_comment(const std::string &value)
 {
-    return m_ostream;
+    (Record(*this) << "$COMMENT").text(" ").text(value);
 }
 
 
-class Section : public RecordWriter
+class FastgenWriter::SectionWriter
 {
 public:
-    Section(FastgenWriter &writer, std::string name, bool volume_mode,
-           const unsigned char *color = NULL);
+    SectionWriter(FastgenWriter &writer, std::string name, bool volume_mode,
+                 const unsigned char *color = NULL);
 
-    ~Section();
+    std::size_t write_grid_point(fastf_t x, fastf_t y, fastf_t z);
 
-    void add_sphere(const std::string &name, const point_t p1, fastf_t 
thickness,
-                   fastf_t radius);
+    void write_sphere(std::size_t g1, fastf_t thickness, fastf_t radius);
 
-    void add_cone(const std::string &name, const point_t p1, const point_t p2,
-                 fastf_t ro1, fastf_t ro2, fastf_t ri1, fastf_t ri2);
+    void write_cone(std::size_t g1, std::size_t g2, fastf_t ro1, fastf_t ro2,
+                   fastf_t ri1, fastf_t ri2);
 
-    void add_line(const std::string &name, const point_t p1, const point_t p2,
-                 fastf_t thickness, fastf_t radius);
+    void write_line(std::size_t g1, std::size_t g2, fastf_t thickness,
+                   fastf_t radius);
 
-    void add_triangle(const std::string &name, const point_t p1, const point_t 
p2,
-                     const point_t p3, fastf_t thickness, bool grid_centered = 
false);
+    void write_triangle(std::size_t g1, std::size_t g2, std::size_t g3,
+                       fastf_t thickness, bool grid_centered = false);
 
-    void add_hexahedron(const std::string &name, const fastf_t points[8][3]);
+    void write_hexahedron(const std::size_t *g);
 
 
-protected:
-    virtual std::ostream &get_ostream();
-
-
 private:
     static const fastf_t INCHES_PER_MM;
     static const std::size_t MAX_NAME_SIZE = 25;
     static const std::size_t MAX_GRID_POINTS = 50000;
 
-    std::size_t add_grid_point(const point_t p1);
-
     std::size_t m_next_grid_id;
     std::size_t m_next_element_id;
     bool m_volume_mode;
     FastgenWriter &m_writer;
-    std::ostringstream m_buffer_ostream;
 };
 
 
-const fastf_t Section::INCHES_PER_MM = 1.0 / 25.4;
+const fastf_t FastgenWriter::SectionWriter::INCHES_PER_MM = 1.0 / 25.4;
 
 
-Section::Section(FastgenWriter &writer, std::string name, bool volume_mode,
-                const unsigned char *color) :
+FastgenWriter::SectionWriter::SectionWriter(FastgenWriter &writer,
+       std::string name, bool volume_mode, const unsigned char *color) :
     m_next_grid_id(1),
     m_next_element_id(1),
     m_volume_mode(volume_mode),
@@ -311,14 +275,14 @@
     }
 
     {
-       RecordWriter::Record record(m_writer);
+       FastgenWriter::Record record(m_writer);
        record << "$NAME" << group_id << next_section_id;
        record << "" << "" << "" << "";
        record.text(name);
     }
 
-    RecordWriter::Record(m_writer) << "SECTION" << group_id << next_section_id 
<<
-                                  (m_volume_mode ? 2 : 1);
+    FastgenWriter::Record(m_writer) << "SECTION" << group_id << 
next_section_id <<
+                                   (m_volume_mode ? 2 : 1);
 
     if (color) {
        writer.m_colors_ostream << next_section_id << ' '
@@ -332,77 +296,83 @@
 }
 
 
-inline Section::~Section()
+std::size_t
+FastgenWriter::SectionWriter::write_grid_point(fastf_t x, fastf_t y, fastf_t z)
 {
-    RecordWriter::Record(m_writer).text(m_buffer_ostream.str());
-}
+    x *= INCHES_PER_MM;
+    y *= INCHES_PER_MM;
+    z *= INCHES_PER_MM;
 
+    if (m_next_grid_id > MAX_GRID_POINTS)
+       throw std::length_error("maximum GRID records");
 
-inline std::ostream &
-Section::get_ostream()
-{
-    return m_buffer_ostream;
+    if (m_next_element_id != 1)
+       throw std::logic_error("logic error: write_grid_point() called after 
adding elements");
+
+    FastgenWriter::Record record(m_writer);
+    record << "GRID" << m_next_grid_id << "";
+    record << x << y << z;
+    return m_next_grid_id++;
 }
 
 
 void
-Section::add_sphere(const std::string &name, const point_t p1,
-                   fastf_t thickness, fastf_t radius)
+FastgenWriter::SectionWriter::write_sphere(std::size_t g1, fastf_t thickness,
+       fastf_t radius)
 {
     thickness *= INCHES_PER_MM;
     radius *= INCHES_PER_MM;
 
-    if (thickness <= 0.0)
-       throw std::invalid_argument("invalid thickness");
+    if (!g1 || g1 >= m_next_grid_id || thickness <= 0.0 || radius <= 0.0)
+       throw std::invalid_argument("invalid value");
 
-    if (radius <= 0.0)
-       throw std::invalid_argument("invalid radius");
-
-    const std::size_t g1 = add_grid_point(p1);
-    this->write_comment(name);
-    RecordWriter::Record record(*this);
+    FastgenWriter::Record record(m_writer);
     record << "CSPHERE" << m_next_element_id++ << 0 << g1 << "" << "" << "";
     record.non_zero(thickness).non_zero(radius);
 }
 
 
 void
-Section::add_cone(const std::string &name, const point_t p1, const point_t p2,
-                 fastf_t ro1, fastf_t ro2, fastf_t ri1, fastf_t ri2)
+FastgenWriter::SectionWriter::write_cone(std::size_t g1, std::size_t g2,
+       fastf_t ro1, fastf_t ro2,
+       fastf_t ri1, fastf_t ri2)
 {
     ro1 *= INCHES_PER_MM;
     ro2 *= INCHES_PER_MM;
     ri1 *= INCHES_PER_MM;
     ri2 *= INCHES_PER_MM;
 
+    if (g1 == g2 || !g1 || !g2 || g1 >= m_next_grid_id || g2 >= m_next_grid_id)
+       throw std::invalid_argument("invalid grid id");
+
     if (ri1 < 0.0 || ri2 < 0.0 || ri1 >= ro1 || ri2 >= ro2)
        throw std::invalid_argument("invalid radius");
 
-    const std::size_t g1 = add_grid_point(p1), g2 = add_grid_point(p2);
-    this->write_comment(name);
-    RecordWriter::Record(*this) << "CCONE2" << m_next_element_id << 0 << g1 <<
-                               g2 << "" << "" << "" << ro1 << 
m_next_element_id;
-    RecordWriter::Record(*this) << m_next_element_id << ro2 << ri1 << ri2;
+    FastgenWriter::Record(m_writer) << "CCONE2" << m_next_element_id << 0 << 
g1 <<
+                                   g2 << "" << "" << "" << ro1 << 
m_next_element_id;
+    FastgenWriter::Record(m_writer) << m_next_element_id << ro2 << ri1 << ri2;
     ++m_next_element_id;
 }
 
 
 void
-Section::add_line(const std::string &name, const point_t p1, const point_t p2,
-                 fastf_t thickness, fastf_t radius)
+FastgenWriter::SectionWriter::write_line(std::size_t g1, std::size_t g2,
+       fastf_t thickness,
+       fastf_t radius)
 {
     thickness *= INCHES_PER_MM;
     radius *= INCHES_PER_MM;
 
+    if (g1 == g2 || !g1 || !g2 || g1 >= m_next_grid_id || g2 >= m_next_grid_id)
+       throw std::invalid_argument("invalid grid id");
+
     if ((!m_volume_mode && thickness <= 0.0) || thickness < 0.0)
        throw std::invalid_argument("invalid thickness");
 
     if (radius <= 0.0)
        throw std::invalid_argument("invalid radius");
 
-    const std::size_t g1 = add_grid_point(p1), g2 = add_grid_point(p2);
-    this->write_comment(name);
-    RecordWriter::Record record(*this);
+    FastgenWriter::Record record(m_writer);
     record << "CLINE" << m_next_element_id++ << 0 << g1 << g2 << "" << "";
 
     if (m_volume_mode)
@@ -415,18 +385,23 @@
 
 
 void
-Section::add_triangle(const std::string &name, const point_t p1,
-                     const point_t p2, const point_t p3, fastf_t thickness, 
bool grid_centered)
+FastgenWriter::SectionWriter::write_triangle(std::size_t g1, std::size_t g2,
+       std::size_t g3,
+       fastf_t thickness, bool grid_centered)
 {
     thickness *= INCHES_PER_MM;
 
+    if (g1 == g2 || g1 == g3 || g2 == g3)
+       throw std::invalid_argument("invalid grid id");
+
+    if (!g1 || !g2 || !g3 || g1 >= m_next_grid_id || g2 >= m_next_grid_id
+       || g3 >= m_next_grid_id)
+       throw std::invalid_argument("invalid grid id");
+
     if (thickness <= 0.0)
        throw std::invalid_argument("invalid thickness");
 
-    const std::size_t g1 = add_grid_point(p1), g2 = add_grid_point(p2),
-                     g3 = add_grid_point(p3);
-    this->write_comment(name);
-    RecordWriter::Record record(*this);
+    FastgenWriter::Record record(m_writer);
     record << "CTRI" << m_next_element_id++ << 0 << g1 << g2 << g3;
     record.non_zero(thickness);
     record << (grid_centered ? 1 : 2);
@@ -434,16 +409,19 @@
 
 
 void
-Section::add_hexahedron(const std::string &name, const fastf_t points[8][3])
+FastgenWriter::SectionWriter::write_hexahedron(const std::size_t *g)
 {
-    std::size_t g[8];
+    for (int i = 0; i < 8; ++i) {
+       if (!g[i] || g[i] >= m_next_grid_id)
+           throw std::invalid_argument("invalid grid id");
 
-    for (int i = 0; i < 8; ++i)
-       g[i] = add_grid_point(points[i]);
+       for (int j = i + 1; j < 8; ++j)
+           if (g[i] == g[j])
+               throw std::invalid_argument("repeated grid id");
+    }
 
     {
-       this->write_comment(name);
-       RecordWriter::Record record1(*this);
+       FastgenWriter::Record record1(m_writer);
        record1 << "CHEX2" << m_next_element_id << 0;
 
        for (int i = 0; i < 6; ++i)
@@ -452,32 +430,155 @@
        record1 << m_next_element_id;
     }
 
-    RecordWriter::Record(*this) << m_next_element_id << g[6] << g[7];
+    FastgenWriter::Record(m_writer) << m_next_element_id << g[6] << g[7];
     ++m_next_element_id;
 }
 
 
+struct Point {
+    Point()
+    {
+       VSETALL(m_point, 0.0);
+    }
+
+
+    operator const fastf_t *() const
+    {
+       return m_point;
+    }
+
+
+    operator fastf_t *()
+    {
+       return m_point;
+    }
+
+
+    point_t m_point;
+};
+
+
+class GridManager
+{
+public:
+    GridManager();
+
+    std::size_t get_grid(const Point &point);
+
+    // return a vector of grid IDs corresponding to the given points,
+    // with no duplicate indices in the returned vector.
+    std::vector<std::size_t> get_unique_grids(const std::vector<Point> 
&points);
+
+
+private:
+    struct FloatFieldComparator {
+       bool operator()(const Point &lhs, const Point &rhs);
+    };
+
+    typedef std::pair<std::map<Point, std::vector<std::size_t>, 
FloatFieldComparator>::iterator, bool>
+    FindResult;
+    FindResult find_grid(const Point &point);
+
+    std::size_t m_next_grid_id;
+    std::map<Point, std::vector<std::size_t>, FloatFieldComparator> m_grids;
+};
+
+
+inline bool GridManager::FloatFieldComparator::operator()(const Point &lhs,
+       const Point &rhs)
+{
+#define COMPARE(a, b) do { if ((a) != (b)) return (a) < (b); } while (false)
+#define COMPARE_TRUNC(a, b) do { \
+    std::string a_str = FastgenWriter::Record::truncate_float((a)); \
+    std::string b_str = FastgenWriter::Record::truncate_float((b)); \
+    COMPARE(a_str, b_str); \
+} while (false)
+
+    // compare final string forms in order to eliminate duplicate points
+    COMPARE_TRUNC(lhs[X], rhs[X]);
+    COMPARE_TRUNC(lhs[Y], rhs[Y]);
+    COMPARE_TRUNC(lhs[Z], rhs[Z]);
+    return false;
+
+#undef COMPARE_TRUNC
+#undef COMPARE
+}
+
+
+inline GridManager::GridManager() :
+    m_next_grid_id(1),
+    m_grids()
+{}
+
+
+GridManager::FindResult
+GridManager::find_grid(const Point &point)
+{
+    std::vector<std::size_t> temp(1);
+    temp.at(0) = m_next_grid_id;
+    return m_grids.insert(std::make_pair(point, temp));
+}
+
+
 std::size_t
-Section::add_grid_point(const point_t p1)
+GridManager::get_grid(const Point &point)
 {
-    if (m_next_grid_id > MAX_GRID_POINTS)
-       throw std::length_error("maximum GRID records");
+    FindResult found = find_grid(point);
 
-    RecordWriter::Record record(m_writer);
-    record << "GRID" << m_next_grid_id << "";
-    record << p1[X] * INCHES_PER_MM << p1[Y] * INCHES_PER_MM << p1[Z] *
-          INCHES_PER_MM;
-    return m_next_grid_id++;
+    if (found.second)
+       ++m_next_grid_id;
+
+    return found.first->second.at(0);
 }
 
 
+std::vector<std::size_t>
+GridManager::get_unique_grids(const std::vector<Point> &points)
+{
+    std::vector<std::size_t> results(points.size());
+
+    for (std::size_t i = 0; i < points.size(); ++i) {
+       FindResult found = find_grid(points[i]);
+
+       std::size_t n = 0;
+       results[i] = found.first->second.at(n);
+
+       for (std::size_t j = 0; j < i; ++j)
+           if (results[j] == results[i]) {
+               if (++n < found.first->second.size() - 1) {
+                   results[i] = found.first->second.at(++n);
+                   j = 0;
+               } else {
+                   found.first->second.push_back(m_next_grid_id);
+                   results[i] = m_next_grid_id++;
+                   break;
+               }
+           }
+    }
+}
+
+
+class Section
+{
+public:
+    void write(FastgenWriter::SectionWriter &writer);
+};
+
+
 HIDDEN void
-write_bot(const std::string &name, Section &section, const rt_bot_internal 
&bot)
+write_bot(FastgenWriter &writer, const std::string &name,
+         const rt_bot_internal &bot, const unsigned char *color = NULL)
 {
     RT_BOT_CK_MAGIC(&bot);
 
-    section.write_comment(name);
+    FastgenWriter::SectionWriter section(writer, name, bot.mode == 
RT_BOT_SOLID,
+                                        color);
 
+    for (std::size_t i = 0; i < bot.num_vertices; ++i) {
+       const fastf_t * const vertex = &bot.vertices[i * 3];
+       section.write_grid_point(V3ARGS(vertex));
+    }
+
     for (std::size_t i = 0; i < bot.num_faces; ++i) {
        fastf_t thickness = 1.0;
        bool grid_centered = false;
@@ -493,10 +594,8 @@
        }
 
        const int * const face = &bot.faces[i * 3];
-       const fastf_t * const p1 = &bot.vertices[face[0] * 3];
-       const fastf_t * const p2 = &bot.vertices[face[1] * 3];
-       const fastf_t * const p3 = &bot.vertices[face[2] * 3];
-       section.add_triangle("", p1, p2, p3, thickness, grid_centered);
+       section.write_triangle(face[0] + 1, face[1] + 1, face[2] + 1, thickness,
+                              grid_centered);
     }
 }
 
@@ -684,7 +783,6 @@
     FastgenWriter &m_writer;
     const bn_tol &m_tol;
     const bool m_convert_primitives;
-    Section *m_current_section;
 
     // for find_ccone_cutout()
     db_i &m_db;
@@ -702,10 +800,12 @@
                                             (internal.idb_ptr);
            RT_CLINE_CK_MAGIC(&cline);
 
+           FastgenWriter::SectionWriter section(data.m_writer, name, true);
            point_t v2;
            VADD2(v2, cline.v, cline.h);
-           data.m_current_section->add_line(name, cline.v, v2, cline.thickness,
-                                            cline.radius);
+           section.write_grid_point(V3ARGS(cline.v));
+           section.write_grid_point(V3ARGS(v2));
+           section.write_line(1, 2, cline.thickness, cline.radius);
            break;
        }
 
@@ -717,7 +817,9 @@
            if (internal.idb_type != ID_SPH && !ell_is_sphere(ell))
                return false;
 
-           data.m_current_section->add_sphere(name, ell.v, 1.0, 
MAGNITUDE(ell.a));
+           FastgenWriter::SectionWriter section(data.m_writer, name, true);
+           section.write_grid_point(V3ARGS(ell.v));
+           section.write_sphere(1, 1.0, MAGNITUDE(ell.a));
            break;
        }
 
@@ -743,24 +845,32 @@
                ri1 = ri2 = 0.0;
            }
 
+           FastgenWriter::SectionWriter section(data.m_writer, new_name, true);
            point_t v2;
            VADD2(v2, tgc.v, tgc.h);
-           data.m_current_section->add_cone(name, tgc.v, v2, ro1, ro2, ri1, 
ri2);
+           section.write_grid_point(V3ARGS(tgc.v));
+           section.write_grid_point(V3ARGS(v2));
+           section.write_cone(1, 2, ro1, ro2, ri1, ri2);
            break;
        }
 
        case ID_ARB8: {
            const rt_arb_internal &arb = *static_cast<rt_arb_internal 
*>(internal.idb_ptr);
            RT_ARB_CK_MAGIC(&arb);
-           data.m_current_section->add_hexahedron(name, arb.pt);
+           FastgenWriter::SectionWriter section(data.m_writer, name, true);
+
+           for (int i = 0; i < 8; ++i)
+               section.write_grid_point(V3ARGS(arb.pt[i]));
+
+           const std::size_t points[] = {1, 2, 3, 4, 5, 6, 7, 8};
+           section.write_hexahedron(points);
            break;
        }
 
        case ID_BOT: {
            const rt_bot_internal &bot = *static_cast<rt_bot_internal 
*>(internal.idb_ptr);
            RT_BOT_CK_MAGIC(&bot);
-           // FIXME solidity -- Section section(writer, name, bot.mode == 
RT_BOT_SOLID);
-           write_bot(name, *data.m_current_section, bot);
+           write_bot(data.m_writer, name, bot);
            break;
        }
 
@@ -782,7 +892,7 @@
 
     ConversionData &data = *static_cast<ConversionData *>(client_data);
 
-    const std::string name = AutoFreePtr<char>(db_path_to_string(path)).ptr;
+    AutoFreePtr<char> name(db_path_to_string(path));
 
     shell *vshell;
 
@@ -804,11 +914,9 @@
            char_color[0] = static_cast<unsigned char>(color[0] * 255.0 + 0.5);
            char_color[1] = static_cast<unsigned char>(color[1] * 255.0 + 0.5);
            char_color[2] = static_cast<unsigned char>(color[2] * 255.0 + 0.5);
-           // FIXME solidity -- Section section(writer, name, bot.mode == 
RT_BOT_SOLID, char_color);
-           write_bot(name, *data.m_current_section, *bot);
+           write_bot(data.m_writer, name.ptr, *bot, char_color);
        } catch (const std::runtime_error &e) {
-           bu_log("FAILURE: write_bot() failed on object '%s': %s\n", 
name.c_str(),
-                  e.what());
+           bu_log("FAILURE: write_bot() failed on object '%s': %s\n", 
name.ptr, e.what());
        }
 
        internal.idb_meth->ft_ifree(&internal);
@@ -816,21 +924,6 @@
 }
 
 
-HIDDEN int
-region_start(db_tree_state *tree_state, const db_full_path *path,
-            const rt_comb_internal *comb_internal, void *client_data)
-{
-    RT_CK_DBTS(tree_state);
-    RT_CK_FULL_PATH(path);
-    RT_CK_COMB(comb_internal);
-
-    ConversionData &data = *static_cast<ConversionData *>(client_data);
-    const std::string name = AutoFreePtr<char>(db_path_to_string(path)).ptr;
-
-    return 1;
-}
-
-
 HIDDEN tree *
 convert_leaf(db_tree_state *tree_state, const db_full_path *path,
             rt_db_internal *internal, void *client_data)
@@ -840,13 +933,11 @@
     RT_CK_DB_INTERNAL(internal);
 
     ConversionData &data = *static_cast<ConversionData *>(client_data);
-    const std::string name = AutoFreePtr<char>(db_path_to_string(path)).ptr;
 
-    data.m_writer.write_comment(name);
-
     if (internal->idb_major_type != DB5_MAJORTYPE_BRLCAD)
        return NULL;
 
+    const std::string name = AutoFreePtr<char>(db_path_to_string(path)).ptr;
     bool converted = false;
 
     try {
@@ -878,6 +969,9 @@
     ConversionData &data = *static_cast<ConversionData *>(client_data);
     const std::string name = AutoFreePtr<char>(db_path_to_string(path)).ptr;
 
+    bu_log("Processing region: %s\n", name.c_str());
+    rt_pr_tree(current_tree, 0);
+
     gcv_region_end_data gcv_data = {write_nmg_region, &data};
     return gcv_region_end(tree_state, path, current_tree, &gcv_data);
 }
@@ -897,7 +991,7 @@
 
     const rt_tess_tol ttol = {RT_TESS_TOL_MAGIC, 0.0, 0.01, 0.0};
     const bn_tol tol = {BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST * BN_TOL_DIST, 
1e-6, 1 - 1e-6};
-    ConversionData conv_data = {writer, tol, convert_primitives, NULL, *dbip, 
std::set<std::string>()};
+    ConversionData conv_data = {writer, tol, convert_primitives, *dbip, 
std::set<std::string>()};
 
     {
        model *vmodel;
@@ -913,10 +1007,8 @@
        bu_free(results, "tops");
 
        vmodel = nmg_mm();
-       conv_data.m_current_section = new Section(writer, "global section", 
true);
        db_walk_tree(dbip, num_objects, const_cast<const char 
**>(object_names.ptr), 1,
-                    &initial_tree_state, region_start, convert_region, 
convert_leaf, &conv_data);
-       delete conv_data.m_current_section;
+                    &initial_tree_state, NULL, convert_region, convert_leaf, 
&conv_data);
        nmg_km(vmodel);
     }
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to