mirror of https://github.com/KLayout/klayout.git
Many bug fixes after refactoring.
This commit is contained in:
parent
ec638c87b4
commit
b9b00a08b5
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in New Issue