From e48c6f3660cefcccba5a3c4108ffaa9b3f2351dc Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 14 Feb 2025 22:11:18 +0100 Subject: [PATCH] Edges#each, Edges#each_merged, Region#each, Region#each_merged, Texts#each and EdgePairs#each now deliver objects with properties too. --- src/db/db/dbFlatEdges.cc | 2 +- src/db/db/gsiDeclDbEdgePairs.cc | 9 ++++++++- src/db/db/gsiDeclDbEdges.cc | 16 ++++++++++++++-- src/db/db/gsiDeclDbRegion.cc | 17 +++++++++++++++-- src/db/db/gsiDeclDbTexts.cc | 9 ++++++++- testdata/ruby/dbEdgePairsTest.rb | 6 ++++++ testdata/ruby/dbEdgesTest.rb | 28 ++++++++++++++++++++++------ testdata/ruby/dbRegionTest.rb | 22 ++++++++++++++++------ testdata/ruby/dbTextsTest.rb | 6 ++++++ 9 files changed, 96 insertions(+), 19 deletions(-) diff --git a/src/db/db/dbFlatEdges.cc b/src/db/db/dbFlatEdges.cc index cae04d9cf..dbd40a87a 100644 --- a/src/db/db/dbFlatEdges.cc +++ b/src/db/db/dbFlatEdges.cc @@ -127,7 +127,7 @@ FlatEdges::ensure_merged_edges_valid () const if (! need_split_props) { - EdgeBooleanClusterCollectorToShapes cluster_collector (&tmp, EdgeOr); + EdgeBooleanClusterCollectorToShapes cluster_collector (&tmp, EdgeOr, prop_id); scanner.reserve (mp_edges->size ()); diff --git a/src/db/db/gsiDeclDbEdgePairs.cc b/src/db/db/gsiDeclDbEdgePairs.cc index e5717d08d..3ac118dd5 100644 --- a/src/db/db/gsiDeclDbEdgePairs.cc +++ b/src/db/db/gsiDeclDbEdgePairs.cc @@ -577,6 +577,11 @@ static db::EdgePairs with_area2 (const db::EdgePairs *r, db::EdgePair::area_type return r->filtered (f); } +static db::generic_shape_iterator begin_edge_pairs (const db::EdgePairs *edge_pairs) +{ + return db::generic_shape_iterator (db::make_wp_iter (edge_pairs->delegate ()->begin ())); +} + extern Class decl_dbShapeCollection; Class decl_EdgePairs (decl_dbShapeCollection, "db", "EdgePairs", @@ -1499,8 +1504,10 @@ Class decl_EdgePairs (decl_dbShapeCollection, "db", "EdgePairs", "\n" "This method has been introduced in version 0.27." ) + - gsi::iterator ("each", &db::EdgePairs::begin, + gsi::iterator_ext ("each", &begin_edge_pairs, "@brief Returns each edge pair of the edge pair collection\n" + "\n" + "Starting with version 0.30, the iterator delivers EdgePairWithProperties objects." ) + method ("[]", &db::EdgePairs::nth, gsi::arg ("n"), "@brief Returns the nth edge pair\n" diff --git a/src/db/db/gsiDeclDbEdges.cc b/src/db/db/gsiDeclDbEdges.cc index 73dc5be84..0d8f307ad 100644 --- a/src/db/db/gsiDeclDbEdges.cc +++ b/src/db/db/gsiDeclDbEdges.cc @@ -745,6 +745,15 @@ static std::vector split_interacting_with_region (const db::Edges *r, return as_2edges_vector (r->selected_interacting_differential (other, min_count, max_count)); } +static db::generic_shape_iterator begin_edges (const db::Edges *edges) +{ + return db::generic_shape_iterator (db::make_wp_iter (edges->delegate ()->begin ())); +} + +static db::generic_shape_iterator begin_edges_merged (const db::Edges *edges) +{ + return db::generic_shape_iterator (db::make_wp_iter (edges->delegate ()->begin_merged ())); +} extern Class decl_dbShapeCollection; @@ -2266,15 +2275,18 @@ Class decl_Edges (decl_dbShapeCollection, "db", "Edges", "\n" "This method has been introduced in version 0.27." ) + - gsi::iterator ("each", &db::Edges::begin, + gsi::iterator_ext ("each", &begin_edges, "@brief Returns each edge of the region\n" + "\n" + "Starting with version 0.30, the iterator delivers an EdgeWithProperties object." ) + - gsi::iterator ("each_merged", &db::Edges::begin_merged, + gsi::iterator_ext ("each_merged", &begin_edges_merged, "@brief Returns each edge of the region\n" "\n" "In contrast to \\each, this method delivers merged edges if merge semantics applies while \\each delivers the original edges only.\n" "\n" "This method has been introduced in version 0.25." + "Starting with version 0.30, the iterator delivers an EdgeWithProperties object." ) + method ("[]", &db::Edges::nth, gsi::arg ("n"), "@brief Returns the nth edge of the collection\n" diff --git a/src/db/db/gsiDeclDbRegion.cc b/src/db/db/gsiDeclDbRegion.cc index 4b41acf78..b3cb7bcff 100644 --- a/src/db/db/gsiDeclDbRegion.cc +++ b/src/db/db/gsiDeclDbRegion.cc @@ -1168,6 +1168,16 @@ rasterize1 (const db::Region *region, const db::Point &origin, const db::Vector return rasterize2 (region, origin, pixel_size, pixel_size, nx, ny); } +static db::generic_shape_iterator begin_region (const db::Region *region) +{ + return db::generic_shape_iterator (db::make_wp_iter (region->delegate ()->begin ())); +} + +static db::generic_shape_iterator begin_region_merged (const db::Region *region) +{ + return db::generic_shape_iterator (db::make_wp_iter (region->delegate ()->begin_merged ())); +} + static tl::Variant begin_shapes_rec (const db::Region *region) { auto res = region->begin_iter (); @@ -3725,15 +3735,18 @@ Class decl_Region (decl_dbShapeCollection, "db", "Region", "\n" "This method has been introduced in version 0.27." ) + - iterator ("each", &db::Region::begin, + iterator_ext ("each", &begin_region, "@brief Returns each polygon of the region\n" "\n" "This returns the raw polygons (not merged polygons if merged semantics is enabled).\n" + "\n" + "Starting with version 0.30, the iterator delivers a RegionWithProperties object." ) + - iterator ("each_merged", &db::Region::begin_merged, + iterator_ext ("each_merged", &begin_region_merged, "@brief Returns each merged polygon of the region\n" "\n" "This returns the raw polygons if merged semantics is disabled or the merged ones if merged semantics is enabled.\n" + "Starting with version 0.30, the iterator delivers a RegionWithProperties object." ) + method ("[]", &db::Region::nth, gsi::arg ("n"), "@brief Returns the nth polygon of the region\n" diff --git a/src/db/db/gsiDeclDbTexts.cc b/src/db/db/gsiDeclDbTexts.cc index 7cef8695e..0de49ade6 100644 --- a/src/db/db/gsiDeclDbTexts.cc +++ b/src/db/db/gsiDeclDbTexts.cc @@ -362,6 +362,11 @@ static db::Region pull_interacting (const db::Texts *r, const db::Region &other) return out; } +static db::generic_shape_iterator begin_texts (const db::Texts *texts) +{ + return db::generic_shape_iterator (db::make_wp_iter (texts->delegate ()->begin ())); +} + extern Class decl_dbShapeCollection; Class decl_Texts (decl_dbShapeCollection, "db", "Texts", @@ -721,8 +726,10 @@ Class decl_Texts (decl_dbShapeCollection, "db", "Texts", "\n" "This method has been introduced in version 0.27." ) + - gsi::iterator ("each", &db::Texts::begin, + gsi::iterator_ext ("each", &begin_texts, "@brief Returns each text of the text collection\n" + "\n" + "Starting with version 0.30, the iterator delivers TextWithProperties objects." ) + method ("[]", &db::Texts::nth, gsi::arg ("n"), "@brief Returns the nth text\n" diff --git a/testdata/ruby/dbEdgePairsTest.rb b/testdata/ruby/dbEdgePairsTest.rb index ada31d850..829b28d95 100644 --- a/testdata/ruby/dbEdgePairsTest.rb +++ b/testdata/ruby/dbEdgePairsTest.rb @@ -590,6 +590,12 @@ class DBEdgePairs_TestClass < TestBase r.insert(RBA::EdgePairWithProperties::new(RBA::EdgePair::new(RBA::Edge::new(0, 0, 100, 100), RBA::Edge::new(200, 300, 200, 500)), { 1 => "one" })) assert_equal(r.to_s, "(0,0;100,100)/(200,300;200,500){1=>one}") + r = RBA::EdgePairs::new + r.insert(RBA::EdgePairWithProperties::new(RBA::EdgePair::new(RBA::Edge::new(0, 0, 100, 100), RBA::Edge::new(200, 300, 200, 500)), { 1 => "one" })) + r.insert(RBA::EdgePair::new(RBA::Edge::new(0, 10, 100, 110), RBA::Edge::new(220, 300, 220, 500))) + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "(0,10;100,110)/(220,300;220,500) props={};(0,0;100,100)/(200,300;200,500) props={1=>one}") + end end diff --git a/testdata/ruby/dbEdgesTest.rb b/testdata/ruby/dbEdgesTest.rb index 2e17948a4..590c247a9 100644 --- a/testdata/ruby/dbEdgesTest.rb +++ b/testdata/ruby/dbEdgesTest.rb @@ -129,12 +129,8 @@ class DBEdges_TestClass < TestBase r.assign(RBA::Edges::new(RBA::Box::new(10, 20, 100, 200))) assert_equal(csort(r.to_s), csort("(10,20;10,200);(10,200;100,200);(100,200;100,20);(100,20;10,20)")) - s = "" - r.each do |e| - s.empty? || s += ";" - s += e.to_s - end - assert_equal(s, "(10,20;10,200);(10,200;100,200);(100,200;100,20);(100,20;10,20)") + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "(10,20;10,200) props={};(10,200;100,200) props={};(100,200;100,20) props={};(100,20;10,20) props={}") assert_equal(r.is_empty?, false) assert_equal(r.count, 4) assert_equal(r.hier_count, 4) @@ -1019,6 +1015,26 @@ class DBEdges_TestClass < TestBase r.insert(s) assert_equal(r.to_s, "(0,0;100,100){1=>one}") + r = RBA::Edges::new + s = RBA::Shapes::new + s.insert(RBA::EdgeWithProperties::new(RBA::Edge::new(0, 0, 100, 100), { 1 => "one" })) + r.insert(s) + assert_equal(r.to_s, "(0,0;100,100){1=>one}") + + r = RBA::Edges::new + r.insert(RBA::EdgeWithProperties::new(RBA::Edge::new(0, 0, 100, 0), { 1 => "one" })) + r.insert(RBA::Edge::new(10, 0, 110, 0)) + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "(10,0;110,0) props={};(0,0;100,0) props={1=>one}") + s = r.each_merged.collect(&:to_s).join(";") + assert_equal(s, "(10,0;110,0) props={};(0,0;100,0) props={1=>one}") + + r = RBA::Edges::new + r.insert(RBA::EdgeWithProperties::new(RBA::Edge::new(0, 0, 100, 0), { 1 => "one" })) + r.insert(RBA::EdgeWithProperties::new(RBA::Edge::new(10, 0, 110, 0), { 1 => "one" })) + s = r.each_merged.collect(&:to_s).join(";") + assert_equal(s, "(0,0;110,0) props={1=>one}") + end end diff --git a/testdata/ruby/dbRegionTest.rb b/testdata/ruby/dbRegionTest.rb index 78ee4766c..9cb46a1dd 100644 --- a/testdata/ruby/dbRegionTest.rb +++ b/testdata/ruby/dbRegionTest.rb @@ -180,12 +180,8 @@ class DBRegion_TestClass < TestBase RBA::Polygon::new(RBA::Box::new(20, 50, 120, 250)) ] ) assert_equal(csort(r.to_s), csort("(10,20;10,200;100,200;100,20);(20,50;20,250;120,250;120,50)")) - s = "" - r.each do |p| - s.empty? || s += ";" - s += p.to_s - end - assert_equal(s, "(10,20;10,200;100,200;100,20);(20,50;20,250;120,250;120,50)") + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "(10,20;10,200;100,200;100,20) props={};(20,50;20,250;120,250;120,50) props={}") assert_equal(r.merged.to_s, "(10,20;10,200;20,200;20,250;120,250;120,50;100,50;100,20)") assert_equal(r.merged(false, 1).to_s, "(10,20;10,200;20,200;20,250;120,250;120,50;100,50;100,20)") assert_equal(r.merged(1).to_s, "(10,20;10,200;20,200;20,250;120,250;120,50;100,50;100,20)") @@ -1571,6 +1567,20 @@ class DBRegion_TestClass < TestBase r.insert(s) assert_equal(r.to_s, "(0,0;0,200;100,200;100,0){1=>one}") + r = RBA::Region::new + r.insert(RBA::BoxWithProperties::new(RBA::Box::new(0, 0, 100, 200), { 1 => "one" })) + r.insert(RBA::Box::new(10, 20, 110, 220)) + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "(10,20;10,220;110,220;110,20) props={};(0,0;0,200;100,200;100,0) props={1=>one}") + s = r.each_merged.collect(&:to_s).join(";") + assert_equal(s, "(10,20;10,220;110,220;110,20) props={};(0,0;0,200;100,200;100,0) props={1=>one}") + + r = RBA::Region::new + r.insert(RBA::BoxWithProperties::new(RBA::Box::new(0, 0, 100, 200), { 1 => "one" })) + r.insert(RBA::BoxWithProperties::new(RBA::Box::new(10, 20, 110, 220), { 1 => "one" })) + s = r.each_merged.collect(&:to_s).join(";") + assert_equal(s, "(0,0;0,200;10,200;10,220;110,220;110,20;100,20;100,0) props={1=>one}") + end end diff --git a/testdata/ruby/dbTextsTest.rb b/testdata/ruby/dbTextsTest.rb index af2061531..0ddfabc02 100644 --- a/testdata/ruby/dbTextsTest.rb +++ b/testdata/ruby/dbTextsTest.rb @@ -459,6 +459,12 @@ class DBTexts_TestClass < TestBase r.insert(RBA::TextWithProperties::new(RBA::Text::new("abc", RBA::Trans::new), { 1 => "one" })) assert_equal(r.to_s, "('abc',r0 0,0){1=>one}") + r = RBA::Texts::new + r.insert(RBA::TextWithProperties::new(RBA::Text::new("abc", RBA::Trans::new), { 1 => "one" })) + r.insert(RBA::Text::new("xuv", RBA::Trans::new)) + s = r.each.collect(&:to_s).join(";") + assert_equal(s, "('xuv',r0 0,0) props={};('abc',r0 0,0) props={1=>one}") + end end