@@ -28,38 +28,42 @@ namespace db
2828{
2929
3030PolygonNeighborhoodVisitor::PolygonNeighborhoodVisitor ()
31- : m_result_type (db::CompoundRegionOperationNode::ResultType::Edges)
31+ : m_result_type (db::CompoundRegionOperationNode::ResultType::Edges), m_variant_type (db::NoReducer)
3232{
3333 disconnect_outputs ();
3434}
3535
3636void
37- PolygonNeighborhoodVisitor::connect_output (Layout * /* layout*/ , std::unordered_set<db::PolygonWithProperties> *polygons) const
37+ PolygonNeighborhoodVisitor::connect_output (Layout * /* layout*/ , std::unordered_set<db::PolygonWithProperties> *polygons, const db::ICplxTrans &trans ) const
3838{
3939 disconnect_outputs ();
4040 mp_polygons = polygons;
41+ m_trans = trans;
4142}
4243
4344void
44- PolygonNeighborhoodVisitor::connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons) const
45+ PolygonNeighborhoodVisitor::connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons, const db::ICplxTrans &trans ) const
4546{
4647 disconnect_outputs ();
4748 mp_layout = layout;
4849 mp_polygon_refs = polygons;
50+ m_trans = trans;
4951}
5052
5153void
52- PolygonNeighborhoodVisitor::connect_output (db::Layout * /* layout*/ , std::unordered_set<db::EdgeWithProperties> *edges) const
54+ PolygonNeighborhoodVisitor::connect_output (db::Layout * /* layout*/ , std::unordered_set<db::EdgeWithProperties> *edges, const db::ICplxTrans &trans ) const
5355{
5456 disconnect_outputs ();
5557 mp_edges = edges;
58+ m_trans = trans;
5659}
5760
5861void
59- PolygonNeighborhoodVisitor::connect_output (Layout * /* layout*/ , std::unordered_set<db::EdgePairWithProperties> *edge_pairs) const
62+ PolygonNeighborhoodVisitor::connect_output (Layout * /* layout*/ , std::unordered_set<db::EdgePairWithProperties> *edge_pairs, const db::ICplxTrans &trans ) const
6063{
6164 disconnect_outputs ();
6265 mp_edge_pairs = edge_pairs;
66+ m_trans = trans;
6367}
6468
6569void
7680PolygonNeighborhoodVisitor::output_polygon (const db::PolygonWithProperties &poly)
7781{
7882 if (mp_polygons) {
79- mp_polygons->insert (poly);
83+ mp_polygons->insert (poly. transformed (m_trans) );
8084 } else if (mp_polygon_refs) {
8185 tl_assert (mp_layout != 0 );
82- mp_polygon_refs->insert (db::PolygonRefWithProperties (db::PolygonRef (poly, mp_layout->shape_repository ()), poly.properties_id ()));
86+ mp_polygon_refs->insert (db::PolygonRefWithProperties (db::PolygonRef (poly. transformed (m_trans) , mp_layout->shape_repository ()), poly.properties_id ()));
8387 } else {
8488 throw tl::Exception (tl::to_string (tr (" PolygonNeighborhoodVisitor is not configured for edge output (use 'result_type=Edges')" )));
8589 }
@@ -91,7 +95,7 @@ PolygonNeighborhoodVisitor::output_edge (const db::EdgeWithProperties &edge)
9195 if (mp_edges == 0 ) {
9296 throw tl::Exception (tl::to_string (tr (" PolygonNeighborhoodVisitor is not configured for edge output (use 'result_type=Edges')" )));
9397 }
94- mp_edges->insert (edge);
98+ mp_edges->insert (edge. transformed (m_trans) );
9599}
96100
97101void
@@ -100,16 +104,22 @@ PolygonNeighborhoodVisitor::output_edge_pair (const db::EdgePairWithProperties &
100104 if (mp_edge_pairs == 0 ) {
101105 throw tl::Exception (tl::to_string (tr (" PolygonNeighborhoodVisitor is not configured for edge pair output (use 'result_type=EdgePairs')" )));
102106 }
103- mp_edge_pairs->insert (edge_pair);
107+ mp_edge_pairs->insert (edge_pair. transformed (m_trans) );
104108}
105109
106110// --------------------------------------------------------------------------------------------------
107111
108112PolygonNeighborhoodCompoundOperationNode::PolygonNeighborhoodCompoundOperationNode (const std::vector<CompoundRegionOperationNode *> &children, PolygonNeighborhoodVisitor *visitor, db::Coord dist)
109- : CompoundRegionMultiInputOperationNode (children), m_dist (dist), mp_visitor (visitor)
113+ : CompoundRegionMultiInputOperationNode (children, true /* no implicit init()*/ ),
114+ m_dist (dist), mp_visitor (visitor)
110115{
111116 tl_assert (visitor != 0 );
112117 visitor->keep ();
118+
119+ m_vars.reset (db::make_reducer (visitor->variant_type ()));
120+
121+ // must be called after local_vars() is available
122+ init ();
113123}
114124
115125db::Coord
@@ -170,12 +180,19 @@ PolygonNeighborhoodCompoundOperationNode::compute_local_impl (CompoundRegionOper
170180 tl_assert (interactions.num_subjects () == 1 );
171181 tl_assert (! results.empty ());
172182
183+ db::ICplxTrans var_trans, var_trans_inv;
184+ if (proc->vars ()) {
185+ var_trans_inv = proc->vars ()->single_variant_transformation (cell->cell_index ());
186+ var_trans = var_trans_inv.inverted ();
187+ }
188+
173189 try {
174190
175- mp_visitor->connect_output (layout, &results.front ());
191+ mp_visitor->connect_output (layout, &results.front (), var_trans_inv );
176192
177193 const T &pr = interactions.begin_subjects ()->second ;
178194 db::PolygonWithProperties subject (pr.instantiate (), pr.properties_id ());
195+ subject.transform (var_trans);
179196
180197 PolygonNeighborhoodVisitor::neighbors_type neighbors;
181198
@@ -191,6 +208,7 @@ PolygonNeighborhoodCompoundOperationNode::compute_local_impl (CompoundRegionOper
191208
192209 for (auto p = others.front ().begin (); p != others.front ().end (); ++p) {
193210 n.push_back (db::PolygonWithProperties (p->instantiate (), p->properties_id ()));
211+ n.back ().transform (var_trans);
194212 }
195213
196214 }
0 commit comments