From 68eafc10596ad8b8865763976c6afea310feabd3 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sat, 14 Mar 2026 14:17:45 +0100 Subject: [PATCH] Add methods to locate joints, segments, polygons at point (bbox-only for now) --- topola-egui/src/viewport.rs | 4 ++-- topola/src/layout.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/topola-egui/src/viewport.rs b/topola-egui/src/viewport.rs index fe0d2a1..877470f 100644 --- a/topola-egui/src/viewport.rs +++ b/topola-egui/src/viewport.rs @@ -29,8 +29,8 @@ impl Viewport { .zoom_range(0.00001..=10000.0) .show(ui, &mut scene_rect, |ui| { if let Some(ref workspace) = workspace { - let mut displayer = Display::new(); - displayer.update(ctx, ui, &self, workspace); + let mut display = Display::new(); + display.update(ctx, ui, &self, workspace); } }); diff --git a/topola/src/layout.rs b/topola/src/layout.rs index 6ba7cb5..110bc62 100644 --- a/topola/src/layout.rs +++ b/topola/src/layout.rs @@ -185,6 +185,41 @@ impl Layout { Rectangle::from_corners([min_x, min_y, layer], [max_x, max_y, layer]) } + pub fn locate_joints_at_point( + &self, + layer: usize, + point: [i64; 2], + ) -> impl Iterator { + self.joints_rtree + .as_ref() + .locate_all_at_point(&[point[0], point[1], layer as i64]) + .map(|geom_with_data| geom_with_data.data) + } + + pub fn locate_segments_at_point( + &self, + layer: usize, + point: [i64; 2], + ) -> impl Iterator { + self.segments_rtree + .as_ref() + .locate_all_at_point(&[point[0], point[1], layer as i64]) + .map(|geom_with_data| geom_with_data.data) + } + + // TODO: vias. + + pub fn locate_polygons_at_point( + &self, + layer: usize, + point: [i64; 2], + ) -> impl Iterator { + self.polygons_rtree + .as_ref() + .locate_all_at_point(&[point[0], point[1], layer as i64]) + .map(|geom_with_data| geom_with_data.data) + } + pub fn pin(&self, pin: PinId) -> &Pin { &self.pins[pin.id()] }