diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index a2fa42b..611149e 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -35,6 +35,8 @@ use crate::geometry::{ use crate::graph::{GenericIndex, GetPetgraphIndex}; use crate::math::NoTangents; +use super::head::{Head, HeadRef}; + #[enum_dispatch] #[derive(Error, Debug, Clone, Copy)] pub enum LayoutException { @@ -919,6 +921,10 @@ impl Drawing { Loose::new(index, self) } + pub fn head_ref(&self, head: Head) -> HeadRef<'_, CW, R> { + HeadRef::new(head, self) + } + pub fn layer_count(&self) -> usize { self.geometry_with_rtree.layer_count() } diff --git a/src/drawing/guide.rs b/src/drawing/guide.rs index cab3c73..2eef697 100644 --- a/src/drawing/guide.rs +++ b/src/drawing/guide.rs @@ -1,15 +1,6 @@ -use enum_dispatch::enum_dispatch; use geo::Line; use crate::{ - drawing::{ - bend::BendIndex, - dot::{DotIndex, FixedDotIndex, LooseDotIndex}, - graph::MakePrimitive, - primitive::{GetCore, GetInnerOuter, GetOtherJoint, GetWeight, MakePrimitiveShape}, - rules::GetConditions, - Drawing, - }, geometry::{ primitive::{PrimitiveShape, PrimitiveShapeTrait}, shape::ShapeTrait, @@ -18,47 +9,15 @@ use crate::{ }; use super::{ - cane::Cane, - graph::PrimitiveIndex, - primitive::GetJoints, - rules::{Conditions, RulesTrait}, + bend::BendIndex, + dot::{DotIndex, FixedDotIndex, LooseDotIndex}, + graph::{MakePrimitive, PrimitiveIndex}, + head::{BareHead, CaneHead, Head, HeadTrait}, + primitive::{GetCore, GetInnerOuter, GetJoints, GetOtherJoint, GetWeight, MakePrimitiveShape}, + rules::{Conditions, GetConditions, RulesTrait}, + Drawing, }; -#[enum_dispatch] -pub trait HeadTrait { - fn face(&self) -> DotIndex; -} - -#[enum_dispatch(HeadTrait)] -#[derive(Debug, Clone, Copy)] -pub enum Head { - Bare(BareHead), - Cane(CaneHead), -} - -#[derive(Debug, Clone, Copy)] -pub struct BareHead { - pub face: FixedDotIndex, -} - -impl HeadTrait for BareHead { - fn face(&self) -> DotIndex { - self.face.into() - } -} - -#[derive(Debug, Clone, Copy)] -pub struct CaneHead { - pub face: LooseDotIndex, - pub cane: Cane, -} - -impl HeadTrait for CaneHead { - fn face(&self) -> DotIndex { - self.face.into() - } -} - pub struct Guide<'a, CW: Copy, R: RulesTrait> { drawing: &'a Drawing, } diff --git a/src/drawing/head.rs b/src/drawing/head.rs new file mode 100644 index 0000000..7c635ae --- /dev/null +++ b/src/drawing/head.rs @@ -0,0 +1,84 @@ +use enum_dispatch::enum_dispatch; + +use crate::geometry::shape::MeasureLength; + +use super::{ + cane::Cane, + dot::{DotIndex, FixedDotIndex, LooseDotIndex}, + primitive::MakePrimitiveShape, + rules::RulesTrait, + Drawing, +}; + +#[enum_dispatch] +pub trait HeadTrait { + fn face(&self) -> DotIndex; +} + +#[enum_dispatch(HeadTrait)] +#[derive(Debug, Clone, Copy)] +pub enum Head { + Bare(BareHead), + Cane(CaneHead), +} + +impl Head { + pub fn ref_<'a, CW: Copy, R: RulesTrait>( + &self, + drawing: &'a Drawing, + ) -> HeadRef<'a, CW, R> { + HeadRef::new(*self, drawing) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct BareHead { + pub face: FixedDotIndex, +} + +impl HeadTrait for BareHead { + fn face(&self) -> DotIndex { + self.face.into() + } +} + +#[derive(Debug, Clone, Copy)] +pub struct CaneHead { + pub face: LooseDotIndex, + pub cane: Cane, +} + +impl HeadTrait for CaneHead { + fn face(&self) -> DotIndex { + self.face.into() + } +} + +pub struct HeadRef<'a, CW: Copy, R: RulesTrait> { + head: Head, + drawing: &'a Drawing, +} + +impl<'a, CW: Copy, R: RulesTrait> HeadRef<'a, CW, R> { + pub fn new(head: Head, drawing: &'a Drawing) -> Self { + Self { drawing, head } + } +} + +impl<'a, CW: Copy, R: RulesTrait> HeadTrait for HeadRef<'a, CW, R> { + fn face(&self) -> DotIndex { + self.head.face() + } +} + +impl<'a, CW: Copy, R: RulesTrait> MeasureLength for HeadRef<'a, CW, R> { + fn length(&self) -> f64 { + match self.head { + Head::Bare(..) => 0.0, + Head::Cane(cane_head) => { + self.drawing.primitive(cane_head.cane.seg).shape().length() + + self.drawing.primitive(cane_head.cane.bend).shape().length() + } + } + } +} diff --git a/src/drawing/mod.rs b/src/drawing/mod.rs index a4f100c..62d0699 100644 --- a/src/drawing/mod.rs +++ b/src/drawing/mod.rs @@ -7,6 +7,7 @@ pub mod collect; pub mod dot; mod drawing; pub mod guide; +pub mod head; pub mod loose; pub mod primitive; pub mod rules; diff --git a/src/router/draw.rs b/src/router/draw.rs index e777f05..dcbc16e 100644 --- a/src/router/draw.rs +++ b/src/router/draw.rs @@ -8,7 +8,8 @@ use crate::{ bend::{BendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, LooseDotIndex, LooseDotWeight}, graph::{GetLayer, GetMaybeNet, MakePrimitive}, - guide::{CaneHead, Guide, Head, HeadTrait}, + guide::Guide, + head::{CaneHead, Head, HeadTrait}, primitive::GetOtherJoint, rules::RulesTrait, seg::{LoneLooseSegWeight, SeqLooseSegWeight}, diff --git a/src/router/route.rs b/src/router/route.rs index c8a00c3..b15d657 100644 --- a/src/router/route.rs +++ b/src/router/route.rs @@ -11,7 +11,6 @@ use crate::{ band::BandFirstSegIndex, dot::{DotIndex, FixedDotIndex}, graph::{MakePrimitive, PrimitiveIndex}, - guide::{CaneHead, Head, HeadTrait}, primitive::MakePrimitiveShape, rules::RulesTrait, }, diff --git a/src/router/router.rs b/src/router/router.rs index 28c90d5..91b0e3f 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -7,7 +7,7 @@ use crate::{ band::BandFirstSegIndex, dot::{DotIndex, FixedDotIndex}, graph::{MakePrimitive, PrimitiveIndex}, - guide::{Head, HeadTrait}, + head::{Head, HeadTrait}, primitive::MakePrimitiveShape, rules::RulesTrait, }, @@ -56,34 +56,18 @@ impl<'a, R: RulesTrait> RouterAstarStrategy<'a, R> { } fn bihead_length(&self) -> f64 { - self.head_length(&self.trace.head) + self.trace.head.ref_(self.tracer.layout.drawing()).length() + match self.trace.head.face() { DotIndex::Fixed(..) => 0.0, - DotIndex::Loose(face) => { - self.head_length(&self.tracer.layout.drawing().guide().rear_head(face)) - } - } - } - - fn head_length(&self, head: &Head) -> f64 { - match head { - Head::Bare(..) => 0.0, - Head::Cane(cane_head) => { - self.tracer + DotIndex::Loose(face) => self + .tracer .layout .drawing() - .primitive(cane_head.cane.seg) - .shape() - .length() - + self - .tracer - .layout - .drawing() - .primitive(cane_head.cane.bend) - .shape() - .length() + .guide() + .rear_head(face) + .ref_(self.tracer.layout.drawing()) + .length(), } - } } } diff --git a/src/router/trace.rs b/src/router/trace.rs index 1648dff..d60ac82 100644 --- a/src/router/trace.rs +++ b/src/router/trace.rs @@ -6,7 +6,7 @@ use crate::{ bend::LooseBendIndex, dot::FixedDotIndex, graph::PrimitiveIndex, - guide::{BareHead, CaneHead, Head}, + head::{BareHead, CaneHead, Head}, rules::RulesTrait, }, router::{ diff --git a/src/router/tracer.rs b/src/router/tracer.rs index 72f514e..ffdcb6d 100644 --- a/src/router/tracer.rs +++ b/src/router/tracer.rs @@ -7,11 +7,7 @@ use thiserror::Error; use crate::{ drawing::{ - band::BandFirstSegIndex, - bend::LooseBendIndex, - dot::FixedDotIndex, - graph::PrimitiveIndex, - guide::{BareHead, CaneHead, Head}, + band::BandFirstSegIndex, bend::LooseBendIndex, dot::FixedDotIndex, graph::PrimitiveIndex, rules::RulesTrait, }, layout::Layout,