diff --git a/src/drawing/zone.rs b/src/drawing/zone.rs index 5961733..436be44 100644 --- a/src/drawing/zone.rs +++ b/src/drawing/zone.rs @@ -1,18 +1,25 @@ use enum_dispatch::enum_dispatch; +use geo::{LineString, Point, Polygon}; use petgraph::stable_graph::NodeIndex; use crate::{ drawing::{ + dot::DotIndex, graph::{GetLayer, GetMaybeNet, MakePrimitive, PrimitiveIndex, PrimitiveWeight, Retag}, primitive::{GenericPrimitive, Primitive}, rules::RulesTrait, Drawing, }, + geometry::GetPos, graph::{GenericIndex, GetNodeIndex}, }; -#[enum_dispatch(GetNodeIndex)] +pub trait MakePolygon { + fn polygon(&self, drawing: &Drawing) -> Polygon; +} + +#[enum_dispatch(GetNodeIndex, MakePolygon)] #[derive(Debug, Clone, Copy, PartialEq)] pub enum ZoneIndex { Solid(SolidZoneIndex), @@ -46,6 +53,27 @@ impl<'a> GetMaybeNet for SolidZoneWeight { pub type SolidZoneIndex = GenericIndex; +impl MakePolygon for SolidZoneIndex { + fn polygon(&self, drawing: &Drawing) -> Polygon { + Polygon::new( + LineString::from( + drawing + .geometry() + .members(GenericIndex::::new(self.node_index())) + .filter_map(|primitive_node| { + if let Ok(dot) = DotIndex::try_from(primitive_node) { + Some(drawing.geometry().dot_weight(dot).pos()) + } else { + None + } + }) + .collect::>(), + ), + vec![], + ) + } +} + #[derive(Debug, Clone, Copy, PartialEq)] pub struct PourZoneWeight { pub layer: u64, @@ -65,3 +93,24 @@ impl<'a> GetMaybeNet for PourZoneWeight { } pub type PourZoneIndex = GenericIndex; + +impl MakePolygon for PourZoneIndex { + fn polygon(&self, drawing: &Drawing) -> Polygon { + Polygon::new( + LineString::from( + drawing + .geometry() + .members(GenericIndex::::new(self.node_index())) + .filter_map(|primitive_node| { + if let Ok(dot) = DotIndex::try_from(primitive_node) { + Some(drawing.geometry().dot_weight(dot).pos()) + } else { + None + } + }) + .collect::>(), + ), + vec![], + ) + } +}