egui: paint zones (only convex ones work for now)

This commit is contained in:
Mikolaj Wielgus 2024-04-08 21:52:15 +00:00
parent c141dfc735
commit 2d5998547a
2 changed files with 39 additions and 11 deletions

View File

@ -5,7 +5,7 @@ use std::{
}; };
use topola::{ use topola::{
drawing::{graph::MakePrimitive, primitive::MakeShape, Drawing}, drawing::{graph::MakePrimitive, primitive::MakeShape, zone::MakePolygon, Drawing},
dsn::{design::DsnDesign, rules::DsnRules}, dsn::{design::DsnDesign, rules::DsnRules},
geometry::shape::{BendShape, DotShape, SegShape, Shape}, geometry::shape::{BendShape, DotShape, SegShape, Shape},
math::Circle, math::Circle,
@ -138,16 +138,30 @@ impl eframe::App for App {
let transform = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect); let transform = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect);
let mut painter = Painter::new(ui, transform); let mut painter = Painter::new(ui, transform);
if let Some(layout) = &self.drawing { if let Some(drawing) = &self.drawing {
for node in layout.layer_primitive_nodes(1) { for node in drawing.layer_primitive_nodes(1) {
let shape = node.primitive(layout).shape(); let shape = node.primitive(drawing).shape();
painter.paint_shape(&shape, egui::Color32::from_rgb(52, 52, 200)); painter.paint_shape(&shape, egui::Color32::from_rgb(52, 52, 200));
} }
for node in layout.layer_primitive_nodes(0) { for zone in drawing.layer_zones(1) {
let shape = node.primitive(layout).shape(); painter.paint_polygon(
&zone.polygon(&drawing),
egui::Color32::from_rgb(52, 52, 200),
)
}
for node in drawing.layer_primitive_nodes(0) {
let shape = node.primitive(drawing).shape();
painter.paint_shape(&shape, egui::Color32::from_rgb(200, 52, 52)); painter.paint_shape(&shape, egui::Color32::from_rgb(200, 52, 52));
} }
for zone in drawing.layer_zones(0) {
painter.paint_polygon(
&zone.polygon(&drawing),
egui::Color32::from_rgb(200, 52, 52),
)
}
} }
}) })
}); });

View File

@ -1,9 +1,9 @@
use egui::{emath::RectTransform, epaint, Color32, Pos2, Ui}; use egui::{emath::RectTransform, epaint, Color32, Pos2, Stroke, Ui};
use geo::Point; use geo::{CoordsIter, Point, Polygon};
use topola::geometry::shape::Shape; use topola::geometry::shape::Shape;
pub struct Painter<'a> { pub struct Painter<'a> {
ui: &'a mut egui::Ui, ui: &'a mut Ui,
transform: RectTransform, transform: RectTransform,
} }
@ -27,7 +27,7 @@ impl<'a> Painter<'a> {
self.transform self.transform
.transform_pos([seg.to.x() as f32, -seg.to.y() as f32].into()), .transform_pos([seg.to.x() as f32, -seg.to.y() as f32].into()),
], ],
egui::Stroke::new(seg.width as f32 * self.transform.scale().x, color), Stroke::new(seg.width as f32 * self.transform.scale().x, color),
), ),
Shape::Bend(bend) => { Shape::Bend(bend) => {
let delta_from = bend.from - bend.c.pos; let delta_from = bend.from - bend.c.pos;
@ -47,7 +47,7 @@ impl<'a> Painter<'a> {
epaint::Shape::line( epaint::Shape::line(
points, points,
egui::Stroke::new(bend.width as f32 * self.transform.scale().x, color), Stroke::new(bend.width as f32 * self.transform.scale().x, color),
) )
} }
}; };
@ -55,6 +55,20 @@ impl<'a> Painter<'a> {
self.ui.painter().add(epaint_shape); self.ui.painter().add(epaint_shape);
} }
pub fn paint_polygon(&mut self, polygon: &Polygon, color: Color32) {
self.ui.painter().add(epaint::Shape::convex_polygon(
polygon
.exterior_coords_iter()
.map(|coords| {
self.transform
.transform_pos([coords.x as f32, -coords.y as f32].into())
})
.collect(),
color,
Stroke::default(),
));
}
pub fn paint_edge(&mut self, from: Point, to: Point, color: Color32) { pub fn paint_edge(&mut self, from: Point, to: Point, color: Color32) {
// //
} }