From 0f4bf1b0be03ff6960460f61c5b6ef09b509130d Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Thu, 28 Aug 2025 11:35:20 +0200 Subject: [PATCH] fix(router/navmesh): Make sure all clearance-intersecting navnodes have the same edges This does not yet fully fix the problem with routing around SMD pads failing, but is a step forward. --- src/drawing/query.rs | 2 +- src/router/navmesh.rs | 45 ++++++++++++++++++++++++++++++++++------ src/router/prenavmesh.rs | 9 ++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/drawing/query.rs b/src/drawing/query.rs index 82a6249..17f4454 100644 --- a/src/drawing/query.rs +++ b/src/drawing/query.rs @@ -161,7 +161,7 @@ impl Drawing { .filter(move |infringement| !self.are_connectable(infringer, infringement.1)) } - pub(super) fn clearance_intersectors<'a>( + pub fn clearance_intersectors<'a>( &'a self, intersector: PrimitiveIndex, ) -> impl Iterator + 'a { diff --git a/src/router/navmesh.rs b/src/router/navmesh.rs index d068a6d..fede5a8 100644 --- a/src/router/navmesh.rs +++ b/src/router/navmesh.rs @@ -66,8 +66,8 @@ pub enum BinavnodeNodeIndex { } impl From for BinavnodeNodeIndex { - fn from(trianvertex: PrenavmeshNodeIndex) -> Self { - match trianvertex { + fn from(node: PrenavmeshNodeIndex) -> Self { + match node { PrenavmeshNodeIndex::FixedDot(dot) => BinavnodeNodeIndex::FixedDot(dot), PrenavmeshNodeIndex::FixedBend(bend) => BinavnodeNodeIndex::FixedBend(bend), } @@ -75,8 +75,8 @@ impl From for BinavnodeNodeIndex { } impl From for PrimitiveIndex { - fn from(vertex: BinavnodeNodeIndex) -> Self { - match vertex { + fn from(node: BinavnodeNodeIndex) -> Self { + match node { BinavnodeNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot), BinavnodeNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend), BinavnodeNodeIndex::LooseBend(bend) => PrimitiveIndex::LooseBend(bend), @@ -85,8 +85,8 @@ impl From for PrimitiveIndex { } impl From for GearIndex { - fn from(vertex: BinavnodeNodeIndex) -> Self { - match vertex { + fn from(node: BinavnodeNodeIndex) -> Self { + match node { BinavnodeNodeIndex::FixedDot(dot) => GearIndex::FixedDot(dot), BinavnodeNodeIndex::FixedBend(bend) => GearIndex::FixedBend(bend), BinavnodeNodeIndex::LooseBend(bend) => GearIndex::LooseBend(bend), @@ -241,6 +241,39 @@ impl Navmesh { edge.source(), edge.target(), ); + + // TODO: This shouldn't depend on clearance. + for source_intersector in layout + .drawing() + .clearance_intersectors(edge.source().into()) + { + let source = match source_intersector.1 { + PrimitiveIndex::FixedDot(dot) => PrenavmeshNodeIndex::FixedDot(dot), + PrimitiveIndex::FixedBend(bend) => PrenavmeshNodeIndex::FixedBend(bend), + _ => continue, + }; + + if !map.contains_key(&source) { + continue; + } + + for target_intersector in layout + .drawing() + .clearance_intersectors(edge.target().into()) + { + let target = match target_intersector.1 { + PrimitiveIndex::FixedDot(dot) => PrenavmeshNodeIndex::FixedDot(dot), + PrimitiveIndex::FixedBend(bend) => PrenavmeshNodeIndex::FixedBend(bend), + _ => continue, + }; + + if !map.contains_key(&target) { + continue; + } + + Self::add_trianedge_to_graph_as_quadrinavedge(&mut graph, &map, source, target); + } + } } // The existence of a constraint edge does not (!) guarantee that this diff --git a/src/router/prenavmesh.rs b/src/router/prenavmesh.rs index c04e503..716ce9a 100644 --- a/src/router/prenavmesh.rs +++ b/src/router/prenavmesh.rs @@ -36,6 +36,15 @@ pub enum PrenavmeshNodeIndex { FixedBend(FixedBendIndex), } +impl From for PrimitiveIndex { + fn from(node: PrenavmeshNodeIndex) -> Self { + match node { + PrenavmeshNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot), + PrenavmeshNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend), + } + } +} + #[derive(Clone, Copy)] pub struct PrenavmeshWeight { pub node: PrenavmeshNodeIndex,