From 47aadfcdd38f42166b68ed957b4058e1e070208d Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 29 Aug 2023 01:49:37 +0200 Subject: [PATCH] Introduce `Segbend`, a seg-dot-bend triple --- src/bow.rs | 2 +- src/guide.rs | 14 ++++---- src/layout.rs | 11 +++++- src/main.rs | 1 + src/primitive.rs | 88 ++++++++++++++++++++++++------------------------ src/router.rs | 47 +++++++++++++++----------- src/segbend.rs | 66 ++++++++++++++++++++++++++++++++++++ 7 files changed, 156 insertions(+), 73 deletions(-) create mode 100644 src/segbend.rs diff --git a/src/bow.rs b/src/bow.rs index 5d05ffa..d3829e1 100644 --- a/src/bow.rs +++ b/src/bow.rs @@ -16,7 +16,7 @@ pub struct Bow { } impl Bow { - pub fn new(index: BendIndex, graph: &StableDiGraph) -> Self { + pub fn from_bend(index: BendIndex, graph: &StableDiGraph) -> Self { let bend = index; let seg1_dot2 = Bend::new(bend, graph).prev().unwrap(); diff --git a/src/guide.rs b/src/guide.rs index 9d0823c..07f09c1 100644 --- a/src/guide.rs +++ b/src/guide.rs @@ -63,15 +63,13 @@ impl<'a, 'b> Guide<'a, 'b> { } pub fn head_cw(&self, head: &Head) -> Option { - match head.bend { - Some(bend) => Some(self.layout.primitive(bend).weight().cw), + match &head.segbend { + Some(segbend) => Some(self.layout.primitive(segbend.bend).weight().cw), None => None, } } fn head_circle(&self, head: &Head, width: f64) -> Circle { - let maybe_bend = head.bend; - let conditions = Conditions { lower_net: None, higher_net: None, @@ -79,12 +77,12 @@ impl<'a, 'b> Guide<'a, 'b> { zone: None, }; - match maybe_bend { - Some(bend) => { - if let Some(inner) = self.layout.primitive(bend).inner() { + match &head.segbend { + Some(segbend) => { + if let Some(inner) = self.layout.primitive(segbend.bend).inner() { self.bend_circle(inner, width) } else { - self.dot_circle(self.layout.primitive(bend).core().unwrap(), width) + self.dot_circle(self.layout.primitive(segbend.bend).core().unwrap(), width) } } None => Circle { diff --git a/src/layout.rs b/src/layout.rs index 9cf0e57..28c5a9c 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -12,6 +12,7 @@ use crate::graph::{ TaggedIndex, TaggedWeight, }; use crate::primitive::Primitive; +use crate::segbend::Segbend; use crate::shape::Shape; pub type RTreeWrapper = GeomWithData; @@ -215,7 +216,15 @@ impl Layout { } pub fn bow(&self, bend: BendIndex) -> Bow { - Bow::new(bend, &self.graph) + Bow::from_bend(bend, &self.graph) + } + + pub fn prev_segbend(&self, dot: DotIndex) -> Option { + Segbend::from_dot_prev(dot, &self.graph) + } + + pub fn next_segbend(&self, dot: DotIndex) -> Option { + Segbend::from_dot_next(dot, &self.graph) } fn fail_and_remove_if_collides_except( diff --git a/src/main.rs b/src/main.rs index 0c56ef5..063c88a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ mod mesh; mod primitive; mod router; mod rules; +mod segbend; mod shape; use geo::EuclideanDistance; diff --git a/src/primitive.rs b/src/primitive.rs index 31c67f2..6a4bbde 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -80,50 +80,6 @@ impl<'a, Weight> Primitive<'a, Weight> { .map(|index| Index::