From 5fa4d62da76c7826a821d5d6b9de5990dfad23d2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 15 Jan 2023 15:03:34 +0100 Subject: [PATCH] WIP: property support for transformation, filters, processors --- src/db/db/dbAsIfFlatEdgePairs.cc | 12 +++++++-- src/db/db/dbAsIfFlatRegion.cc | 18 ++++++++++--- src/db/db/dbAsIfFlatTexts.cc | 6 ++++- src/db/db/dbFlatEdges.cc | 42 ++++++++++++++++++++++++------ src/db/db/dbFlatEdges.h | 5 ++++ src/db/db/dbFlatRegion.cc | 32 +++++++++++++++++++---- src/db/db/dbFlatRegion.h | 5 ++++ src/db/db/dbObjectWithProperties.h | 9 +++++++ src/db/db/dbShapeCollectionUtils.h | 4 +-- 9 files changed, 112 insertions(+), 21 deletions(-) diff --git a/src/db/db/dbAsIfFlatEdgePairs.cc b/src/db/db/dbAsIfFlatEdgePairs.cc index 03ee70ac5..c6ca1e1d8 100644 --- a/src/db/db/dbAsIfFlatEdgePairs.cc +++ b/src/db/db/dbAsIfFlatEdgePairs.cc @@ -162,7 +162,11 @@ AsIfFlatEdgePairs::processed_to_polygons (const EdgePairToPolygonProcessorBase & res_polygons.clear (); filter.process (*e, res_polygons); for (std::vector::const_iterator pr = res_polygons.begin (); pr != res_polygons.end (); ++pr) { - region->insert (*pr); + if (e.prop_id () != 0) { + region->insert (db::PolygonWithProperties (*pr, e.prop_id ())); + } else { + region->insert (*pr); + } } } @@ -184,7 +188,11 @@ AsIfFlatEdgePairs::processed_to_edges (const EdgePairToEdgeProcessorBase &filter res_edges.clear (); filter.process (*e, res_edges); for (std::vector::const_iterator pr = res_edges.begin (); pr != res_edges.end (); ++pr) { - edges->insert (*pr); + if (e.prop_id () != 0) { + edges->insert (db::EdgeWithProperties (*pr, e.prop_id ())); + } else { + edges->insert (*pr); + } } } diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc index 8793397fa..432798ade 100644 --- a/src/db/db/dbAsIfFlatRegion.cc +++ b/src/db/db/dbAsIfFlatRegion.cc @@ -378,7 +378,11 @@ AsIfFlatRegion::processed (const PolygonProcessorBase &filter) const poly_res.clear (); filter.process (*p, poly_res); for (std::vector::const_iterator pr = poly_res.begin (); pr != poly_res.end (); ++pr) { - new_region->insert (*pr); + if (p.prop_id () != 0) { + new_region->insert (db::PolygonWithProperties (*pr, p.prop_id ())); + } else { + new_region->insert (*pr); + } } } @@ -401,7 +405,11 @@ AsIfFlatRegion::processed_to_edges (const PolygonToEdgeProcessorBase &filter) co edge_res.clear (); filter.process (*p, edge_res); for (std::vector::const_iterator er = edge_res.begin (); er != edge_res.end (); ++er) { - new_edges->insert (*er); + if (p.prop_id () != 0) { + new_edges->insert (db::EdgeWithProperties (*er, p.prop_id ())); + } else { + new_edges->insert (*er); + } } } @@ -424,7 +432,11 @@ AsIfFlatRegion::processed_to_edge_pairs (const PolygonToEdgePairProcessorBase &f edge_pair_res.clear (); filter.process (*p, edge_pair_res); for (std::vector::const_iterator epr = edge_pair_res.begin (); epr != edge_pair_res.end (); ++epr) { - new_edge_pairs->insert (*epr); + if (p.prop_id () != 0) { + new_edge_pairs->insert (db::EdgePairWithProperties (*epr, p.prop_id ())); + } else { + new_edge_pairs->insert (*epr); + } } } diff --git a/src/db/db/dbAsIfFlatTexts.cc b/src/db/db/dbAsIfFlatTexts.cc index 13ea13b0b..4f742cd36 100644 --- a/src/db/db/dbAsIfFlatTexts.cc +++ b/src/db/db/dbAsIfFlatTexts.cc @@ -179,7 +179,11 @@ AsIfFlatTexts::processed_to_polygons (const TextToPolygonProcessorBase &filter) res_polygons.clear (); filter.process (*e, res_polygons); for (std::vector::const_iterator pr = res_polygons.begin (); pr != res_polygons.end (); ++pr) { - region->insert (*pr); + if (e.prop_id () != 0) { + region->insert (db::PolygonWithProperties (*pr, e.prop_id ())); + } else { + region->insert (*pr); + } } } diff --git a/src/db/db/dbFlatEdges.cc b/src/db/db/dbFlatEdges.cc index 24190cfa7..ec0023b0c 100644 --- a/src/db/db/dbFlatEdges.cc +++ b/src/db/db/dbFlatEdges.cc @@ -192,23 +192,36 @@ FlatEdges::processed_in_place (const EdgeProcessorBase &filter) db::Shapes &e = *mp_edges; edge_iterator_type pw = e.get_layer ().begin (); + edge_iterator_wp_type pw_wp = e.get_layer ().begin (); + for (EdgesIterator p (filter.requires_raw_input () ? begin () : begin_merged ()); ! p.at_end (); ++p) { edge_res.clear (); filter.process (*p, edge_res); for (std::vector::const_iterator pr = edge_res.begin (); pr != edge_res.end (); ++pr) { - if (pw == e.get_layer ().end ()) { - e.get_layer ().insert (*pr); - pw = e.get_layer ().end (); + if (p.prop_id () != 0) { + if (pw_wp == e.get_layer ().end ()) { + e.get_layer ().insert (db::EdgeWithProperties (*pr, p.prop_id ())); + pw_wp = e.get_layer ().end (); + } else { + e.get_layer ().replace (pw_wp++, db::EdgeWithProperties (*pr, p.prop_id ())); + } } else { - e.get_layer ().replace (pw++, *pr); + if (pw == e.get_layer ().end ()) { + e.get_layer ().insert (*pr); + pw = e.get_layer ().end (); + } else { + e.get_layer ().replace (pw++, *pr); + } } } } e.get_layer ().erase (pw, e.get_layer ().end ()); + e.get_layer ().erase (pw_wp, e.get_layer ().end ()); + mp_merged_edges->clear (); m_is_merged = filter.result_is_merged () && merged_semantics (); @@ -221,18 +234,31 @@ FlatEdges::filter_in_place (const EdgeFilterBase &filter) db::Shapes &e = *mp_edges; edge_iterator_type pw = e.get_layer ().begin (); + edge_iterator_wp_type pw_wp = e.get_layer ().begin (); + for (EdgesIterator p (begin_merged ()); ! p.at_end (); ++p) { if (filter.selected (*p)) { - if (pw == e.get_layer ().end ()) { - e.get_layer ().insert (*p); - pw = e.get_layer ().end (); + if (p.prop_id () != 0) { + if (pw_wp == e.get_layer ().end ()) { + e.get_layer ().insert (db::EdgeWithProperties (*p, p.prop_id ())); + pw_wp = e.get_layer ().end (); + } else { + e.get_layer ().replace (pw_wp++, db::EdgeWithProperties (*p, p.prop_id ())); + } } else { - e.get_layer ().replace (pw++, *p); + if (pw == e.get_layer ().end ()) { + e.get_layer ().insert (*p); + pw = e.get_layer ().end (); + } else { + e.get_layer ().replace (pw++, *p); + } } } } e.get_layer ().erase (pw, e.get_layer ().end ()); + e.get_layer ().erase (pw_wp, e.get_layer ().end ()); + mp_merged_edges->clear (); m_is_merged = merged_semantics (); diff --git a/src/db/db/dbFlatEdges.h b/src/db/db/dbFlatEdges.h index 9f175d6f0..538099130 100644 --- a/src/db/db/dbFlatEdges.h +++ b/src/db/db/dbFlatEdges.h @@ -50,6 +50,8 @@ public: typedef db::layer edge_layer_type; typedef edge_layer_type::iterator edge_iterator_type; + typedef db::layer edge_layer_wp_type; + typedef edge_layer_wp_type::iterator edge_iterator_wp_type; FlatEdges (); FlatEdges (const db::Shapes &edges, bool is_merged); @@ -147,6 +149,9 @@ private: for (edge_iterator_type p = e.template get_layer ().begin (); p != e.get_layer ().end (); ++p) { e.get_layer ().replace (p, p->transformed (trans)); } + for (edge_iterator_wp_type p = e.template get_layer ().begin (); p != e.get_layer ().end (); ++p) { + e.get_layer ().replace (p, p->transformed (trans)); + } invalidate_cache (); } } diff --git a/src/db/db/dbFlatRegion.cc b/src/db/db/dbFlatRegion.cc index 6ec81ab7c..01ab71303 100644 --- a/src/db/db/dbFlatRegion.cc +++ b/src/db/db/dbFlatRegion.cc @@ -172,20 +172,33 @@ Box FlatRegion::compute_bbox () const RegionDelegate *FlatRegion::filter_in_place (const PolygonFilterBase &filter) { db::layer &poly_layer = mp_polygons->get_layer (); + db::layer &poly_layer_wp = mp_polygons->get_layer (); polygon_iterator_type pw = poly_layer.begin (); + polygon_iterator_wp_type pw_wp = poly_layer_wp.begin (); + for (RegionIterator p (filter.requires_raw_input () ? begin () : begin_merged ()); ! p.at_end (); ++p) { if (filter.selected (*p)) { - if (pw == poly_layer.end ()) { - poly_layer.insert (*p); - poly_layer.end (); + if (p.prop_id () != 0) { + if (pw_wp == poly_layer_wp.end ()) { + poly_layer_wp.insert (db::PolygonWithProperties (*p, p.prop_id ())); + pw_wp = poly_layer_wp.end (); + } else { + poly_layer_wp.replace (pw_wp++, db::PolygonWithProperties (*p, p.prop_id ())); + } } else { - poly_layer.replace (pw++, *p); + if (pw == poly_layer.end ()) { + poly_layer.insert (*p); + pw = poly_layer.end (); + } else { + poly_layer.replace (pw++, *p); + } } } } poly_layer.erase (pw, poly_layer.end ()); + poly_layer_wp.erase (pw_wp, poly_layer_wp.end ()); mp_merged_polygons->clear (); m_is_merged = filter.requires_raw_input () ? false : merged_semantics (); @@ -197,15 +210,24 @@ RegionDelegate *FlatRegion::process_in_place (const PolygonProcessorBase &filter { db::layer &poly_layer = mp_polygons->get_layer (); db::layer out; + db::layer &poly_layer_wp = mp_polygons->get_layer (); + db::layer out_wp; std::vector poly_res; for (RegionIterator p (filter.requires_raw_input () ? begin () : begin_merged ()); ! p.at_end (); ++p) { poly_res.clear (); filter.process (*p, poly_res); - out.insert (poly_res.begin (), poly_res.end ()); + if (p.prop_id () != 0) { + for (auto r = poly_res.begin (); r != poly_res.end (); ++r) { + out_wp.insert (db::PolygonWithProperties (*r, p.prop_id ())); + } + } else { + out.insert (poly_res.begin (), poly_res.end ()); + } } poly_layer.swap (out); + poly_layer_wp.swap (out_wp); mp_merged_polygons->clear (); m_is_merged = filter.result_is_merged () && merged_semantics (); diff --git a/src/db/db/dbFlatRegion.h b/src/db/db/dbFlatRegion.h index f952f275d..9ad4f6e29 100644 --- a/src/db/db/dbFlatRegion.h +++ b/src/db/db/dbFlatRegion.h @@ -48,6 +48,8 @@ public: typedef db::Polygon value_type; typedef db::layer polygon_layer_type; typedef polygon_layer_type::iterator polygon_iterator_type; + typedef db::layer polygon_layer_wp_type; + typedef polygon_layer_wp_type::iterator polygon_iterator_wp_type; FlatRegion (); FlatRegion (const db::Shapes &polygons, bool is_merged); @@ -157,6 +159,9 @@ private: for (polygon_iterator_type p = polygons.get_layer ().begin (); p != polygons.get_layer ().end (); ++p) { polygons.get_layer ().replace (p, p->transformed (trans)); } + for (polygon_iterator_wp_type p = polygons.get_layer ().begin (); p != polygons.get_layer ().end (); ++p) { + polygons.get_layer ().replace (p, p->transformed (trans)); + } invalidate_cache (); } } diff --git a/src/db/db/dbObjectWithProperties.h b/src/db/db/dbObjectWithProperties.h index ad88a26c7..7b1d46c05 100644 --- a/src/db/db/dbObjectWithProperties.h +++ b/src/db/db/dbObjectWithProperties.h @@ -176,6 +176,15 @@ public: m_id = id; } + /** + * @brief Returns the transformed object + */ + template + object_with_properties transformed (const Trans &tr) const + { + return object_with_properties (Obj::transformed (tr), m_id); + } + private: properties_id_type m_id; }; diff --git a/src/db/db/dbShapeCollectionUtils.h b/src/db/db/dbShapeCollectionUtils.h index 897464809..96ef425d5 100644 --- a/src/db/db/dbShapeCollectionUtils.h +++ b/src/db/db/dbShapeCollectionUtils.h @@ -39,9 +39,9 @@ namespace db { /** - * @brief A template base class for edge processors + * @brief A template base class for a shape processors * - * A polygon processor can turn a edge into something else. + * A shape processor can turn a shape into something else. */ template class DB_PUBLIC_TEMPLATE shape_collection_processor