WIP: property support for transformation, filters, processors

This commit is contained in:
Matthias Koefferlein 2023-01-15 15:03:34 +01:00
parent 9f633b813d
commit 5fa4d62da7
9 changed files with 112 additions and 21 deletions

View File

@ -162,7 +162,11 @@ AsIfFlatEdgePairs::processed_to_polygons (const EdgePairToPolygonProcessorBase &
res_polygons.clear ();
filter.process (*e, res_polygons);
for (std::vector<db::Polygon>::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<db::Edge>::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);
}
}
}

View File

@ -378,7 +378,11 @@ AsIfFlatRegion::processed (const PolygonProcessorBase &filter) const
poly_res.clear ();
filter.process (*p, poly_res);
for (std::vector<db::Polygon>::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<db::Edge>::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<db::EdgePair>::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);
}
}
}

View File

@ -179,7 +179,11 @@ AsIfFlatTexts::processed_to_polygons (const TextToPolygonProcessorBase &filter)
res_polygons.clear ();
filter.process (*e, res_polygons);
for (std::vector<db::Polygon>::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);
}
}
}

View File

@ -192,23 +192,36 @@ FlatEdges::processed_in_place (const EdgeProcessorBase &filter)
db::Shapes &e = *mp_edges;
edge_iterator_type pw = e.get_layer<db::Edge, db::unstable_layer_tag> ().begin ();
edge_iterator_wp_type pw_wp = e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().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<db::Edge>::const_iterator pr = edge_res.begin (); pr != edge_res.end (); ++pr) {
if (pw == e.get_layer<db::Edge, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::Edge, db::unstable_layer_tag> ().insert (*pr);
pw = e.get_layer<db::Edge, db::unstable_layer_tag> ().end ();
if (p.prop_id () != 0) {
if (pw_wp == e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().insert (db::EdgeWithProperties (*pr, p.prop_id ()));
pw_wp = e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end ();
} else {
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().replace (pw_wp++, db::EdgeWithProperties (*pr, p.prop_id ()));
}
} else {
e.get_layer<db::Edge, db::unstable_layer_tag> ().replace (pw++, *pr);
if (pw == e.get_layer<db::Edge, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::Edge, db::unstable_layer_tag> ().insert (*pr);
pw = e.get_layer<db::Edge, db::unstable_layer_tag> ().end ();
} else {
e.get_layer<db::Edge, db::unstable_layer_tag> ().replace (pw++, *pr);
}
}
}
}
e.get_layer<db::Edge, db::unstable_layer_tag> ().erase (pw, e.get_layer<db::Edge, db::unstable_layer_tag> ().end ());
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().erase (pw_wp, e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().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<db::Edge, db::unstable_layer_tag> ().begin ();
edge_iterator_wp_type pw_wp = e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().begin ();
for (EdgesIterator p (begin_merged ()); ! p.at_end (); ++p) {
if (filter.selected (*p)) {
if (pw == e.get_layer<db::Edge, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::Edge, db::unstable_layer_tag> ().insert (*p);
pw = e.get_layer<db::Edge, db::unstable_layer_tag> ().end ();
if (p.prop_id () != 0) {
if (pw_wp == e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().insert (db::EdgeWithProperties (*p, p.prop_id ()));
pw_wp = e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end ();
} else {
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().replace (pw_wp++, db::EdgeWithProperties (*p, p.prop_id ()));
}
} else {
e.get_layer<db::Edge, db::unstable_layer_tag> ().replace (pw++, *p);
if (pw == e.get_layer<db::Edge, db::unstable_layer_tag> ().end ()) {
e.get_layer<db::Edge, db::unstable_layer_tag> ().insert (*p);
pw = e.get_layer<db::Edge, db::unstable_layer_tag> ().end ();
} else {
e.get_layer<db::Edge, db::unstable_layer_tag> ().replace (pw++, *p);
}
}
}
}
e.get_layer<db::Edge, db::unstable_layer_tag> ().erase (pw, e.get_layer<db::Edge, db::unstable_layer_tag> ().end ());
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().erase (pw_wp, e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end ());
mp_merged_edges->clear ();
m_is_merged = merged_semantics ();

View File

@ -50,6 +50,8 @@ public:
typedef db::layer<db::Edge, db::unstable_layer_tag> edge_layer_type;
typedef edge_layer_type::iterator edge_iterator_type;
typedef db::layer<db::EdgeWithProperties, db::unstable_layer_tag> 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<db::Edge, db::unstable_layer_tag> ().begin (); p != e.get_layer<db::Edge, db::unstable_layer_tag> ().end (); ++p) {
e.get_layer<db::Edge, db::unstable_layer_tag> ().replace (p, p->transformed (trans));
}
for (edge_iterator_wp_type p = e.template get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().begin (); p != e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().end (); ++p) {
e.get_layer<db::EdgeWithProperties, db::unstable_layer_tag> ().replace (p, p->transformed (trans));
}
invalidate_cache ();
}
}

View File

@ -172,20 +172,33 @@ Box FlatRegion::compute_bbox () const
RegionDelegate *FlatRegion::filter_in_place (const PolygonFilterBase &filter)
{
db::layer<db::Polygon, db::unstable_layer_tag> &poly_layer = mp_polygons->get_layer<db::Polygon, db::unstable_layer_tag> ();
db::layer<db::PolygonWithProperties, db::unstable_layer_tag> &poly_layer_wp = mp_polygons->get_layer<db::PolygonWithProperties, db::unstable_layer_tag> ();
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<db::Polygon, db::unstable_layer_tag> &poly_layer = mp_polygons->get_layer<db::Polygon, db::unstable_layer_tag> ();
db::layer<db::Polygon, db::unstable_layer_tag> out;
db::layer<db::PolygonWithProperties, db::unstable_layer_tag> &poly_layer_wp = mp_polygons->get_layer<db::PolygonWithProperties, db::unstable_layer_tag> ();
db::layer<db::PolygonWithProperties, db::unstable_layer_tag> out_wp;
std::vector<db::Polygon> 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 ();

View File

@ -48,6 +48,8 @@ public:
typedef db::Polygon value_type;
typedef db::layer<db::Polygon, db::unstable_layer_tag> polygon_layer_type;
typedef polygon_layer_type::iterator polygon_iterator_type;
typedef db::layer<db::PolygonWithProperties, db::unstable_layer_tag> 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<db::Polygon, db::unstable_layer_tag> ().begin (); p != polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().end (); ++p) {
polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().replace (p, p->transformed (trans));
}
for (polygon_iterator_wp_type p = polygons.get_layer<db::PolygonWithProperties, db::unstable_layer_tag> ().begin (); p != polygons.get_layer<db::PolygonWithProperties, db::unstable_layer_tag> ().end (); ++p) {
polygons.get_layer<db::PolygonWithProperties, db::unstable_layer_tag> ().replace (p, p->transformed (trans));
}
invalidate_cache ();
}
}

View File

@ -176,6 +176,15 @@ public:
m_id = id;
}
/**
* @brief Returns the transformed object
*/
template <class Trans>
object_with_properties<Obj> transformed (const Trans &tr) const
{
return object_with_properties<Obj> (Obj::transformed (tr), m_id);
}
private:
properties_id_type m_id;
};

View File

@ -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 Shape, class Result>
class DB_PUBLIC_TEMPLATE shape_collection_processor