From 0c6190e2355d2365bfbf3b5666af3de927658601 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sat, 13 Jan 2024 22:55:54 +0000 Subject: [PATCH] cleanup,layout: make connectivity and geometry private and clean up --- src/draw.rs | 5 ++-- src/geometry.rs | 3 +-- src/graph.rs | 2 +- src/layout.rs | 48 ++++++++++++++++++++++++++++---------- src/main.rs | 12 +++++----- src/mesh.rs | 2 +- src/primitive.rs | 55 ++++++++++++++++++++++---------------------- src/tracer.rs | 12 +++------- src/triangulation.rs | 2 +- 9 files changed, 79 insertions(+), 62 deletions(-) diff --git a/src/draw.rs b/src/draw.rs index 49c1ed7..57c126c 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -4,9 +4,8 @@ use thiserror::Error; use crate::{ geometry::{ - BendIndex, DotIndex, FixedDotIndex, FixedSegWeight, GetBandIndex, GetNet, LooseBendIndex, - LooseBendWeight, LooseDotIndex, LooseDotWeight, LooseSegWeight, MakePrimitive, - WraparoundableIndex, + BendIndex, DotIndex, FixedDotIndex, FixedSegWeight, GetBandIndex, GetNet, LooseBendWeight, + LooseDotIndex, LooseDotWeight, LooseSegWeight, MakePrimitive, WraparoundableIndex, }, guide::{Guide, Head, HeadTrait, SegbendHead}, layout::{Infringement, Layout, LayoutException}, diff --git a/src/geometry.rs b/src/geometry.rs index f703eb0..0f9c738 100644 --- a/src/geometry.rs +++ b/src/geometry.rs @@ -1,10 +1,9 @@ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::{NodeIndex, StableDiGraph}; -use std::marker::PhantomData; use crate::{ connectivity::{BandIndex, BandWeight, ComponentWeight, ConnectivityWeight}, - graph::{GenericIndex, GetNodeIndex}, + graph::GenericIndex, layout::Layout, math::Circle, primitive::{GenericPrimitive, Primitive}, diff --git a/src/graph.rs b/src/graph.rs index 5408380..f2a5b01 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -7,7 +7,7 @@ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::NodeIndex; // Due to apparent limitations of enum_dispatch we're forced to import some types backwards. -use crate::connectivity::{BandWeight, ComponentWeight, ConnectivityWeight}; + use crate::geometry::{BendIndex, DotIndex, Index, SegIndex, WraparoundableIndex}; #[enum_dispatch] diff --git a/src/layout.rs b/src/layout.rs index a47909b..52966e7 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -1,4 +1,4 @@ -use contracts::debug_invariant; +use contracts::{debug_ensures, debug_invariant}; use enum_dispatch::enum_dispatch; use geo::Point; use petgraph::stable_graph::StableDiGraph; @@ -8,7 +8,7 @@ use rstar::primitives::GeomWithData; use rstar::{RTree, RTreeObject}; use thiserror::Error; -use crate::connectivity::{BandIndex, ConnectivityLabel, ConnectivityWeight}; +use crate::connectivity::{BandIndex, BandWeight, ConnectivityGraph, ConnectivityWeight}; use crate::geometry::{ BendWeight, DotIndex, DotWeight, FixedBendIndex, FixedDotIndex, FixedDotWeight, FixedSegIndex, FixedSegWeight, GeometryGraph, GeometryLabel, GeometryWeight, GetNet, Index, LooseBendIndex, @@ -19,8 +19,8 @@ use crate::graph::{GenericIndex, GetNodeIndex}; use crate::guide::Guide; use crate::math::NoTangents; use crate::primitive::{ - GenericPrimitive, GetConnectable, GetCore, GetEnds, GetFirstRail, GetInnerOuter, GetInterior, - GetOtherEnd, GetWeight, GetWraparound, MakeShape, + GenericPrimitive, GetConnectable, GetCore, GetEnds, GetFirstRail, GetInnerOuter, GetOtherEnd, + GetWeight, GetWraparound, MakeShape, }; use crate::segbend::Segbend; use crate::shape::{Shape, ShapeTrait}; @@ -56,8 +56,8 @@ pub struct AlreadyConnected(pub i64, pub Index); #[derive(Debug)] pub struct Layout { rtree: RTree, - pub connectivity: StableDiGraph, - pub geometry: GeometryGraph, + connectivity: ConnectivityGraph, + geometry: GeometryGraph, } #[debug_invariant(self.geometry.node_count() == self.rtree.size())] @@ -103,6 +103,18 @@ impl Layout { self.geometry.remove_node(index.node_index()); } + #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] + #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] + pub fn add_band(&mut self, from: FixedDotIndex, width: f64) -> BandIndex { + BandIndex::new( + self.connectivity + .add_node(ConnectivityWeight::Band(BandWeight { + width, + net: self.primitive(from).net(), + })), + ) + } + #[debug_ensures(ret.is_ok() -> self.geometry.node_count() == old(self.geometry.node_count() + 1))] #[debug_ensures(ret.is_err() -> self.geometry.node_count() == old(self.geometry.node_count()))] #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] @@ -770,12 +782,6 @@ impl Layout { Ok(()) } - #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] - #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] - pub fn primitive(&self, index: GenericIndex) -> GenericPrimitive { - GenericPrimitive::new(index, self) - } - #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] fn detect_infringement_except(&self, index: Index, except: &[Index]) -> Option { @@ -829,6 +835,24 @@ impl Layout { } impl Layout { + #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] + #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] + pub fn connectivity(&self) -> &ConnectivityGraph { + &self.connectivity + } + + #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] + #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] + pub fn geometry(&self) -> &GeometryGraph { + &self.geometry + } + + #[debug_ensures(self.geometry.node_count() == old(self.geometry.node_count()))] + #[debug_ensures(self.geometry.edge_count() == old(self.geometry.edge_count()))] + pub fn primitive(&self, index: GenericIndex) -> GenericPrimitive { + GenericPrimitive::new(index, self) + } + fn test_envelopes(&self) -> bool { !self.rtree.iter().any(|wrapper| { let index = wrapper.data; diff --git a/src/main.rs b/src/main.rs index 0d808b2..594b0ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,7 @@ use layout::{Infringement, Layout, LayoutException}; use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use primitive::MakeShape; -use router::{RouterObserver, RoutingError}; +use router::RouterObserver; use sdl2::event::Event; use sdl2::keyboard::Keycode; @@ -68,14 +68,14 @@ enum RouterOrLayout<'a> { struct EmptyRouterObserver; impl RouterObserver for EmptyRouterObserver { - fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {} - fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {} + fn on_rework(&mut self, _tracer: &Tracer, _trace: &Trace) {} + fn before_probe(&mut self, _tracer: &Tracer, _trace: &Trace, _edge: MeshEdgeReference) {} fn on_probe( &mut self, - tracer: &Tracer, - trace: &Trace, + _tracer: &Tracer, + _trace: &Trace, _edge: MeshEdgeReference, - result: Result<(), DrawException>, + _result: Result<(), DrawException>, ) { } fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {} diff --git a/src/mesh.rs b/src/mesh.rs index f1b2db1..52e571f 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -75,7 +75,7 @@ impl Mesh { vertex_to_triangulation_vertex: Vec::new(), }; this.vertex_to_triangulation_vertex - .resize(layout.geometry.node_bound(), None); + .resize(layout.geometry().node_bound(), None); this } diff --git a/src/primitive.rs b/src/primitive.rs index de85df7..75f631f 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -66,15 +66,15 @@ pub trait GetWraparound: GetLayout + GetNodeIndex { pub trait GetFirstRail: GetLayout + GetNodeIndex { fn first_rail(&self) -> Option { self.layout() - .geometry + .geometry() .neighbors_directed(self.node_index(), Incoming) .filter(|ni| { matches!( self.layout() - .geometry + .geometry() .edge_weight( self.layout() - .geometry + .geometry() .find_edge(*ni, self.node_index()) .unwrap() ) @@ -90,15 +90,15 @@ pub trait GetFirstRail: GetLayout + GetNodeIndex { pub trait GetCore: GetLayout + GetNodeIndex { fn core(&self) -> FixedDotIndex { self.layout() - .geometry + .geometry() .neighbors(self.node_index()) .filter(|ni| { matches!( self.layout() - .geometry + .geometry() .edge_weight( self.layout() - .geometry + .geometry() .find_edge(self.node_index(), *ni) .unwrap() ) @@ -115,15 +115,15 @@ pub trait GetCore: GetLayout + GetNodeIndex { pub trait GetInnerOuter: GetLayout + GetNodeIndex { fn inner(&self) -> Option { self.layout() - .geometry + .geometry() .neighbors_directed(self.node_index(), Incoming) .filter(|ni| { matches!( self.layout() - .geometry + .geometry() .edge_weight( self.layout() - .geometry + .geometry() .find_edge(*ni, self.node_index()) .unwrap() ) @@ -137,15 +137,15 @@ pub trait GetInnerOuter: GetLayout + GetNodeIndex { fn outer(&self) -> Option { self.layout() - .geometry + .geometry() .neighbors_directed(self.node_index(), Outgoing) .filter(|ni| { matches!( self.layout() - .geometry + .geometry() .edge_weight( self.layout() - .geometry + .geometry() .find_edge(self.node_index(), *ni) .unwrap() ) @@ -191,7 +191,7 @@ macro_rules! impl_loose_primitive { impl<'a> GetNet for $primitive_struct<'a> { fn net(&self) -> i64 { self.layout() - .connectivity + .connectivity() .node_weight(self.weight().band().node_index()) .unwrap() .net() @@ -224,22 +224,22 @@ impl<'a, W> GenericPrimitive<'a, W> { fn tagged_weight(&self) -> GeometryWeight { *self .layout - .geometry + .geometry() .node_weight(self.index.node_index()) .unwrap() } fn adjacents(&self) -> Vec> { self.layout - .geometry + .geometry() .neighbors_undirected(self.index.node_index()) .filter(|ni| { matches!( self.layout - .geometry + .geometry() .edge_weight( self.layout - .geometry + .geometry() .find_edge_undirected(self.index.node_index(), *ni) .unwrap() .0, @@ -308,15 +308,15 @@ impl_loose_primitive!(LooseDot, LooseDotWeight); impl<'a> LooseDot<'a> { pub fn seg(&self) -> Option { self.layout - .geometry + .geometry() .neighbors_undirected(self.index.node_index()) .filter(|ni| { matches!( self.layout - .geometry + .geometry() .edge_weight( self.layout - .geometry + .geometry() .find_edge_undirected(self.index.node_index(), *ni) .unwrap() .0, @@ -327,7 +327,7 @@ impl<'a> LooseDot<'a> { }) .filter(|ni| { matches!( - self.layout.geometry.node_weight(*ni).unwrap(), + self.layout.geometry().node_weight(*ni).unwrap(), GeometryWeight::LooseSeg(..) ) }) @@ -337,15 +337,15 @@ impl<'a> LooseDot<'a> { pub fn bend(&self) -> LooseBendIndex { self.layout - .geometry + .geometry() .neighbors_undirected(self.index.node_index()) .filter(|ni| { matches!( self.layout - .geometry + .geometry() .edge_weight( self.layout - .geometry + .geometry() .find_edge_undirected(self.index.node_index(), *ni) .unwrap() .0, @@ -356,7 +356,7 @@ impl<'a> LooseDot<'a> { }) .filter(|ni| { matches!( - self.layout.geometry.node_weight(*ni).unwrap(), + self.layout.geometry().node_weight(*ni).unwrap(), GeometryWeight::LooseBend(..) ) }) @@ -423,9 +423,10 @@ impl<'a> GetWidth for LooseSeg<'a> { impl<'a> GetEnds for LooseSeg<'a> { fn ends(&self) -> (DotIndex, LooseDotIndex) { let v = self.adjacents(); - if let GeometryWeight::FixedDot(..) = self.layout.geometry.node_weight(v[0]).unwrap() { + if let GeometryWeight::FixedDot(..) = self.layout.geometry().node_weight(v[0]).unwrap() { (FixedDotIndex::new(v[0]).into(), LooseDotIndex::new(v[1])) - } else if let GeometryWeight::FixedDot(..) = self.layout.geometry.node_weight(v[1]).unwrap() + } else if let GeometryWeight::FixedDot(..) = + self.layout.geometry().node_weight(v[1]).unwrap() { (FixedDotIndex::new(v[1]).into(), LooseDotIndex::new(v[0])) } else { diff --git a/src/tracer.rs b/src/tracer.rs index bd62cd0..80a008e 100644 --- a/src/tracer.rs +++ b/src/tracer.rs @@ -1,11 +1,10 @@ use contracts::debug_ensures; use crate::{ - connectivity::{BandIndex, BandWeight, ConnectivityWeight}, draw::{Draw, DrawException}, - geometry::{FixedDotIndex, GetNet, LooseBendIndex}, + geometry::{FixedDotIndex, LooseBendIndex}, guide::{BareHead, Head, SegbendHead}, - layout::{Layout, LayoutException}, + layout::Layout, mesh::{Mesh, VertexIndex}, rules::Rules, }; @@ -32,12 +31,7 @@ impl<'a> Tracer<'a> { } pub fn start(&mut self, from: FixedDotIndex, width: f64) -> Trace { - let band = BandIndex::new(self.layout.connectivity.add_node(ConnectivityWeight::Band( - BandWeight { - width, - net: self.layout.primitive(from).net(), - }, - ))); + let band = self.layout.add_band(from, width); Trace { path: vec![from.into()], head: BareHead { dot: from, band }.into(), diff --git a/src/triangulation.rs b/src/triangulation.rs index f89bd5b..2f3750a 100644 --- a/src/triangulation.rs +++ b/src/triangulation.rs @@ -27,7 +27,7 @@ impl + HasPosition