KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcbnew_settings.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) 2020-2023 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 <pybind11/pybind11.h>
25
26#include <common.h>
28#include <layer_ids.h>
29#include <lset.h>
30#include <pcbnew_settings.h>
31#include <pgm_base.h>
35#include <settings/parameters.h>
37#include <wx/config.h>
38#include <wx/tokenzr.h>
39#include <zones.h>
40#include <widgets/ui_common.h>
41#include <base_units.h>
42
43#include "../3d-viewer/3d_viewer/eda_3d_viewer_settings.h"
44
45
47const int pcbnewSchemaVersion = 5;
48
49
52 m_AuiPanels(),
53 m_Cleanup(),
54 m_DrcDialog(),
55 m_ExportIdf(),
56 m_ExportStep(),
57 m_ExportSvg(),
58 m_ExportVrml(),
59 m_FootprintWizardList(),
60 m_GenDrill(),
61 m_ImportGraphics(),
62 m_NetlistDialog(),
63 m_PlaceFile(),
64 m_Plot(),
65 m_FootprintChooser(),
66 m_Zones(),
67 m_FootprintViewer(),
68 m_FootprintWizard(),
69 m_Display(),
70 m_TrackDragAction( TRACK_DRAG_ACTION::DRAG ),
72 m_CtrlClickHighlight( false ),
73 m_Use45DegreeLimit( false ),
74 m_FlipDirection( FLIP_DIRECTION::TOP_BOTTOM ),
75 m_ESCClearsNetHighlight( true ),
76 m_PolarCoords( false ),
77 m_RotationAngle( ANGLE_90 ),
78 m_ShowPageLimits( true ),
79 m_ShowCourtyardCollisions( true ),
80 m_AutoRefillZones( false ),
81 m_AllowFreePads( false ),
82 m_PnsSettings( nullptr ),
83 m_FootprintViewerZoom( 1.0 ),
84 m_FootprintViewerAutoZoomOnSelect( true ),
85 m_FootprintViewerLibListWidth( 200 ),
86 m_FootprintViewerFPListWidth( 300 )
87{
88 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL;
89 m_MagneticItems.tracks = MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL;
92
94
95 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
97
98 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
100
101 m_params.emplace_back( new PARAM<int>( "aui.net_inspector_width",
103
104 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
106
107 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
109
110 m_params.emplace_back( new PARAM<int>( "aui.search_panel_height",
112
113 m_params.emplace_back( new PARAM<int>( "aui.search_panel_width",
115
116 m_params.emplace_back( new PARAM<int>( "aui.search_panel_dock_direction",
118
119 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
120 &m_AuiPanels.appearance_panel_tab, 0, 0, 2 ) );
121
122 m_params.emplace_back( new PARAM<bool>( "aui.appearance_expand_layer_display",
124
125 m_params.emplace_back( new PARAM<bool>( "aui.appearance_expand_net_display",
127
128 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
129 &m_AuiPanels.show_properties, false ) );
130
131 m_params.emplace_back( new PARAM<bool>( "aui.show_search",
132 &m_AuiPanels.show_search, false ) );
133
134 m_params.emplace_back( new PARAM<bool>( "aui.show_net_inspector",
136
137 m_params.emplace_back( new PARAM<int>( "footprint_chooser.width",
138 &m_FootprintChooser.width, -1 ) );
139
140 m_params.emplace_back( new PARAM<int>( "footprint_chooser.height",
141 &m_FootprintChooser.height, -1 ) );
142
143 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_h",
144 &m_FootprintChooser.sash_h, -1 ) );
145
146 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_v",
147 &m_FootprintChooser.sash_v, -1 ) );
148
149 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sort_mode",
151
152 m_params.emplace_back( new PARAM<bool>( "footprint_chooser.filter_on_pin_count",
154
155 m_params.emplace_back( new PARAM<bool>( "footprint_chooser.use_fp_filters",
157
158 m_params.emplace_back( new PARAM<bool>( "editing.flip_left_right",
159 reinterpret_cast<bool*>( &m_FlipDirection ),
160 static_cast<bool>( FLIP_DIRECTION::LEFT_RIGHT ) ) );
161
162 m_params.emplace_back( new PARAM<bool>( "editing.esc_clears_net_highlight",
163 &m_ESCClearsNetHighlight, true ) );
164
165 m_params.emplace_back( new PARAM<bool>( "editing.show_courtyard_collisions",
166 &m_ShowCourtyardCollisions, true ) );
167
168 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
169 &m_MagneticItems.graphics, true ) );
170
171 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
172 reinterpret_cast<int*>( &m_MagneticItems.pads ),
173 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
174
175 m_params.emplace_back( new PARAM<int>( "editing.magnetic_tracks",
176 reinterpret_cast<int*>( &m_MagneticItems.tracks ),
177 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
178
179 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
180 &m_MagneticItems.allLayers, false ) );
181
182 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
183 &m_PolarCoords, false ) );
184
185 m_params.emplace_back( new PARAM<int>( "editing.track_drag_action",
186 reinterpret_cast<int*>( &m_TrackDragAction ),
187 static_cast<int>( TRACK_DRAG_ACTION::DRAG ) ) );
188
189 m_params.emplace_back( new PARAM<int>( "editing.arc_edit_mode",
190 reinterpret_cast<int*>( &m_ArcEditMode ),
191 static_cast<int>( ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS ) ) );
192
193 m_params.emplace_back( new PARAM<bool>( "editing.ctrl_click_highlight",
194 &m_CtrlClickHighlight, false ) );
195
196 m_params.emplace_back( new PARAM<bool>( "editing.pcb_use_45_degree_limit",
197 &m_Use45DegreeLimit, false ) );
198
199 m_params.emplace_back( new PARAM<bool>( "editing.auto_fill_zones",
200 &m_AutoRefillZones, false ) );
201
202 m_params.emplace_back( new PARAM<bool>( "editing.allow_free_pads",
203 &m_AllowFreePads, false ) );
204
205 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
206 [this] () -> int
207 {
209
210 // Don't store values larger than 360 degrees
211 return rot % 3600;
212 },
213 [this] ( int aVal )
214 {
215 if( aVal )
217
218 // A misconfiguration allowed some angles to be stored as tenth of a degree but read
219 // as tens of degrees. By disallowing storage of values larger than 360, we can weed out
220 // those invalid values here.
221 while( m_RotationAngle > ANGLE_360 )
223
224 },
225 900 ) );
226
227 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphic_items_fill",
229
230 m_params.emplace_back( new PARAM<int>( "pcb_display.max_links_shown",
231 &m_Display.m_MaxLinksShowed, 3, 0, 15 ) );
232
233 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
235
236 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
238
239 m_params.emplace_back( new PARAM<int>( "pcb_display.net_names_mode",
240 &m_Display.m_NetNames, 3, 0, 3 ) );
241
242 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_clearance",
243 &m_Display.m_PadClearance, true ) );
244
245 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
247
248 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
250
251 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_global",
253
254 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_footprint",
256
257 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_curved",
259
260 m_params.emplace_back( new PARAM<double>( "pcb_display.ratsnest_thickness",
262
263 m_params.emplace_back( new PARAM<int>( "pcb_display.track_clearance_mode",
264 reinterpret_cast<int*>( &m_Display.m_TrackClearance ), SHOW_WITH_VIA_WHILE_ROUTING ) );
265
266 m_params.emplace_back( new PARAM<bool>( "pcb_display.track_fill",
268
269 m_params.emplace_back( new PARAM<bool>( "pcb_display.via_fill",
270 &m_Display.m_DisplayViaFill, true ) );
271
272 m_params.emplace_back( new PARAM<int>( "pcb_display.origin_mode",
273 reinterpret_cast<int*>( &m_Display.m_DisplayOrigin ),
274 PCB_DISPLAY_ORIGIN::PCB_ORIGIN_PAGE ) );
275
276 m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_x_axis",
278
279 m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_y_axis",
281
282 m_params.emplace_back( new PARAM<bool>( "pcb_display.force_show_fields_when_fp_selected",
284
285 m_params.emplace_back( new PARAM<bool>( "pcb_display.live_3d_refresh",
286 &m_Display.m_Live3DRefresh, false ) );
287
288 m_params.emplace_back( new PARAM<bool>( "pcb_display.show_page_borders",
289 &m_ShowPageLimits, true ) );
290
291 m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_refill_zones",
293
294 m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_vias",
295 &m_Cleanup.cleanup_vias, true ) );
296
297 m_params.emplace_back( new PARAM<bool>( "cleanup.delete_dangling_vias",
299
300 m_params.emplace_back( new PARAM<bool>( "cleanup.merge_segments",
301 &m_Cleanup.merge_segments, true ) );
302
303 m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_unconnected",
305
306 m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_short_circuits",
308
309 m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_tracks_in_pad",
311
312 m_params.emplace_back( new PARAM<bool>( "drc_dialog.refill_zones",
313 &m_DrcDialog.refill_zones, true ) );
314
315 m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_all_track_errors",
317
318 m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_footprints",
319 &m_DrcDialog.test_footprints, false ) );
320
321 m_params.emplace_back( new PARAM<int>( "drc_dialog.severities",
323
324 m_params.emplace_back( new PARAM<bool>( "gen_drill.merge_pth_npth",
325 &m_GenDrill.merge_pth_npth, false ) );
326
327 m_params.emplace_back( new PARAM<bool>( "gen_drill.minimal_header",
328 &m_GenDrill.minimal_header, false ) );
329
330 m_params.emplace_back( new PARAM<bool>( "gen_drill.mirror",
331 &m_GenDrill.mirror, false ) );
332
333 m_params.emplace_back( new PARAM<bool>( "gen_drill.unit_drill_is_inch",
334 &m_GenDrill.unit_drill_is_inch, false ) );
335
336 m_params.emplace_back( new PARAM<bool>( "gen_drill.use_route_for_oval_holes",
338
339 m_params.emplace_back( new PARAM<int>( "gen_drill.drill_file_type",
341
342 m_params.emplace_back( new PARAM<int>( "gen_drill.map_file_type",
344
345 m_params.emplace_back( new PARAM<int>( "gen_drill.zeros_format",
346 &m_GenDrill.zeros_format, 0, 0, 3 ) );
347
348 m_params.emplace_back( new PARAM<int>( "export_2581.units",
349 &m_Export2581.units, 0 ) );
350
351 m_params.emplace_back( new PARAM<int>( "export_2581.precision",
352 &m_Export2581.precision, 3 ) );
353
354 m_params.emplace_back( new PARAM<int>( "export_2581.version",
355 &m_Export2581.version, 1 ) );
356
357 m_params.emplace_back( new PARAM<bool>( "export_2581.compress",
358 &m_Export2581.compress, false ) );
359
360 m_params.emplace_back( new PARAM<bool>( "export_idf.auto_adjust",
361 &m_ExportIdf.auto_adjust, false ) );
362
363 m_params.emplace_back( new PARAM<int>( "export_idf.ref_units",
364 &m_ExportIdf.ref_units, 0 ) );
365
366 m_params.emplace_back( new PARAM<double>( "export_idf.ref_x",
367 &m_ExportIdf.ref_x, 0 ) );
368
369 m_params.emplace_back( new PARAM<double>( "export_idf.ref_y",
370 &m_ExportIdf.ref_y, 0 ) );
371
372 m_params.emplace_back( new PARAM<bool>( "export_idf.units_mils",
373 &m_ExportIdf.units_mils, false ) );
374
375 m_params.emplace_back( new PARAM<int>( "export_step.origin_mode",
377
378 m_params.emplace_back( new PARAM<int>( "export_step.origin_units",
380
381 m_params.emplace_back( new PARAM<double>( "export_step.origin_x",
382 &m_ExportStep.origin_x, 0 ) );
383
384 m_params.emplace_back( new PARAM<double>( "export_step.origin_y",
385 &m_ExportStep.origin_y, 0 ) );
386
387 m_params.emplace_back( new PARAM<bool>( "export_step.no_unspecified",
388 &m_ExportStep.no_unspecified, false ) );
389
390 m_params.emplace_back( new PARAM<bool>( "export_step.no_dnp",
391 &m_ExportStep.no_dnp, false ) );
392
393 m_params.emplace_back( new PARAM<bool>( "export_step.replace_models",
394 &m_ExportStep.replace_models, true ) );
395
396 m_params.emplace_back( new PARAM<bool>( "export_step.overwrite_file",
397 &m_ExportStep.overwrite_file, true ) );
398
399 m_params.emplace_back( new PARAM<bool>( "export_svg.black_and_white",
400 &m_ExportSvg.black_and_white, false ) );
401
402 m_params.emplace_back( new PARAM<bool>( "export_svg.use_theme",
404
405 m_params.emplace_back( new PARAM<wxString>( "export_svg.color_theme",
406 &m_ExportSvg.color_theme, "" ) );
407
408 m_params.emplace_back( new PARAM<bool>( "export_svg.mirror",
409 &m_ExportSvg.mirror, false ) );
410
411 m_params.emplace_back( new PARAM<bool>( "export_svg.one_file",
412 &m_ExportSvg.one_file, false ) );
413
414 m_params.emplace_back(new PARAM<bool>( "export_svg.plot_board_edges",
415 &m_ExportSvg.plot_board_edges, true ) );
416
417 m_params.emplace_back( new PARAM<int>( "export_svg.page_size",
418 &m_ExportSvg.page_size, 0 ) );
419
420 m_params.emplace_back( new PARAM<wxString>( "export_svg.output_dir",
421 &m_ExportSvg.output_dir, "" ) );
422
423 m_params.emplace_back( new PARAM_LIST<int>( "export_svg.layers",
424 &m_ExportSvg.layers, {} ) );
425
426 m_params.emplace_back( new PARAM<int>( "export_vrml.units",
427 &m_ExportVrml.units, 1 ) );
428
429 m_params.emplace_back( new PARAM<bool>( "export_vrml.no_unspecified",
430 &m_ExportVrml.no_unspecified, false ) );
431
432 m_params.emplace_back( new PARAM<bool>( "export_vrml.no_dnp",
433 &m_ExportVrml.no_dnp, false ) );
434
435 m_params.emplace_back( new PARAM<bool>( "export_vrml.copy_3d_models",
436 &m_ExportVrml.copy_3d_models, false ) );
437
438 m_params.emplace_back( new PARAM<bool>( "export_vrml.use_relative_paths",
440
441 m_params.emplace_back( new PARAM<int>( "export_vrml.ref_units",
442 &m_ExportVrml.ref_units, 0 ) );
443
444 m_params.emplace_back( new PARAM<double>( "export_vrml.ref_x",
445 &m_ExportVrml.ref_x, 0 ) );
446
447 m_params.emplace_back( new PARAM<double>( "export_vrml.ref_y",
448 &m_ExportVrml.ref_y, 0 ) );
449
450 m_params.emplace_back( new PARAM<int>( "export_vrml.origin_mode",
452
453 m_params.emplace_back( new PARAM<int>( "zones.net_sort_mode",
454 &m_Zones.net_sort_mode, -1 ) );
455
456 m_params.emplace_back( new PARAM<int>( "import_graphics.layer",
458
459 m_params.emplace_back( new PARAM<bool>( "import_graphics.use_dlg_layer_selection",
461
462 m_params.emplace_back( new PARAM<bool>( "import_graphics.interactive_placement",
464
465 m_params.emplace_back( new PARAM<bool>( "import_graphics.group_items",
466 &m_ImportGraphics.group_items, true ) );
467
468 m_params.emplace_back( new PARAM<bool>( "import_graphics.fix_discontinuities",
470
471 m_params.emplace_back( new PARAM<double>( "import_graphics.tolerance",
472 &m_ImportGraphics.tolerance, 1.0, 0.0, 10.0 ) );
473
474 m_params.emplace_back( new PARAM<int>( "import_graphics.line_width_units",
476
477 m_params.emplace_back( new PARAM<double>( "import_graphics.line_width",
479
480 m_params.emplace_back( new PARAM<int>( "import_graphics.origin_units",
482
483 m_params.emplace_back( new PARAM<double>( "import_graphics.origin_x",
485
486 m_params.emplace_back( new PARAM<double>( "import_graphics.origin_y",
488
489 m_params.emplace_back( new PARAM<int>( "import_graphics.dxf_units",
491
492 m_params.emplace_back( new PARAM<int>( "netlist.report_filter",
494
495 m_params.emplace_back( new PARAM<bool>( "netlist.update_footprints",
497
498 m_params.emplace_back( new PARAM<bool>( "netlist.delete_shorting_tracks",
500
501 m_params.emplace_back( new PARAM<bool>( "netlist.delete_extra_footprints",
503
504 m_params.emplace_back( new PARAM<bool>( "netlist.associate_by_ref_sch",
506
507 /*
508 * place_file.output_directory is only used at run-time; actual data is in project file
509 *
510 * m_params.emplace_back( new PARAM<wxString>( "place_file.output_directory",
511 * &m_PlaceFile.output_directory, wxEmptyString ) );
512 */
513
514 m_params.emplace_back( new PARAM<int>( "place_file.units",
515 &m_PlaceFile.units, 1 ) );
516
517 m_params.emplace_back( new PARAM<int>( "place_file.file_options",
519
520 m_params.emplace_back( new PARAM<int>( "place_file.file_format",
521 &m_PlaceFile.file_format, 0 ) );
522
523 m_params.emplace_back( new PARAM<bool>( "place_file.excludeTH",
524 &m_PlaceFile.exclude_TH, false ) );
525
526 m_params.emplace_back( new PARAM<bool>( "place_file.onlySMD",
527 &m_PlaceFile.only_SMD, false ) );
528
529 m_params.emplace_back( new PARAM<bool>( "place_file.include_board_edge",
531
532 m_params.emplace_back( new PARAM<bool>( "place_file.use_place_file_origin",
533 &m_PlaceFile.use_aux_origin, true ) );
534
535 m_params.emplace_back( new PARAM<bool>( "place_file.negate_xcoord",
536 &m_PlaceFile.negate_xcoord, false ) );
537
538 m_params.emplace_back( new PARAM<int>( "plot.all_layers_on_one_page",
540
541 m_params.emplace_back( new PARAM<bool>( "plot.edgecut_on_all_layers",
542 &m_Plot.edgecut_on_all_layers, true ) );
543
544 m_params.emplace_back( new PARAM<int>( "plot.pads_drill_mode",
545 &m_Plot.pads_drill_mode, 2 ) );
546
547 m_params.emplace_back( new PARAM<double>( "plot.fine_scale_x",
548 &m_Plot.fine_scale_x, 0 ) );
549
550 m_params.emplace_back( new PARAM<double>( "plot.fine_scale_y",
551 &m_Plot.fine_scale_y, 0 ) );
552
553 m_params.emplace_back( new PARAM<double>( "plot.ps_fine_width_adjust",
555
556 m_params.emplace_back( new PARAM<bool>( "plot.check_zones_before_plotting",
558
559 m_params.emplace_back( new PARAM<bool>( "plot.mirror",
560 &m_Plot.mirror, false ) );
561
562 m_params.emplace_back( new PARAM<bool>( "plot.as_item_checkboxes",
563 &m_Plot.as_item_checkboxes, false ) );
564
565 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
566 &m_FootprintTextShownColumns, "0 1 2 3 4 5 7" ) );
567
568 m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.width",
570
571 m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.height",
573
574 m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_sort_on_modules",
576 m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_remove_front_prefix",
578 m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_remove_back_prefix",
580 m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_exclude_locked",
581 &m_Reannotate.exclude_locked, false ) );
582
583 m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_grid_index",
584 &m_Reannotate.grid_index, 0 ) );
585 m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_sort_code",
586 &m_Reannotate.sort_code, 0 ) );
587 m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_choice",
589 m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_report_severity",
591
592 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_front_refdes_start",
594 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_back_refdes_start",
596 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_front_prefix",
597 &m_Reannotate.front_prefix, "" ) );
598 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_back_prefix",
599 &m_Reannotate.back_prefix, "" ) );
600 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_exclude_list",
601 &m_Reannotate.exclude_list, "" ) );
602 m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_report_file_name",
604
605 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "action_plugins",
606 [&]() -> nlohmann::json
607 {
608 nlohmann::json js = nlohmann::json::array();
609
610 for( const auto& pair : m_VisibleActionPlugins )
611 js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
612
613 return js;
614 },
615 [&]( const nlohmann::json& aObj )
616 {
618
619 if( !aObj.is_array() )
620 {
621 return;
622 }
623
624 for( const auto& entry : aObj )
625 {
626 if( entry.empty() || !entry.is_object() )
627 continue;
628
629 for( const auto& pair : entry.items() )
630 {
631 m_VisibleActionPlugins.emplace_back( std::make_pair(
632 wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
633 }
634 }
635 },
636 nlohmann::json::array() ) );
637
638 addParamsForWindow( &m_FootprintViewer, "footprint_viewer" );
639
640 m_params.emplace_back( new PARAM<double>( "footprint_viewer.zoom",
641 &m_FootprintViewerZoom, 1.0 ) );
642
643 m_params.emplace_back( new PARAM<bool>( "footprint_viewer.autozoom",
645
646 m_params.emplace_back( new PARAM<int>( "footprint_viewer.lib_list_width",
648
649 m_params.emplace_back( new PARAM<int>( "footprint_viewer.fp_list_width",
651
652 addParamsForWindow( &m_FootprintWizard, "footprint_wizard" );
653
654 m_params.emplace_back( new PARAM<wxString>( "system.last_footprint_lib_dir",
655 &m_lastFootprintLibDir, "" ) );
656
657 m_params.emplace_back( new PARAM<wxString>( "system.last_footprint3d_dir",
658 &m_lastFootprint3dDir, "" ) );
659
660 registerMigration( 0, 1,
661 [&]()
662 {
663 if( std::optional<int> optval = Get<int>( "pcb_display.rotation_angle" ) )
664 Set( "editing.rotation_angle", *optval );
665
666 try
667 {
668 At( "pcb_display" ).erase( "rotation_angle" );
669 }
670 catch( ... )
671 {}
672
673 return true;
674 } );
675
676 registerMigration( 1, 2,
677 [&]()
678 {
679 // In version 1 this meant "after Zone Properties dialog", but it now means
680 // "everywhere" so we knock it off on transition.
681 Set( "editing.auto_fill_zones", false );
682
683 return true;
684 } );
685
686
687 registerMigration( 2, 3,
688 [&]() -> bool
689 {
690 // We used to have a bug on GTK which would set the lib tree column width way
691 // too narrow.
692 if( std::optional<int> optval = Get<int>( "lib_tree.column_width" ) )
693 {
694 if( optval < 150 )
695 Set( "lib_tree.column_width", 300 );
696 }
697
698 return true;
699 } );
700
701 registerMigration( 3, 4,
702 [&]() -> bool
703 {
704 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
705 return migrateLibTreeWidth();
706 } );
707
708 registerMigration( 4, 5,
709 [&]() -> bool
710 {
711 // This default proved to be unpopular; bump it off for everyone
712 Set( "editing.auto_fill_zones", false );
713 return true;
714 } );
715}
716
717
719
720
721bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
722{
723 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
724
725 const std::string f = getLegacyFrameName();
726
727 //
728 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
729 //
730 ret &= fromLegacy<bool>( aCfg, "ShowLayerManagerTools", "aui.show_layer_manager" );
731
732 ret &= fromLegacy<int>( aCfg, "FootprintChooserHSashPosition", "footprint_chooser.sash_h" );
733 ret &= fromLegacy<int>( aCfg, "FootprintChooserVSashPosition", "footprint_chooser.sash_v" );
734 ret &= fromLegacy<int>( aCfg, "FootprintChooserWidth", "footprint_chooser.width" );
735 ret &= fromLegacy<int>( aCfg, "FootprintChooserHeight", "footprint_chooser.height" );
736
737 ret &= fromLegacy<bool>( aCfg, "FlipLeftRight", "editing.flip_left_right" );
738 ret &= fromLegacy<bool>( aCfg, "MagneticGraphics", "editing.magnetic_graphics" );
739 ret &= fromLegacy<int>( aCfg, "MagneticPads", "editing.magnetic_pads" );
740 ret &= fromLegacy<int>( aCfg, "MagneticTracks", "editing.magnetic_tracks" );
741 ret &= fromLegacy<bool>( aCfg, "DisplayPolarCoords", "editing.polar_coords" );
742 ret &= fromLegacy<bool>( aCfg, "Use45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
743
744 ret &= fromLegacy<bool>( aCfg, "PcbAffT", "pcb_display.graphic_items_fill" );
745 ret &= fromLegacy<int>( aCfg, "MaxLnkS", "pcb_display.max_links_shown" );
746 ret &= fromLegacy<bool>( aCfg, "ModAffC", "pcb_display.footprint_edge_fill" );
747 ret &= fromLegacy<bool>( aCfg, "ModAffT", "pcb_display.footprint_text_fill" );
748 ret &= fromLegacy<int>( aCfg, "ShowNetNamesMode", "pcb_display.net_names_mode" );
749 ret &= fromLegacy<int>( aCfg, "PcbDisplayOrigin", "pcb_display.origin_mode" );
750 ret &= fromLegacy<bool>( aCfg, "PcbInvertXAxis", "pcb_display.origin_invert_x_axis" );
751 ret &= fromLegacy<bool>( aCfg, "PcbInvertYAxis", "pcb_display.origin_invert_y_axis" );
752 ret &= fromLegacy<bool>( aCfg, "PadAffG", "pcb_display.pad_clearance" );
753 ret &= fromLegacy<bool>( aCfg, "PadFill", "pcb_display.pad_fill" );
754 ret &= fromLegacy<bool>( aCfg, "PadSNum", "pcb_display.pad_numbers" );
755 ret &= fromLegacy<bool>( aCfg, "ShowRatsnestLines", "pcb_display.ratsnest_global" );
756 ret &= fromLegacy<bool>( aCfg, "ShowRatsnestModuleLines", "pcb_display.ratsnest_footprint" );
757 ret &= fromLegacy<bool>( aCfg, "CurvedRatsnestLines", "pcb_display.ratsnest_curved" );
758 ret &= fromLegacy<int>( aCfg, "RotationAngle", "pcb_display.rotation_angle" );
759 ret &= fromLegacy<int>( aCfg, "TrackDisplayClearance", "pcb_display.track_clearance_mode" );
760 ret &= fromLegacy<bool>( aCfg, "DisplayTrackFilled", "pcb_display.track_fill" );
761 ret &= fromLegacy<bool>( aCfg, "ViaFill", "pcb_display.via_fill" );
762 ret &= fromLegacy<int>( aCfg, "PcbShowZonesMode", "pcb_display.zone_mode" );
763
764 ret &= fromLegacy<double>( aCfg, "PlotLineWidth_mm", "plot.line_width" );
765
766 aCfg->SetPath( "/dialogs/cleanup_tracks" );
767 ret &= fromLegacy<bool>( aCfg, "DialogCleanupVias", "cleanup.cleanup_vias" );
768 ret &= fromLegacy<bool>( aCfg, "DialogCleanupMergeSegments", "cleanup.merge_segments" );
769 ret &= fromLegacy<bool>( aCfg, "DialogCleanupUnconnected", "cleanup.cleanup_unconnected" );
770 ret &= fromLegacy<bool>( aCfg, "DialogCleanupShortCircuit", "cleanup.cleanup_short_circuits" );
771 ret &= fromLegacy<bool>( aCfg, "DialogCleanupTracksInPads", "cleanup.cleanup_tracks_in_pad" );
772 aCfg->SetPath( "../.." );
773
774 ret &= fromLegacy<bool>( aCfg, "RefillZonesBeforeDrc", "drc_dialog.refill_zones" );
775 ret &= fromLegacy<bool>( aCfg, "DrcTestFootprints", "drc_dialog.test_footprints" );
776
777 ret &= fromLegacy<bool>( aCfg, "DrillMergePTHNPTH", "gen_drill.merge_pth_npth" );
778 ret &= fromLegacy<bool>( aCfg, "DrillMinHeader", "gen_drill.minimal_header" );
779 ret &= fromLegacy<bool>( aCfg, "DrillMirrorYOpt", "gen_drill.mirror" );
780 ret &= fromLegacy<bool>( aCfg, "DrillUnit", "gen_drill.unit_drill_is_inch" );
781 ret &= fromLegacy<bool>( aCfg, "OvalHolesRouteMode", "gen_drill.use_route_for_oval_holes" );
782 ret &= fromLegacy<int>( aCfg, "DrillFileType", "gen_drill.drill_file_type" );
783 ret &= fromLegacy<int>( aCfg, "DrillMapFileType", "gen_drill.map_file_type" );
784 ret &= fromLegacy<int>( aCfg, "DrillZerosFormat", "gen_drill.zeros_format" );
785
786 ret &= fromLegacy<bool>( aCfg, "IDFRefAutoAdj", "export_idf.auto_adjust" );
787 ret &= fromLegacy<int>( aCfg, "IDFRefUnits", "export_idf.ref_units" );
788 ret &= fromLegacy<double>( aCfg, "IDFRefX", "export_idf.ref_x" );
789 ret &= fromLegacy<double>( aCfg, "IDFRefY", "export_idf.ref_y" );
790 ret &= fromLegacy<bool>( aCfg, "IDFExportThou", "export_idf.units_mils" );
791
792 ret &= fromLegacy<int>( aCfg, "STEP_Origin_Opt", "export_step.origin_mode" );
793 ret &= fromLegacy<int>( aCfg, "STEP_UserOriginUnits", "export_step.origin_units" );
794 ret &= fromLegacy<double>( aCfg, "STEP_UserOriginX", "export_step.origin_x" );
795 ret &= fromLegacy<double>( aCfg, "STEP_UserOriginY", "export_step.origin_y" );
796 ret &= fromLegacy<bool>( aCfg, "STEP_NoVirtual", "export_step.no_virtual" );
797
798 ret &= fromLegacy<bool>( aCfg, "PlotSVGModeColor", "export_svg.black_and_white" );
799 ret &= fromLegacy<bool>( aCfg, "PlotSVGModeMirror", "export_svg.mirror" );
800 ret &= fromLegacy<bool>( aCfg, "PlotSVGModeOneFile", "export_svg.one_file" );
801 ret &= fromLegacy<bool>( aCfg, "PlotSVGBrdEdge", "export_svg.plot_board_edges" );
802 ret &= fromLegacy<int>( aCfg, "PlotSVGPageOpt", "export_svg.page_size" );
803 ret &= fromLegacyString( aCfg, "PlotSVGDirectory", "export_svg.output_dir" );
804
805 {
806 nlohmann::json js = nlohmann::json::array();
807 wxString key;
808 bool val = false;
809
810 for( unsigned i = 0; i < PCB_LAYER_ID_COUNT; ++i )
811 {
812 key.Printf( wxT( "PlotSVGLayer_%d" ), i );
813
814 if( aCfg->Read( key, &val ) && val )
815 js.push_back( i );
816 }
817
818 Set( "export_svg.layers", js );
819 }
820
821 {
822 nlohmann::json js = nlohmann::json::array();
823
824 wxString packed;
825
826 if( aCfg->Read( "ActionPluginButtons", &packed ) )
827 {
828 wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed, ";" );
829
830 while( pluginSettingsTokenizer.HasMoreTokens() )
831 {
832 nlohmann::json row;
833 wxString plugin = pluginSettingsTokenizer.GetNextToken();
834 wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" );
835
836 if( pluginTokenizer.CountTokens() != 2 )
837 {
838 // Bad config
839 continue;
840 }
841
842 std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
843 bool value( pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 );
844
845 js.push_back( nlohmann::json( { { key, value } } ) );
846 }
847 }
848
849 Set( "action_plugins", js );
850 }
851
852 //
853 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
854 //
855 ret &= fromLegacy<int>( aCfg, "VrmlExportUnit", "export_vrml.units" );
856 ret &= fromLegacy<bool>( aCfg, "VrmlExportCopyFiles", "export_vrml.copy_3d_models" );
857 ret &= fromLegacy<bool>( aCfg, "VrmlUseRelativePaths", "export_vrml.use_relative_paths" );
858 ret &= fromLegacy<int>( aCfg, "VrmlRefUnits", "export_vrml.ref_units" );
859 ret &= fromLegacy<double>( aCfg, "VrmlRefX", "export_vrml.ref_x" );
860 ret &= fromLegacy<double>( aCfg, "VrmlRefY", "export_vrml.ref_y" );
861 ret &= fromLegacy<int> ( aCfg, "VrmlOriginMode", "export_vrml.origin_mode" );
862
863 ret &= fromLegacy<int>( aCfg, "Zone_Ouline_Hatch_Opt", "zones.hatching_style" );
864 ret &= fromLegacy<int>( aCfg, "Zone_NetSort_Opt", "zones.net_sort_mode" );
865 ret &= fromLegacy<double>( aCfg, "Zone_Clearance", "zones.clearance" );
866 ret &= fromLegacy<double>( aCfg, "Zone_Thickness", "zones.min_thickness" );
867 ret &= fromLegacy<double>( aCfg, "Zone_TH_Gap", "zones.thermal_relief_gap" );
868 ret &= fromLegacy<double>( aCfg, "Zone_TH_Copper_Width", "zones.thermal_relief_copper_width" );
869
870 aCfg->SetPath( "ImportGraphics" );
871 ret &= fromLegacy<int>( aCfg, "BoardLayer", "import_graphics.layer" );
872 ret &= fromLegacy<bool>( aCfg, "InteractivePlacement", "import_graphics.interactive_placement" );
873 ret &= fromLegacyString( aCfg, "LastFile", "import_graphics.last_file" );
874 ret &= fromLegacy<double>( aCfg, "LineWidth", "import_graphics.line_width" );
875 ret &= fromLegacy<int>( aCfg, "LineWidthUnits", "import_graphics.line_width_units" );
876 ret &= fromLegacy<int>( aCfg, "PositionUnits", "import_graphics.origin_units" );
877 ret &= fromLegacy<double>( aCfg, "PositionX", "import_graphics.origin_x" );
878 ret &= fromLegacy<double>( aCfg, "PositionY", "import_graphics.origin_y" );
879 aCfg->SetPath( ".." );
880
881 ret &= fromLegacy<int>( aCfg, "NetlistReportFilterMsg", "netlist.report_filter" );
882 ret &= fromLegacy<bool>( aCfg, "NetlistUpdateFootprints", "netlist.update_footprints" );
883 ret &= fromLegacy<bool>( aCfg, "NetlistDeleteShortingTracks", "netlist.delete_shorting_tracks" );
884 ret &= fromLegacy<bool>( aCfg, "NetlistDeleteExtraFootprints", "netlist.delete_extra_footprints" );
885
886 ret &= fromLegacy<int>( aCfg, "PlaceFileUnits", "place_file.units" );
887 ret &= fromLegacy<int>( aCfg, "PlaceFileOpts", "place_file.file_options" );
888 ret &= fromLegacy<int>( aCfg, "PlaceFileFormat", "place_file.file_format" );
889 ret &= fromLegacy<bool>( aCfg, "PlaceFileIncludeBrdEdge", "place_file.include_board_edge" );
890
891 ret &= fromLegacy<int>( aCfg, "PrintSinglePage", "plot.all_layers_on_one_page" );
892 ret &= fromLegacy<int>( aCfg, "PrintPadsDrillOpt", "plot.pads_drill_mode" );
893 ret &= fromLegacy<double>( aCfg, "PlotXFineScaleAdj", "plot.fine_scale_x" );
894 ret &= fromLegacy<double>( aCfg, "PlotYFineScaleAdj", "plot.fine_scale_y" );
895 ret &= fromLegacy<double>( aCfg, "PSPlotFineWidthAdj", "plot.ps_fine_width_adjust" );
896 ret &= fromLegacy<bool>( aCfg, "CheckZonesBeforePlotting", "plot.check_zones_before_plotting" );
897
898 ret &= fromLegacyString( aCfg, "FootprintTextShownColumns", "window.footprint_text_shown_columns" );
899
900 ret &= fromLegacy<int>( aCfg, "FpWizardListWidth", "footprint_wizard_list.width" );
901 ret &= fromLegacy<int>( aCfg, "FpWizardListHeight", "footprint_wizard_list.height" );
902
903 migrateWindowConfig( aCfg, "ModViewFrame", "footprint_viewer" );
904
905 ret &= fromLegacy<bool>( aCfg, "ModViewFrameAutoZoom", "footprint_viewer.auto_zoom" );
906 ret &= fromLegacy<double>( aCfg, "ModViewFrameZoom", "footprint_viewer.zoom" );
907
908 migrateWindowConfig( aCfg, "FootprintWizard", "footprint_wizard" );
909 ret &= fromLegacyString( aCfg, "Fpwizard_auiPerspective", "footprint_wizard.perspective" );
910
911
912 const std::string p = "pcbnew.InteractiveRouter.";
913
914 Set( "tools.pns.meta", nlohmann::json( {
915 { "filename", "pns" },
916 { "version", 0 }
917 } ) );
918
919 ret &= fromLegacy<int>( aCfg, p + "Mode", "tools.pns.mode" );
920 ret &= fromLegacy<int>( aCfg, p + "OptimizerEffort", "tools.pns.effort" );
921 ret &= fromLegacy<bool>( aCfg, p + "RemoveLoops", "tools.pns.remove_loops" );
922 ret &= fromLegacy<bool>( aCfg, p + "SmartPads", "tools.pns.smart_pads" );
923 ret &= fromLegacy<bool>( aCfg, p + "ShoveVias", "tools.pns.shove_vias" );
924 ret &= fromLegacy<bool>( aCfg, p + "StartDiagonal", "tools.pns.start_diagonal" );
925 ret &= fromLegacy<int>( aCfg, p + "ShoveTimeLimit", "tools.pns.shove_time_limit" );
926 ret &= fromLegacy<int>( aCfg, p + "ShoveIterationLimit", "tools.pns.shove_iteration_limit" );
927 ret &= fromLegacy<int>( aCfg, p + "WalkaroundIterationLimit", "tools.pns.walkaround_iteration_limit" );
928 ret &= fromLegacy<bool>( aCfg, p + "JumpOverObstacles", "tools.pns.jump_over_obstacles" );
929 ret &= fromLegacy<bool>( aCfg, p + "SmoothDraggedSegments", "tools.pns.smooth_dragged_segments" );
930 ret &= fromLegacy<bool>( aCfg, p + "CanViolateDRC", "tools.pns.can_violate_drc" );
931 ret &= fromLegacy<bool>( aCfg, p + "SuggestFinish", "tools.pns.suggest_finish" );
932 ret &= fromLegacy<bool>( aCfg, p + "FreeAngleMode", "tools.pns.free_angle_mode" );
933 ret &= fromLegacy<bool>( aCfg, p + "InlineDragEnabled", "editing.track_drag_action" );
934
935 // Initialize some new PNS settings to legacy behaviors if coming from legacy
936 Set( "tools.pns.fix_all_segments", false );
937
938 // Migrate color settings that were stored in the pcbnew config file
939
942
943 auto migrateLegacyColor =
944 [&] ( const std::string& aKey, int aLayerId )
945 {
946 wxString str;
947
948 if( aCfg->Read( aKey, &str ) )
949 cs->SetColor( aLayerId, COLOR4D( str ) );
950 };
951
952 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
953 {
954 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
955 migrateLegacyColor( "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
956 }
957
958 migrateLegacyColor( "Color4DAnchorEx", LAYER_ANCHOR );
959 migrateLegacyColor( "Color4DAuxItems", LAYER_AUX_ITEMS );
960 migrateLegacyColor( "Color4DGrid", LAYER_GRID );
961 migrateLegacyColor( "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
962 migrateLegacyColor( "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
963 migrateLegacyColor( "Color4DPCBCursor", LAYER_CURSOR );
964 migrateLegacyColor( "Color4DRatsEx", LAYER_RATSNEST );
965 migrateLegacyColor( "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
966 migrateLegacyColor( "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
967 migrateLegacyColor( "Color4DViaThruEx", LAYER_VIA_THROUGH );
968 migrateLegacyColor( "Color4DWorksheet", LAYER_DRAWINGSHEET );
969 migrateLegacyColor( "Color4DGrid", LAYER_PAGE_LIMITS );
970
971 mgr.SaveColorSettings( cs, "board" );
972
973 Set( "appearance.color_theme", cs->GetFilename() );
974
975 double x = 0, y = 0;
976
977 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
978 {
979 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
980 static_cast<long>( EDA_UNITS::INCHES ) ) );
981
982 // Convert to internal units
985
986 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
987 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
988 }
989
990 // Footprint editor settings were stored in pcbnew config file. Migrate them here.
992 fpedit->MigrateFromLegacy( aCfg );
993 fpedit->Load();
994
995 // Same with 3D viewer
996 EDA_3D_VIEWER_SETTINGS* viewer3d = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
997 viewer3d->MigrateFromLegacy( aCfg );
998 viewer3d->Load();
999
1000 return ret;
1001}
1002
1003//namespace py = pybind11;
1004//
1005//PYBIND11_MODULE( pcbnew, m )
1006//{
1007// py::class_<PCBNEW_SETTINGS>( m, "settings" )
1008// .def_readwrite( "Use45DegreeGraphicSegments", &PCBNEW_SETTINGS::m_Use45DegreeGraphicSegments )
1009// .def_readwrite( "FlipLeftRight", &PCBNEW_SETTINGS::m_FlipDirection )
1010// .def_readwrite( "AddUnlockedPads", &PCBNEW_SETTINGS::m_AddUnlockedPads)
1011// .def_readwrite( "UsePolarCoords", &PCBNEW_SETTINGS::m_PolarCoords)
1012// .def_readwrite( "RotationAngle", &PCBNEW_SETTINGS::m_RotationAngle)
1013// .def_readwrite( "ShowPageLimits", &PCBNEW_SETTINGS::m_ShowPageLimits)
1014// ;
1015//}
ARC_EDIT_MODE
Settings for arc editing.
Definition: app_settings.h:52
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrates legacy window settings into the JSON document.
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath)
Adds parameters for the given window object.
bool migrateLibTreeWidth()
Migrates the library tree width setting from a single column (Item) to multi-column.
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetColor(int aLayer, const COLOR4D &aColor)
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
int AsTenthsOfADegree() const
Definition: eda_angle.h:115
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
nlohmann::json & At(const std::string &aPath)
Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these function...
wxString GetFilename() const
Definition: json_settings.h:80
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:193
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:295
DIALOG_EXPORT_2581 m_Export2581
double m_FootprintViewerZoom
The last zoom level used (0 for auto)
DISPLAY_OPTIONS m_Display
DIALOG_NETLIST m_NetlistDialog
DIALOG_CLEANUP m_Cleanup
EDA_ANGLE m_RotationAngle
DIALOG_PLACE_FILE m_PlaceFile
bool m_FootprintViewerAutoZoomOnSelect
true to use automatic zoom on fp selection
DIALOG_FOOTPRINT_WIZARD_LIST m_FootprintWizardList
ARC_EDIT_MODE m_ArcEditMode
FOOTPRINT_CHOOSER m_FootprintChooser
virtual ~PCBNEW_SETTINGS()
DIALOG_EXPORT_VRML m_ExportVrml
DIALOG_EXPORT_IDF m_ExportIdf
TRACK_DRAG_ACTION m_TrackDragAction
LOCKING_OPTIONS m_LockingOptions
wxString m_lastFootprintLibDir
virtual std::string getLegacyFrameName() const override
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
DIALOG_PLOT m_Plot
WINDOW_SETTINGS m_FootprintWizard
ACTION_PLUGIN_SETTINGS_LIST m_VisibleActionPlugins
DIALOG_IMPORT_GRAPHICS m_ImportGraphics
DIALOG_DRC m_DrcDialog
AUI_PANELS m_AuiPanels
DIALOG_EXPORT_STEP m_ExportStep
WINDOW_SETTINGS m_FootprintViewer
wxString m_lastFootprint3dDir
bool m_ShowCourtyardCollisions
DIALOG_GENERATE_DRILL m_GenDrill
MAGNETIC_SETTINGS m_MagneticItems
FLIP_DIRECTION m_FlipDirection
DIALOG_REANNOTATE m_Reannotate
int m_FootprintViewerFPListWidth
DIALOG_EXPORT_SVG m_ExportSvg
wxString m_FootprintTextShownColumns
int m_FootprintViewerLibListWidth
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
T * GetAppSettings(const wxString &aFilename)
Returns a handle to the a given settings by type If the settings have already been loaded,...
COLOR_SETTINGS * GetMigratedColorSettings()
Returns a color theme for storing colors migrated from legacy (5.x and earlier) settings,...
The common library.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
@ TENTHS_OF_A_DEGREE_T
Definition: eda_angle.h:30
static constexpr EDA_ANGLE ANGLE_360
Definition: eda_angle.h:407
EDA_UNITS
Definition: eda_units.h:46
@ LAYER_GRID
Definition: layer_ids.h:206
@ LAYER_PAGE_LIMITS
color for drawing the page extents (visibility stored in PCBNEW_SETTINGS::m_ShowPageLimits)
Definition: layer_ids.h:253
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:198
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:218
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:221
@ LAYER_CURSOR
PCB cursor.
Definition: layer_ids.h:222
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:223
@ LAYER_RATSNEST
Definition: layer_ids.h:205
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:202
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:195
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:197
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:196
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ Dwgs_User
Definition: layer_ids.h:107
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:135
FLIP_DIRECTION
Definition: mirror.h:27
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
Definition: eda_units.cpp:510
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:300
const int pcbnewSchemaVersion
! Update the schema version whenever a migration is required
@ SHOW_WITH_VIA_WHILE_ROUTING
TRACK_DRAG_ACTION
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
MAGNETIC_OPTIONS tracks
MAGNETIC_OPTIONS pads
TRACK_CLEARANCE_MODE m_TrackClearance
Functions to provide common constants and other functions to assist in making a consistent UI.