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 ());
scanner.reserve (size ());
AddressableEdgeDelivery e (begin (), has_valid_edges ());
size_t n = 0;
for (EdgesIterator e (begin ()); ! e.at_end (); ++e) {
scanner.insert (&*e, n);
for ( ; ! e.at_end (); ++e) {
scanner.insert (e.operator-> (), 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 ());
scanner.reserve (size () + (other ? other->size () : 0));
AddressableEdgeDelivery e (begin_merged (), has_valid_edges ());
size_t n = 0;
for (EdgesIterator e (begin_merged ()); ! e.at_end (); ++e) {
scanner.insert (&*e, n);
for ( ; ! e.at_end (); ++e) {
scanner.insert (e.operator-> (), n);
n += 2;
}
AddressableEdgeDelivery ee;
if (other) {
ee = other->addressable_merged_edges ();
n = 1;
for (EdgesIterator e (other->begin_merged ()); ! e.at_end (); ++e) {
scanner.insert (&*e, n);
for ( ; ! ee.at_end (); ++ee) {
scanner.insert (ee.operator-> (), n);
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 ());
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 ()) {
scanner.insert (&*e, 0);
scanner.insert (e.operator-> (), 0);
}
}
AddressableEdgeDelivery ee;
if (other) {
for (EdgesIterator e (other->begin ()); ! e.at_end (); ++e) {
if (! e->is_degenerate ()) {
scanner.insert (&*e, 1);
ee = other->addressable_edges ();
for ( ; ! ee.at_end (); ++ee) {
if (! ee->is_degenerate ()) {
scanner.insert (ee.operator-> (), 1);
}
}
}

View File

@ -873,7 +873,7 @@ public:
*/
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)
{
set_delegate (mp_delegate->and_with (other));
set_delegate (mp_delegate->not_with (other));
return *this;
}

View File

@ -106,7 +106,7 @@ FlatEdges::ensure_merged_edges_valid () const
m_merged_edges.clear ();
db::Shapes tmp;
db::Shapes tmp (false);
EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr);
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);
}
void
OriginalLayerEdges::merged_semantics_changed ()
{
m_merged_edges.clear ();
m_merged_edges_valid = false;
}
EdgesIteratorDelegate *
OriginalLayerEdges::begin () const
{
@ -245,15 +252,17 @@ OriginalLayerEdges::ensure_merged_edges_valid () const
m_merged_edges.clear ();
db::Shapes tmp;
db::Shapes tmp (false);
EdgeBooleanClusterCollector<db::Shapes> cluster_collector (&tmp, EdgeOr);
db::box_scanner<db::Edge, size_t> scanner (report_progress (), progress_desc ());
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 ()) {
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 less (const Edges &other) const;
protected:
virtual void merged_semantics_changed ();
private:
OriginalLayerEdges &operator= (const OriginalLayerEdges &other);

View File

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

View File

@ -64,6 +64,9 @@ public:
virtual bool equals (const Region &other) const;
virtual bool less (const Region &other) const;
protected:
virtual void merged_semantics_changed ();
private:
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.transformed (db::Trans (db::Vector (1, 2))).bbox ().to_string (), "(1,2;101,202)");
EXPECT_EQ (r.empty (), false);
EXPECT_EQ (r.is_merged (), false);
EXPECT_EQ (r.is_merged (), true);
EXPECT_EQ (r.begin ().at_end (), false);
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.has_valid_edges (), false);
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.size (), size_t (6));
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)");
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.bbox ().to_string (), "(120,20;220,140)");
EXPECT_EQ (r2.size (), size_t (6));