KiCad PCB EDA Suite
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-2021 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 <pcbnew_settings.h>
30 #include <pgm_base.h>
34 #include <settings/parameters.h>
36 #include <wx/config.h>
37 #include <wx/tokenzr.h>
38 #include <zones.h>
39 #include <widgets/ui_common.h>
40 #include <base_units.h>
41 
42 #include "../3d-viewer/3d_viewer/eda_3d_viewer_settings.h"
43 
44 
46 const int pcbnewSchemaVersion = 1;
47 
48 
51  m_AuiPanels(),
52  m_Cleanup(),
53  m_DrcDialog(),
54  m_ExportIdf(),
55  m_ExportStep(),
56  m_ExportSvg(),
57  m_ExportVrml(),
58  m_FootprintWizardList(),
59  m_GenDrill(),
60  m_ImportGraphics(),
61  m_NetlistDialog(),
62  m_PlaceFile(),
63  m_Plot(),
64  m_FootprintChooser(),
65  m_Zones(),
66  m_FootprintViewer(),
67  m_FootprintWizard(),
68  m_Display(),
69  m_TrackDragAction( TRACK_DRAG_ACTION::DRAG ),
70  m_PcbUse45DegreeLimit( false ),
71  m_FpeditUse45DegreeLimit( false ),
72  m_FlipLeftRight( false ),
73  m_PolarCoords( false ),
74  m_RotationAngle( 900 ),
75  m_ShowPageLimits( true ),
76  m_AutoRefillZones( true ),
77  m_AllowFreePads( false ),
78  m_PnsSettings( nullptr ),
79  m_FootprintViewerZoom( 1.0 )
80 {
83  m_MagneticItems.graphics = false;
84 
85  m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
87 
88  m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
90 
91  m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
92  &m_AuiPanels.appearance_panel_tab, 0, 0, 2 ) );
93 
94  m_params.emplace_back( new PARAM<int>( "footprint_chooser.width",
95  &m_FootprintChooser.width, -1 ) );
96 
97  m_params.emplace_back( new PARAM<int>( "footprint_chooser.height",
98  &m_FootprintChooser.height, -1 ) );
99 
100  m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_h",
101  &m_FootprintChooser.sash_h, -1 ) );
102 
103  m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_v",
104  &m_FootprintChooser.sash_v, -1 ) );
105 
106  m_params.emplace_back( new PARAM<bool>( "editing.flip_left_right",
107  &m_FlipLeftRight, true ) );
108 
109  m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
110  &m_MagneticItems.graphics, true ) );
111 
112  m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
113  reinterpret_cast<int*>( &m_MagneticItems.pads ),
114  static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
115 
116  m_params.emplace_back( new PARAM<int>( "editing.magnetic_tracks",
117  reinterpret_cast<int*>( &m_MagneticItems.tracks ),
118  static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
119 
120  m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
121  &m_PolarCoords, false ) );
122 
123  m_params.emplace_back( new PARAM<int>( "editing.track_drag_action",
124  reinterpret_cast<int*>( &m_TrackDragAction ),
125  static_cast<int>( TRACK_DRAG_ACTION::DRAG ) ) );
126 
127  m_params.emplace_back( new PARAM<bool>( "editing.pcb_use_45_degree_limit",
128  &m_PcbUse45DegreeLimit, false ) );
129 
130  m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
131  &m_FpeditUse45DegreeLimit, false ) );
132 
133  m_params.emplace_back( new PARAM<bool>( "editing.auto_fill_zones",
134  &m_AutoRefillZones, true ) );
135 
136  m_params.emplace_back( new PARAM<bool>( "editing.allow_free_pads",
137  &m_AllowFreePads, false ) );
138 
139  m_params.emplace_back( new PARAM<int>( "editing.rotation_angle",
140  &m_RotationAngle, 900, 1, 900 ) );
141 
142  m_params.emplace_back( new PARAM<bool>( "pcb_display.graphic_items_fill",
143  &m_Display.m_DisplayGraphicsFill, true ) );
144 
145  m_params.emplace_back( new PARAM<int>( "pcb_display.max_links_shown",
146  &m_Display.m_MaxLinksShowed, 3, 0, 15 ) );
147 
148  m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
149  &m_Display.m_DisplayGraphicsFill, true ) );
150 
151  m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
152  &m_Display.m_DisplayTextFill, true ) );
153 
154  m_params.emplace_back( new PARAM<int>( "pcb_display.net_names_mode",
155  &m_Display.m_DisplayNetNamesMode, 3, 0, 3 ) );
156 
157  m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_clearance",
158  &m_Display.m_DisplayPadClearance, true ) );
159 
160  m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_no_connects",
162 
163  m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
164  &m_Display.m_DisplayPadFill, true ) );
165 
166  m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
167  &m_Display.m_DisplayPadNum, true ) );
168 
169  m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_global",
170  &m_Display.m_ShowGlobalRatsnest, true ) );
171 
172  m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_footprint",
173  &m_Display.m_ShowModuleRatsnest, true ) );
174 
175  m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_curved",
177 
178  m_params.emplace_back( new PARAM<int>( "pcb_display.track_clearance_mode",
179  reinterpret_cast<int*>( &m_Display.m_ShowTrackClearanceMode ),
181 
182  m_params.emplace_back( new PARAM<bool>( "pcb_display.track_fill",
183  &m_Display.m_DisplayPcbTrackFill, true ) );
184 
185  m_params.emplace_back( new PARAM<bool>( "pcb_display.via_fill",
186  &m_Display.m_DisplayViaFill, true ) );
187 
188  m_params.emplace_back( new PARAM_ENUM<ZONE_DISPLAY_MODE>( "pcb_display.zone_mode",
191 
192  m_params.emplace_back( new PARAM<int>( "pcb_display.origin_mode",
193  reinterpret_cast<int*>( &m_Display.m_DisplayOrigin ),
195 
196  m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_x_axis",
197  &m_Display.m_DisplayInvertXAxis, false ) );
198 
199  m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_y_axis",
200  &m_Display.m_DisplayInvertYAxis, false ) );
201 
202  m_params.emplace_back( new PARAM<bool>( "pcb_display.live_3d_refresh",
203  &m_Display.m_Live3DRefresh, false ) );
204 
205  m_params.emplace_back( new PARAM<bool>( "pcb_display.show_page_borders",
206  &m_ShowPageLimits, true ) );
207 
208  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_vias",
209  &m_Cleanup.cleanup_vias, true ) );
210 
211  m_params.emplace_back( new PARAM<bool>( "cleanup.delete_dangling_vias",
212  &m_Cleanup.delete_dangling_vias, true ) );
213 
214  m_params.emplace_back( new PARAM<bool>( "cleanup.merge_segments",
215  &m_Cleanup.merge_segments, true ) );
216 
217  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_unconnected",
218  &m_Cleanup.cleanup_unconnected, true ) );
219 
220  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_short_circuits",
222 
223  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_tracks_in_pad",
224  &m_Cleanup.cleanup_tracks_in_pad, false ) );
225 
226  m_params.emplace_back( new PARAM<bool>( "drc_dialog.refill_zones",
227  &m_DrcDialog.refill_zones, true ) );
228 
229  m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_all_track_errors",
231 
232  m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_footprints",
233  &m_DrcDialog.test_footprints, false ) );
234 
235  m_params.emplace_back( new PARAM<int>( "drc_dialog.severities",
237 
238  m_params.emplace_back( new PARAM<bool>( "gen_drill.merge_pth_npth",
239  &m_GenDrill.merge_pth_npth, false ) );
240 
241  m_params.emplace_back( new PARAM<bool>( "gen_drill.minimal_header",
242  &m_GenDrill.minimal_header, false ) );
243 
244  m_params.emplace_back( new PARAM<bool>( "gen_drill.mirror",
245  &m_GenDrill.mirror, false ) );
246 
247  m_params.emplace_back( new PARAM<bool>( "gen_drill.unit_drill_is_inch",
248  &m_GenDrill.unit_drill_is_inch, true ) );
249 
250  m_params.emplace_back( new PARAM<bool>( "gen_drill.use_route_for_oval_holes",
252 
253  m_params.emplace_back( new PARAM<int>( "gen_drill.drill_file_type",
254  &m_GenDrill.drill_file_type, 0 ) );
255 
256  m_params.emplace_back( new PARAM<int>( "gen_drill.map_file_type",
257  &m_GenDrill.map_file_type, 1 ) );
258 
259  m_params.emplace_back( new PARAM<int>( "gen_drill.zeros_format",
260  &m_GenDrill.zeros_format, 0, 0, 3 ) );
261 
262  m_params.emplace_back( new PARAM<bool>( "export_idf.auto_adjust",
263  &m_ExportIdf.auto_adjust, false ) );
264 
265  m_params.emplace_back( new PARAM<int>( "export_idf.ref_units",
266  &m_ExportIdf.ref_units, 0 ) );
267 
268  m_params.emplace_back( new PARAM<double>( "export_idf.ref_x",
269  &m_ExportIdf.ref_x, 0 ) );
270 
271  m_params.emplace_back( new PARAM<double>( "export_idf.ref_y",
272  &m_ExportIdf.ref_y, 0 ) );
273 
274  m_params.emplace_back( new PARAM<bool>( "export_idf.units_mils",
275  &m_ExportIdf.units_mils, false ) );
276 
277  m_params.emplace_back( new PARAM<int>( "export_step.origin_mode",
278  &m_ExportStep.origin_mode, 0 ) );
279 
280  m_params.emplace_back( new PARAM<int>( "export_step.origin_units",
281  &m_ExportStep.origin_units, 0 ) );
282 
283  m_params.emplace_back( new PARAM<double>( "export_step.origin_x",
284  &m_ExportStep.origin_x, 0 ) );
285 
286  m_params.emplace_back( new PARAM<double>( "export_step.origin_y",
287  &m_ExportStep.origin_y, 0 ) );
288 
289  m_params.emplace_back( new PARAM<bool>( "export_step.no_virtual",
290  &m_ExportStep.no_virtual, false ) );
291 
292  m_params.emplace_back( new PARAM<bool>( "export_step.replace_models",
293  &m_ExportStep.replace_models, false ) );
294 
295  m_params.emplace_back( new PARAM<bool>( "export_step.overwrite_file",
296  &m_ExportStep.overwrite_file, true ) );
297 
298  m_params.emplace_back( new PARAM<bool>( "export_svg.black_and_white",
299  &m_ExportSvg.black_and_white, false ) );
300 
301  m_params.emplace_back( new PARAM<bool>( "export_svg.mirror",
302  &m_ExportSvg.mirror, false ) );
303 
304  m_params.emplace_back( new PARAM<bool>( "export_svg.one_file",
305  &m_ExportSvg.one_file, false ) );
306 
307  m_params.emplace_back(new PARAM<bool>( "export_svg.plot_board_edges",
308  &m_ExportSvg.plot_board_edges, true ) );
309 
310  m_params.emplace_back( new PARAM<int>( "export_svg.page_size",
311  &m_ExportSvg.page_size, 0 ) );
312 
313  m_params.emplace_back( new PARAM<wxString>( "export_svg.output_dir",
314  &m_ExportSvg.output_dir, "" ) );
315 
316  m_params.emplace_back( new PARAM_LIST<int>( "export_svg.layers",
317  &m_ExportSvg.layers, {} ) );
318 
319  m_params.emplace_back( new PARAM<int>( "export_vrml.units",
320  &m_ExportVrml.units, 1 ) );
321 
322  m_params.emplace_back( new PARAM<bool>( "export_vrml.copy_3d_models",
323  &m_ExportVrml.copy_3d_models, false ) );
324 
325  m_params.emplace_back( new PARAM<bool>( "export_vrml.use_relative_paths",
326  &m_ExportVrml.use_relative_paths, false ) );
327 
328  m_params.emplace_back( new PARAM<int>( "export_vrml.ref_units",
329  &m_ExportVrml.ref_units, 0 ) );
330 
331  m_params.emplace_back( new PARAM<double>( "export_vrml.ref_x",
332  &m_ExportVrml.ref_x, 0 ) );
333 
334  m_params.emplace_back( new PARAM<double>( "export_vrml.ref_y",
335  &m_ExportVrml.ref_y, 0 ) );
336 
337  m_params.emplace_back( new PARAM<int>( "export_vrml.origin_mode",
338  &m_ExportVrml.origin_mode, 0 ) );
339 
340  m_params.emplace_back( new PARAM<int>( "zones.hatching_style",
341  &m_Zones.hatching_style, 0 ) );
342 
343  m_params.emplace_back( new PARAM<int>( "zones.net_sort_mode",
344  &m_Zones.net_sort_mode, -1 ) );
345 
346  m_params.emplace_back( new PARAM<double>( "zones.clearance",
348 
349  m_params.emplace_back( new PARAM<double>( "zones.min_thickness",
351 
352  m_params.emplace_back( new PARAM<double>( "zones.thermal_relief_gap",
354 
355  m_params.emplace_back( new PARAM<double>( "zones.thermal_relief_copper_width",
357 
358  m_params.emplace_back( new PARAM<int>( "import_graphics.layer",
360 
361  m_params.emplace_back( new PARAM<bool>( "import_graphics.interactive_placement",
363 
364  m_params.emplace_back( new PARAM<int>( "import_graphics.line_width_units",
366 
367  m_params.emplace_back( new PARAM<double>( "import_graphics.line_width",
368  &m_ImportGraphics.line_width, 0.2 ) );
369 
370  m_params.emplace_back( new PARAM<int>( "import_graphics.origin_units",
372 
373  m_params.emplace_back( new PARAM<double>( "import_graphics.origin_x",
374  &m_ImportGraphics.origin_x, 0 ) );
375 
376  m_params.emplace_back( new PARAM<double>( "import_graphics.origin_y",
377  &m_ImportGraphics.origin_y, 0 ) );
378 
379  m_params.emplace_back( new PARAM<int>( "import_graphics.dxf_units",
380  &m_ImportGraphics.dxf_units, 0 ) );
381 
382  m_params.emplace_back( new PARAM<int>( "netlist.report_filter",
384 
385  m_params.emplace_back( new PARAM<bool>( "netlist.update_footprints",
387 
388  m_params.emplace_back( new PARAM<bool>( "netlist.delete_shorting_tracks",
390 
391  m_params.emplace_back( new PARAM<bool>( "netlist.delete_extra_footprints",
393 
394  m_params.emplace_back( new PARAM<bool>( "netlist.associate_by_ref_sch",
396 
397  m_params.emplace_back(new PARAM<int>( "place_file.units",
398  &m_PlaceFile.units, 1 ) );
399 
400  m_params.emplace_back( new PARAM<int>( "place_file.file_options",
401  &m_PlaceFile.file_options, 0 ) );
402 
403  m_params.emplace_back( new PARAM<int>( "place_file.file_format",
404  &m_PlaceFile.file_format, 0 ) );
405 
406  m_params.emplace_back( new PARAM<bool>( "place_file.include_board_edge",
407  &m_PlaceFile.include_board_edge, false ) );
408 
409  m_params.emplace_back( new PARAM<bool>( "place_file.use_place_file_origin",
410  &m_PlaceFile.use_aux_origin, true ) );
411 
412  m_params.emplace_back( new PARAM<int>( "plot.all_layers_on_one_page",
414 
415  m_params.emplace_back( new PARAM<int>( "plot.pads_drill_mode",
416  &m_Plot.pads_drill_mode, 2 ) );
417 
418  m_params.emplace_back( new PARAM<double>( "plot.fine_scale_x",
419  &m_Plot.fine_scale_x, 0 ) );
420 
421  m_params.emplace_back( new PARAM<double>( "plot.fine_scale_y",
422  &m_Plot.fine_scale_y, 0 ) );
423 
424  m_params.emplace_back( new PARAM<double>( "plot.ps_fine_width_adjust",
426 
427  m_params.emplace_back( new PARAM<bool>( "plot.check_zones_before_plotting",
429 
430  m_params.emplace_back( new PARAM<bool>( "plot.mirror",
431  &m_Plot.mirror, false ) );
432 
433  m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
434  &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
435 
436  m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.width",
437  &m_FootprintWizardList.width, -1 ) );
438 
439  m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.height",
440  &m_FootprintWizardList.height, -1 ) );
441 
442  m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_sort_on_modules",
444  m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_remove_front_prefix",
445  &m_Reannotate.remove_front_prefix, false ) );
446  m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_remove_back_prefix",
447  &m_Reannotate.remove_back_prefix, false ) );
448  m_params.emplace_back( new PARAM<bool>( "reannotate_dialog.annotate_exclude_locked",
449  &m_Reannotate.exclude_locked, false ) );
450 
451  m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_grid_index",
452  &m_Reannotate.grid_index, 0 ) );
453  m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_sort_code",
454  &m_Reannotate.sort_code, 0 ) );
455  m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_choice",
457  m_params.emplace_back( new PARAM<int>( "reannotate_dialog.annotate_report_severity",
459 
460  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_front_refdes_start",
462  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_back_refdes_start",
464  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_front_prefix",
465  &m_Reannotate.front_prefix, "" ) );
466  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_back_prefix",
467  &m_Reannotate.back_prefix, "" ) );
468  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_exclude_list",
469  &m_Reannotate.exclude_list, "" ) );
470  m_params.emplace_back( new PARAM<wxString>( "reannotate_dialog.annotate_report_file_name",
472 
473  m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "action_plugins",
474  [&]() -> nlohmann::json
475  {
476  nlohmann::json js = nlohmann::json::array();
477 
478  for( const auto& pair : m_VisibleActionPlugins )
479  js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
480 
481  return js;
482  },
483  [&]( const nlohmann::json& aObj )
484  {
485  m_VisibleActionPlugins.clear();
486 
487  if( !aObj.is_array() )
488  {
489  return;
490  }
491 
492  for( const auto& entry : aObj )
493  {
494  if( entry.empty() || !entry.is_object() )
495  continue;
496 
497  for( const auto& pair : entry.items() )
498  {
499  m_VisibleActionPlugins.emplace_back( std::make_pair(
500  wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
501  }
502  }
503  },
504  nlohmann::json::array() ) );
505 
506  addParamsForWindow( &m_FootprintViewer, "footprint_viewer" );
507 
508  m_params.emplace_back( new PARAM<double>( "footprint_viewer.zoom",
509  &m_FootprintViewerZoom, 1.0 ) );
510 
511  addParamsForWindow( &m_FootprintWizard, "footprint_wizard" );
512 
513  m_params.emplace_back( new PARAM<wxString>( "system.last_footprint_lib_dir",
514  &m_lastFootprintLibDir, "" ) );
515 
516  m_params.emplace_back( new PARAM<wxString>( "system.last_footprint3d_dir",
517  &m_lastFootprint3dDir, "" ) );
518 
519  registerMigration( 0, 1,
520  [&]()
521  {
522  if( OPT<int> optval = Get<int>( "pcb_display.rotation_angle" ) )
523  Set( "editing.rotation_angle", optval.get() );
524 
525  try
526  {
527  At( "pcb_display" ).erase( "rotation_angle" );
528  }
529  catch( ... )
530  {}
531 
532  return true;
533  } );
534 
535 }
536 
537 
539 
540 
541 bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
542 {
543  bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
544 
545  const std::string f = getLegacyFrameName();
546 
547  //
548  // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
549  //
550  ret &= fromLegacy<bool>( aCfg, "ShowLayerManagerTools", "aui.show_layer_manager" );
551 
552  ret &= fromLegacy<int>( aCfg, "FootprintChooserHSashPosition", "footprint_chooser.sash_h" );
553  ret &= fromLegacy<int>( aCfg, "FootprintChooserVSashPosition", "footprint_chooser.sash_v" );
554  ret &= fromLegacy<int>( aCfg, "FootprintChooserWidth", "footprint_chooser.width" );
555  ret &= fromLegacy<int>( aCfg, "FootprintChooserHeight", "footprint_chooser.height" );
556 
557  ret &= fromLegacy<bool>( aCfg, "FlipLeftRight", "editing.flip_left_right" );
558  ret &= fromLegacy<bool>( aCfg, "MagneticGraphics", "editing.magnetic_graphics" );
559  ret &= fromLegacy<int>( aCfg, "MagneticPads", "editing.magnetic_pads" );
560  ret &= fromLegacy<int>( aCfg, "MagneticTracks", "editing.magnetic_tracks" );
561  ret &= fromLegacy<bool>( aCfg, "DisplayPolarCoords", "editing.polar_coords" );
562  ret &= fromLegacy<bool>( aCfg, "Use45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
563 
564  ret &= fromLegacy<bool>( aCfg, "PcbAffT", "pcb_display.graphic_items_fill" );
565  ret &= fromLegacy<int>( aCfg, "MaxLnkS", "pcb_display.max_links_shown" );
566  ret &= fromLegacy<bool>( aCfg, "ModAffC", "pcb_display.footprint_edge_fill" );
567  ret &= fromLegacy<bool>( aCfg, "ModAffT", "pcb_display.footprint_text_fill" );
568  ret &= fromLegacy<int>( aCfg, "ShowNetNamesMode", "pcb_display.net_names_mode" );
569  ret &= fromLegacy<int>( aCfg, "PcbDisplayOrigin", "pcb_display.origin_mode" );
570  ret &= fromLegacy<bool>( aCfg, "PcbInvertXAxis", "pcb_display.origin_invert_x_axis" );
571  ret &= fromLegacy<bool>( aCfg, "PcbInvertYAxis", "pcb_display.origin_invert_y_axis" );
572  ret &= fromLegacy<bool>( aCfg, "PadAffG", "pcb_display.pad_clearance" );
573  ret &= fromLegacy<bool>( aCfg, "PadFill", "pcb_display.pad_fill" );
574  ret &= fromLegacy<bool>( aCfg, "PadSNum", "pcb_display.pad_numbers" );
575  ret &= fromLegacy<bool>( aCfg, "ShowRatsnestLines", "pcb_display.ratsnest_global" );
576  ret &= fromLegacy<bool>( aCfg, "ShowRatsnestModuleLines", "pcb_display.ratsnest_footprint" );
577  ret &= fromLegacy<bool>( aCfg, "CurvedRatsnestLines", "pcb_display.ratsnest_curved" );
578  ret &= fromLegacy<int>( aCfg, "RotationAngle", "pcb_display.rotation_angle" );
579  ret &= fromLegacy<int>( aCfg, "TrackDisplayClearance", "pcb_display.track_clearance_mode" );
580  ret &= fromLegacy<bool>( aCfg, "DisplayTrackFilled", "pcb_display.track_fill" );
581  ret &= fromLegacy<bool>( aCfg, "ViaFill", "pcb_display.via_fill" );
582  ret &= fromLegacy<int>( aCfg, "PcbShowZonesMode", "pcb_display.zone_mode" );
583 
584  ret &= fromLegacy<double>( aCfg, "PlotLineWidth_mm", "plot.line_width" );
585 
586  aCfg->SetPath( "/dialogs/cleanup_tracks" );
587  ret &= fromLegacy<bool>( aCfg, "DialogCleanupVias", "cleanup.cleanup_vias" );
588  ret &= fromLegacy<bool>( aCfg, "DialogCleanupMergeSegments", "cleanup.merge_segments" );
589  ret &= fromLegacy<bool>( aCfg, "DialogCleanupUnconnected", "cleanup.cleanup_unconnected" );
590  ret &= fromLegacy<bool>( aCfg, "DialogCleanupShortCircuit", "cleanup.cleanup_short_circuits" );
591  ret &= fromLegacy<bool>( aCfg, "DialogCleanupTracksInPads", "cleanup.cleanup_tracks_in_pad" );
592  aCfg->SetPath( "../.." );
593 
594  ret &= fromLegacy<bool>( aCfg, "RefillZonesBeforeDrc", "drc_dialog.refill_zones" );
595  ret &= fromLegacy<bool>( aCfg, "DrcTestFootprints", "drc_dialog.test_footprints" );
596 
597  ret &= fromLegacy<bool>( aCfg, "DrillMergePTHNPTH", "gen_drill.merge_pth_npth" );
598  ret &= fromLegacy<bool>( aCfg, "DrillMinHeader", "gen_drill.minimal_header" );
599  ret &= fromLegacy<bool>( aCfg, "DrillMirrorYOpt", "gen_drill.mirror" );
600  ret &= fromLegacy<bool>( aCfg, "DrillUnit", "gen_drill.unit_drill_is_inch" );
601  ret &= fromLegacy<bool>( aCfg, "OvalHolesRouteMode", "gen_drill.use_route_for_oval_holes" );
602  ret &= fromLegacy<int>( aCfg, "DrillFileType", "gen_drill.drill_file_type" );
603  ret &= fromLegacy<int>( aCfg, "DrillMapFileType", "gen_drill.map_file_type" );
604  ret &= fromLegacy<int>( aCfg, "DrillZerosFormat", "gen_drill.zeros_format" );
605 
606  ret &= fromLegacy<bool>( aCfg, "IDFRefAutoAdj", "export_idf.auto_adjust" );
607  ret &= fromLegacy<int>( aCfg, "IDFRefUnits", "export_idf.ref_units" );
608  ret &= fromLegacy<double>( aCfg, "IDFRefX", "export_idf.ref_x" );
609  ret &= fromLegacy<double>( aCfg, "IDFRefY", "export_idf.ref_y" );
610  ret &= fromLegacy<bool>( aCfg, "IDFExportThou", "export_idf.units_mils" );
611 
612  ret &= fromLegacy<int>( aCfg, "STEP_Origin_Opt", "export_step.origin_mode" );
613  ret &= fromLegacy<int>( aCfg, "STEP_UserOriginUnits", "export_step.origin_units" );
614  ret &= fromLegacy<double>( aCfg, "STEP_UserOriginX", "export_step.origin_x" );
615  ret &= fromLegacy<double>( aCfg, "STEP_UserOriginY", "export_step.origin_y" );
616  ret &= fromLegacy<bool>( aCfg, "STEP_NoVirtual", "export_step.no_virtual" );
617 
618  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeColor", "export_svg.black_and_white" );
619  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeMirror", "export_svg.mirror" );
620  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeOneFile", "export_svg.one_file" );
621  ret &= fromLegacy<bool>( aCfg, "PlotSVGBrdEdge", "export_svg.plot_board_edges" );
622  ret &= fromLegacy<int>( aCfg, "PlotSVGPageOpt", "export_svg.page_size" );
623  ret &= fromLegacyString( aCfg, "PlotSVGDirectory", "export_svg.output_dir" );
624 
625  {
626  nlohmann::json js = nlohmann::json::array();
627  wxString key;
628  bool val = false;
629 
630  for( unsigned i = 0; i < PCB_LAYER_ID_COUNT; ++i )
631  {
632  key.Printf( wxT( "PlotSVGLayer_%d" ), i );
633 
634  if( aCfg->Read( key, &val ) && val )
635  js.push_back( i );
636  }
637 
638  Set( "export_svg.layers", js );
639  }
640 
641  {
642  nlohmann::json js = nlohmann::json::array();
643 
644  wxString packed;
645 
646  if( aCfg->Read( "ActionPluginButtons", &packed ) )
647  {
648  wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed, ";" );
649 
650  while( pluginSettingsTokenizer.HasMoreTokens() )
651  {
652  nlohmann::json row;
653  wxString plugin = pluginSettingsTokenizer.GetNextToken();
654  wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" );
655 
656  if( pluginTokenizer.CountTokens() != 2 )
657  {
658  // Bad config
659  continue;
660  }
661 
662  std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
663  bool value( pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 );
664 
665  js.push_back( nlohmann::json( { { key, value } } ) );
666  }
667  }
668 
669  Set( "action_plugins", js );
670  }
671 
672  //
673  // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
674  //
675  ret &= fromLegacy<int>( aCfg, "VrmlExportUnit", "export_vrml.units" );
676  ret &= fromLegacy<bool>( aCfg, "VrmlExportCopyFiles", "export_vrml.copy_3d_models" );
677  ret &= fromLegacy<bool>( aCfg, "VrmlUseRelativePaths", "export_vrml.use_relative_paths" );
678  ret &= fromLegacy<int>( aCfg, "VrmlRefUnits", "export_vrml.ref_units" );
679  ret &= fromLegacy<double>( aCfg, "VrmlRefX", "export_vrml.ref_x" );
680  ret &= fromLegacy<double>( aCfg, "VrmlRefY", "export_vrml.ref_y" );
681  ret &= fromLegacy<int> ( aCfg, "VrmlOriginMode", "export_vrml.origin_mode" );
682 
683  ret &= fromLegacy<int>( aCfg, "Zone_Ouline_Hatch_Opt", "zones.hatching_style" );
684  ret &= fromLegacy<int>( aCfg, "Zone_NetSort_Opt", "zones.net_sort_mode" );
685  ret &= fromLegacy<double>( aCfg, "Zone_Clearance", "zones.clearance" );
686  ret &= fromLegacy<double>( aCfg, "Zone_Thickness", "zones.min_thickness" );
687  ret &= fromLegacy<double>( aCfg, "Zone_TH_Gap", "zones.thermal_relief_gap" );
688  ret &= fromLegacy<double>( aCfg, "Zone_TH_Copper_Width", "zones.thermal_relief_copper_width" );
689 
690  aCfg->SetPath( "ImportGraphics" );
691  ret &= fromLegacy<int>( aCfg, "BoardLayer", "import_graphics.layer" );
692  ret &= fromLegacy<bool>( aCfg, "InteractivePlacement", "import_graphics.interactive_placement" );
693  ret &= fromLegacyString( aCfg, "LastFile", "import_graphics.last_file" );
694  ret &= fromLegacy<double>( aCfg, "LineWidth", "import_graphics.line_width" );
695  ret &= fromLegacy<int>( aCfg, "LineWidthUnits", "import_graphics.line_width_units" );
696  ret &= fromLegacy<int>( aCfg, "PositionUnits", "import_graphics.origin_units" );
697  ret &= fromLegacy<double>( aCfg, "PositionX", "import_graphics.origin_x" );
698  ret &= fromLegacy<double>( aCfg, "PositionY", "import_graphics.origin_y" );
699  aCfg->SetPath( ".." );
700 
701  ret &= fromLegacy<int>( aCfg, "NetlistReportFilterMsg", "netlist.report_filter" );
702  ret &= fromLegacy<bool>( aCfg, "NetlistUpdateFootprints", "netlist.update_footprints" );
703  ret &= fromLegacy<bool>( aCfg, "NetlistDeleteShortingTracks", "netlist.delete_shorting_tracks" );
704  ret &= fromLegacy<bool>( aCfg, "NetlistDeleteExtraFootprints", "netlist.delete_extra_footprints" );
705 
706  ret &= fromLegacy<int>( aCfg, "PlaceFileUnits", "place_file.units" );
707  ret &= fromLegacy<int>( aCfg, "PlaceFileOpts", "place_file.file_options" );
708  ret &= fromLegacy<int>( aCfg, "PlaceFileFormat", "place_file.file_format" );
709  ret &= fromLegacy<bool>( aCfg, "PlaceFileIncludeBrdEdge", "place_file.include_board_edge" );
710 
711  ret &= fromLegacy<int>( aCfg, "PrintSinglePage", "plot.all_layers_on_one_page" );
712  ret &= fromLegacy<int>( aCfg, "PrintPadsDrillOpt", "plot.pads_drill_mode" );
713  ret &= fromLegacy<double>( aCfg, "PlotXFineScaleAdj", "plot.fine_scale_x" );
714  ret &= fromLegacy<double>( aCfg, "PlotYFineScaleAdj", "plot.fine_scale_y" );
715  ret &= fromLegacy<double>( aCfg, "PSPlotFineWidthAdj", "plot.ps_fine_width_adjust" );
716  ret &= fromLegacy<bool>( aCfg, "CheckZonesBeforePlotting", "plot.check_zones_before_plotting" );
717 
718  ret &= fromLegacyString( aCfg, "FootprintTextShownColumns", "window.footprint_text_shown_columns" );
719 
720  ret &= fromLegacy<int>( aCfg, "FpWizardListWidth", "footprint_wizard_list.width" );
721  ret &= fromLegacy<int>( aCfg, "FpWizardListHeight", "footprint_wizard_list.height" );
722 
723  migrateWindowConfig( aCfg, "ModViewFrame", "footprint_viewer" );
724 
725  ret &= fromLegacy<bool>( aCfg, "ModViewFrameAutoZoom", "footprint_viewer.auto_zoom" );
726  ret &= fromLegacy<double>( aCfg, "ModViewFrameZoom", "footprint_viewer.zoom" );
727 
728  migrateWindowConfig( aCfg, "FootprintWizard", "footprint_wizard" );
729  ret &= fromLegacyString( aCfg, "Fpwizard_auiPerspective", "footprint_wizard.perspective" );
730 
731 
732  const std::string p = "pcbnew.InteractiveRouter.";
733 
734  Set( "tools.pns.meta", nlohmann::json( {
735  { "filename", "pns" },
736  { "version", 0 }
737  } ) );
738 
739  ret &= fromLegacy<int>( aCfg, p + "Mode", "tools.pns.mode" );
740  ret &= fromLegacy<int>( aCfg, p + "OptimizerEffort", "tools.pns.effort" );
741  ret &= fromLegacy<bool>( aCfg, p + "RemoveLoops", "tools.pns.remove_loops" );
742  ret &= fromLegacy<bool>( aCfg, p + "SmartPads", "tools.pns.smart_pads" );
743  ret &= fromLegacy<bool>( aCfg, p + "ShoveVias", "tools.pns.shove_vias" );
744  ret &= fromLegacy<bool>( aCfg, p + "StartDiagonal", "tools.pns.start_diagonal" );
745  ret &= fromLegacy<int>( aCfg, p + "ShoveTimeLimit", "tools.pns.shove_time_limit" );
746  ret &= fromLegacy<int>( aCfg, p + "ShoveIterationLimit", "tools.pns.shove_iteration_limit" );
747  ret &= fromLegacy<int>( aCfg, p + "WalkaroundIterationLimit", "tools.pns.walkaround_iteration_limit" );
748  ret &= fromLegacy<bool>( aCfg, p + "JumpOverObstacles", "tools.pns.jump_over_obstacles" );
749  ret &= fromLegacy<bool>( aCfg, p + "SmoothDraggedSegments", "tools.pns.smooth_dragged_segments" );
750  ret &= fromLegacy<bool>( aCfg, p + "CanViolateDRC", "tools.pns.can_violate_drc" );
751  ret &= fromLegacy<bool>( aCfg, p + "SuggestFinish", "tools.pns.suggest_finish" );
752  ret &= fromLegacy<bool>( aCfg, p + "FreeAngleMode", "tools.pns.free_angle_mode" );
753  ret &= fromLegacy<bool>( aCfg, p + "InlineDragEnabled", "editing.track_drag_action" );
754 
755  // Initialize some new PNS settings to legacy behaviors if coming from legacy
756  Set( "tools.pns.fix_all_segments", false );
757 
758  // Migrate color settings that were stored in the pcbnew config file
759 
760  COLOR_SETTINGS* cs = Pgm().GetSettingsManager().GetMigratedColorSettings();
761 
762  auto migrateLegacyColor =
763  [&] ( const std::string& aKey, int aLayerId )
764  {
765  wxString str;
766 
767  if( aCfg->Read( aKey, &str ) )
768  cs->SetColor( aLayerId, COLOR4D( str ) );
769  };
770 
771  for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
772  {
773  wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
774  migrateLegacyColor( "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
775  }
776 
777  migrateLegacyColor( "Color4DAnchorEx", LAYER_ANCHOR );
778  migrateLegacyColor( "Color4DAuxItems", LAYER_AUX_ITEMS );
779  migrateLegacyColor( "Color4DGrid", LAYER_GRID );
780  migrateLegacyColor( "Color4DNoNetPadMarker", LAYER_NO_CONNECTS );
781  migrateLegacyColor( "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
782  migrateLegacyColor( "Color4DPadThruHoleEx", LAYER_PADS_TH );
783  migrateLegacyColor( "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
784  migrateLegacyColor( "Color4DPCBCursor", LAYER_CURSOR );
785  migrateLegacyColor( "Color4DRatsEx", LAYER_RATSNEST );
786  migrateLegacyColor( "Color4DTxtInvisEx", LAYER_MOD_TEXT_INVISIBLE );
787  migrateLegacyColor( "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
788  migrateLegacyColor( "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
789  migrateLegacyColor( "Color4DViaThruEx", LAYER_VIA_THROUGH );
790  migrateLegacyColor( "Color4DWorksheet", LAYER_DRAWINGSHEET );
791 
792  Pgm().GetSettingsManager().SaveColorSettings( cs, "board" );
793 
794  Set( "appearance.color_theme", cs->GetFilename() );
795 
796  double x, y;
797 
798  if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
799  {
800  EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
801  static_cast<long>( EDA_UNITS::INCHES ) ) );
802 
803  // Convert to internal units
804  x = From_User_Unit( u, x );
805  y = From_User_Unit( u, y );
806 
807  Set( "window.grid.user_grid_x", StringFromValue( u, x ) );
808  Set( "window.grid.user_grid_y", StringFromValue( u, y ) );
809  }
810 
811  // Footprint editor settings were stored in pcbnew config file. Migrate them here.
812  auto fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( false );
813  fpedit->MigrateFromLegacy( aCfg );
814  fpedit->Load();
815 
816  // Same with 3D viewer
817  auto viewer3d = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( false );
818  viewer3d->MigrateFromLegacy( aCfg );
819  viewer3d->Load();
820 
821  return ret;
822 }
823 
824 //namespace py = pybind11;
825 //
826 //PYBIND11_MODULE( pcbnew, m )
827 //{
828 // py::class_<PCBNEW_SETTINGS>( m, "settings" )
829 // .def_readwrite( "Use45DegreeGraphicSegments", &PCBNEW_SETTINGS::m_Use45DegreeGraphicSegments )
830 // .def_readwrite( "FlipLeftRight", &PCBNEW_SETTINGS::m_FlipLeftRight )
831 // .def_readwrite( "AddUnlockedPads", &PCBNEW_SETTINGS::m_AddUnlockedPads)
832 // .def_readwrite( "UsePolarCoords", &PCBNEW_SETTINGS::m_PolarCoords)
833 // .def_readwrite( "RotationAngle", &PCBNEW_SETTINGS::m_RotationAngle)
834 // .def_readwrite( "ShowPageLimits", &PCBNEW_SETTINGS::m_ShowPageLimits)
835 // ;
836 //}
DIALOG_GENERATE_DRILL m_GenDrill
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath)
Adds parameters for the given window object.
to draw micro vias
Definition: layer_ids.h:190
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:218
DIALOG_EXPORT_STEP m_ExportStep
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...
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
DIALOG_CLEANUP m_Cleanup
Implementation of conversion functions that require both schematic and board internal units.
PCB cursor.
Definition: layer_ids.h:217
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
DIALOG_EXPORT_IDF m_ExportIdf
wxString GetFilename() const
Definition: json_settings.h:72
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:197
void SetColor(int aLayer, const COLOR4D &aColor)
Stores an enum as an integer.
Definition: parameters.h:215
const int pcbnewSchemaVersion
! Update the schema version whenever a migration is required
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL
Definition: zones.h:30
double m_FootprintViewerZoom
The last zoom level used (0 for auto)
wxString m_FootprintTextShownColumns
DIALOG_EXPORT_VRML m_ExportVrml
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
nlohmann::json json
Definition: gerbview.cpp:41
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...
FOOTPRINT_CHOOSER m_FootprintChooser
TRACK_DRAG_ACTION
TRACE_CLEARANCE_DISPLAY_MODE_T m_ShowTrackClearanceMode
How trace clearances are displayed.
to draw usual through hole vias
Definition: layer_ids.h:192
DIALOG_FOOTPRINT_WIZARD_LIST m_FootprintWizardList
wxString m_lastFootprint3dDir
WINDOW_SETTINGS m_FootprintWizard
DIALOG_EXPORT_SVG m_ExportSvg
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:193
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:99
PCB_DISPLAY_ORIGIN_OPTIONS_T m_DisplayOrigin
Which origin is used for display transforms.
TRACK_DRAG_ACTION m_TrackDragAction
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:82
DIALOG_NETLIST m_NetlistDialog
text marked as invisible
Definition: layer_ids.h:196
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
Functions to provide common constants and other functions to assist in making a consistent UI.
#define ZONE_CLEARANCE_MIL
Definition: zones.h:33
drawingsheet frame and titleblock
Definition: layer_ids.h:213
WINDOW_SETTINGS m_FootprintViewer
#define ZONE_THICKNESS_MIL
Definition: zones.h:31
virtual std::string getLegacyFrameName() const override
show a marker on pads with no nets
Definition: layer_ids.h:203
EDA_UNITS
Definition: eda_units.h:38
DIALOG_PLACE_FILE m_PlaceFile
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
ACTION_PLUGIN_SETTINGS_LIST m_VisibleActionPlugins
see class PGM_BASE
virtual ~PCBNEW_SETTINGS()
multilayer pads, usually with holes
Definition: layer_ids.h:209
to draw blind/buried vias
Definition: layer_ids.h:191
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:65
bool m_Live3DRefresh
If true, 3D viewer will redraw on every modification operation.
MAGNETIC_OPTIONS pads
ZONE_DISPLAY_MODE m_ZoneDisplayMode
AUI_PANELS m_AuiPanels
The common library.
DIALOG_PLOT m_Plot
DIALOG_REANNOTATE m_Reannotate
boost::optional< T > OPT
Definition: optional.h:7
PCB background color.
Definition: layer_ids.h:216
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
wxString StringFromValue(EDA_UNITS aUnits, double aValue, bool aAddUnitSymbol, EDA_DATA_TYPE aType)
Convert a value to a string using double notation.
Definition: base_units.cpp:204
DIALOG_IMPORT_GRAPHICS m_ImportGraphics
Color settings are a bit different than most of the settings objects in that there can be more than o...
#define ZONE_THERMAL_RELIEF_GAP_MIL
Definition: zones.h:29
DIALOG_DRC m_DrcDialog
MAGNETIC_SETTINGS m_MagneticItems
wxString m_lastFootprintLibDir
PCB_DISPLAY_OPTIONS m_Display
double From_User_Unit(EDA_UNITS aUnits, double aValue)
Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".
Definition: base_units.cpp:282
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrates legacy window settings into the JSON document.
MAGNETIC_OPTIONS tracks
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103