Revision: 73856
          http://sourceforge.net/p/brlcad/code/73856
Author:   starseeker
Date:     2019-09-07 23:01:42 +0000 (Sat, 07 Sep 2019)
Log Message:
-----------
move the iteration down into the initialize_edge_segs function.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt.cpp
    brlcad/trunk/src/libbrep/cdt.h
    brlcad/trunk/src/libbrep/cdt_edge.cpp

Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp    2019-09-07 22:51:47 UTC (rev 73855)
+++ brlcad/trunk/src/libbrep/cdt.cpp    2019-09-07 23:01:42 UTC (rev 73856)
@@ -510,16 +510,9 @@
        }
 
        // Do the non-tolerance based initialization splits.
-       for (epoly_it = s_cdt->e2polysegs.begin(); epoly_it != 
s_cdt->e2polysegs.end(); epoly_it++) {
-           std::set<cdt_mesh::bedge_seg_t *>::iterator seg_it;
-           std::set<cdt_mesh::bedge_seg_t *> wsegs = epoly_it->second;
-           for (seg_it = wsegs.begin(); seg_it != wsegs.end(); seg_it++) {
-               cdt_mesh::bedge_seg_t *bseg = *seg_it;
-
-               if (!initialize_edge_segs(s_cdt, bseg)) {
-                   std::cout << "Initialization failed for edge " << 
epoly_it->first << "\n";
-               }
-           }
+       if (!initialize_edge_segs(s_cdt)) {
+           std::cout << "Initialization failed for edges\n";
+           return -1;
        }
 
        // Check the CDT meshing - at this point, we should be able to produce

Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h      2019-09-07 22:51:47 UTC (rev 73855)
+++ brlcad/trunk/src/libbrep/cdt.h      2019-09-07 23:01:42 UTC (rev 73856)
@@ -190,7 +190,7 @@
 std::set<cdt_mesh::cpolyedge_t *>
 split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce);
 
-bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt, 
cdt_mesh::bedge_seg_t *e);
+bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt);
 std::vector<int> characterize_edges(struct ON_Brep_CDT_State *s_cdt);
 void initialize_edge_containers(struct ON_Brep_CDT_State *s_cdt);
 bool initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt, 
std::set<cdt_mesh::cpolyedge_t *> *singular_edges);

Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-07 22:51:47 UTC (rev 
73855)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-07 23:01:42 UTC (rev 
73856)
@@ -882,67 +882,77 @@
 // beginning regardless of tolerance settings.  Do them up front so the 
subsequent
 // working set has consistent properties.
 bool
-initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::bedge_seg_t *e)
+initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt)
 {
-    ON_BrepEdge& edge = s_cdt->brep->m_E[e->edge_ind];
-    ON_BrepTrim *trim1 = edge.Trim(0);
-    ON_BrepTrim *trim2 = edge.Trim(1);
-    std::set<cdt_mesh::bedge_seg_t *> esegs_closed;
+    std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator epoly_it;
+    for (epoly_it = s_cdt->e2polysegs.begin(); epoly_it != 
s_cdt->e2polysegs.end(); epoly_it++) {
+       std::set<cdt_mesh::bedge_seg_t *>::iterator seg_it;
+       std::set<cdt_mesh::bedge_seg_t *> wsegs = epoly_it->second;
+       for (seg_it = wsegs.begin(); seg_it != wsegs.end(); seg_it++) {
+           cdt_mesh::bedge_seg_t *e = *seg_it;
 
-    if (!trim1 || !trim2) return false;
 
-    if (trim1->m_type == ON_BrepTrim::singular || trim1->m_type == 
ON_BrepTrim::singular) return false;
+           ON_BrepEdge& edge = s_cdt->brep->m_E[e->edge_ind];
+           ON_BrepTrim *trim1 = edge.Trim(0);
+           ON_BrepTrim *trim2 = edge.Trim(1);
+           std::set<cdt_mesh::bedge_seg_t *> esegs_closed;
 
-    // 1.  Any edges with at least 1 closed trim are split.
-    if (trim1->IsClosed() || trim2->IsClosed()) {
-       esegs_closed = split_edge_seg(s_cdt, e, 1);
-       if (!esegs_closed.size()) {
-           // split failed??  On a closed edge this is fatal - we must split it
-           // to work with it at all
-           return false;
-       }
-    } else {
-       esegs_closed.insert(e);
-    }
+           if (!trim1 || !trim2) return false;
 
-    // 2.  Any edges with a non-linear edge curve are split.  (If non-linear
-    // and closed, split again - a curved, closed curve must be split twice
-    // to have chance of producing a non-degenerate polygon.)
-    std::set<cdt_mesh::bedge_seg_t *> esegs_csplit;
-    const ON_Curve* crv = edge.EdgeCurveOf();
-    if (!crv->IsLinear(BN_TOL_DIST)) {
-       std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
-       for (e_it = esegs_closed.begin(); e_it != esegs_closed.end(); e_it++) {
-           std::set<cdt_mesh::bedge_seg_t *> efirst = split_edge_seg(s_cdt, 
*e_it, 1);
-           if (!efirst.size()) {
-               // split failed??  On a curved edge we must split at least once 
to
-               // avoid potentially degenerate polygons (if we had to split a 
closed
-               // loop from step 1, for example;
-               return false;
+           if (trim1->m_type == ON_BrepTrim::singular || trim1->m_type == 
ON_BrepTrim::singular) return false;
+
+           // 1.  Any edges with at least 1 closed trim are split.
+           if (trim1->IsClosed() || trim2->IsClosed()) {
+               esegs_closed = split_edge_seg(s_cdt, e, 1);
+               if (!esegs_closed.size()) {
+                   // split failed??  On a closed edge this is fatal - we must 
split it
+                   // to work with it at all
+                   return false;
+               }
            } else {
-               // To avoid representing circles with squares, split curved 
segments
-               // one additional time
-               std::set<cdt_mesh::bedge_seg_t *>::iterator s_it;
-               for (s_it = efirst.begin(); s_it != efirst.end(); s_it++) {
-                   std::set<cdt_mesh::bedge_seg_t *> etmp = 
split_edge_seg(s_cdt, *s_it, 1);
-                   if (!etmp.size()) {
-                       // split failed??  This isn't good and shouldn't
-                       // happen, but it's not fatal the way the previous two
-                       // failure cases are...
-                       esegs_csplit.insert(*s_it);
+               esegs_closed.insert(e);
+           }
+
+           // 2.  Any edges with a non-linear edge curve are split.  (If 
non-linear
+           // and closed, split again - a curved, closed curve must be split 
twice
+           // to have chance of producing a non-degenerate polygon.)
+           std::set<cdt_mesh::bedge_seg_t *> esegs_csplit;
+           const ON_Curve* crv = edge.EdgeCurveOf();
+           if (!crv->IsLinear(BN_TOL_DIST)) {
+               std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
+               for (e_it = esegs_closed.begin(); e_it != esegs_closed.end(); 
e_it++) {
+                   std::set<cdt_mesh::bedge_seg_t *> efirst = 
split_edge_seg(s_cdt, *e_it, 1);
+                   if (!efirst.size()) {
+                       // split failed??  On a curved edge we must split at 
least once to
+                       // avoid potentially degenerate polygons (if we had to 
split a closed
+                       // loop from step 1, for example;
+                       return false;
                    } else {
-                       esegs_csplit.insert(etmp.begin(), etmp.end());
+                       // To avoid representing circles with squares, split 
curved segments
+                       // one additional time
+                       std::set<cdt_mesh::bedge_seg_t *>::iterator s_it;
+                       for (s_it = efirst.begin(); s_it != efirst.end(); 
s_it++) {
+                           std::set<cdt_mesh::bedge_seg_t *> etmp = 
split_edge_seg(s_cdt, *s_it, 1);
+                           if (!etmp.size()) {
+                               // split failed??  This isn't good and shouldn't
+                               // happen, but it's not fatal the way the 
previous two
+                               // failure cases are...
+                               esegs_csplit.insert(*s_it);
+                           } else {
+                               esegs_csplit.insert(etmp.begin(), etmp.end());
+                           }
+                       }
                    }
                }
+           } else {
+               esegs_csplit = esegs_closed;
            }
+
+           s_cdt->e2polysegs[edge.m_edge_index].clear();
+           s_cdt->e2polysegs[edge.m_edge_index].insert(esegs_csplit.begin(), 
esegs_csplit.end());
        }
-    } else {
-       esegs_csplit = esegs_closed;
     }
 
-    s_cdt->e2polysegs[edge.m_edge_index].clear();
-    s_cdt->e2polysegs[edge.m_edge_index].insert(esegs_csplit.begin(), 
esegs_csplit.end());
-
     return true;
 }
 

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