mirror of https://github.com/KLayout/klayout.git
WIP: property support for transformation, filters, processors
This commit is contained in:
parent
9f633b813d
commit
5fa4d62da7
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue