From 43f1248a76f6c13de87934a3997e0ee928129956 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Thu, 18 Apr 2024 15:41:01 +0200 Subject: [PATCH] geometry: have a common `Shape` object for both primitives and compounds --- src/bin/topola-egui/app.rs | 15 +++-- src/bin/topola-sdl2-demo/main.rs | 2 +- src/drawing/drawing.rs | 5 +- src/drawing/guide.rs | 2 +- src/drawing/primitive.rs | 18 +++--- src/dsn/design.rs | 27 ++++---- src/geometry/mod.rs | 1 + src/geometry/poly.rs | 15 +++++ src/geometry/polygon.rs | 11 ---- src/geometry/shape.rs | 24 ++++++- src/layout/layout.rs | 41 +++++------- src/layout/zone.rs | 107 +++++++++++++++++-------------- src/overlay/overlay.rs | 36 ++++++----- src/router/mesh.rs | 2 +- src/router/router.rs | 2 +- 15 files changed, 171 insertions(+), 137 deletions(-) create mode 100644 src/geometry/poly.rs delete mode 100644 src/geometry/polygon.rs diff --git a/src/bin/topola-egui/app.rs b/src/bin/topola-egui/app.rs index 36d928f..e829796 100644 --- a/src/bin/topola-egui/app.rs +++ b/src/bin/topola-egui/app.rs @@ -6,13 +6,14 @@ use std::{ }; use topola::{ - drawing::{graph::MakePrimitive, primitive::MakeShape, Drawing}, + drawing::{graph::MakePrimitive, primitive::MakePrimitiveShape, Drawing}, dsn::{design::DsnDesign, rules::DsnRules}, geometry::{ + compound::CompoundManagerTrait, primitive::{BendShape, DotShape, PrimitiveShape, SegShape}, GenericNode, }, - layout::{zone::MakePolygon, Layout}, + layout::{zone::MakePolyShape, Layout}, math::Circle, overlay::Overlay, }; @@ -168,7 +169,10 @@ impl eframe::App for App { for zone in layout.layer_zones(1) { painter.paint_polygon( - &zone.polygon(&layout.drawing()), + &layout + .compound_weight(zone) + .shape(&layout.drawing(), zone) + .polygon, egui::Color32::from_rgb(52, 52, 200), ) } @@ -190,7 +194,10 @@ impl eframe::App for App { for zone in layout.layer_zones(0) { painter.paint_polygon( - &zone.polygon(&layout.drawing()), + &layout + .compound_weight(zone) + .shape(&layout.drawing(), zone) + .polygon, egui::Color32::from_rgb(200, 52, 52), ) } diff --git a/src/bin/topola-sdl2-demo/main.rs b/src/bin/topola-sdl2-demo/main.rs index 3368e2e..c11c100 100644 --- a/src/bin/topola-sdl2-demo/main.rs +++ b/src/bin/topola-sdl2-demo/main.rs @@ -15,7 +15,7 @@ use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use topola::draw::DrawException; use topola::drawing::dot::FixedDotWeight; use topola::drawing::graph::{MakePrimitive, PrimitiveIndex}; -use topola::drawing::primitive::MakeShape; +use topola::drawing::primitive::MakePrimitiveShape; use topola::drawing::rules::{Conditions, RulesTrait}; use topola::drawing::seg::FixedSegWeight; use topola::drawing::zone::MakePolygon; diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index 5087fda..53ddbe1 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -21,7 +21,9 @@ use crate::drawing::{ bend::{FixedBendIndex, LooseBendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, graph::{MakePrimitive, PrimitiveIndex, PrimitiveWeight}, - primitive::{GenericPrimitive, GetCore, GetInnerOuter, GetJoints, GetOtherJoint, MakeShape}, + primitive::{ + GenericPrimitive, GetCore, GetInnerOuter, GetJoints, GetOtherJoint, MakePrimitiveShape, + }, seg::{ FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex, SeqLooseSegIndex, SeqLooseSegWeight, @@ -37,7 +39,6 @@ use crate::geometry::{ SegWeightTrait, }; use crate::graph::{GenericIndex, GetNodeIndex}; -use crate::layout::zone::{ZoneIndex, ZoneWeight}; use crate::math::NoTangents; use super::bend::BendWeight; diff --git a/src/drawing/guide.rs b/src/drawing/guide.rs index a290d88..b15a68a 100644 --- a/src/drawing/guide.rs +++ b/src/drawing/guide.rs @@ -6,7 +6,7 @@ use crate::{ bend::BendIndex, dot::{DotIndex, FixedDotIndex, LooseDotIndex}, graph::MakePrimitive, - primitive::{GetCore, GetInnerOuter, GetOtherJoint, GetWeight, MakeShape}, + primitive::{GetCore, GetInnerOuter, GetOtherJoint, GetWeight, MakePrimitiveShape}, rules::GetConditions, Drawing, }, diff --git a/src/drawing/primitive.rs b/src/drawing/primitive.rs index dc20ebf..c2e4259 100644 --- a/src/drawing/primitive.rs +++ b/src/drawing/primitive.rs @@ -34,7 +34,7 @@ pub trait GetWeight { } #[enum_dispatch] -pub trait MakeShape { +pub trait MakePrimitiveShape { fn shape(&self) -> PrimitiveShape; } @@ -160,7 +160,7 @@ macro_rules! impl_loose_primitive { GetMaybeNet, GetWidth, GetDrawing, - MakeShape, + MakePrimitiveShape, GetLimbs, GetConditions )] @@ -279,7 +279,7 @@ impl<'a, CW: Copy, R: RulesTrait> FixedDot<'a, CW, R> { } } -impl<'a, CW: Copy, R: RulesTrait> MakeShape for FixedDot<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for FixedDot<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().dot_shape(self.index.into()) } @@ -325,7 +325,7 @@ impl<'a, CW: Copy, R: RulesTrait> LooseDot<'a, CW, R> { } } -impl<'a, CW: Copy, R: RulesTrait> MakeShape for LooseDot<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for LooseDot<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().dot_shape(self.index.into()) } @@ -348,7 +348,7 @@ impl<'a, CW: Copy, R: RulesTrait> GetLimbs for LooseDot<'a, CW, R> { pub type FixedSeg<'a, CW, R> = GenericPrimitive<'a, FixedSegWeight, CW, R>; impl_fixed_primitive!(FixedSeg, FixedSegWeight); -impl<'a, CW: Copy, R: RulesTrait> MakeShape for FixedSeg<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for FixedSeg<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().seg_shape(self.index.into()) } @@ -374,7 +374,7 @@ impl<'a, CW: Copy, R: RulesTrait> GetOtherJoint pub type LoneLooseSeg<'a, CW, R> = GenericPrimitive<'a, LoneLooseSegWeight, CW, R>; impl_loose_primitive!(LoneLooseSeg, LoneLooseSegWeight); -impl<'a, CW: Copy, R: RulesTrait> MakeShape for LoneLooseSeg<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for LoneLooseSeg<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().seg_shape(self.index.into()) } @@ -402,7 +402,7 @@ impl<'a, CW: Copy, R: RulesTrait> GetOtherJoint pub type SeqLooseSeg<'a, CW, R> = GenericPrimitive<'a, SeqLooseSegWeight, CW, R>; impl_loose_primitive!(SeqLooseSeg, SeqLooseSegWeight); -impl<'a, CW: Copy, R: RulesTrait> MakeShape for SeqLooseSeg<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for SeqLooseSeg<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().seg_shape(self.index.into()) } @@ -446,7 +446,7 @@ impl<'a, CW: Copy, R: RulesTrait> GetBendIndex for FixedBend<'a, CW, R> { } } -impl<'a, CW: Copy, R: RulesTrait> MakeShape for FixedBend<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for FixedBend<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().bend_shape(self.index.into()) } @@ -487,7 +487,7 @@ impl<'a, CW: Copy, R: RulesTrait> From> for BendIndex { } } -impl<'a, CW: Copy, R: RulesTrait> MakeShape for LooseBend<'a, CW, R> { +impl<'a, CW: Copy, R: RulesTrait> MakePrimitiveShape for LooseBend<'a, CW, R> { fn shape(&self) -> PrimitiveShape { self.drawing.geometry().bend_shape(self.index.into()) } diff --git a/src/dsn/design.rs b/src/dsn/design.rs index 58aa996..015405f 100644 --- a/src/dsn/design.rs +++ b/src/dsn/design.rs @@ -12,10 +12,7 @@ use crate::{ }, geometry::compound::CompoundManagerTrait, graph::{GenericIndex, GetNodeIndex}, - layout::{ - zone::{SolidZoneWeight, ZoneIndex}, - Layout, - }, + layout::{zone::SolidZoneWeight, Layout}, math::Circle, }; @@ -367,7 +364,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); let dot_2_1 = layout @@ -380,7 +377,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); let dot_2_2 = layout @@ -393,7 +390,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); let dot_1_2 = layout @@ -406,7 +403,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); // Sides. @@ -419,7 +416,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); layout @@ -431,7 +428,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); layout @@ -443,7 +440,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); layout @@ -455,7 +452,7 @@ impl DsnDesign { layer, maybe_net: Some(net), }, - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); } @@ -567,7 +564,7 @@ impl DsnDesign { }, // TODO: This manual retagging shouldn't be necessary, `.into()` should suffice. //GenericIndex::new(zone.node_index()).into(), - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); @@ -592,7 +589,7 @@ impl DsnDesign { maybe_net: Some(net), }, // TODO: This manual retagging shouldn't be necessary, `.into()` should suffice. - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); @@ -607,7 +604,7 @@ impl DsnDesign { maybe_net: Some(net), }, // TODO: This manual retagging shouldn't be necessary, `.into()` should suffice. - ZoneIndex::Solid(GenericIndex::new(zone.node_index())), + zone, ) .unwrap(); diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs index 7ab66a2..e906d7b 100644 --- a/src/geometry/mod.rs +++ b/src/geometry/mod.rs @@ -1,6 +1,7 @@ #[macro_use] mod geometry; pub mod compound; +pub mod poly; pub mod primitive; pub mod shape; pub mod with_rtree; diff --git a/src/geometry/poly.rs b/src/geometry/poly.rs new file mode 100644 index 0000000..c4e4b7f --- /dev/null +++ b/src/geometry/poly.rs @@ -0,0 +1,15 @@ +use enum_dispatch::enum_dispatch; +use geo::{Contains, Point, Polygon}; + +use crate::geometry::shape::ShapeTrait; + +#[derive(Debug, Clone, PartialEq)] +pub struct PolyShape { + pub polygon: Polygon, +} + +impl ShapeTrait for PolyShape { + fn contains_point(&self, p: Point) -> bool { + self.polygon.contains(&p) + } +} diff --git a/src/geometry/polygon.rs b/src/geometry/polygon.rs deleted file mode 100644 index 7eb803c..0000000 --- a/src/geometry/polygon.rs +++ /dev/null @@ -1,11 +0,0 @@ -use enum_dispatch::enum_dispatch; - -pub struct PolygonShape { - pub polygon: Polygon, -} - -impl ShapeTrait for PolygonShape { - fn contains_point(&self, p: Point) -> bool { - self.polygon.contains(p) - } -} diff --git a/src/geometry/shape.rs b/src/geometry/shape.rs index a95bd48..9a9479c 100644 --- a/src/geometry/shape.rs +++ b/src/geometry/shape.rs @@ -1,9 +1,31 @@ use enum_dispatch::enum_dispatch; use geo::Point; -use crate::geometry::primitive::PrimitiveShape; +use crate::geometry::{ + poly::PolyShape, + primitive::{BendShape, DotShape, PrimitiveShape, SegShape}, +}; #[enum_dispatch] pub trait ShapeTrait { fn contains_point(&self, p: Point) -> bool; } + +#[enum_dispatch(ShapeTrait)] +#[derive(Debug, Clone, PartialEq)] +pub enum Shape { + Dot(DotShape), + Seg(SegShape), + Bend(BendShape), + Poly(PolyShape), +} + +impl From for Shape { + fn from(primitive: PrimitiveShape) -> Self { + match primitive { + PrimitiveShape::Dot(dot) => Shape::Dot(dot), + PrimitiveShape::Seg(seg) => Shape::Seg(seg), + PrimitiveShape::Bend(bend) => Shape::Bend(bend), + } + } +} diff --git a/src/layout/layout.rs b/src/layout/layout.rs index 3f8cd2b..3417271 100644 --- a/src/layout/layout.rs +++ b/src/layout/layout.rs @@ -17,15 +17,15 @@ use crate::{ Drawing, Infringement, LayoutException, }, geometry::{ - compound::CompoundManagerTrait, BendWeightTrait, DotWeightTrait, GenericNode, Geometry, - GeometryLabel, GetWidth, SegWeightTrait, + compound::CompoundManagerTrait, poly::PolyShape, BendWeightTrait, DotWeightTrait, + GenericNode, Geometry, GeometryLabel, GetWidth, SegWeightTrait, }, graph::{GenericIndex, GetNodeIndex}, layout::{ connectivity::{ BandIndex, BandWeight, ConnectivityLabel, ConnectivityWeight, ContinentIndex, }, - zone::{PourZoneIndex, SolidZoneIndex, ZoneIndex, ZoneWeight}, + zone::{PourZoneIndex, SolidZoneIndex, ZoneWeight}, }, }; @@ -92,13 +92,12 @@ impl Layout { pub fn add_zone_fixed_dot( &mut self, weight: FixedDotWeight, - zone: ZoneIndex, + zone: GenericIndex, ) -> Result { let maybe_dot = self.drawing.add_fixed_dot(weight); if let Ok(dot) = maybe_dot { - self.drawing - .add_to_compound(dot, GenericIndex::new(zone.node_index())); + self.drawing.add_to_compound(dot, zone); } maybe_dot @@ -118,13 +117,12 @@ impl Layout { from: FixedDotIndex, to: FixedDotIndex, weight: FixedSegWeight, - zone: ZoneIndex, + zone: GenericIndex, ) -> Result { let maybe_seg = self.add_fixed_seg(from, to, weight); if let Ok(seg) = maybe_seg { - self.drawing - .add_to_compound(seg, GenericIndex::new(zone.node_index())); + self.drawing.add_to_compound(seg, zone); } maybe_seg @@ -170,22 +168,17 @@ impl Layout { ContinentIndex::new(0.into()) } - pub fn zones(&self) -> impl Iterator + '_ { + pub fn zones(&self) -> impl Iterator> + '_ { self.drawing.rtree().iter().filter_map(|wrapper| { if let NodeIndex::Compound(zone) = wrapper.data { - Some(match self.drawing.geometry().compound_weight(zone) { - ZoneWeight::Solid(..) => { - ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index())) - } - ZoneWeight::Pour(..) => ZoneIndex::Pour(PourZoneIndex::new(zone.node_index())), - }) + Some(zone) } else { None } }) } - pub fn layer_zones(&self, layer: u64) -> impl Iterator + '_ { + pub fn layer_zones(&self, layer: u64) -> impl Iterator> + '_ { self.drawing .rtree() .locate_in_envelope_intersecting(&AABB::from_corners( @@ -194,21 +187,17 @@ impl Layout { )) .filter_map(|wrapper| { if let NodeIndex::Compound(zone) = wrapper.data { - Some(match self.drawing.geometry().compound_weight(zone) { - ZoneWeight::Solid(..) => { - ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index())) - } - ZoneWeight::Pour(..) => { - ZoneIndex::Pour(PourZoneIndex::new(zone.node_index())) - } - }) + Some(zone) } else { None } }) } - pub fn zone_members(&self, zone: ZoneIndex) -> impl Iterator + '_ { + pub fn zone_members( + &self, + zone: GenericIndex, + ) -> impl Iterator + '_ { self.drawing .geometry() .compound_members(GenericIndex::new(zone.node_index())) diff --git a/src/layout/zone.rs b/src/layout/zone.rs index 328af91..84b37a0 100644 --- a/src/layout/zone.rs +++ b/src/layout/zone.rs @@ -11,23 +11,20 @@ use crate::{ rules::RulesTrait, Drawing, }, - geometry::GetPos, + geometry::{poly::PolyShape, GetPos}, graph::{GenericIndex, GetNodeIndex}, }; #[enum_dispatch] -pub trait MakePolygon { - fn polygon(&self, drawing: &Drawing) -> Polygon; +pub trait MakePolyShape { + fn shape( + &self, + drawing: &Drawing, + index: GenericIndex, + ) -> PolyShape; } -#[enum_dispatch(GetNodeIndex, MakePolygon)] -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum ZoneIndex { - Solid(SolidZoneIndex), - Pour(PourZoneIndex), -} - -#[enum_dispatch(GetLayer)] +#[enum_dispatch(GetLayer, MakePolyShape)] #[derive(Debug, Clone, Copy, PartialEq)] pub enum ZoneWeight { Solid(SolidZoneWeight), @@ -52,29 +49,35 @@ 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() - .compound_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::>(), +impl MakePolyShape for SolidZoneWeight { + fn shape( + &self, + drawing: &Drawing, + index: GenericIndex, + ) -> PolyShape { + PolyShape { + polygon: Polygon::new( + LineString::from( + drawing + .geometry() + .compound_members(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![], ), - vec![], - ) + } } } +pub type SolidZoneIndex = GenericIndex; + #[derive(Debug, Clone, Copy, PartialEq)] pub struct PourZoneWeight { pub layer: u64, @@ -93,25 +96,31 @@ 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() - .compound_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::>(), +impl MakePolyShape for PourZoneWeight { + fn shape( + &self, + drawing: &Drawing, + index: GenericIndex, + ) -> PolyShape { + PolyShape { + polygon: Polygon::new( + LineString::from( + drawing + .geometry() + .compound_members(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![], ), - vec![], - ) + } } } + +pub type PourZoneIndex = GenericIndex; diff --git a/src/overlay/overlay.rs b/src/overlay/overlay.rs index ff2252e..35f43cf 100644 --- a/src/overlay/overlay.rs +++ b/src/overlay/overlay.rs @@ -6,12 +6,18 @@ use rstar::AABB; use crate::{ drawing::{ graph::{GetLayer, MakePrimitive, PrimitiveIndex}, - primitive::MakeShape, + primitive::MakePrimitiveShape, rules::RulesTrait, }, - geometry::shape::ShapeTrait, + geometry::{ + compound::CompoundManagerTrait, + shape::{Shape, ShapeTrait}, + }, graph::GenericIndex, - layout::{zone::ZoneWeight, Layout, NodeIndex}, + layout::{ + zone::{MakePolyShape, ZoneWeight}, + Layout, NodeIndex, + }, }; pub struct Overlay { @@ -61,20 +67,18 @@ impl Overlay { node: NodeIndex, p: Point, ) -> bool { - match node { - NodeIndex::Primitive(primitive) => { - if primitive - .primitive(layout.drawing()) - .shape() - .contains_point(p) - { - self.toggle_selection(node); - return true; - } - } - NodeIndex::Compound(compound) => (), // TODO. - } + let shape: Shape = match node { + NodeIndex::Primitive(primitive) => primitive.primitive(layout.drawing()).shape().into(), + NodeIndex::Compound(compound) => layout + .compound_weight(compound) + .shape(layout.drawing(), compound) + .into(), + }; + if shape.contains_point(p) { + self.toggle_selection(node); + return true; + } false } diff --git a/src/router/mesh.rs b/src/router/mesh.rs index cbe52ff..5856bee 100644 --- a/src/router/mesh.rs +++ b/src/router/mesh.rs @@ -13,7 +13,7 @@ use crate::{ bend::{FixedBendIndex, LooseBendIndex}, dot::FixedDotIndex, graph::{MakePrimitive, PrimitiveIndex}, - primitive::{GetCore, MakeShape, Primitive}, + primitive::{GetCore, MakePrimitiveShape, Primitive}, Drawing, }, geometry::primitive::PrimitiveShapeTrait, diff --git a/src/router/router.rs b/src/router/router.rs index d5b1265..70ca64d 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -7,7 +7,7 @@ use thiserror::Error; use crate::drawing::{ dot::FixedDotIndex, graph::{MakePrimitive, PrimitiveIndex}, - primitive::MakeShape, + primitive::MakePrimitiveShape, rules::RulesTrait, }; use crate::geometry::primitive::PrimitiveShapeTrait;