KiCad PCB EDA Suite
advanced_config.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2019-2022 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <advanced_config.h>
25
26#include <config_params.h>
28
29#include <wx/app.h>
30#include <wx/config.h>
31#include <wx/filename.h>
32#include <wx/log.h>
33#include <wx/tokenzr.h>
34
35/*
36 * Flag to enable advanced config debugging
37 *
38 * Use "KICAD_ADVANCED_CONFIG" to enable.
39 *
40 * @ingroup trace_env_vars
41 */
42static const wxChar AdvancedConfigMask[] = wxT( "KICAD_ADVANCED_CONFIG" );
43
49namespace AC_STACK
50{
51 static constexpr int min_stack = 32 * 4096;
52 static constexpr int default_stack = 256 * 4096;
53 static constexpr int max_stack = 4096 * 4096;
54}
55
62namespace AC_KEYS
63{
64
69static const wxChar ExtraFillMargin[] = wxT( "ExtraFillMargin" );
70
76static const wxChar DRCEpsilon[] = wxT( "DRCEpsilon" );
77
81static const wxChar DRCSliverWidthTolerance[] = wxT( "DRCSliverWidthTolerance" );
82static const wxChar DRCSliverAngleTolerance[] = wxT( "DRCSliverAngleTolerance" );
83
89static const wxChar HoleWallThickness[] = wxT( "HoleWallPlatingThickness" );
90
96static const wxChar RealtimeConnectivity[] = wxT( "RealtimeConnectivity" );
97
102static const wxChar CoroutineStackSize[] = wxT( "CoroutineStackSize" );
103
107static const wxChar ShowRouterDebugGraphics[] = wxT( "ShowRouterDebugGraphics" );
108
113static const wxChar CompactFileSave[] = wxT( "CompactSave" );
114
122static const wxChar DrawArcAccuracy[] = wxT( "DrawArcAccuracy" );
123
130static const wxChar DrawArcCenterStartEndMaxAngle[] = wxT( "DrawArcCenterStartEndMaxAngle" );
131
137static const wxChar MaxTangentTrackAngleDeviation[] = wxT( "MaxTangentTrackAngleDeviation" );
138
143static const wxChar MaxTrackLengthToKeep[] = wxT( "MaxTrackLengthToKeep" );
144
148static const wxChar StrokeTriangulation[] = wxT( "StrokeTriangulation" );
149
154static const wxChar ExtraZoneDisplayModes[] = wxT( "ExtraZoneDisplayModes" );
155
160static const wxChar MinPlotPenWidth[] = wxT( "MinPlotPenWidth" );
161
162static const wxChar DebugZoneFiller[] = wxT( "DebugZoneFiller" );
163
164static const wxChar DebugPDFWriter[] = wxT( "DebugPDFWriter" );
165
170static const wxChar SmallDrillMarkSize[] = wxT( "SmallDrillMarkSize" );
171
172static const wxChar HotkeysDumper[] = wxT( "HotkeysDumper" );
173
174static const wxChar DrawBoundingBoxes[] = wxT( "DrawBoundingBoxes" );
175
176static const wxChar ShowPcbnewExportNetlist[] = wxT( "ShowPcbnewExportNetlist" );
177
178static const wxChar Skip3DModelFileCache[] = wxT( "Skip3DModelFileCache" );
179
180static const wxChar Skip3DModelMemoryCache[] = wxT( "Skip3DModelMemoryCache" );
181
182static const wxChar HideVersionFromTitle[] = wxT( "HideVersionFromTitle" );
183
184static const wxChar TraceMasks[] = wxT( "TraceMasks" );
185
186static const wxChar ShowRepairSchematic[] = wxT( "ShowRepairSchematic" );
187
188static const wxChar ShowEventCounters[] = wxT( "ShowEventCounters" );
189
190static const wxChar AllowManualCanvasScale[] = wxT( "AllowManualCanvasScale" );
191
192static const wxChar UpdateUIEventInterval[] = wxT( "UpdateUIEventInterval" );
193
194static const wxChar ShowPropertiesPanel[] = wxT( "ShowPropertiesPanel" );
195
196static const wxChar V3DRT_BevelHeight_um[] = wxT( "V3DRT_BevelHeight_um" );
197
198static const wxChar V3DRT_BevelExtentFactor[] = wxT( "V3DRT_BevelExtentFactor" );
199} // namespace KEYS
200
201
206namespace AC_GROUPS
207{
208static const wxChar V3D_RayTracing[] = wxT( "G_3DV_RayTracing" );
209}
210
211/*
212 * Get a simple string for common parameters.
213 *
214 * This isn't exhaustive, but it covers most common types that might be
215 * used in the advance config
216 */
217wxString dumpParamCfg( const PARAM_CFG& aParam )
218{
219 wxString s = aParam.m_Ident + ": ";
220
221 /*
222 * This implementation is rather simplistic, but it is
223 * effective enough for simple uses. A better implementation would be
224 * some kind of visitor, but that's somewhat more work.
225 */
226 switch( aParam.m_Type )
227 {
230 s << *static_cast<const PARAM_CFG_INT&>( aParam ).m_Pt_param;
231 break;
233 s << *static_cast<const PARAM_CFG_DOUBLE&>( aParam ).m_Pt_param;
234 break;
236 s << *static_cast<const PARAM_CFG_WXSTRING&>( aParam ).m_Pt_param;
237 break;
239 s << *static_cast<const PARAM_CFG_FILENAME&>( aParam ).m_Pt_param;
240 break;
242 s << ( *static_cast<const PARAM_CFG_BOOL&>( aParam ).m_Pt_param ? "true" : "false" );
243 break;
244 default: s << "Unsupported PARAM_CFG variant: " << aParam.m_Type;
245 }
246
247 return s;
248}
249
250
254static void dumpCfg( const std::vector<PARAM_CFG*>& aArray )
255{
256 // only dump if we need to
257 if( !wxLog::IsAllowedTraceMask( AdvancedConfigMask ) )
258 return;
259
260 for( const PARAM_CFG* param : aArray )
261 {
262 wxLogTrace( AdvancedConfigMask, dumpParamCfg( *param ) );
263 }
264}
265
266
272static wxFileName getAdvancedCfgFilename()
273{
274 const static wxString cfg_filename{ "kicad_advanced" };
275 return wxFileName( SETTINGS_MANAGER::GetUserSettingsPath(), cfg_filename );
276}
277
278
280{
281 wxLogTrace( AdvancedConfigMask, "Init advanced config" );
282
283 // Init defaults - this is done in case the config doesn't exist,
284 // then the values will remain as set here.
288 m_DrawArcAccuracy = 10.0;
291 m_MaxTrackLengthToKeep = 0.0005;
294
295 m_ExtraClearance = 0.0005;
296 m_DRCEpsilon = 0.0005; // 0.5um is small enough not to materially violate
297 // any constraints.
300
301 m_HoleWallThickness = 0.020; // IPC-6012 says 15-18um; Cadence says at least
302 // 0.020 for a Class 2 board and at least 0.025
303 // for Class 3.
304
305 m_MinPlotPenWidth = 0.0212; // 1 pixel at 1200dpi.
306
307 m_DebugZoneFiller = false;
308 m_DebugPDFWriter = false;
310 m_HotkeysDumper = false;
311 m_DrawBoundingBoxes = false;
316 m_ShowEventCounters = false;
318 m_CompactSave = false;
320 m_ShowRepairSchematic = false;
321 m_ShowPropertiesPanel = false;
322
324 m_3DRT_BevelExtentFactor = 1.0 / 16.0;
325
327}
328
329
331{
332 static ADVANCED_CFG instance;
333 return instance;
334}
335
336
338{
339 const wxFileName k_advanced = getAdvancedCfgFilename();
340
341 // If we are running headless, use the class defaults because we cannot instantiate wxConfig
342 if( !wxTheApp )
343 return;
344
345 if( !k_advanced.FileExists() )
346 {
347 wxLogTrace( AdvancedConfigMask, "File does not exist %s", k_advanced.GetFullPath() );
348
349 // load the defaults
350 wxConfig emptyConfig;
351 loadSettings( emptyConfig );
352
353 return;
354 }
355
356 wxLogTrace( AdvancedConfigMask, "Loading advanced config from: %s", k_advanced.GetFullPath() );
357
358 wxFileConfig file_cfg( "", "", k_advanced.GetFullPath() );
359 loadSettings( file_cfg );
360}
361
362
363void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
364{
365 std::vector<PARAM_CFG*> configParams;
366
367 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::RealtimeConnectivity,
369
370 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::ExtraFillMargin,
371 &m_ExtraClearance, m_ExtraClearance, 0.0, 1.0 ) );
372
373 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCEpsilon,
374 &m_DRCEpsilon, m_DRCEpsilon, 0.0, 1.0 ) );
375
376 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCSliverWidthTolerance,
378
379 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCSliverAngleTolerance,
381
382 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::HoleWallThickness,
384
385 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::CoroutineStackSize,
388
389 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::UpdateUIEventInterval,
391
392 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowRouterDebugGraphics,
394
395 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::CompactFileSave,
397
398 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DrawArcAccuracy,
399 &m_DrawArcAccuracy, m_DrawArcAccuracy, 0.0, 100000.0 ) );
400
401 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DrawArcCenterStartEndMaxAngle,
403
404 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MaxTangentTrackAngleDeviation,
406
407 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MaxTrackLengthToKeep,
409
410 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ExtraZoneDisplayModes,
412
413 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::StrokeTriangulation,
415
416 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MinPlotPenWidth,
417 &m_MinPlotPenWidth, m_MinPlotPenWidth, 0.0, 1.0 ) );
418
419 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DebugZoneFiller,
421
422 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DebugPDFWriter,
424
425 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::SmallDrillMarkSize,
427
428 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::HotkeysDumper,
430
431 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DrawBoundingBoxes,
433
434 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowPcbnewExportNetlist,
436
437 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::Skip3DModelFileCache,
439
440 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::Skip3DModelMemoryCache,
442
443 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::HideVersionFromTitle,
445
446 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowRepairSchematic,
448
449 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowEventCounters,
451
452 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::AllowManualCanvasScale,
454
455 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::V3DRT_BevelHeight_um,
457 0, std::numeric_limits<int>::max(),
459
460 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::V3DRT_BevelExtentFactor,
462 0.0, 100.0,
464
465
466
467 // Special case for trace mask setting...we just grab them and set them immediately
468 // Because we even use wxLogTrace inside of advanced config
469 wxString traceMasks = "";
470 configParams.push_back( new PARAM_CFG_WXSTRING( true, AC_KEYS::TraceMasks, &traceMasks, "" ) );
471
472 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowPropertiesPanel,
473 &m_ShowPropertiesPanel, false ) );
474
475 // Load the config from file
476 wxConfigLoadSetups( &aCfg, configParams );
477
478 // Now actually set the trace masks
479 wxStringTokenizer traceMaskTokenizer( traceMasks, "," );
480
481 while( traceMaskTokenizer.HasMoreTokens() )
482 {
483 wxString mask = traceMaskTokenizer.GetNextToken();
484 wxLog::AddTraceMask( mask );
485 }
486
487 dumpCfg( configParams );
488
489 for( PARAM_CFG* param : configParams )
490 delete param;
491}
492
493
static void dumpCfg(const std::vector< PARAM_CFG * > &aArray)
Dump the configs in the given array to trace.
wxString dumpParamCfg(const PARAM_CFG &aParam)
static const wxChar AdvancedConfigMask[]
static wxFileName getAdvancedCfgFilename()
Get the filename for the advanced config file.
Class containing "advanced" configuration options.
bool m_Skip3DModelFileCache
Skip reading/writing 3d model file caches This does not prevent the models from being cached in memor...
bool m_ShowRepairSchematic
double m_DrawArcCenterMaxAngle
When drawing an arc, the angle ( center - start ) - ( start - end ) can be limited to avoid extremely...
double m_MaxTangentAngleDeviation
Maximum angle between the tangent line of an arc track and a connected straight track in order to com...
bool m_ShowRouterDebugGraphics
Show PNS router debug graphics.
bool m_Skip3DModelMemoryCache
Skip reading/writing 3d model memory caches This ensures 3d models are always reloaded from disk even...
void loadFromConfigFile()
Load the config from the normal config file.
double m_HoleWallThickness
Hole wall plating thickness.
int m_CoroutineStackSize
Set the stack size for coroutines.
double m_SmallDrillMarkSize
The diameter of the drill marks on print and plot outputs (in mm), when the "Drill marks" option is s...
bool m_ShowPropertiesPanel
Show the properties panel in PcbNew.
double m_ExtraClearance
Extra fill clearance for zone fills.
bool m_DrawBoundingBoxes
Draw GAL bounding boxes in painters.
double m_DRCEpsilon
Epsilon for DRC tests.
double m_SliverAngleTolerance
bool m_AllowManualCanvasScale
double m_SliverWidthTolerance
Sliver tolerances for DRC.
bool m_ExtraZoneDisplayModes
When true, adds zone-diaplay-modes for stroking the zone fracture boundaries and the zone triangulati...
double m_MinPlotPenWidth
Sets an absolute minimum pen width for plotting.
double m_MaxTrackLengthToKeep
Maximum track length to keep after doing an arc track resizing operation.
double m_DrawArcAccuracy
Distance from an arc end point and the estimated end point, when rotating from the start point to the...
bool m_HotkeysDumper
Enable the hotkeys dumper feature, used for generating documentation.
int m_UpdateUIEventInterval
The update interval the wxWidgets sends wxUpdateUIEvents to windows.
void loadSettings(wxConfigBase &aCfg)
double m_3DRT_BevelExtentFactor
3D-Viewer, Raytracing Factor applied to Extent.z of the item layer, used on calculation of the bevel'...
bool m_ShowPcbnewExportNetlist
Enable exporting board editor netlist to a file for troubleshooting purposes.
bool m_RealTimeConnectivity
Do real-time connectivity.
bool m_DebugPDFWriter
A mode that writes PDFs without compression.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
bool m_ShowEventCounters
Shows debugging event counters in various places.
bool m_DrawTriangulationOutlines
When true, strokes the triangulations with visible color.
int m_3DRT_BevelHeight_um
3D-Viewer, Raytracing Bevel height of layer items.
bool m_CompactSave
Save files in compact display mode When is is not specified, points are written one per line.
bool m_HideVersionFromTitle
Hides the build version from the KiCad manager frame title.
bool m_DebugZoneFiller
A mode that dumps the various stages of a F_Cu fill into In1_Cu through In9_Cu.
Configuration object for booleans.
Configuration object for double precision floating point numbers.
Configuration object for integers.
Configuration object for wxString objects.
A base class which establishes the interface functions ReadParam and SaveParam, which are implemented...
Definition: config_params.h:82
paramcfg_id m_Type
Type of parameter.
wxString m_Ident
Keyword in config data.
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
void wxConfigLoadSetups(wxConfigBase *aCfg, const std::vector< PARAM_CFG * > &aList)
Use aList of PARAM_CFG object to load configuration values from aCfg.
@ PARAM_WXSTRING
Definition: config_params.h:60
@ PARAM_INT_WITH_SCALE
Definition: config_params.h:56
@ PARAM_INT
Definition: config_params.h:55
@ PARAM_FILENAME
Definition: config_params.h:62
@ PARAM_DOUBLE
Definition: config_params.h:57
@ PARAM_BOOL
Definition: config_params.h:58
List of known groups for advanced configuration options.
static const wxChar V3D_RayTracing[]
List of known keys for advanced configuration options.
static const wxChar DebugPDFWriter[]
static const wxChar HotkeysDumper[]
static const wxChar ShowRepairSchematic[]
static const wxChar HideVersionFromTitle[]
static const wxChar ShowPropertiesPanel[]
static const wxChar AllowManualCanvasScale[]
static const wxChar MaxTangentTrackAngleDeviation[]
For arc track interactive drag-resizing Maximum angle between the tangent line of an arc track and a ...
static const wxChar MaxTrackLengthToKeep[]
For arc track interactive drag-resizing Maximum track length to keep after doing an arc track resizin...
static const wxChar ShowPcbnewExportNetlist[]
static const wxChar DrawBoundingBoxes[]
static const wxChar MinPlotPenWidth[]
Absolute minimum pen width to send to the plotter.
static const wxChar CoroutineStackSize[]
Configure the coroutine stack size in bytes.
static const wxChar HoleWallThickness[]
Used to calculate the actual hole size from the finish hole size.
static const wxChar DRCSliverWidthTolerance[]
Angle and width tolerances for copper and solder mask sliver detection.
static const wxChar DebugZoneFiller[]
static const wxChar StrokeTriangulation[]
When true, GAL will stroke the triangulations (only used in OpenGL) with a visible color.
static const wxChar CompactFileSave[]
When set to true, this will wrap polygon point sets at 4 points per line rather than a single point p...
static const wxChar DRCSliverAngleTolerance[]
static const wxChar UpdateUIEventInterval[]
static const wxChar V3DRT_BevelHeight_um[]
static const wxChar RealtimeConnectivity[]
Testing mode for new connectivity algorithm.
static const wxChar ShowRouterDebugGraphics[]
Show PNS router debug graphics while routing.
static const wxChar DRCEpsilon[]
A fudge factor for DRC.
static const wxChar V3DRT_BevelExtentFactor[]
static const wxChar DrawArcAccuracy[]
For drawsegments - arcs.
static const wxChar Skip3DModelMemoryCache[]
static const wxChar ExtraZoneDisplayModes[]
When true, a third zone-display-mode is included which strokes the filled areas and fracture boundari...
static const wxChar Skip3DModelFileCache[]
static const wxChar SmallDrillMarkSize[]
The diameter of the drill marks on print and plot outputs (in mm), when the "Drill marks" option is s...
static const wxChar DrawArcCenterStartEndMaxAngle[]
For drawsegments - arcs.
static const wxChar ExtraFillMargin[]
When filling zones, we add an extra amount of clearance to each zone to ensure that rounding errors d...
static const wxChar ShowEventCounters[]
static const wxChar TraceMasks[]
Limits and default settings for the coroutine stack size allowed.
static constexpr int min_stack
static constexpr int max_stack
static constexpr int default_stack