Edges#each, Edges#each_merged, Region#each, Region#each_merged, Texts#each and EdgePairs#each now deliver objects with properties too.

This commit is contained in:
Matthias Koefferlein 2025-02-14 22:11:18 +01:00
parent 502346608f
commit e48c6f3660
9 changed files with 96 additions and 19 deletions

View File

@ -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 ());

View File

@ -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<db::EdgePairWithProperties> begin_edge_pairs (const db::EdgePairs *edge_pairs)
{
return db::generic_shape_iterator<db::EdgePairWithProperties> (db::make_wp_iter (edge_pairs->delegate ()->begin ()));
}
extern Class<db::ShapeCollection> decl_dbShapeCollection;
Class<db::EdgePairs> decl_EdgePairs (decl_dbShapeCollection, "db", "EdgePairs",
@ -1499,8 +1504,10 @@ Class<db::EdgePairs> 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"

View File

@ -745,6 +745,15 @@ static std::vector<db::Edges> 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<db::EdgeWithProperties> begin_edges (const db::Edges *edges)
{
return db::generic_shape_iterator<db::EdgeWithProperties> (db::make_wp_iter (edges->delegate ()->begin ()));
}
static db::generic_shape_iterator<db::EdgeWithProperties> begin_edges_merged (const db::Edges *edges)
{
return db::generic_shape_iterator<db::EdgeWithProperties> (db::make_wp_iter (edges->delegate ()->begin_merged ()));
}
extern Class<db::ShapeCollection> decl_dbShapeCollection;
@ -2266,15 +2275,18 @@ Class<db::Edges> 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"

View File

@ -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<db::PolygonWithProperties> begin_region (const db::Region *region)
{
return db::generic_shape_iterator<db::PolygonWithProperties> (db::make_wp_iter (region->delegate ()->begin ()));
}
static db::generic_shape_iterator<db::PolygonWithProperties> begin_region_merged (const db::Region *region)
{
return db::generic_shape_iterator<db::PolygonWithProperties> (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<db::Region> 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"

View File

@ -362,6 +362,11 @@ static db::Region pull_interacting (const db::Texts *r, const db::Region &other)
return out;
}
static db::generic_shape_iterator<db::TextWithProperties> begin_texts (const db::Texts *texts)
{
return db::generic_shape_iterator<db::TextWithProperties> (db::make_wp_iter (texts->delegate ()->begin ()));
}
extern Class<db::ShapeCollection> decl_dbShapeCollection;
Class<db::Texts> decl_Texts (decl_dbShapeCollection, "db", "Texts",
@ -721,8 +726,10 @@ Class<db::Texts> 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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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