main: highlight nodes that made the probe fail

This commit is contained in:
Mikolaj Wielgus 2023-12-23 01:03:43 +00:00
parent 9a005c8ba3
commit da8af817bf
2 changed files with 36 additions and 21 deletions

View File

@ -706,16 +706,11 @@ impl Layout {
} }
pub fn nodes(&self) -> impl Iterator<Item = Index> + '_ { pub fn nodes(&self) -> impl Iterator<Item = Index> + '_ {
self.node_indices().map(|ni| { self.rtree.iter().map(|wrapper| wrapper.data)
self.graph
.node_weight(ni.node_index())
.unwrap()
.retag(ni.node_index())
})
} }
pub fn shapes(&self) -> impl Iterator<Item = Shape> + '_ { pub fn shapes(&self) -> impl Iterator<Item = Shape> + '_ {
self.node_indices().map(|ni| ni.primitive(self).shape()) self.nodes().map(|node| node.primitive(self).shape())
} }
pub fn node_count(&self) -> usize { pub fn node_count(&self) -> usize {

View File

@ -27,7 +27,7 @@ mod triangulation;
use draw::DrawException; use draw::DrawException;
use geo::point; use geo::point;
use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive}; use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive};
use layout::Layout; use layout::{Infringement, Layout, LayoutException};
use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use mesh::{Mesh, MeshEdgeReference, VertexIndex};
use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use petgraph::visit::{EdgeRef, IntoEdgeReferences};
use primitive::MakeShape; use primitive::MakeShape;
@ -115,6 +115,7 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
None, None,
Some(tracer.mesh.clone()), Some(tracer.mesh.clone()),
&trace.path, &trace.path,
&[],
40, 40,
); );
} }
@ -132,6 +133,7 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
None, None,
Some(tracer.mesh.clone()), Some(tracer.mesh.clone()),
&path, &path,
&[],
10, 10,
); );
} }
@ -143,6 +145,17 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
_edge: MeshEdgeReference, _edge: MeshEdgeReference,
result: Result<(), DrawException>, result: Result<(), DrawException>,
) { ) {
let highlight = match result {
Err(DrawException::CannotWrapAround(
..,
LayoutException::Infringement(Infringement(.., infringee1)),
LayoutException::Infringement(Infringement(.., infringee2)),
)) => {
vec![infringee1, infringee2]
}
_ => vec![],
};
render_times( render_times(
self.event_pump, self.event_pump,
self.window, self.window,
@ -153,6 +166,7 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
None, None,
Some(tracer.mesh.clone()), Some(tracer.mesh.clone()),
&trace.path, &trace.path,
&highlight,
10, 10,
); );
} }
@ -471,8 +485,8 @@ fn main() {
let _ = router.enroute( let _ = router.enroute(
dot_start, dot_start,
dot_end, dot_end,
&mut EmptyRouterObserver, //&mut EmptyRouterObserver,
//&mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context), &mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context),
); );
render_times( render_times(
@ -485,6 +499,7 @@ fn main() {
None, None,
None, None,
&[], &[],
&[],
-1, -1,
); );
@ -502,8 +517,8 @@ fn main() {
let _ = router.enroute( let _ = router.enroute(
dot_start2, dot_start2,
dot_end2, dot_end2,
&mut EmptyRouterObserver, //&mut EmptyRouterObserver,
//&mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context), &mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context),
); );
render_times( render_times(
@ -516,6 +531,7 @@ fn main() {
None, None,
None, None,
&[], &[],
&[],
-1, -1,
); );
@ -535,6 +551,7 @@ fn main() {
None, None,
None, None,
&[], &[],
&[],
-1, -1,
); );
} }
@ -549,6 +566,7 @@ fn render_times(
follower: Option<LooseDotIndex>, follower: Option<LooseDotIndex>,
mut mesh: Option<Mesh>, mut mesh: Option<Mesh>,
path: &[VertexIndex], path: &[VertexIndex],
highlight: &[Index],
times: i64, times: i64,
) { ) {
let mut i = 0; let mut i = 0;
@ -602,9 +620,17 @@ fn render_times(
}; };
//let result = panic::catch_unwind(|| { //let result = panic::catch_unwind(|| {
for shape in layout.shapes() { for node in layout.nodes() {
canvas.set_stroke_style(ColorU::new(200, 52, 52, 255)); let color = if highlight.contains(&node) {
canvas.set_fill_style(ColorU::new(200, 52, 52, 255)); ColorU::new(255, 100, 100, 255)
} else {
ColorU::new(200, 52, 52, 255)
};
canvas.set_stroke_style(color);
canvas.set_fill_style(color);
let shape = node.primitive(layout).shape();
match shape { match shape {
Shape::Dot(dot) => { Shape::Dot(dot) => {
@ -658,12 +684,6 @@ fn render_times(
let start_point = edge.source().primitive(layout).shape().center(); let start_point = edge.source().primitive(layout).shape().center();
let end_point = edge.target().primitive(layout).shape().center(); let end_point = edge.target().primitive(layout).shape().center();
/*let color = if path.contains(&edge.source()) && path.contains(&edge.target()) {
ColorU::new(250, 250, 0, 255)
} else {
ColorU::new(125, 125, 125, 255)
};*/
let color = 'blk: { let color = 'blk: {
if let (Some(source_pos), Some(target_pos)) = ( if let (Some(source_pos), Some(target_pos)) = (
path.iter().position(|node| *node == edge.source()), path.iter().position(|node| *node == edge.source()),