KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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
68static const wxChar IncrementalConnectivity[] = wxT( "IncrementalConnectivity" );
69
73static const wxChar Use3DConnexionDriver[] = wxT( "3DConnexionDriver" );
74
79static const wxChar ExtraFillMargin[] = wxT( "ExtraFillMargin" );
80
86static const wxChar DRCEpsilon[] = wxT( "DRCEpsilon" );
87
91static const wxChar DRCSliverWidthTolerance[] = wxT( "DRCSliverWidthTolerance" );
92static const wxChar DRCSliverMinimumLength[] = wxT( "DRCSliverMinimumLength" );
93static const wxChar DRCSliverAngleTolerance[] = wxT( "DRCSliverAngleTolerance" );
94
100static const wxChar HoleWallThickness[] = wxT( "HoleWallPlatingThickness" );
101
106static const wxChar CoroutineStackSize[] = wxT( "CoroutineStackSize" );
107
111static const wxChar ShowRouterDebugGraphics[] = wxT( "ShowRouterDebugGraphics" );
112
117static const wxChar CompactFileSave[] = wxT( "CompactSave" );
118
126static const wxChar DrawArcAccuracy[] = wxT( "DrawArcAccuracy" );
127
134static const wxChar DrawArcCenterStartEndMaxAngle[] = wxT( "DrawArcCenterStartEndMaxAngle" );
135
141static const wxChar MaxTangentTrackAngleDeviation[] = wxT( "MaxTangentTrackAngleDeviation" );
142
147static const wxChar MaxTrackLengthToKeep[] = wxT( "MaxTrackLengthToKeep" );
148
152static const wxChar StrokeTriangulation[] = wxT( "StrokeTriangulation" );
153
158static const wxChar ExtraZoneDisplayModes[] = wxT( "ExtraZoneDisplayModes" );
159
164static const wxChar MinPlotPenWidth[] = wxT( "MinPlotPenWidth" );
165
166static const wxChar DebugZoneFiller[] = wxT( "DebugZoneFiller" );
167
168static const wxChar DebugPDFWriter[] = wxT( "DebugPDFWriter" );
169
174static const wxChar SmallDrillMarkSize[] = wxT( "SmallDrillMarkSize" );
175
176static const wxChar HotkeysDumper[] = wxT( "HotkeysDumper" );
177
178static const wxChar DrawBoundingBoxes[] = wxT( "DrawBoundingBoxes" );
179
180static const wxChar ShowPcbnewExportNetlist[] = wxT( "ShowPcbnewExportNetlist" );
181
182static const wxChar Skip3DModelFileCache[] = wxT( "Skip3DModelFileCache" );
183
184static const wxChar Skip3DModelMemoryCache[] = wxT( "Skip3DModelMemoryCache" );
185
186static const wxChar HideVersionFromTitle[] = wxT( "HideVersionFromTitle" );
187
188static const wxChar TraceMasks[] = wxT( "TraceMasks" );
189
190static const wxChar ShowRepairSchematic[] = wxT( "ShowRepairSchematic" );
191
192static const wxChar ShowEventCounters[] = wxT( "ShowEventCounters" );
193
194static const wxChar AllowManualCanvasScale[] = wxT( "AllowManualCanvasScale" );
195
196static const wxChar UpdateUIEventInterval[] = wxT( "UpdateUIEventInterval" );
197
198static const wxChar ShowPropertiesPanel[] = wxT( "ShowPropertiesPanel" );
199
200static const wxChar V3DRT_BevelHeight_um[] = wxT( "V3DRT_BevelHeight_um" );
201
202static const wxChar V3DRT_BevelExtentFactor[] = wxT( "V3DRT_BevelExtentFactor" );
203
204static const wxChar UseClipper2[] = wxT( "UseClipper2" );
205} // namespace KEYS
206
207
212namespace AC_GROUPS
213{
214static const wxChar V3D_RayTracing[] = wxT( "G_3DV_RayTracing" );
215}
216
217/*
218 * Get a simple string for common parameters.
219 *
220 * This isn't exhaustive, but it covers most common types that might be
221 * used in the advance config
222 */
223wxString dumpParamCfg( const PARAM_CFG& aParam )
224{
225 wxString s = aParam.m_Ident + wxS( ": " );
226
227 /*
228 * This implementation is rather simplistic, but it is
229 * effective enough for simple uses. A better implementation would be
230 * some kind of visitor, but that's somewhat more work.
231 */
232 switch( aParam.m_Type )
233 {
236 s << *static_cast<const PARAM_CFG_INT&>( aParam ).m_Pt_param;
237 break;
239 s << *static_cast<const PARAM_CFG_DOUBLE&>( aParam ).m_Pt_param;
240 break;
242 s << *static_cast<const PARAM_CFG_WXSTRING&>( aParam ).m_Pt_param;
243 break;
245 s << *static_cast<const PARAM_CFG_FILENAME&>( aParam ).m_Pt_param;
246 break;
248 s << ( *static_cast<const PARAM_CFG_BOOL&>( aParam ).m_Pt_param ? wxS( "true" ) : wxS( "false" ) );
249 break;
250 default: s << wxS( "Unsupported PARAM_CFG variant: " ) << aParam.m_Type;
251 }
252
253 return s;
254}
255
256
260static void dumpCfg( const std::vector<PARAM_CFG*>& aArray )
261{
262 // only dump if we need to
263 if( !wxLog::IsAllowedTraceMask( AdvancedConfigMask ) )
264 return;
265
266 for( const PARAM_CFG* param : aArray )
267 {
268 wxLogTrace( AdvancedConfigMask, dumpParamCfg( *param ) );
269 }
270}
271
272
278static wxFileName getAdvancedCfgFilename()
279{
280 const static wxString cfg_filename{ wxS( "kicad_advanced" ) };
281 return wxFileName( SETTINGS_MANAGER::GetUserSettingsPath(), cfg_filename );
282}
283
284
286{
287 wxLogTrace( AdvancedConfigMask, wxS( "Init advanced config" ) );
288
289 // Init defaults - this is done in case the config doesn't exist,
290 // then the values will remain as set here.
293 m_DrawArcAccuracy = 10.0;
296 m_MaxTrackLengthToKeep = 0.0005;
299
300 m_ExtraClearance = 0.0005;
301 m_DRCEpsilon = 0.0005; // 0.5um is small enough not to materially violate
302 // any constraints.
304 m_SliverMinimumLength = 0.0008;
306
307 m_HoleWallThickness = 0.020; // IPC-6012 says 15-18um; Cadence says at least
308 // 0.020 for a Class 2 board and at least 0.025
309 // for Class 3.
310
311 m_MinPlotPenWidth = 0.0212; // 1 pixel at 1200dpi.
312
313 m_DebugZoneFiller = false;
314 m_DebugPDFWriter = false;
316 m_HotkeysDumper = false;
317 m_DrawBoundingBoxes = false;
322 m_ShowEventCounters = false;
324 m_CompactSave = false;
326 m_ShowRepairSchematic = false;
327 m_ShowPropertiesPanel = false;
328
330 m_3DRT_BevelExtentFactor = 1.0 / 16.0;
331
332 m_UseClipper2 = true;
333
334#ifdef _WIN32
335 // spacemouse is largely stable on Windows
337#else
339#endif
340
342
344}
345
346
348{
349 static ADVANCED_CFG instance;
350 return instance;
351}
352
353
355{
356 const wxFileName k_advanced = getAdvancedCfgFilename();
357
358 // If we are running headless, use the class defaults because we cannot instantiate wxConfig
359 if( !wxTheApp )
360 return;
361
362 if( !k_advanced.FileExists() )
363 {
364 wxLogTrace( AdvancedConfigMask, wxS( "File does not exist %s" ), k_advanced.GetFullPath() );
365
366 // load the defaults
367 wxConfig emptyConfig;
368 loadSettings( emptyConfig );
369
370 return;
371 }
372
373 wxLogTrace( AdvancedConfigMask, wxS( "Loading advanced config from: %s" ), k_advanced.GetFullPath() );
374
375 wxFileConfig file_cfg( wxS( "" ), wxS( "" ), k_advanced.GetFullPath() );
376 loadSettings( file_cfg );
377}
378
379
380void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
381{
382 std::vector<PARAM_CFG*> configParams;
383
384 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::ExtraFillMargin,
385 &m_ExtraClearance, m_ExtraClearance, 0.0, 1.0 ) );
386
387 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCEpsilon,
388 &m_DRCEpsilon, m_DRCEpsilon, 0.0, 1.0 ) );
389
390 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCSliverWidthTolerance,
392
393 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCSliverMinimumLength,
395
396 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DRCSliverAngleTolerance,
398
399 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::HoleWallThickness,
401
402 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::CoroutineStackSize,
405
406 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::UpdateUIEventInterval,
408
409 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowRouterDebugGraphics,
411
412 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::CompactFileSave,
414
415 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DrawArcAccuracy,
416 &m_DrawArcAccuracy, m_DrawArcAccuracy, 0.0, 100000.0 ) );
417
418 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::DrawArcCenterStartEndMaxAngle,
420
421 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MaxTangentTrackAngleDeviation,
423
424 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MaxTrackLengthToKeep,
426
427 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ExtraZoneDisplayModes,
429
430 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::StrokeTriangulation,
432
433 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MinPlotPenWidth,
434 &m_MinPlotPenWidth, m_MinPlotPenWidth, 0.0, 1.0 ) );
435
436 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DebugZoneFiller,
438
439 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DebugPDFWriter,
441
442 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::SmallDrillMarkSize,
444
445 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::HotkeysDumper,
447
448 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::DrawBoundingBoxes,
450
451 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowPcbnewExportNetlist,
453
454 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::Skip3DModelFileCache,
456
457 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::Skip3DModelMemoryCache,
459
460 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::HideVersionFromTitle,
462
463 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowRepairSchematic,
465
466 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowEventCounters,
468
469 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::AllowManualCanvasScale,
471
472 configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::V3DRT_BevelHeight_um,
474 0, std::numeric_limits<int>::max(),
476
477 configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::V3DRT_BevelExtentFactor,
479 0.0, 100.0,
481
482 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::UseClipper2,
484
485 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::Use3DConnexionDriver,
487
488 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::IncrementalConnectivity,
490
491
492
493 // Special case for trace mask setting...we just grab them and set them immediately
494 // Because we even use wxLogTrace inside of advanced config
495 wxString traceMasks;
496 configParams.push_back( new PARAM_CFG_WXSTRING( true, AC_KEYS::TraceMasks, &traceMasks, wxS( "" ) ) );
497
498 configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowPropertiesPanel,
499 &m_ShowPropertiesPanel, false ) );
500
501 // Load the config from file
502 wxConfigLoadSetups( &aCfg, configParams );
503
504 // Now actually set the trace masks
505 wxStringTokenizer traceMaskTokenizer( traceMasks, wxS( "," ) );
506
507 while( traceMaskTokenizer.HasMoreTokens() )
508 {
509 wxString mask = traceMaskTokenizer.GetNextToken();
510 wxLog::AddTraceMask( mask );
511 }
512
513 dumpCfg( configParams );
514
515 for( PARAM_CFG* param : configParams )
516 delete param;
517}
518
519
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.
void loadFromConfigFile()
Load the config from the normal config file.
void loadSettings(wxConfigBase &aCfg)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
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
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_Use3DConnexionDriver
Use the 3DConnexion Driver.
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...
double m_HoleWallThickness
Hole wall plating thickness.
int m_CoroutineStackSize
Set the stack size for coroutines.
bool m_UseClipper2
Use Clipper2 instead of Clipper1.
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 applications that it hasn't been fully released for.
bool m_IncrementalConnectivity
Use the new incremental netlister for realtime jobs.
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-display-modes for stroking the zone fracture boundaries and the zone triangulati...
double m_MinPlotPenWidth
Sets an absolute minimum pen width for plotting.
double m_SliverMinimumLength
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.
double m_3DRT_BevelExtentFactor
3D-Viewer raytracing factor applied to Extent.z of the item layer.
bool m_ShowPcbnewExportNetlist
Enable exporting board editor netlist to a file for troubleshooting purposes.
bool m_DebugPDFWriter
A mode that writes PDFs without compression.
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.
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 UseClipper2[]
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 IncrementalConnectivity[]
Should the schematic use the new incremental connectivity algorithm.
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 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 DRCSliverMinimumLength[]
static const wxChar ShowEventCounters[]
static const wxChar TraceMasks[]
static const wxChar Use3DConnexionDriver[]
Decide whether to attempt usage of the 3DConnexion mouse.
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