Starved thermals DRC checking.

ADDED min_resolved_spokes constraint.
ADDED "Thermal relief connection to zone incomplete" violation.

Fixes https://gitlab.com/kicad/code/kicad/issues/2183
This commit is contained in:
Jeff Young 2021-08-09 11:10:09 +01:00
parent 32721755bf
commit a1e3f2b188
29 changed files with 50281 additions and 53893 deletions

View File

@ -455,6 +455,7 @@ set( BMAPS_MID
switch_corner_rounding_shape
text
text_sketch
thermal_spokes
three_d
tool_ratsnest
tools

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="thermal_spokes.svg"
inkscape:version="1.0.2 (e86c8708, 2021-01-15)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="715"
id="namedview30"
showgrid="true"
inkscape:zoom="15.850952"
inkscape:cx="9.5143495"
inkscape:cy="9.8131165"
inkscape:window-x="0"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:document-rotation="0"
inkscape:current-layer="Слой_1"
inkscape:snap-global="false">
<inkscape:grid
type="xygrid"
id="grid_kicad"
spacingx="0.5"
spacingy="0.5"
color="#9999ff"
opacity="0.13"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata43">
<rdf:RDF>
<cc:Work
rdf:about="">
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>zone_fillet</dc:title>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<defs
id="defs27772">
<style
id="style27770">.cls-1{fill:#b9b9b9;}.cls-2{fill:none;stroke:#545454;stroke-miterlimit:10;}.cls-3{fill:#545454;}</style>
</defs>
<title
id="title27774">zone_fillet</title>
<path
class="cls-1"
d="M 23.9907,24.0007 H 0.0159 V 0.0093 C 14,0 7.3333333,0 24,0 Z"
id="path27776"
style="fill:#1a81c4;fill-opacity:1;stroke:none"
sodipodi:nodetypes="ccccc" />
<circle
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.428572"
id="path862"
cx="13.918107"
cy="13.936913"
r="8" />
<path
style="fill:none;stroke:#1a81c4;stroke-width:3.64724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4.0272976,13.901122 H 23.360632 v 0"
id="path866" />
<path
style="fill:none;stroke:#1a81c4;stroke-width:3.64724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 14.090385,4.8832277 v 19.3333343 0"
id="path868" />
<circle
style="fill:#ded3dd;fill-opacity:1;stroke:none;stroke-width:0.823937;stroke-miterlimit:4;stroke-dasharray:none"
id="path864"
cx="14.004702"
cy="13.887019"
r="5.5" />
<circle
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.120535"
id="circle872"
cx="14.035262"
cy="13.927893"
r="2.25" />
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="thermal_spokes.svg"
inkscape:version="1.0.2 (e86c8708, 2021-01-15)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="715"
id="namedview30"
showgrid="true"
inkscape:zoom="15.850952"
inkscape:cx="7.1102979"
inkscape:cy="14.614735"
inkscape:window-x="0"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:document-rotation="0"
inkscape:current-layer="Слой_1"
inkscape:snap-global="false">
<inkscape:grid
type="xygrid"
id="grid_kicad"
spacingx="0.5"
spacingy="0.5"
color="#9999ff"
opacity="0.13"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata43">
<rdf:RDF>
<cc:Work
rdf:about="">
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>zone_fillet</dc:title>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<defs
id="defs27772">
<style
id="style27770">.cls-1{fill:#b9b9b9;}.cls-2{fill:none;stroke:#545454;stroke-miterlimit:10;}.cls-3{fill:#545454;}</style>
</defs>
<title
id="title27774">zone_fillet</title>
<path
class="cls-1"
d="M 23.9907,24.0007 H 0.0159 V 0.0093 C 14,0 7.3333333,0 24,0 Z"
id="path27776"
style="fill:#39b4ea;fill-opacity:1;stroke:none"
sodipodi:nodetypes="ccccc" />
<circle
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.428572"
id="path862"
cx="13.918107"
cy="13.936913"
r="8" />
<path
style="fill:none;stroke:#39b4ea;stroke-width:3.64724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4.0272976,13.901122 H 23.360632 v 0"
id="path866" />
<path
style="fill:none;stroke:#39b4ea;stroke-width:3.64724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 14.090385,4.8832277 v 19.3333343 0"
id="path868" />
<circle
style="fill:#545454;fill-opacity:1;stroke:none;stroke-width:0.823937;stroke-miterlimit:4;stroke-dasharray:none"
id="path864"
cx="14.004702"
cy="13.887019"
r="5.5" />
<circle
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.120535"
id="circle872"
cx="14.035262"
cy="13.927893"
r="2.25" />
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -21,6 +21,7 @@ length
max
micro_via
min
min_resolved_spokes
none
npth
opt

View File

@ -472,6 +472,7 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
{ BITMAPS::switch_corner_rounding_shape, wxT( "switch_corner_rounding_shape_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::text, wxT( "text_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::text_sketch, wxT( "text_sketch_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::thermal_spokes, wxT( "thermal_spokes_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::three_d, wxT( "three_d_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::tool_ratsnest, wxT( "tool_ratsnest_24.png" ), 24, wxT( "light" ) },
{ BITMAPS::tools, wxT( "tools_24.png" ), 24, wxT( "light" ) },
@ -839,6 +840,7 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
{ BITMAPS::switch_corner_rounding_shape, wxT( "switch_corner_rounding_shape_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::text, wxT( "text_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::text_sketch, wxT( "text_sketch_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::thermal_spokes, wxT( "thermal_spokes_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::three_d, wxT( "three_d_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::tool_ratsnest, wxT( "tool_ratsnest_dark_24.png" ), 24, wxT( "dark" ) },
{ BITMAPS::tools, wxT( "tools_dark_24.png" ), 24, wxT( "dark" ) },

View File

@ -526,6 +526,7 @@ enum class BITMAPS : unsigned int
switch_corner_rounding_shape,
text,
text_sketch,
thermal_spokes,
three_d,
tool_ratsnest,
tools,

View File

@ -92,6 +92,8 @@
// on edge cut line thicknesses) should be used.
#define DEFAULT_SILKCLEARANCE 0.0
#define DEFAULT_MINRESOLVEDSPOKES 2 // Fewer resolved spokes indicates a starved thermal
#define MINIMUM_ERROR_SIZE_MM 0.001
#define MAXIMUM_ERROR_SIZE_MM 0.1
@ -678,7 +680,8 @@ public:
int m_CopperEdgeClearance;
int m_HoleClearance; // Hole to copper clearance
int m_HoleToHoleMin; // Min width of web between two drilled holes
int m_SilkClearance;
int m_SilkClearance; // Min dist between two silk items
int m_MinResolvedSpokes; // Min spoke count to not be a starved thermal
int m_MinSilkTextHeight; // Min text height for silkscreen layers
int m_MinSilkTextThickness; // Min text thickness for silkscreen layers

View File

@ -151,6 +151,7 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS( JSON_SETTINGS* aParent, const std:
m_HoleClearance = Millimeter2iu( DEFAULT_HOLECLEARANCE );
m_HoleToHoleMin = Millimeter2iu( DEFAULT_HOLETOHOLEMIN );
m_SilkClearance = Millimeter2iu( DEFAULT_SILKCLEARANCE );
m_MinResolvedSpokes = DEFAULT_MINRESOLVEDSPOKES;
m_MinSilkTextHeight = Millimeter2iu( DEFAULT_SILK_TEXT_SIZE * 0.8 );
m_MinSilkTextThickness= Millimeter2iu( DEFAULT_SILK_TEXT_WIDTH * 0.8 );
@ -256,6 +257,9 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS( JSON_SETTINGS* aParent, const std:
Millimeter2iu( DEFAULT_SILKCLEARANCE ), Millimeter2iu( 0.00 ), Millimeter2iu( 100.0 ),
MM_PER_IU ) );
m_params.emplace_back( new PARAM<int>( "rules.min_resolved_spokes",
&m_MinResolvedSpokes, DEFAULT_MINRESOLVEDSPOKES, 0, 4 ) );
m_params.emplace_back( new PARAM_SCALED<int>( "rules.min_text_height", &m_MinSilkTextHeight,
Millimeter2iu( DEFAULT_SILK_TEXT_SIZE * 0.8 ), Millimeter2iu( 0.00 ),
Millimeter2iu( 100.0 ), MM_PER_IU ) );

View File

@ -54,6 +54,10 @@ PANEL_SETUP_CONSTRAINTS::PANEL_SETUP_CONSTRAINTS( PAGED_DIALOG* aParent, PCB_EDI
m_BrdSettings = &m_Frame->GetBoard()->GetDesignSettings();
m_stCircleToPolyWarning->SetFont( KIUI::GetInfoFont( this ) );
wxSize ctrlSize = m_minResolvedSpokeCountCtrl->GetSize();
ctrlSize.x = KIUI::GetTextSize( wxT( "XXX" ), m_minResolvedSpokeCountCtrl ).x;
m_minResolvedSpokeCountCtrl->SetSize( ctrlSize );
}
@ -73,6 +77,7 @@ bool PANEL_SETUP_CONSTRAINTS::TransferDataToWindow()
m_rbOutlinePolygonFastest->SetValue( m_BrdSettings->m_ZoneFillVersion == 6 );
m_rbOutlinePolygonBestQ->SetValue( m_BrdSettings->m_ZoneFillVersion == 5 );
m_allowExternalFilletsOpt->SetValue( m_BrdSettings->m_ZoneKeepExternalFillets );
m_minResolvedSpokeCountCtrl->SetValue( m_BrdSettings->m_MinResolvedSpokes );
m_minClearance.SetValue( m_BrdSettings->m_MinClearance );
m_trackMinWidth.SetValue( m_BrdSettings->m_TrackMinWidth );
@ -133,6 +138,7 @@ bool PANEL_SETUP_CONSTRAINTS::TransferDataFromWindow()
m_BrdSettings->m_ZoneFillVersion = m_rbOutlinePolygonFastest->GetValue() ? 6 : 5;
m_BrdSettings->m_ZoneKeepExternalFillets = m_allowExternalFilletsOpt->GetValue();
m_BrdSettings->m_MinResolvedSpokes = m_minResolvedSpokeCountCtrl->GetValue();
m_BrdSettings->m_MinClearance = m_minClearance.GetValue();
m_BrdSettings->m_TrackMinWidth = m_trackMinWidth.GetValue();
@ -166,6 +172,7 @@ bool PANEL_SETUP_CONSTRAINTS::Show( bool aShow )
// first then the icons will be blank unless they're set here.
m_bitmapZoneFillOpt->SetBitmap( KiBitmap( BITMAPS::show_zone ) );
m_filletBitmap->SetBitmap( KiBitmap( BITMAPS::zone_fillet ) );
m_spokeBitmap->SetBitmap( KiBitmap( BITMAPS::thermal_spokes ) );
m_bitmapClearance->SetBitmap( KiBitmap( BITMAPS::ps_diff_pair_gap ) );
m_bitmapMinTrackWidth->SetBitmap( KiBitmap( BITMAPS::width_track ) );
m_bitmapMinViaAnnulus->SetBitmap( KiBitmap( BITMAPS::via_annulus ) );

View File

@ -24,7 +24,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_staticText26 = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Allowed features"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText26->Wrap( -1 );
sbFeatureRules->Add( m_staticText26, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
sbFeatureRules->Add( m_staticText26, 0, wxRIGHT|wxLEFT, 5 );
wxFlexGridSizer* fgSizerViaOpt;
fgSizerViaOpt = new wxFlexGridSizer( 0, 2, 0, 0 );
@ -32,16 +32,16 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
fgSizerViaOpt->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_bitmapBlindBuried = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
fgSizerViaOpt->Add( m_bitmapBlindBuried, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
fgSizerViaOpt->Add( m_bitmapBlindBuried, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
m_OptAllowBlindBuriedVias = new wxCheckBox( m_scrolledWindow, wxID_ANY, _("Allow blind/buried vias"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizerViaOpt->Add( m_OptAllowBlindBuriedVias, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
fgSizerViaOpt->Add( m_OptAllowBlindBuriedVias, 0, wxALIGN_CENTER_VERTICAL|wxALL, 6 );
m_bitmap_uVia = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
fgSizerViaOpt->Add( m_bitmap_uVia, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
fgSizerViaOpt->Add( m_bitmap_uVia, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
m_OptAllowMicroVias = new wxCheckBox( m_scrolledWindow, wxID_ANY, _("Allow micro vias (uVias)"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizerViaOpt->Add( m_OptAllowMicroVias, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
fgSizerViaOpt->Add( m_OptAllowMicroVias, 0, wxALIGN_CENTER_VERTICAL|wxALL, 6 );
sbFeatureRules->Add( fgSizerViaOpt, 0, wxEXPAND|wxTOP, 5 );
@ -50,7 +50,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
bSizerArcToPoly = new wxBoxSizer( wxVERTICAL );
m_staticline2 = new wxStaticLine( m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerArcToPoly->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 15 );
bSizerArcToPoly->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 );
m_stCircleToPolyOpt = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Arc/circle approximated by segments"), wxDefaultPosition, wxDefaultSize, 0 );
m_stCircleToPolyOpt->Wrap( -1 );
@ -93,7 +93,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_bSizerPolygonFillOption = new wxBoxSizer( wxVERTICAL );
m_staticline1 = new wxStaticLine( m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
m_bSizerPolygonFillOption->Add( m_staticline1, 0, wxEXPAND|wxTOP|wxBOTTOM, 15 );
m_bSizerPolygonFillOption->Add( m_staticline1, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 );
m_stZoneFilledPolysOpt = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Zone fill strategy"), wxDefaultPosition, wxDefaultSize, 0 );
m_stZoneFilledPolysOpt->Wrap( -1 );
@ -103,7 +103,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
bSizer5 = new wxBoxSizer( wxHORIZONTAL );
m_bitmapZoneFillOpt = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer5->Add( m_bitmapZoneFillOpt, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
bSizer5->Add( m_bitmapZoneFillOpt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizerOutlinesOpts;
bSizerOutlinesOpts = new wxBoxSizer( wxVERTICAL );
@ -123,19 +123,35 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
bSizer5->Add( bSizerOutlinesOpts, 1, wxEXPAND, 5 );
m_bSizerPolygonFillOption->Add( bSizer5, 1, wxEXPAND, 15 );
m_bSizerPolygonFillOption->Add( bSizer5, 0, wxEXPAND, 15 );
wxBoxSizer* bSizer9;
bSizer9 = new wxBoxSizer( wxHORIZONTAL );
m_filletBitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_filletBitmap, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer9->Add( m_filletBitmap, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
m_allowExternalFilletsOpt = new wxCheckBox( m_scrolledWindow, wxID_ANY, _("Allow fillets outside zone outline"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_allowExternalFilletsOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_bSizerPolygonFillOption->Add( bSizer9, 1, wxEXPAND, 5 );
m_bSizerPolygonFillOption->Add( bSizer9, 0, wxEXPAND|wxTOP, 7 );
wxBoxSizer* bSizer111;
bSizer111 = new wxBoxSizer( wxHORIZONTAL );
m_spokeBitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer111->Add( m_spokeBitmap, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_minResolvedSpokesLabel = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Min thermal relief spoke count:"), wxDefaultPosition, wxDefaultSize, 0 );
m_minResolvedSpokesLabel->Wrap( -1 );
bSizer111->Add( m_minResolvedSpokesLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
m_minResolvedSpokeCountCtrl = new wxSpinCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 0, 10, 0 );
bSizer111->Add( m_minResolvedSpokeCountCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_bSizerPolygonFillOption->Add( bSizer111, 1, wxEXPAND|wxTOP, 5 );
sbFeatureRules->Add( m_bSizerPolygonFillOption, 0, wxEXPAND|wxTOP, 10 );
@ -144,7 +160,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
bSizer11 = new wxBoxSizer( wxVERTICAL );
m_staticline15 = new wxStaticLine( m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizer11->Add( m_staticline15, 0, wxEXPAND | wxALL, 5 );
bSizer11->Add( m_staticline15, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 );
m_staticText33 = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Length tuning"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText33->Wrap( -1 );
@ -174,7 +190,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_staticText23 = new wxStaticText( m_scrolledWindow, wxID_ANY, _("Copper"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText23->Wrap( -1 );
fgFeatureConstraints->Add( m_staticText23, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxLEFT, 4 );
fgFeatureConstraints->Add( m_staticText23, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxLEFT, 4 );
fgFeatureConstraints->Add( 0, 0, 1, wxEXPAND, 5 );
@ -195,7 +211,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_clearanceCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_clearanceCtrl->SetToolTip( _("The minimum clearance between copper items which do not belong to the same net. If set, this is an absolute minimum which cannot be reduced by netclasses, custom rules, or other settings.") );
fgFeatureConstraints->Add( m_clearanceCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_clearanceCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_clearanceUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_clearanceUnits->Wrap( -1 );
@ -212,7 +228,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_TrackMinWidthCtrl->SetToolTip( _("The minimum track width. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules, or other settings.") );
m_TrackMinWidthCtrl->SetMinSize( wxSize( 120,-1 ) );
fgFeatureConstraints->Add( m_TrackMinWidthCtrl, 0, wxALIGN_LEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_TrackMinWidthCtrl, 0, wxALIGN_LEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_TrackMinWidthUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
m_TrackMinWidthUnits->Wrap( -1 );
@ -228,7 +244,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_ViaMinAnnulusCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_ViaMinAnnulusCtrl->SetToolTip( _("The minimum annular ring width. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules, or other settings.") );
fgFeatureConstraints->Add( m_ViaMinAnnulusCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_ViaMinAnnulusCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_ViaMinAnnulusUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaMinAnnulusUnits->Wrap( -1 );
@ -244,7 +260,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_SetViasMinSizeCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_SetViasMinSizeCtrl->SetToolTip( _("The minimum via diameter. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules, or other settings.") );
fgFeatureConstraints->Add( m_SetViasMinSizeCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_SetViasMinSizeCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_ViaMinUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
m_ViaMinUnits->Wrap( -1 );
@ -260,7 +276,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_HoleClearanceCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_HoleClearanceCtrl->SetToolTip( _("The minimum clearance between a hole and an unassociated copper item. If set, this is an absolute minimum and cannot be reduced by custom rules or other settings.") );
fgFeatureConstraints->Add( m_HoleClearanceCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_HoleClearanceCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_HoleClearanceUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_HoleClearanceUnits->Wrap( -1 );
@ -276,7 +292,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_EdgeClearanceCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_EdgeClearanceCtrl->SetToolTip( _("The minimum clearance between the board edge and any copper item. If set, this is an absolute minimum and cannot be reduced by custom rules or other settings.") );
fgFeatureConstraints->Add( m_EdgeClearanceCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_EdgeClearanceCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_EdgeClearanceUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_EdgeClearanceUnits->Wrap( -1 );
@ -317,7 +333,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_MinDrillCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_MinDrillCtrl->SetToolTip( _("The minimum through-hole size. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules or other settings.") );
fgFeatureConstraints->Add( m_MinDrillCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_MinDrillCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_MinDrillUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
m_MinDrillUnits->Wrap( -1 );
@ -333,7 +349,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_SetHoleToHoleCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_SetHoleToHoleCtrl->SetToolTip( _("The minimum clearance between two drilled holes. If set, this is an absolute minimum and cannot be reduced by custom rules or other settings. (Note: does not apply to milled holes.)") );
fgFeatureConstraints->Add( m_SetHoleToHoleCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_SetHoleToHoleCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_HoleToHoleUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_HoleToHoleUnits->Wrap( -1 );
@ -374,7 +390,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_uviaMinSizeCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_uviaMinSizeCtrl->SetToolTip( _("The minimum diameter for micro-vias. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules, or other settings.") );
fgFeatureConstraints->Add( m_uviaMinSizeCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_uviaMinSizeCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_uviaMinSizeUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
m_uviaMinSizeUnits->Wrap( -1 );
@ -390,7 +406,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_uviaMinDrillCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_uviaMinDrillCtrl->SetToolTip( _("The minimum micro-via hole size. If set, this is an absolute minimum and cannot be reduced by netclasses, custom rules, or other settings.") );
fgFeatureConstraints->Add( m_uviaMinDrillCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_uviaMinDrillCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_uviaMinDrillUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
m_uviaMinDrillUnits->Wrap( -1 );
@ -431,7 +447,7 @@ PANEL_SETUP_CONSTRAINTS_BASE::PANEL_SETUP_CONSTRAINTS_BASE( wxWindow* parent, wx
m_silkClearanceCtrl = new wxTextCtrl( m_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_silkClearanceCtrl->SetToolTip( _("Minimum clearance between two items on the same silkscreen layer. If set this can improve legibility. (Note: does not apply to multiple shapes within a single footprint.)") );
fgFeatureConstraints->Add( m_silkClearanceCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 7 );
fgFeatureConstraints->Add( m_silkClearanceCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_silkClearanceUnits = new wxStaticText( m_scrolledWindow, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_silkClearanceUnits->Wrap( -1 );

View File

@ -120,14 +120,14 @@
<property name="border">5</property>
<property name="flag">wxEXPAND|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">sbFeatureRules</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
<property name="flag">wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
@ -204,7 +204,7 @@
<property name="vgap">0</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="0">
<property name="BottomDockable">1</property>
@ -261,7 +261,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="border">6</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="0">
@ -326,7 +326,7 @@
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="0">
<property name="BottomDockable">1</property>
@ -383,7 +383,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="border">6</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="0">
@ -458,7 +458,7 @@
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">15</property>
<property name="border">12</property>
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="0">
@ -853,17 +853,17 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<object class="sizeritem" expanded="1">
<property name="border">10</property>
<property name="flag">wxEXPAND|wxTOP</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">m_bSizerPolygonFillOption</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">protected</property>
<object class="sizeritem" expanded="0">
<property name="border">15</property>
<property name="border">12</property>
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="0">
@ -984,7 +984,7 @@
<object class="sizeritem" expanded="0">
<property name="border">15</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizer5</property>
@ -992,7 +992,7 @@
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="0">
<property name="BottomDockable">1</property>
@ -1191,18 +1191,18 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="0">
<object class="sizeritem" expanded="1">
<property name="border">7</property>
<property name="flag">wxEXPAND|wxTOP</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer9</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="0">
<property name="BottomDockable">1</property>
@ -1324,6 +1324,198 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer111</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_spokeBitmap</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Min thermal relief spoke count:</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_minResolvedSpokesLabel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxSpinCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">0</property>
<property name="max">10</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_minResolvedSpokeCountCtrl</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size">-1,-1</property>
<property name="style">wxSP_ARROW_KEYS</property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
@ -1336,8 +1528,8 @@
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="border">12</property>
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="0">
<property name="BottomDockable">1</property>
@ -1559,7 +1751,7 @@
<property name="vgap">0</property>
<object class="sizeritem" expanded="0">
<property name="border">4</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
@ -1768,7 +1960,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -2012,7 +2204,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxALIGN_LEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -2256,7 +2448,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -2500,7 +2692,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -2744,7 +2936,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -2988,7 +3180,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -3555,7 +3747,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -3799,7 +3991,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -4366,7 +4558,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -4610,7 +4802,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
@ -5129,7 +5321,7 @@
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">7</property>
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">

View File

@ -26,6 +26,7 @@
#include <wx/textctrl.h>
#include <wx/valtext.h>
#include <wx/radiobut.h>
#include <wx/spinctrl.h>
#include <wx/scrolwin.h>
#include <wx/panel.h>
@ -58,6 +59,9 @@ class PANEL_SETUP_CONSTRAINTS_BASE : public wxPanel
wxRadioButton* m_rbOutlinePolygonFastest;
wxStaticBitmap* m_filletBitmap;
wxCheckBox* m_allowExternalFilletsOpt;
wxStaticBitmap* m_spokeBitmap;
wxStaticText* m_minResolvedSpokesLabel;
wxSpinCtrl* m_minResolvedSpokeCountCtrl;
wxStaticLine* m_staticline15;
wxStaticText* m_staticText33;
wxCheckBox* m_useHeightForLengthCalcs;

View File

@ -301,6 +301,7 @@ void PANEL_SETUP_RULES::onScintillaCharAdded( wxStyledTextEvent &aEvent )
"hole_clearance|"
"hole_size|"
"hole_to_hole|"
"min_resolved_spokes|"
"silk_clearance|"
"skew|"
"text_height|"
@ -330,6 +331,10 @@ void PANEL_SETUP_RULES::onScintillaCharAdded( wxStyledTextEvent &aEvent )
"thermal_relief "
"none";
}
else if( sexprs.top() == "min_resolved_spokes" )
{
tokens = "0 1 2 3 4";
}
else if( sexprs.top() == "layer" )
{
tokens = "inner|outer|\"x\"";

View File

@ -30,6 +30,7 @@
* length
* hole\_clearance
* hole\_size
* min\_resolved\_spokes
* silk\_clearance
* skew
* text\_height
@ -224,4 +225,8 @@ For the latter use a `(layer "layer_name")` clause in the rule.
# Don't use thermal reliefs on heatsink pads
(rule heat_sink_pad
(constraint zone_connection solid)
(condition "A.Fabrication_Property == 'Heatsink pad'"))
(condition "A.Fabrication_Property == 'Heatsink pad'"))
# Require all four thermal relief spokes to connect to parent zone
(rule fully_spoked_pads
(constraint min_resolved_spokes 4))

View File

@ -172,6 +172,12 @@ void DRC_ENGINE::loadImplicitRules()
diffPairGapConstraint.Value().SetMin( bds.m_MinClearance );
rule->AddConstraint( diffPairGapConstraint );
rule = createImplicitRule( _( "default" ) );
DRC_CONSTRAINT thermalSpokeCountConstraint( MIN_RESOLVED_SPOKES_CONSTRAINT );
thermalSpokeCountConstraint.Value().SetMin( bds.m_MinResolvedSpokes );
rule->AddConstraint( thermalSpokeCountConstraint );
rule = createImplicitRule( _( "board setup constraints silk" ) );
rule->m_LayerCondition = LSET( 2, F_SilkS, B_SilkS );
@ -496,6 +502,18 @@ static wxString formatConstraint( const DRC_CONSTRAINT& constraint )
return str;
};
auto formatMin =
[]( const DRC_CONSTRAINT& c ) -> wxString
{
wxString str;
const auto value = c.GetValue();
if ( value.HasMin() )
str += wxString::Format( " min: %d", value.Min() );
return str;
};
std::vector<FORMATTER> formats =
{
{ CLEARANCE_CONSTRAINT, "clearance", formatMinMax },
@ -512,6 +530,7 @@ static wxString formatConstraint( const DRC_CONSTRAINT& constraint )
{ ZONE_CONNECTION_CONSTRAINT, "zone_connection", nullptr },
{ THERMAL_RELIEF_GAP_CONSTRAINT, "thermal_relief_gap", formatMinMax },
{ THERMAL_SPOKE_WIDTH_CONSTRAINT, "thermal_spoke_width", formatMinMax },
{ MIN_RESOLVED_SPOKES_CONSTRAINT, "min_resolved_spokes", formatMin },
{ DISALLOW_CONSTRAINT, "disallow", nullptr },
{ VIA_DIAMETER_CONSTRAINT, "via_diameter", formatMinMax },
{ LENGTH_CONSTRAINT, "length", formatMinMax },

View File

@ -83,6 +83,10 @@ DRC_ITEM DRC_ITEM::zoneHasEmptyNet( DRCE_ZONE_HAS_EMPTY_NET,
_( "Copper zone net has no pads" ),
wxT( "zone_has_empty_net" ) );
DRC_ITEM DRC_ITEM::starvedThermal( DRCE_STARVED_THERMAL,
_( "Thermal relief connection to zone incomplete" ),
wxT( "starved_thermal" ) );
DRC_ITEM DRC_ITEM::viaDangling( DRCE_DANGLING_VIA,
_( "Via is not connected or connected on only one layer" ),
wxT( "via_dangling" ) );
@ -231,6 +235,7 @@ std::vector<std::reference_wrapper<RC_ITEM>> DRC_ITEM::allItemTypes( {
DRC_ITEM::clearance,
DRC_ITEM::viaDangling,
DRC_ITEM::trackDangling,
DRC_ITEM::starvedThermal,
DRC_ITEM::heading_DFM,
DRC_ITEM::edgeClearance,
@ -294,6 +299,7 @@ std::shared_ptr<DRC_ITEM> DRC_ITEM::Create( int aErrorCode )
case DRCE_EDGE_CLEARANCE: return std::make_shared<DRC_ITEM>( edgeClearance );
case DRCE_ZONES_INTERSECT: return std::make_shared<DRC_ITEM>( zonesIntersect );
case DRCE_ZONE_HAS_EMPTY_NET: return std::make_shared<DRC_ITEM>( zoneHasEmptyNet );
case DRCE_STARVED_THERMAL: return std::make_shared<DRC_ITEM>( starvedThermal );
case DRCE_DANGLING_VIA: return std::make_shared<DRC_ITEM>( viaDangling );
case DRCE_DANGLING_TRACK: return std::make_shared<DRC_ITEM>( trackDangling );
case DRCE_DRILLED_HOLES_TOO_CLOSE: return std::make_shared<DRC_ITEM>( holeNearHole );

View File

@ -42,6 +42,7 @@ enum PCB_DRC_CODE {
DRCE_EDGE_CLEARANCE, // a copper item is too close to the board edge
DRCE_ZONES_INTERSECT, // copper area outlines intersect
DRCE_ZONE_HAS_EMPTY_NET, // copper area has a net but no pads in nets, which is suspicious
DRCE_STARVED_THERMAL, // insufficient number of thermal spokes connected to zone
DRCE_DANGLING_VIA, // via which isn't connected to anything
DRCE_DANGLING_TRACK, // track with at least one end not connected to anything
DRCE_DRILLED_HOLES_TOO_CLOSE, // overlapping drilled holes break drill bits
@ -146,6 +147,7 @@ private:
static DRC_ITEM edgeClearance;
static DRC_ITEM zonesIntersect;
static DRC_ITEM zoneHasEmptyNet;
static DRC_ITEM starvedThermal;
static DRC_ITEM viaDangling;
static DRC_ITEM trackDangling;
static DRC_ITEM holeNearHole;

View File

@ -56,6 +56,7 @@ enum DRC_CONSTRAINT_T
ZONE_CONNECTION_CONSTRAINT,
THERMAL_RELIEF_GAP_CONSTRAINT,
THERMAL_SPOKE_WIDTH_CONSTRAINT,
MIN_RESOLVED_SPOKES_CONSTRAINT,
DISALLOW_CONSTRAINT,
VIA_DIAMETER_CONSTRAINT,
LENGTH_CONSTRAINT,

View File

@ -281,6 +281,7 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
case T_zone_connection: c.m_Type = ZONE_CONNECTION_CONSTRAINT; break;
case T_thermal_relief_gap: c.m_Type = THERMAL_RELIEF_GAP_CONSTRAINT; break;
case T_thermal_spoke_width: c.m_Type = THERMAL_SPOKE_WIDTH_CONSTRAINT; break;
case T_min_resolved_spokes: c.m_Type = MIN_RESOLVED_SPOKES_CONSTRAINT; break;
case T_disallow: c.m_Type = DISALLOW_CONSTRAINT; break;
case T_length: c.m_Type = LENGTH_CONSTRAINT; break;
case T_skew: c.m_Type = SKEW_CONSTRAINT; break;
@ -292,8 +293,8 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
"clearance, hole_clearance, edge_clearance, hole_size, hole_to_hole, "
"courtyard_clearance, silk_clearance, text_height, text_thickness, "
"track_width, annular_width, via_diameter, zone_connection, "
"thermal_relief_gap, thermal_spoke_width, disallow, length, skew, "
"diff_pair_gap or diff_pair_uncoupled." );
"thermal_relief_gap, thermal_spoke_width, min_resolved_spokes, "
"disallow, length, skew, diff_pair_gap or diff_pair_uncoupled." );
reportError( msg );
}
@ -372,6 +373,37 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
aRule->AddConstraint( c );
return;
}
else if( c.m_Type == MIN_RESOLVED_SPOKES_CONSTRAINT )
{
// We don't use a min/max/opt structure here for two reasons:
//
// 1) The min/max/opt parser can't handle unitless numbers, and if we make it handle
// them then it will no longer catch the more common case of forgetting to add a unit
// and getting an ineffective rule because the distances are in nanometers.
//
// 2) Min/max/opt gives a strong implication that you could specify the optimal number
// of spokes. We don't want to open that door because the spoke generator is highly
// optimized around being able to "cheat" off of a cartesian coordinate system.
token = NextTok();
if( (int) token == DSN_NUMBER )
{
value = (int) strtol( CurText(), nullptr, 10 );
c.m_Value.SetMin( value );
}
else
{
reportError( _( "Expecting number." ) );
parseUnknown();
}
if( (int) NextTok() != DSN_RIGHT )
reportError( _( "Missing ')'." ) );
aRule->AddConstraint( c );
return;
}
for( token = NextTok(); token != T_RIGHT && token != T_EOF; token = NextTok() )
{

View File

@ -21,13 +21,25 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <board.h>
#include <board_design_settings.h>
#include <connectivity/connectivity_data.h>
#include <zone.h>
#include <footprint.h>
#include <pad.h>
#include <pcb_track.h>
#include <geometry/shape_line_chain.h>
#include <geometry/shape_poly_set.h>
#include <drc/drc_rule.h>
#include <drc/drc_test_provider.h>
/*
This doesn't actually run any tests; it just loads the various zone connectionrules for
the ZONE_FILLER.
This loads some rule resolvers for the ZONE_FILLER, and checks that pad thermal relief
connections have at least the required number of spokes.
Errors generated:
- DRCE_STARVED_THERMAL
*/
class DRC_TEST_PROVIDER_ZONE_CONNECTIONS : public DRC_TEST_PROVIDER
@ -41,10 +53,7 @@ public:
{
}
virtual bool Run() override
{
return true;
}
virtual bool Run() override;
virtual const wxString GetName() const override
{
@ -53,16 +62,129 @@ public:
virtual const wxString GetDescription() const override
{
return "Compiles zone connection rules for the zone filler";
return "Checks thermal reliefs for a sufficient number of connecting spokes";
}
virtual std::set<DRC_CONSTRAINT_T> GetConstraintTypes() const override
{
return { ZONE_CONNECTION_CONSTRAINT, THERMAL_RELIEF_GAP_CONSTRAINT,
THERMAL_SPOKE_WIDTH_CONSTRAINT };
THERMAL_SPOKE_WIDTH_CONSTRAINT, MIN_RESOLVED_SPOKES_CONSTRAINT };
}
};
bool DRC_TEST_PROVIDER_ZONE_CONNECTIONS::Run()
{
const int delta = 5; // This is the number of tests between 2 calls to the progress bar
int ii = 0;
BOARD* board = m_drcEngine->GetBoard();
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();
std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->GetConnectivity();
DRC_CONSTRAINT constraint;
std::vector<ZONE*> zones;
if( !reportPhase( _( "Checking thermal reliefs..." ) ) )
return false; // DRC cancelled
for( ZONE* zone : board->Zones() )
zones.push_back( zone );
for( FOOTPRINT* footprint : board->Footprints() )
{
for( ZONE* zone : footprint->Zones() )
zones.push_back( zone );
}
for( ZONE* zone : zones )
{
if( !reportProgress( ii++, zones.size(), delta ) )
return false;
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
{
const SHAPE_POLY_SET& zoneFill = zone->GetFilledPolysList( layer );
for( FOOTPRINT* footprint : board->Footprints() )
{
for( PAD* pad : footprint->Pads() )
{
if( m_drcEngine->IsErrorLimitExceeded( DRCE_STARVED_THERMAL ) )
return true;
if( !pad->FlashLayer( layer ) )
continue;
if( pad->GetNetCode() != zone->GetNetCode() || pad->GetNetCode() <= 0 )
continue;
EDA_RECT item_boundingbox = pad->GetBoundingBox();
if( !item_boundingbox.Intersects( zone->GetCachedBoundingBox() ) )
continue;
constraint = bds.m_DRCEngine->EvalZoneConnection( pad, zone, layer );
ZONE_CONNECTION conn = constraint.m_ZoneConnection;
if( conn != ZONE_CONNECTION::THERMAL )
continue;
constraint = bds.m_DRCEngine->EvalRules( MIN_RESOLVED_SPOKES_CONSTRAINT,
pad, zone, layer );
int minCount = constraint.m_Value.Min();
if( minCount <= 0 )
continue;
SHAPE_POLY_SET padPoly;
pad->TransformShapeWithClearanceToPolygon( padPoly, layer, 0, ARC_LOW_DEF,
ERROR_OUTSIDE );
SHAPE_LINE_CHAIN& padOutline = padPoly.Outline( 0 );
std::vector<SHAPE_LINE_CHAIN::INTERSECTION> intersections;
int spokes = 0;
for( int jj = 0; jj < zoneFill.OutlineCount(); ++jj )
padOutline.Intersect( zoneFill.Outline( jj ), intersections, true );
spokes += intersections.size() / 2;
for( PCB_TRACK* track : connectivity->GetConnectedTracks( pad ) )
{
if( padOutline.PointInside( track->GetStart() ) )
{
if( zone->GetFilledPolysList( layer ).Collide( track->GetEnd() ) )
spokes++;
}
else if( padOutline.PointInside( track->GetEnd() ) )
{
if( zone->GetFilledPolysList( layer ).Collide( track->GetStart() ) )
spokes++;
}
}
if( spokes < minCount )
{
std::shared_ptr<DRC_ITEM> drce = DRC_ITEM::Create( DRCE_STARVED_THERMAL );
m_msg.Printf( _( "(%s min spoke count %d; actual %d)" ),
constraint.GetName(),
minCount,
spokes );
drce->SetErrorMessage( drce->GetErrorText() + wxS( " " ) + m_msg );
drce->SetItems( zone, pad );
drce->SetViolatingRule( constraint.GetParentRule() );
reportViolation( drce, pad->GetPosition() );
}
}
}
}
}
return true;
}
namespace detail
{

File diff suppressed because it is too large Load Diff

View File

@ -33,9 +33,9 @@
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
"drill": 0.0,
"height": 0.4,
"width": 1.35
},
"silk_line_width": 0.12,
"silk_text_italic": false,
@ -56,6 +56,7 @@
},
"rule_severities": {
"annular_width": "error",
"aperture_clearance": "error",
"clearance": "error",
"copper_edge_clearance": "error",
"courtyards_overlap": "error",
@ -83,6 +84,9 @@
"silk_over_copper": "ignore",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"too_many_vias": "error",
"track_dangling": "ignore",
"track_width": "error",
@ -97,13 +101,17 @@
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.005,
"min_aperture_clearance": 0.049999999999999996,
"min_clearance": 0.0,
"min_copper_edge_clearance": 0.024999999999999998,
"min_hole_clearance": 0.0,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.12,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.049999999999999996,
@ -315,7 +323,7 @@
"pinned_symbol_libs": []
},
"meta": {
"filename": "issue6417.kicad_pro",
"filename": "issue1358.kicad_pro",
"version": 1
},
"net_settings": {

File diff suppressed because it is too large Load Diff

View File

@ -61,6 +61,7 @@
},
"rule_severities": {
"annular_width": "error",
"aperture_clearance": "error",
"clearance": "error",
"copper_edge_clearance": "error",
"courtyards_overlap": "error",
@ -88,6 +89,9 @@
"silk_over_copper": "ignore",
"silk_overlap": "error",
"skew_out_of_range": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
@ -104,27 +108,32 @@
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.01,
"min_aperture_clearance": 0.049999999999999996,
"min_clearance": 0.0,
"min_copper_edge_clearance": 0.01,
"min_hole_clearance": 0.0,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.508,
"min_microvia_drill": 0.127,
"min_resolved_spokes": 1,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.12,
"min_through_hole_diameter": 0.5,
"min_track_width": 0.25,
"min_via_annular_width": 0.049999999999999996,
"min_via_diameter": 0.8999999999999999
"min_via_diameter": 0.8999999999999999,
"use_height_for_length_calcs": true
},
"track_widths": [
0.5,
0.0,
0.4,
0.5
],
"via_dimensions": [
{
"diameter": 1.6,
"drill": 0.6
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": true,
@ -350,7 +359,7 @@
"pinned_symbol_libs": []
},
"meta": {
"filename": "pic_programmer.kicad_pro",
"filename": "issue4774.kicad_pro",
"version": 1
},
"net_settings": {
@ -395,7 +404,7 @@
}
],
"meta": {
"version": 0
"version": 1
},
"net_colors": null
},

File diff suppressed because it is too large Load Diff

View File

@ -69,6 +69,7 @@
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint_type_mismatch": "error",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
@ -88,6 +89,10 @@
"silk_over_copper": "ignore",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "ignore",
"track_width": "error",
@ -108,7 +113,10 @@
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.15,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.12,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.2032,
"min_via_annular_width": 0.15,

View File

@ -27,6 +27,7 @@
#include <board_design_settings.h>
#include <pad.h>
#include <pcb_track.h>
#include <pcb_marker.h>
#include <footprint.h>
#include <drc/drc_item.h>
#include <settings/settings_manager.h>
@ -125,7 +126,10 @@ BOOST_FIXTURE_TEST_CASE( DRCFalseNegativeRegressions, DRC_REGRESSION_TEST_FIXTUR
bds.m_DRCEngine->SetViolationHandler(
[&]( const std::shared_ptr<DRC_ITEM>& aItem, wxPoint aPos )
{
violations.push_back( *aItem );
PCB_MARKER temp( aItem, aPos );
if( bds.m_DrcExclusions.find( temp.Serialize() ) == bds.m_DrcExclusions.end() )
violations.push_back( *aItem );
} );
bds.m_DRCEngine->RunTests( EDA_UNITS::MILLIMETRES, true, false );