From 75032f3acdf1d305a4cc270592b84b61889ff988 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Thu, 25 Feb 2021 22:56:34 +0000 Subject: [PATCH] Use the more-constrained layer when running rules. Fixes https://gitlab.com/kicad/code/kicad/issues/7639 --- pcbnew/router/pns_kicad_iface.cpp | 39 ++++++++++++++++++------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index bda8e18325..1c4590d57d 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -287,21 +287,22 @@ int PNS_PCBNEW_RULE_RESOLVER::Clearance( const PNS::ITEM* aA, const PNS::ITEM* a PNS::CONSTRAINT constraint; int rv = 0; + int layer; + + if( !aA->Layers().IsMultilayer() || !aB || aB->Layers().IsMultilayer() ) + layer = aA->Layer(); + else + layer = aB->Layer(); if( isCopper( aA ) && ( !aB || isCopper( aB ) ) ) { - if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_CLEARANCE, aA, aB, aA->Layer(), - &constraint ) ) - { - if( constraint.m_Value.Min() > rv ) - rv = constraint.m_Value.Min(); - } + if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_CLEARANCE, aA, aB, layer, &constraint ) ) + rv = constraint.m_Value.Min(); } if( isEdge( aA ) || ( aB && isEdge( aB ) ) ) { - if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_EDGE_CLEARANCE, aA, aB, aA->Layer(), - &constraint ) ) + if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_EDGE_CLEARANCE, aA, aB, layer, &constraint ) ) { if( constraint.m_Value.Min() > rv ) rv = constraint.m_Value.Min(); @@ -323,12 +324,15 @@ int PNS_PCBNEW_RULE_RESOLVER::HoleClearance( const PNS::ITEM* aA, const PNS::ITE PNS::CONSTRAINT constraint; int rv = 0; + int layer; - if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_HOLE_CLEARANCE, aA, aB, aA->Layer(), - &constraint ) ) - { + if( !aA->Layers().IsMultilayer() || !aB || aB->Layers().IsMultilayer() ) + layer = aA->Layer(); + else + layer = aB->Layer(); + + if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_HOLE_CLEARANCE, aA, aB, layer, &constraint ) ) rv = constraint.m_Value.Min(); - } m_holeClearanceCache[ key ] = rv; return rv; @@ -345,12 +349,15 @@ int PNS_PCBNEW_RULE_RESOLVER::HoleToHoleClearance( const PNS::ITEM* aA, const PN PNS::CONSTRAINT constraint; int rv = 0; + int layer; - if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_HOLE_TO_HOLE, aA, aB, aA->Layer(), - &constraint ) ) - { + if( !aA->Layers().IsMultilayer() || !aB || aB->Layers().IsMultilayer() ) + layer = aA->Layer(); + else + layer = aB->Layer(); + + if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_HOLE_TO_HOLE, aA, aB, layer, &constraint ) ) rv = constraint.m_Value.Min(); - } m_holeToHoleClearanceCache[ key ] = rv; return rv;