Fix SolderBridge check to only check across multiple
We should not generate an error when overlapping a single copper element with a soldermask that is not associated with copper. Fixes https://gitlab.com/kicad/code/kicad/issues/10906
This commit is contained in:
parent
f0e4448a9d
commit
a19d9105f0
|
@ -333,11 +333,17 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::testItemAgainstItems( BOARD_ITEM* aItem,
|
||||||
if( otherNet > 0 && otherNet == itemNet )
|
if( otherNet > 0 && otherNet == itemNet )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if( aItem->GetParentFootprint() && other->GetParentFootprint() )
|
||||||
|
{
|
||||||
|
int attr = static_cast<FOOTPRINT*>( aItem->GetParentFootprint() )->GetAttributes();
|
||||||
|
|
||||||
|
if( attr & FP_ALLOW_SOLDERMASK_BRIDGES )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if( pad && otherPad && pad->GetParent() == otherPad->GetParent() )
|
if( pad && otherPad && pad->GetParent() == otherPad->GetParent() )
|
||||||
{
|
{
|
||||||
if( pad->GetParent()->GetAttributes() & FP_ALLOW_SOLDERMASK_BRIDGES )
|
if( pad->SameLogicalPadAs( otherPad ) )
|
||||||
return false;
|
|
||||||
else if( pad->SameLogicalPadAs( otherPad ) )
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,8 +407,13 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::testItemAgainstItems( BOARD_ITEM* aItem,
|
||||||
{
|
{
|
||||||
std::pair<BOARD_ITEM*, PCB_LAYER_ID> key = { aItem, aRefLayer };
|
std::pair<BOARD_ITEM*, PCB_LAYER_ID> key = { aItem, aRefLayer };
|
||||||
|
|
||||||
|
// If the mask collides with the first object, add the object
|
||||||
|
// net to our map and stop. This cannot be an error yet.
|
||||||
if( m_maskApertureNetMap.count( key ) == 0 )
|
if( m_maskApertureNetMap.count( key ) == 0 )
|
||||||
|
{
|
||||||
m_maskApertureNetMap[ key ] = otherNet;
|
m_maskApertureNetMap[ key ] = otherNet;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if( m_maskApertureNetMap.at( key ) == otherNet && otherNet > 0 )
|
if( m_maskApertureNetMap.at( key ) == otherNet && otherNet > 0 )
|
||||||
return true;
|
return true;
|
||||||
|
@ -413,7 +424,10 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::testItemAgainstItems( BOARD_ITEM* aItem,
|
||||||
std::pair<BOARD_ITEM*, PCB_LAYER_ID> key = { other, aRefLayer };
|
std::pair<BOARD_ITEM*, PCB_LAYER_ID> key = { other, aRefLayer };
|
||||||
|
|
||||||
if( m_maskApertureNetMap.count( key ) == 0 )
|
if( m_maskApertureNetMap.count( key ) == 0 )
|
||||||
|
{
|
||||||
m_maskApertureNetMap[ key ] = itemNet;
|
m_maskApertureNetMap[ key ] = itemNet;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if( m_maskApertureNetMap.at( key ) == itemNet && itemNet > 0 )
|
if( m_maskApertureNetMap.at( key ) == itemNet && itemNet > 0 )
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
(kicad_pcb (version 20220211) (generator pcbnew)
|
||||||
|
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
)
|
||||||
|
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(disableapertmacros false)
|
||||||
|
(usegerberextensions false)
|
||||||
|
(usegerberattributes true)
|
||||||
|
(usegerberadvancedattributes true)
|
||||||
|
(creategerberjobfile true)
|
||||||
|
(dashed_line_dash_ratio 12.000000)
|
||||||
|
(dashed_line_gap_ratio 3.000000)
|
||||||
|
(svgprecision 4)
|
||||||
|
(excludeedgelayer true)
|
||||||
|
(plotframeref false)
|
||||||
|
(viasonmask false)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin false)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15.000000)
|
||||||
|
(dxfpolygonmode true)
|
||||||
|
(dxfimperialunits true)
|
||||||
|
(dxfusepcbnewfont true)
|
||||||
|
(psnegative false)
|
||||||
|
(psa4output false)
|
||||||
|
(plotreference true)
|
||||||
|
(plotvalue true)
|
||||||
|
(plotinvisibletext false)
|
||||||
|
(sketchpadsonfab false)
|
||||||
|
(subtractmaskfromsilk false)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror false)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(net 0 "")
|
||||||
|
|
||||||
|
(footprint "Connector_Wire:SolderWirePad_1x01_SMD_1x2mm" (layer "F.Cu")
|
||||||
|
(tedit 620FF1C8) (tstamp 2e642b3e-a476-4c54-9a52-dcea955640cd)
|
||||||
|
(at 136.84 58.35)
|
||||||
|
(descr "Wire Pad, Square, SMD Pad, 5mm x 10mm,")
|
||||||
|
(tags "MesurementPoint Square SMDPad 5mmx10mm ")
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_text reference "REF**" (at 0 -2.54) (layer "F.SilkS") hide
|
||||||
|
(effects (font (size 1 1) (thickness 0.15)))
|
||||||
|
(tstamp b1086f75-01ba-4188-8d36-75a9e2828ca9)
|
||||||
|
)
|
||||||
|
(fp_text value "" (at 0 2.54) (layer "F.Fab") hide
|
||||||
|
(effects (font (size 1 1) (thickness 0.15)))
|
||||||
|
(tstamp 716e31c5-485f-40b5-88e3-a75900da9811)
|
||||||
|
)
|
||||||
|
(fp_rect (start -0.762 -0.508) (end 1.016 0.762)
|
||||||
|
(stroke (width 0) (type solid)) (fill solid) (layer "F.Cu") (tstamp e87a6f80-914f-4f62-9c9f-9ba62a88ee3d))
|
||||||
|
(fp_rect (start -0.762 -0.508) (end 1.016 0.762)
|
||||||
|
(stroke (width 0) (type solid)) (fill solid) (layer "F.Mask") (tstamp df3dc9a2-ba40-4c3a-87fe-61cc8e23d71b))
|
||||||
|
)
|
||||||
|
|
||||||
|
(gr_rect (start 135.25 57.21) (end 138.55 60.51)
|
||||||
|
(stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 2f0570b6-86da-47a8-9e56-ce60c431c534))
|
||||||
|
|
||||||
|
)
|
File diff suppressed because it is too large
Load Diff
|
@ -56,7 +56,8 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"drc_exclusions": [
|
"drc_exclusions": [
|
||||||
"lib_footprint_issues|154305000|81417500|3bd3a1e0-b35d-4974-99fa-33d3eee5d601|00000000-0000-0000-0000-000000000000"
|
"lib_footprint_issues|154305000|81417500|3bd3a1e0-b35d-4974-99fa-33d3eee5d601|00000000-0000-0000-0000-000000000000",
|
||||||
|
"lib_footprint_mismatch|194730000|83947750|970e0f64-111f-41e3-9f5a-fb0d0f6fa101|00000000-0000-0000-0000-000000000000"
|
||||||
],
|
],
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 2
|
"version": 2
|
||||||
|
@ -80,6 +81,7 @@
|
||||||
"items_not_allowed": "error",
|
"items_not_allowed": "error",
|
||||||
"length_out_of_range": "error",
|
"length_out_of_range": "error",
|
||||||
"lib_footprint_issues": "ignore",
|
"lib_footprint_issues": "ignore",
|
||||||
|
"lib_footprint_mismatch": "error",
|
||||||
"malformed_courtyard": "error",
|
"malformed_courtyard": "error",
|
||||||
"microvia_drill_out_of_range": "error",
|
"microvia_drill_out_of_range": "error",
|
||||||
"missing_courtyard": "ignore",
|
"missing_courtyard": "ignore",
|
||||||
|
@ -129,6 +131,46 @@
|
||||||
"solder_mask_to_copper_clearance": 0.0,
|
"solder_mask_to_copper_clearance": 0.0,
|
||||||
"use_height_for_length_calcs": true
|
"use_height_for_length_calcs": true
|
||||||
},
|
},
|
||||||
|
"teardrop_options": [
|
||||||
|
{
|
||||||
|
"td_allow_use_two_tracks": true,
|
||||||
|
"td_curve_segcount": 5,
|
||||||
|
"td_on_pad_in_zone": false,
|
||||||
|
"td_onpadsmd": true,
|
||||||
|
"td_onroundshapesonly": false,
|
||||||
|
"td_ontrackend": false,
|
||||||
|
"td_onviapad": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"teardrop_parameters": [
|
||||||
|
{
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_target_name": "td_round_shape",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_target_name": "td_rect_shape",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_target_name": "td_track_end",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
}
|
||||||
|
],
|
||||||
"track_widths": [
|
"track_widths": [
|
||||||
0.0,
|
0.0,
|
||||||
0.2,
|
0.2,
|
||||||
|
|
|
@ -57,7 +57,8 @@ BOOST_FIXTURE_TEST_CASE( DRCFalsePositiveRegressions, DRC_REGRESSION_TEST_FIXTUR
|
||||||
// selective inner copper layers
|
// selective inner copper layers
|
||||||
"issue7567", // DRC constraint to disallow holes gets SMD pads also
|
"issue7567", // DRC constraint to disallow holes gets SMD pads also
|
||||||
"issue7975", // Differential pair gap out of range fault by DRC
|
"issue7975", // Differential pair gap out of range fault by DRC
|
||||||
"issue8407" // PCBNEW: Arc for diff pair has clearance DRC error
|
"issue8407", // PCBNEW: Arc for diff pair has clearance DRC error
|
||||||
|
"issue10906" // Soldermask bridge for only one object
|
||||||
};
|
};
|
||||||
|
|
||||||
for( const wxString& relPath : tests )
|
for( const wxString& relPath : tests )
|
||||||
|
|
|
@ -66,14 +66,14 @@ BOOST_FIXTURE_TEST_CASE( DRCSolderMaskBridgingTest, DRC_REGRESSION_TEST_FIXTURE
|
||||||
|
|
||||||
bds.m_DRCEngine->RunTests( EDA_UNITS::MILLIMETRES, true, false );
|
bds.m_DRCEngine->RunTests( EDA_UNITS::MILLIMETRES, true, false );
|
||||||
|
|
||||||
if( violations.size() == 4 )
|
if( violations.size() == 5 )
|
||||||
{
|
{
|
||||||
BOOST_CHECK_EQUAL( 1, 1 ); // quiet "did not check any assertions" warning
|
BOOST_CHECK_EQUAL( 1, 1 ); // quiet "did not check any assertions" warning
|
||||||
BOOST_TEST_MESSAGE( "DRC solder mask bridge test passed" );
|
BOOST_TEST_MESSAGE( "DRC solder mask bridge test passed" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BOOST_CHECK_EQUAL( violations.size(), 4 );
|
BOOST_CHECK_EQUAL( violations.size(), 5 );
|
||||||
|
|
||||||
std::map<KIID, EDA_ITEM*> itemMap;
|
std::map<KIID, EDA_ITEM*> itemMap;
|
||||||
m_board->FillItemMap( itemMap );
|
m_board->FillItemMap( itemMap );
|
||||||
|
|
Loading…
Reference in New Issue