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:
parent
32721755bf
commit
a1e3f2b188
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -21,6 +21,7 @@ length
|
|||
max
|
||||
micro_via
|
||||
min
|
||||
min_resolved_spokes
|
||||
none
|
||||
npth
|
||||
opt
|
||||
|
|
|
@ -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" ) },
|
||||
|
|
|
@ -526,6 +526,7 @@ enum class BITMAPS : unsigned int
|
|||
switch_corner_rounding_shape,
|
||||
text,
|
||||
text_sketch,
|
||||
thermal_spokes,
|
||||
three_d,
|
||||
tool_ratsnest,
|
||||
tools,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 ) );
|
||||
|
|
|
@ -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 ) );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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\"";
|
||||
|
|
|
@ -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))
|
|
@ -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 },
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() )
|
||||
{
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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
|
||||
},
|
||||
|
|
100507
qa/data/issue7325.kicad_pcb
100507
qa/data/issue7325.kicad_pcb
File diff suppressed because it is too large
Load Diff
|
@ -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,
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue