router: reimplement interactive routing

This commit is contained in:
Mikolaj Wielgus 2024-01-23 18:04:27 +00:00
parent 35d713b5e6
commit bc72aa62d0
4 changed files with 74 additions and 48 deletions

View File

@ -4,7 +4,7 @@ use crate::{
graph::GetNodeIndex,
layout::Layout,
loose::{GetNextLoose, LooseIndex},
primitive::GetEnds,
primitive::{GetEnds, GetOtherEnd},
};
pub struct Band<'a> {
@ -46,14 +46,18 @@ impl<'a> Band<'a> {
maybe_loose = self.layout.loose(loose).next_loose(prev_prev);
}
if let Some(LooseIndex::SeqSeg(seg)) = maybe_loose {
if let DotIndex::Fixed(dot) = self.layout.primitive(seg).ends().0 {
Some(dot)
} else {
unreachable!()
match prev {
Some(LooseIndex::LoneSeg(seg)) => {
Some(self.layout.primitive(seg).other_end(self.from()))
}
} else {
None
Some(LooseIndex::SeqSeg(seg)) => {
if let DotIndex::Fixed(dot) = self.layout.primitive(seg).ends().0 {
Some(dot)
} else {
None
}
}
_ => unreachable!(),
}
}
}

View File

@ -92,8 +92,9 @@ impl Layout {
LooseIndex::Dot(dot) => {
dots.push(dot);
}
LooseIndex::LoneSeg(..) => {
unreachable!();
LooseIndex::LoneSeg(seg) => {
self.remove(seg.into());
break;
}
LooseIndex::SeqSeg(seg) => {
segs.push(seg);

View File

@ -28,6 +28,7 @@ mod tracer;
mod triangulation;
mod wraparoundable;
use connectivity::BandIndex;
use draw::DrawException;
use geo::point;
use geometry::{FixedDotIndex, FixedSegWeight, GeometryIndex, LooseDotIndex, MakePrimitive};
@ -116,7 +117,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
self.font_context,
RouterOrLayout::Layout(tracer.layout),
None,
None,
Some(tracer.mesh.clone()),
&trace.path,
&[],
@ -135,7 +135,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
self.font_context,
RouterOrLayout::Layout(tracer.layout),
None,
None,
Some(tracer.mesh.clone()),
&path,
&[],
@ -167,7 +166,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
self.font_context,
RouterOrLayout::Layout(tracer.layout),
None,
None,
Some(tracer.mesh.clone()),
&trace.path,
&ghosts,
@ -510,7 +508,6 @@ fn main() -> Result<(), anyhow::Error> {
RouterOrLayout::Layout(&router.layout),
None,
None,
None,
&[],
&[],
&[],
@ -543,7 +540,6 @@ fn main() -> Result<(), anyhow::Error> {
RouterOrLayout::Layout(&router.layout),
None,
None,
None,
&[],
&[],
&[],
@ -565,7 +561,6 @@ fn main() -> Result<(), anyhow::Error> {
RouterOrLayout::Layout(&router.layout),
None,
None,
None,
&[],
&[],
&[],
@ -582,6 +577,33 @@ fn main() -> Result<(), anyhow::Error> {
RouterOrLayout::Layout(&router.layout),
None,
None,
&[],
&[],
&[],
-1,
);
render_times(
&mut event_pump,
&window,
&mut renderer,
&font_context,
RouterOrLayout::Router(&mut router),
Some(band2),
None,
&[],
&[],
&[],
-1,
);
render_times(
&mut event_pump,
&window,
&mut renderer,
&font_context,
RouterOrLayout::Layout(&router.layout),
None,
None,
&[],
&[],
@ -598,9 +620,8 @@ fn render_times(
renderer: &mut Renderer<GLDevice>,
font_context: &CanvasFontContext,
mut router_or_layout: RouterOrLayout,
from: Option<FixedDotIndex>,
follower: Option<LooseDotIndex>,
mut mesh: Option<Mesh>,
maybe_band: Option<BandIndex>,
mut maybe_mesh: Option<Mesh>,
path: &[VertexIndex],
ghosts: &[Shape],
highlighteds: &[GeometryIndex],
@ -628,27 +649,22 @@ fn render_times(
let layout = match router_or_layout {
RouterOrLayout::Router(ref mut router) => {
if let Some(follower) = follower {
let state = event_pump.mouse_state();
let state = event_pump.mouse_state();
if let Some(from) = from {
mesh = router
.reroute(
from,
point! {x: state.x() as f64, y: state.y() as f64},
&mut DebugRouterObserver::new(
event_pump,
window,
renderer,
font_context,
),
)
.ok();
} else {
let _ = router
.layout
.move_dot(follower.into(), (state.x() as f64, state.y() as f64).into());
}
if let Some(band) = maybe_band {
router
.reroute_band(
band,
point! {x: state.x() as f64, y: state.y() as f64},
&mut DebugRouterObserver::new(
event_pump,
window,
renderer,
font_context,
),
)
.ok();
maybe_mesh = None;
}
&router.layout
@ -672,7 +688,7 @@ fn render_times(
render_shape(&mut canvas, &ghost, ColorU::new(75, 75, 150, 255));
}
if let Some(ref mesh) = mesh {
if let Some(ref mesh) = maybe_mesh {
for edge in mesh.edge_references() {
let start_point = edge.source().primitive(layout).shape().center();
let end_point = edge.target().primitive(layout).shape().center();

View File

@ -4,12 +4,13 @@ use spade::InsertionError;
use thiserror::Error;
use crate::astar::{astar, AstarStrategy, PathTracker};
use crate::connectivity::BandIndex;
use crate::connectivity::{BandIndex, GetNet};
use crate::draw::DrawException;
use crate::geometry::FixedDotIndex;
use crate::geometry::{FixedDotIndex, FixedDotWeight};
use crate::guide::HeadTrait;
use crate::layout::Layout;
use crate::math::Circle;
use crate::mesh::{Mesh, MeshEdgeReference, VertexIndex};
use crate::rules::Rules;
@ -147,13 +148,17 @@ impl Router {
Ok(band)
}
pub fn reroute(
pub fn reroute_band(
&mut self,
_from: FixedDotIndex,
_to: Point,
_observer: &mut impl RouterObserver,
) -> Result<Mesh, InsertionError> {
Ok(Mesh::new(&self.layout))
band: BandIndex,
to: Point,
observer: &mut impl RouterObserver,
) -> Result<BandIndex, RoutingError> {
let from_dot = self.layout.band(band).from();
let to_dot = self.layout.band(band).to().unwrap();
self.layout.remove_band(band);
self.layout.move_dot(to_dot.into(), to).unwrap(); // TODO: Remove `.unwrap()`.
self.route_band(from_dot, to_dot, observer)
}
pub fn tracer<'a>(&'a mut self, mesh: &'a Mesh) -> Tracer {