diff --git a/src/guide.rs b/src/guide.rs index 20e3c5b..8a52395 100644 --- a/src/guide.rs +++ b/src/guide.rs @@ -63,10 +63,9 @@ impl<'a, 'b> Guide<'a, 'b> { } pub fn head_cw(&self, head: &Head) -> Option { - match &head.segbend { - Some(segbend) => Some(self.layout.primitive(segbend.bend).weight().cw), - None => None, - } + head.segbend + .as_ref() + .map(|segbend| self.layout.primitive(segbend.bend).weight().cw) } fn head_circle(&self, head: &Head, width: f64) -> Circle { diff --git a/src/router.rs b/src/router.rs index 2400605..6b2c242 100644 --- a/src/router.rs +++ b/src/router.rs @@ -2,8 +2,6 @@ use geo::geometry::Point; use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use spade::InsertionError; - - use crate::astar::astar; use crate::bow::Bow; use crate::graph::{BendIndex, DotIndex, Ends, SegIndex, TaggedIndex}; @@ -16,7 +14,6 @@ use crate::mesh::{Mesh, VertexIndex}; use crate::rules::{Conditions, Rules}; use crate::segbend::Segbend; - pub struct Router { pub layout: Layout, mesh: Mesh, @@ -90,12 +87,33 @@ impl Router { Ok(()) } + fn unroute_step(&mut self, mut route: Route) -> Result { + route.head = self.undraw_segbend(route.head).unwrap(); + route.path.pop(); + Ok(route) + } + fn route_step(&mut self, mut route: Route, to: DotIndex) -> Result { route.head = self.draw_around_dot(route.head, to, true, route.width)?; route.path.push(self.mesh.vertex(to)); Ok(route) } + pub fn undraw_segbend(&mut self, head: Head) -> Option { + let segbend = head.segbend.unwrap(); + + if let Some(prev_dot) = self.layout.primitive(segbend.ends().0).prev() { + self.layout.remove_interior(&segbend); + + Some(Head { + dot: prev_dot, + segbend: self.layout.prev_segbend(prev_dot), + }) + } else { + None + } + } + pub fn draw_start(&mut self, from: DotIndex) -> Head { Head { dot: from, diff --git a/src/segbend.rs b/src/segbend.rs index e86fa40..fe75be1 100644 --- a/src/segbend.rs +++ b/src/segbend.rs @@ -1,7 +1,7 @@ use petgraph::stable_graph::StableDiGraph; use crate::{ - graph::{BendIndex, DotIndex, Interior, Label, SegIndex, TaggedIndex, TaggedWeight}, + graph::{BendIndex, DotIndex, Ends, Interior, Label, SegIndex, TaggedIndex, TaggedWeight}, primitive::{Bend, Dot}, }; @@ -64,3 +64,9 @@ impl Interior for Segbend { ] } } + +impl Ends for Segbend { + fn ends(&self) -> (SegIndex, BendIndex) { + (self.seg, self.bend) + } +}