From 521b231873932e982922b9eb934d5943ed3fe66c Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Thu, 7 Jul 2022 19:30:57 -0600 Subject: [PATCH] Don't zero out width of shapes on Margin, only Edge_Cuts. Fixes https://gitlab.com/kicad/code/kicad/issues/11967 --- .../drc/drc_test_provider_edge_clearance.cpp | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/pcbnew/drc/drc_test_provider_edge_clearance.cpp b/pcbnew/drc/drc_test_provider_edge_clearance.cpp index 3f6f6d202a..98e718722d 100644 --- a/pcbnew/drc/drc_test_provider_edge_clearance.cpp +++ b/pcbnew/drc/drc_test_provider_edge_clearance.cpp @@ -173,9 +173,12 @@ bool DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run() [&]( BOARD_ITEM *item ) -> bool { PCB_SHAPE* shape = static_cast( item ); - STROKE_PARAMS stroke( 0 ); + STROKE_PARAMS stroke = shape->GetStroke(); - if( shape->GetShape() == SHAPE_T::RECT ) + if( item->IsOnLayer( Edge_Cuts ) ) + stroke.SetWidth( 0 ); + + if( shape->GetShape() == SHAPE_T::RECT && !shape->IsFilled() ) { // A single rectangle for the board would make the RTree useless, so convert // to 4 edges @@ -195,9 +198,8 @@ bool DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run() edges.back()->SetShape( SHAPE_T::SEGMENT ); edges.back()->SetStartY( shape->GetEndY() ); edges.back()->SetStroke( stroke ); - return true; } - else if( shape->GetShape() == SHAPE_T::POLY ) + else if( shape->GetShape() == SHAPE_T::POLY && !shape->IsFilled() ) { // A single polygon for the board would make the RTree useless, so convert // to n edges. @@ -213,9 +215,12 @@ bool DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run() edges.back()->SetStroke( stroke ); } } + else + { + edges.emplace_back( static_cast( shape->Clone() ) ); + edges.back()->SetStroke( stroke ); + } - edges.emplace_back( static_cast( shape->Clone() ) ); - edges.back()->SetStroke( stroke ); return true; } ); @@ -280,25 +285,25 @@ bool DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run() if( testCopper && item->IsOnCopperLayer() ) { edgesTree.QueryColliding( item, UNDEFINED_LAYER, testLayer, nullptr, - [&]( BOARD_ITEM* edge ) -> bool + [&]( BOARD_ITEM* edge ) -> bool { return testAgainstEdge( item, itemShape.get(), edge, EDGE_CLEARANCE_CONSTRAINT, DRCE_EDGE_CLEARANCE ); }, - m_largestEdgeClearance ); + m_largestEdgeClearance ); } if( testSilk && ( item->IsOnLayer( F_SilkS ) || item->IsOnLayer( B_SilkS ) ) ) { if( edgesTree.QueryColliding( item, UNDEFINED_LAYER, testLayer, nullptr, - [&]( BOARD_ITEM* edge ) -> bool + [&]( BOARD_ITEM* edge ) -> bool { return testAgainstEdge( item, itemShape.get(), edge, SILK_CLEARANCE_CONSTRAINT, DRCE_SILK_EDGE_CLEARANCE ); }, - m_largestEdgeClearance ) ) + m_largestEdgeClearance ) ) { // violations reported during QueryColliding }