Many bug fixes after refactoring.

This commit is contained in:
Matthias Koefferlein 2018-11-09 01:14:22 +01:00
parent ec638c87b4
commit b9b00a08b5
8 changed files with 55 additions and 20 deletions

View File

@ -386,9 +386,11 @@ AsIfFlatEdges::extended (coord_type ext_b, coord_type ext_e, coord_type ext_o, c
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ()); db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());
scanner.reserve (size ()); scanner.reserve (size ());
AddressableEdgeDelivery e (begin (), has_valid_edges ());
size_t n = 0; size_t n = 0;
for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { for ( ; ! e.at_end (); ++e) {
scanner.insert (&*e, n); scanner.insert (e.operator-> (), n);
++n; ++n;
} }
@ -743,16 +745,21 @@ AsIfFlatEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Co
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ()); db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());
scanner.reserve (size () + (other ? other->size () : 0)); scanner.reserve (size () + (other ? other->size () : 0));
AddressableEdgeDelivery e (begin_merged (), has_valid_edges ());
size_t n = 0; size_t n = 0;
for (EdgesIterator e (begin_merged ()); ! e.at_end (); ++e) { for ( ; ! e.at_end (); ++e) {
scanner.insert (&*e, n); scanner.insert (e.operator-> (), n);
n += 2; n += 2;
} }
AddressableEdgeDelivery ee;
if (other) { if (other) {
ee = other->addressable_merged_edges ();
n = 1; n = 1;
for (EdgesIterator e (other->begin_merged ()); ! e.at_end (); ++e) { for ( ; ! ee.at_end (); ++ee) {
scanner.insert (&*e, n); scanner.insert (ee.operator-> (), n);
n += 2; n += 2;
} }
} }
@ -779,15 +786,21 @@ AsIfFlatEdges::boolean (const Edges *other, EdgeBoolOp op) const
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ()); db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());
scanner.reserve (size () + (other ? other->size () : 0)); scanner.reserve (size () + (other ? other->size () : 0));
for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { AddressableEdgeDelivery e (begin (), has_valid_edges ());
for ( ; ! e.at_end (); ++e) {
if (! e->is_degenerate ()) { if (! e->is_degenerate ()) {
scanner.insert (&*e, 0); scanner.insert (e.operator-> (), 0);
} }
} }
AddressableEdgeDelivery ee;
if (other) { if (other) {
for (EdgesIterator e (other->begin ()); ! e.at_end (); ++e) { ee = other->addressable_edges ();
if (! e->is_degenerate ()) { for ( ; ! ee.at_end (); ++ee) {
scanner.insert (&*e, 1); if (! ee->is_degenerate ()) {
scanner.insert (ee.operator-> (), 1);
} }
} }
} }

View File

@ -873,7 +873,7 @@ public:
*/ */
Edges operator- (const Region &other) const Edges operator- (const Region &other) const
{ {
return Edges (mp_delegate->and_with (other)); return Edges (mp_delegate->not_with (other));
} }
/** /**
@ -883,7 +883,7 @@ public:
*/ */
Edges &operator-= (const Region &other) Edges &operator-= (const Region &other)
{ {
set_delegate (mp_delegate->and_with (other)); set_delegate (mp_delegate->not_with (other));
return *this; return *this;
} }

View File

@ -106,7 +106,7 @@ FlatEdges::ensure_merged_edges_valid () const
m_merged_edges.clear (); m_merged_edges.clear ();
db::Shapes tmp; db::Shapes tmp (false);
EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr); EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr);
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ()); db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());

View File

@ -139,6 +139,13 @@ OriginalLayerEdges::clone () const
return new OriginalLayerEdges (*this); return new OriginalLayerEdges (*this);
} }
void
OriginalLayerEdges::merged_semantics_changed ()
{
m_merged_edges.clear ();
m_merged_edges_valid = false;
}
EdgesIteratorDelegate * EdgesIteratorDelegate *
OriginalLayerEdges::begin () const OriginalLayerEdges::begin () const
{ {
@ -245,15 +252,17 @@ OriginalLayerEdges::ensure_merged_edges_valid () const
m_merged_edges.clear (); m_merged_edges.clear ();
db::Shapes tmp; db::Shapes tmp (false);
EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr); EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr);
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ()); db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());
scanner.reserve (size ()); scanner.reserve (size ());
for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { AddressableEdgeDelivery e (begin (), has_valid_edges ());
for ( ; ! e.at_end (); ++e) {
if (! e->is_degenerate ()) { if (! e->is_degenerate ()) {
scanner.insert (&*e, 0); scanner.insert (e.operator-> (), 0);
} }
} }

View File

@ -66,6 +66,9 @@ public:
virtual bool equals (const Edges &other) const; virtual bool equals (const Edges &other) const;
virtual bool less (const Edges &other) const; virtual bool less (const Edges &other) const;
protected:
virtual void merged_semantics_changed ();
private: private:
OriginalLayerEdges &operator= (const OriginalLayerEdges &other); OriginalLayerEdges &operator= (const OriginalLayerEdges &other);

View File

@ -139,6 +139,13 @@ OriginalLayerRegion::clone () const
return new OriginalLayerRegion (*this); return new OriginalLayerRegion (*this);
} }
void
OriginalLayerRegion::merged_semantics_changed ()
{
m_merged_polygons.clear ();
m_merged_polygons_valid = false;
}
RegionIteratorDelegate * RegionIteratorDelegate *
OriginalLayerRegion::begin () const OriginalLayerRegion::begin () const
{ {

View File

@ -64,6 +64,9 @@ public:
virtual bool equals (const Region &other) const; virtual bool equals (const Region &other) const;
virtual bool less (const Region &other) const; virtual bool less (const Region &other) const;
protected:
virtual void merged_semantics_changed ();
private: private:
OriginalLayerRegion &operator= (const OriginalLayerRegion &other); OriginalLayerRegion &operator= (const OriginalLayerRegion &other);

View File

@ -53,7 +53,7 @@ TEST(1)
EXPECT_EQ (r.bbox ().to_string (), "(0,0;100,200)"); EXPECT_EQ (r.bbox ().to_string (), "(0,0;100,200)");
EXPECT_EQ (r.transformed (db::Trans (db::Vector (1, 2))).bbox ().to_string (), "(1,2;101,202)"); EXPECT_EQ (r.transformed (db::Trans (db::Vector (1, 2))).bbox ().to_string (), "(1,2;101,202)");
EXPECT_EQ (r.empty (), false); EXPECT_EQ (r.empty (), false);
EXPECT_EQ (r.is_merged (), false); EXPECT_EQ (r.is_merged (), true);
EXPECT_EQ (r.begin ().at_end (), false); EXPECT_EQ (r.begin ().at_end (), false);
db::Edges r1 = r; db::Edges r1 = r;
@ -638,7 +638,7 @@ TEST(20)
EXPECT_EQ (r1.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20);(160,80;160,140);(220,80;160,80)"); EXPECT_EQ (r1.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20);(160,80;160,140);(220,80;160,80)");
EXPECT_EQ (r1.has_valid_edges (), false); EXPECT_EQ (r1.has_valid_edges (), false);
EXPECT_EQ (r1.length (), db::Edges::length_type (200)); EXPECT_EQ (r1.length (), db::Edges::length_type (200));
EXPECT_EQ (r1.has_valid_edges (), true); // length, since merging, will implicitly convert to valid edges EXPECT_EQ (r1.has_valid_edges (), false);
EXPECT_EQ (r1.bbox ().to_string (), "(120,20;220,140)"); EXPECT_EQ (r1.bbox ().to_string (), "(120,20;220,140)");
EXPECT_EQ (r1.size (), size_t (6)); EXPECT_EQ (r1.size (), size_t (6));
EXPECT_EQ (r1.empty (), false); EXPECT_EQ (r1.empty (), false);
@ -649,7 +649,7 @@ TEST(20)
EXPECT_EQ (rr.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20)"); EXPECT_EQ (rr.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20)");
db::Edges r2 = r1; db::Edges r2 = r1;
EXPECT_EQ (r2.has_valid_edges (), true); EXPECT_EQ (r2.has_valid_edges (), false);
EXPECT_EQ (r2.length (), db::Edges::length_type (200)); EXPECT_EQ (r2.length (), db::Edges::length_type (200));
EXPECT_EQ (r2.bbox ().to_string (), "(120,20;220,140)"); EXPECT_EQ (r2.bbox ().to_string (), "(120,20;220,140)");
EXPECT_EQ (r2.size (), size_t (6)); EXPECT_EQ (r2.size (), size_t (6));