Add methods to unroute or undraw segbends

This commit is contained in:
Mikolaj Wielgus 2023-08-29 21:11:03 +02:00
parent f2346eedb8
commit 247b78087c
3 changed files with 31 additions and 8 deletions

View File

@ -63,10 +63,9 @@ impl<'a, 'b> Guide<'a, 'b> {
} }
pub fn head_cw(&self, head: &Head) -> Option<bool> { pub fn head_cw(&self, head: &Head) -> Option<bool> {
match &head.segbend { head.segbend
Some(segbend) => Some(self.layout.primitive(segbend.bend).weight().cw), .as_ref()
None => None, .map(|segbend| self.layout.primitive(segbend.bend).weight().cw)
}
} }
fn head_circle(&self, head: &Head, width: f64) -> Circle { fn head_circle(&self, head: &Head, width: f64) -> Circle {

View File

@ -2,8 +2,6 @@ use geo::geometry::Point;
use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use petgraph::visit::{EdgeRef, IntoEdgeReferences};
use spade::InsertionError; use spade::InsertionError;
use crate::astar::astar; use crate::astar::astar;
use crate::bow::Bow; use crate::bow::Bow;
use crate::graph::{BendIndex, DotIndex, Ends, SegIndex, TaggedIndex}; use crate::graph::{BendIndex, DotIndex, Ends, SegIndex, TaggedIndex};
@ -16,7 +14,6 @@ use crate::mesh::{Mesh, VertexIndex};
use crate::rules::{Conditions, Rules}; use crate::rules::{Conditions, Rules};
use crate::segbend::Segbend; use crate::segbend::Segbend;
pub struct Router { pub struct Router {
pub layout: Layout, pub layout: Layout,
mesh: Mesh, mesh: Mesh,
@ -90,12 +87,33 @@ impl Router {
Ok(()) Ok(())
} }
fn unroute_step(&mut self, mut route: Route) -> Result<Route, ()> {
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, ()> { fn route_step(&mut self, mut route: Route, to: DotIndex) -> Result<Route, ()> {
route.head = self.draw_around_dot(route.head, to, true, route.width)?; route.head = self.draw_around_dot(route.head, to, true, route.width)?;
route.path.push(self.mesh.vertex(to)); route.path.push(self.mesh.vertex(to));
Ok(route) Ok(route)
} }
pub fn undraw_segbend(&mut self, head: Head) -> Option<Head> {
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 { pub fn draw_start(&mut self, from: DotIndex) -> Head {
Head { Head {
dot: from, dot: from,

View File

@ -1,7 +1,7 @@
use petgraph::stable_graph::StableDiGraph; use petgraph::stable_graph::StableDiGraph;
use crate::{ use crate::{
graph::{BendIndex, DotIndex, Interior, Label, SegIndex, TaggedIndex, TaggedWeight}, graph::{BendIndex, DotIndex, Ends, Interior, Label, SegIndex, TaggedIndex, TaggedWeight},
primitive::{Bend, Dot}, primitive::{Bend, Dot},
}; };
@ -64,3 +64,9 @@ impl Interior<TaggedIndex> for Segbend {
] ]
} }
} }
impl Ends<SegIndex, BendIndex> for Segbend {
fn ends(&self) -> (SegIndex, BendIndex) {
(self.seg, self.bend)
}
}