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 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 <common.h>
27 #include <pcbnew_settings.h>
28 #include <pgm_base.h>
32 #include <settings/parameters.h>
34 #include <wx/config.h>
35 #include <wx/tokenzr.h>
36 #include <zones.h>
37 #include <widgets/ui_common.h>
38 
39 #include "../3d-viewer/3d_viewer/3d_viewer_settings.h"
40 
41 
43 const int pcbnewSchemaVersion = 0;
44 
45 
48  m_Use45DegreeGraphicSegments( false ),
49  m_FlipLeftRight( false ),
50  m_ShowPageLimits( true ),
51  m_PnsSettings( nullptr ),
52  m_FootprintViewerAutoZoom( false ),
53  m_FootprintViewerZoom( 1.0 )
54 {
57  m_MagneticItems.graphics = false;
58 
59  m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
61 
62  m_params.emplace_back( new PARAM<bool>( "aui.show_microwave_tools",
64 
65  m_params.emplace_back( new PARAM<int>( "footprint_chooser.width",
66  &m_FootprintChooser.width, -1 ) );
67 
68  m_params.emplace_back( new PARAM<int>( "footprint_chooser.height",
69  &m_FootprintChooser.height, -1 ) );
70 
71  m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_h",
72  &m_FootprintChooser.sash_h, -1 ) );
73 
74  m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_v",
75  &m_FootprintChooser.sash_v, -1 ) );
76 
77  m_params.emplace_back( new PARAM<int>( "grid.fast_grid_1", &m_FastGrid1, 0 ) );
78 
79  m_params.emplace_back( new PARAM<int>( "grid.fast_grid_2", &m_FastGrid2, 0 ) );
80 
81  m_params.emplace_back( new PARAM<bool>( "editing.flip_left_right", &m_FlipLeftRight, true ) );
82 
83  m_params.emplace_back(
84  new PARAM<bool>( "editing.magnetic_graphics", &m_MagneticItems.graphics, true ) );
85 
86  m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
87  reinterpret_cast<int*>( &m_MagneticItems.pads ),
88  static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
89 
90  m_params.emplace_back( new PARAM<int>( "editing.magnetic_tracks",
91  reinterpret_cast<int*>( &m_MagneticItems.tracks ),
92  static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
93 
94  m_params.emplace_back( new PARAM<bool>( "editing.polar_coords", &m_PolarCoords, false ) );
95 
96  m_params.emplace_back( new PARAM<bool>( "editing.use_45_degree_graphic_segments",
97  &m_Use45DegreeGraphicSegments, false ) );
98 
99  m_params.emplace_back( new PARAM<int>( "grid.user.units",
100  &m_UserGrid.units, static_cast<int>( EDA_UNITS::INCHES ) ) );
101 
102  m_params.emplace_back( new PARAM<double>( "grid.user.size_x", &m_UserGrid.size_x, 0.01 ) );
103 
104  m_params.emplace_back( new PARAM<double>( "grid.user.size_y", &m_UserGrid.size_y, 0.01 ) );
105 
106  m_params.emplace_back( new PARAM<bool>(
107  "pcb_display.graphic_items_fill", &m_Display.m_DisplayGraphicsFill, true ) );
108 
109  m_params.emplace_back( new PARAM<int>(
110  "pcb_display.max_links_shown", &m_Display.m_MaxLinksShowed, 3, 0, 15 ) );
111 
112  m_params.emplace_back( new PARAM<bool>(
113  "pcb_display.graphics_fill", &m_Display.m_DisplayGraphicsFill, true ) );
114 
115  m_params.emplace_back( new PARAM<bool>(
116  "pcb_display.text_fill", &m_Display.m_DisplayTextFill, true ) );
117 
118  m_params.emplace_back( new PARAM<int>(
119  "pcb_display.net_names_mode", &m_Display.m_DisplayNetNamesMode, 3, 0, 3 ) );
120 
121  m_params.emplace_back(
122  new PARAM<bool>( "pcb_display.pad_clearance", &m_Display.m_DisplayPadIsol, true ) );
123 
124  m_params.emplace_back(
125  new PARAM<bool>( "pcb_display.pad_fill", &m_Display.m_DisplayPadFill, true ) );
126 
127  m_params.emplace_back(
128  new PARAM<bool>( "pcb_display.pad_numbers", &m_Display.m_DisplayPadNum, true ) );
129 
130  m_params.emplace_back( new PARAM<bool>(
131  "pcb_display.ratsnest_global", &m_Display.m_ShowGlobalRatsnest, true ) );
132 
133  m_params.emplace_back( new PARAM<bool>(
134  "pcb_display.ratsnest_footprint", &m_Display.m_ShowModuleRatsnest, true ) );
135 
136  m_params.emplace_back( new PARAM<bool>(
137  "pcb_display.ratsnest_curved", &m_Display.m_DisplayRatsnestLinesCurved, false ) );
138 
139  m_params.emplace_back( new PARAM<int>(
140  "pcb_display.rotation_angle", &m_RotationAngle, 900, 1, 900 ) );
141 
142  m_params.emplace_back( new PARAM<int>( "pcb_display.track_clearance_mode",
143  reinterpret_cast<int*>( &m_Display.m_ShowTrackClearanceMode ),
145 
146  m_params.emplace_back(
147  new PARAM<bool>( "pcb_display.track_fill", &m_Display.m_DisplayPcbTrackFill, true ) );
148 
149  m_params.emplace_back(
150  new PARAM<bool>( "pcb_display.via_fill", &m_Display.m_DisplayViaFill, true ) );
151 
152  m_params.emplace_back(
153  new PARAM<int>( "pcb_display.zone_mode", &m_Display.m_DisplayZonesMode, 0, 0, 2 ) );
154 
155  m_params.emplace_back(
156  new PARAM<double>( "plot.line_width", &m_PlotLineWidth, 0.1, 0.01, 5.0 ) );
157 
158  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_vias",
159  &m_Cleanup.cleanup_vias, true ) );
160 
161  m_params.emplace_back( new PARAM<bool>( "cleanup.merge_segments",
162  &m_Cleanup.merge_segments, true ) );
163 
164  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_unconnected",
165  &m_Cleanup.cleanup_unconnected, true ) );
166 
167  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_short_circuits",
169 
170  m_params.emplace_back( new PARAM<bool>( "cleanup.cleanup_tracks_in_pad",
171  &m_Cleanup.cleanup_tracks_in_pad, true ) );
172 
173  m_params.emplace_back( new PARAM<bool>( "drc_dialog.refill_zones",
174  &m_DrcDialog.refill_zones, false ) );
175 
176  m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_track_to_zone",
177  &m_DrcDialog.test_track_to_zone, false ) );
178 
179  m_params.emplace_back( new PARAM<bool>( "drc_dialog.test_footprints",
180  &m_DrcDialog.test_footprints, false ) );
181 
182  m_params.emplace_back( new PARAM<int>( "drc_dialog.severities",
184 
185  m_params.emplace_back( new PARAM<bool>( "gen_drill.merge_pth_npth",
186  &m_GenDrill.merge_pth_npth, false ) );
187 
188  m_params.emplace_back( new PARAM<bool>( "gen_drill.minimal_header",
189  &m_GenDrill.minimal_header, false ) );
190 
191  m_params.emplace_back( new PARAM<bool>( "gen_drill.mirror", &m_GenDrill.mirror, false ) );
192 
193  m_params.emplace_back( new PARAM<bool>( "gen_drill.unit_drill_is_inch",
194  &m_GenDrill.unit_drill_is_inch, true ) );
195 
196  m_params.emplace_back( new PARAM<bool>( "gen_drill.use_route_for_oval_holes",
198 
199  m_params.emplace_back( new PARAM<int>(
200  "gen_drill.drill_file_type", &m_GenDrill.drill_file_type, 0 ) );
201 
202  m_params.emplace_back( new PARAM<int>(
203  "gen_drill.map_file_type", &m_GenDrill.map_file_type, 1 ) );
204 
205  m_params.emplace_back( new PARAM<int>(
206  "gen_drill.zeros_format", &m_GenDrill.zeros_format, 0, 0, 3 ) );
207 
208  m_params.emplace_back(
209  new PARAM<bool>( "export_idf.auto_adjust", &m_ExportIdf.auto_adjust, false ) );
210 
211  m_params.emplace_back( new PARAM<int>( "export_idf.ref_units", &m_ExportIdf.ref_units, 0 ) );
212 
213  m_params.emplace_back( new PARAM<double>( "export_idf.ref_x", &m_ExportIdf.ref_x, 0 ) );
214 
215  m_params.emplace_back( new PARAM<double>( "export_idf.ref_y", &m_ExportIdf.ref_y, 0 ) );
216 
217  m_params.emplace_back(
218  new PARAM<bool>( "export_idf.units_mils", &m_ExportIdf.units_mils, false ) );
219 
220  m_params.emplace_back(
221  new PARAM<int>( "export_step.origin_mode", &m_ExportStep.origin_mode, 0 ) );
222 
223  m_params.emplace_back(
224  new PARAM<int>( "export_step.origin_units", &m_ExportStep.origin_units, 0 ) );
225 
226  m_params.emplace_back( new PARAM<double>( "export_step.origin_x", &m_ExportStep.origin_x, 0 ) );
227 
228  m_params.emplace_back( new PARAM<double>( "export_step.origin_y", &m_ExportStep.origin_y, 0 ) );
229 
230  m_params.emplace_back(
231  new PARAM<bool>( "export_step.no_virtual", &m_ExportStep.no_virtual, false ) );
232 
233  m_params.emplace_back(
234  new PARAM<bool>( "export_svg.black_and_white", &m_ExportSvg.black_and_white, false ) );
235 
236  m_params.emplace_back(
237  new PARAM<bool>( "export_svg.mirror", &m_ExportSvg.mirror, false ) );
238 
239  m_params.emplace_back( new PARAM<bool>( "export_svg.one_file", &m_ExportSvg.one_file, false ) );
240 
241  m_params.emplace_back(new PARAM<bool>(
242  "export_svg.plot_board_edges", &m_ExportSvg.plot_board_edges, true ) );
243 
244  m_params.emplace_back( new PARAM<int>( "export_svg.page_size", &m_ExportSvg.page_size, 0 ) );
245 
246  m_params.emplace_back(
247  new PARAM<wxString>( "export_svg.output_dir", &m_ExportSvg.output_dir, "" ) );
248 
249  m_params.emplace_back( new PARAM_LIST<int>( "export_svg.layers", &m_ExportSvg.layers, {} ) );
250 
251  m_params.emplace_back( new PARAM<int>( "export_vrml.units", &m_ExportVrml.units, 1 ) );
252 
253  m_params.emplace_back( new PARAM<bool>(
254  "export_vrml.copy_3d_models", &m_ExportVrml.copy_3d_models, false ) );
255 
256  m_params.emplace_back( new PARAM<bool>(
257  "export_vrml.use_relative_paths", &m_ExportVrml.use_relative_paths, false ) );
258 
259  m_params.emplace_back( new PARAM<bool>(
260  "export_vrml.use_plain_pcb", &m_ExportVrml.use_plain_pcb, false ) );
261 
262  m_params.emplace_back( new PARAM<int>( "export_vrml.ref_units", &m_ExportVrml.ref_units, 0 ) );
263 
264  m_params.emplace_back( new PARAM<double>( "export_vrml.ref_x", &m_ExportVrml.ref_x, 0 ) );
265 
266  m_params.emplace_back( new PARAM<double>( "export_vrml.ref_y", &m_ExportVrml.ref_y, 0 ) );
267 
268  m_params.emplace_back( new PARAM<int>( "zones.hatching_style", &m_Zones.hatching_style, 0 ) );
269 
270  m_params.emplace_back( new PARAM<wxString>( "zones.net_filter", &m_Zones.net_filter, "" ) );
271 
272  m_params.emplace_back( new PARAM<int>( "zones.net_sort_mode", &m_Zones.net_sort_mode, 1 ) );
273 
274  m_params.emplace_back(
275  new PARAM<double>( "zones.clearance", &m_Zones.clearance, ZONE_CLEARANCE_MIL ) );
276 
277  m_params.emplace_back( new PARAM<double>( "zones.min_thickness",
279 
280  m_params.emplace_back( new PARAM<double>( "zones.thermal_relief_gap",
282 
283  m_params.emplace_back( new PARAM<double>( "zones.thermal_relief_copper_width",
285 
286  m_params.emplace_back(
287  new PARAM<int>( "import_graphics.layer", &m_ImportGraphics.layer, Dwgs_User ) );
288 
289  m_params.emplace_back( new PARAM<bool>( "import_graphics.interactive_placement",
291 
292  m_params.emplace_back( new PARAM<int>(
293  "import_graphics.line_width_units", &m_ImportGraphics.line_width_units, 0 ) );
294 
295  m_params.emplace_back(
296  new PARAM<double>( "import_graphics.line_width", &m_ImportGraphics.line_width, 0.2 ) );
297 
298  m_params.emplace_back(
299  new PARAM<int>( "import_graphics.origin_units", &m_ImportGraphics.origin_units, 0 ) );
300 
301  m_params.emplace_back(
302  new PARAM<double>( "import_graphics.origin_x", &m_ImportGraphics.origin_x, 0 ) );
303 
304  m_params.emplace_back(
305  new PARAM<double>( "import_graphics.origin_y", &m_ImportGraphics.origin_y, 0 ) );
306 
307  m_params.emplace_back(
308  new PARAM<int>( "netlist.report_filter", &m_NetlistDialog.report_filter, -1 ) );
309 
310  m_params.emplace_back( new PARAM<bool>(
311  "netlist.update_footprints", &m_NetlistDialog.update_footprints, true ) );
312 
313  m_params.emplace_back( new PARAM<bool>(
314  "netlist.delete_shorting_tracks", &m_NetlistDialog.delete_shorting_tracks, false ) );
315 
316  m_params.emplace_back( new PARAM<bool>(
317  "netlist.delete_extra_footprints", &m_NetlistDialog.delete_extra_footprints, false ) );
318 
319  m_params.emplace_back( new PARAM<bool>(
320  "netlist.delete_single_pad_nets", &m_NetlistDialog.delete_single_pad_nets, false ) );
321 
322  m_params.emplace_back( new PARAM<bool>(
323  "netlist.associate_by_ref_sch", &m_NetlistDialog.associate_by_ref_sch, false ) );
324 
325  m_params.emplace_back(new PARAM<int>( "place_file.units", &m_PlaceFile.units, 1 ) );
326 
327  m_params.emplace_back(
328  new PARAM<int>( "place_file.file_options", &m_PlaceFile.file_options, 0 ) );
329 
330  m_params.emplace_back(
331  new PARAM<int>( "place_file.file_format", &m_PlaceFile.file_format, 0 ) );
332 
333  m_params.emplace_back( new PARAM<bool>(
334  "place_file.include_board_edge", &m_PlaceFile.include_board_edge, false ) );
335 
336  m_params.emplace_back( new PARAM<int>( "plot.one_page_per_layer",
337  &m_Plot.one_page_per_layer, 1 ) );
338 
339  m_params.emplace_back(
340  new PARAM<int>( "plot.pads_drill_mode", &m_Plot.pads_drill_mode, 2 ) );
341 
342  m_params.emplace_back( new PARAM<double>( "plot.fine_scale_x", &m_Plot.fine_scale_x, 0 ) );
343 
344  m_params.emplace_back( new PARAM<double>( "plot.fine_scale_y", &m_Plot.fine_scale_y, 0 ) );
345 
346  m_params.emplace_back(
347  new PARAM<double>( "plot.ps_fine_width_adjust", &m_Plot.ps_fine_width_adjust, 0 ) );
348 
349  m_params.emplace_back( new PARAM<bool>( "plot.check_zones_before_plotting",
351 
352  m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
353  &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
354 
355  m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.width",
356  &m_FootprintWizardList.width, -1 ) );
357 
358  m_params.emplace_back( new PARAM<int>( "footprint_wizard_list.height",
359  &m_FootprintWizardList.height, -1 ) );
360 
361 #if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU)
362  m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "action_plugins",
363  [&]() -> nlohmann::json
364  {
365  nlohmann::json js = nlohmann::json::array();
366 
367  for( const auto& pair : m_VisibleActionPlugins )
368  js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
369 
370  return js;
371  },
372  [&]( const nlohmann::json& aObj )
373  {
374  m_VisibleActionPlugins.clear();
375 
376  if( !aObj.is_array() )
377  {
378  return;
379  }
380 
381  for( const auto& entry : aObj )
382  {
383  if( entry.empty() || !entry.is_object() )
384  continue;
385 
386  for( const auto& pair : entry.items() )
387  {
388  m_VisibleActionPlugins.emplace_back( std::make_pair(
389  wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
390  }
391  }
392  },
393  nlohmann::json::array() ) );
394 #endif
395 
396  addParamsForWindow( &m_FootprintViewer, "footprint_viewer" );
397 
398  m_params.emplace_back( new PARAM<bool>( "footprint_viewer.auto_zoom",
399  &m_FootprintViewerAutoZoom, false ) );
400 
401  m_params.emplace_back( new PARAM<double>( "footprint_viewer.zoom",
402  &m_FootprintViewerZoom, 1.0 ) );
403 
404  addParamsForWindow( &m_FootprintWizard, "footprint_wizard" );
405 }
406 
407 
409 
410 
411 bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
412 {
413  bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
414 
415  const std::string f = getLegacyFrameName();
416 
417  //
418  // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
419  //
420  ret &= fromLegacy<bool>( aCfg, "ShowLayerManagerTools", "aui.show_layer_manager" );
421  ret &= fromLegacy<bool>( aCfg, "ShowMicrowaveTools", "aui.show_microwave_tools" );
422 
423  ret &= fromLegacy<int>( aCfg, "FootprintChooserHSashPosition", "footprint_chooser.sash_h" );
424  ret &= fromLegacy<int>( aCfg, "FootprintChooserVSashPosition", "footprint_chooser.sash_v" );
425  ret &= fromLegacy<int>( aCfg, "FootprintChooserWidth", "footprint_chooser.width" );
426  ret &= fromLegacy<int>( aCfg, "FootprintChooserHeight", "footprint_chooser.height" );
427 
428  ret &= fromLegacy<int>( aCfg, f + "FastGrid1", "grid.fast_grid_1" );
429  ret &= fromLegacy<int>( aCfg, f + "FastGrid2", "grid.fast_grid_2" );
430 
431  ret &= fromLegacy<bool>( aCfg, "FlipLeftRight", "editing.flip_left_right" );
432  ret &= fromLegacy<bool>( aCfg, "MagneticGraphics", "editing.magnetic_graphics" );
433  ret &= fromLegacy<int>( aCfg, "MagneticPads", "editing.magnetic_pads" );
434  ret &= fromLegacy<int>( aCfg, "MagneticTracks", "editing.magnetic_tracks" );
435  ret &= fromLegacy<bool>( aCfg, "DisplayPolarCoords", "editing.polar_coords" );
436  ret &= fromLegacy<bool>( aCfg, "Use45DegreeGraphicSegments",
437  "editing.use_45_degree_graphic_segments" );
438 
439  ret &= fromLegacy<int>( aCfg, f + "PcbUserGrid_X", "grid.user.size_x" );
440  ret &= fromLegacy<int>( aCfg, f + "PcbUserGrid_Y", "grid.user.size_y" );
441  ret &= fromLegacy<int>( aCfg, f + "PcbUserGrid_Unit", "grid.user.units" );
442 
443  ret &= fromLegacy<bool>( aCfg, "PcbAffT", "pcb_display.graphic_items_fill" );
444  ret &= fromLegacy<int>( aCfg, "MaxLnkS", "pcb_display.max_links_shown" );
445  ret &= fromLegacy<bool>( aCfg, "ModAffC", "pcb_display.footprint_edge_fill" );
446  ret &= fromLegacy<bool>( aCfg, "ModAffT", "pcb_display.footprint_text_fill" );
447  ret &= fromLegacy<int>( aCfg, "ShowNetNamesMode", "pcb_display.net_names_mode" );
448  ret &= fromLegacy<bool>( aCfg, "PadAffG", "pcb_display.pad_clearance" );
449  ret &= fromLegacy<bool>( aCfg, "PadFill", "pcb_display.pad_fill" );
450  ret &= fromLegacy<bool>( aCfg, "PadSNum", "pcb_display.pad_numbers" );
451  ret &= fromLegacy<bool>( aCfg, "ShowRatsnestLines", "pcb_display.ratsnest_global" );
452  ret &= fromLegacy<bool>( aCfg, "ShowRatsnestModuleLines", "pcb_display.ratsnest_footprint" );
453  ret &= fromLegacy<bool>( aCfg, "CurvedRatsnestLines", "pcb_display.ratsnest_curved" );
454  ret &= fromLegacy<int>( aCfg, "RotationAngle", "pcb_display.rotation_angle" );
455  ret &= fromLegacy<int>( aCfg, "TrackDisplayClearance", "pcb_display.track_clearance_mode" );
456  ret &= fromLegacy<bool>( aCfg, "DisplayTrackFilled", "pcb_display.track_fill" );
457  ret &= fromLegacy<bool>( aCfg, "ViaFill", "pcb_display.via_fill" );
458  ret &= fromLegacy<int>( aCfg, "PcbShowZonesMode", "pcb_display.zone_mode" );
459 
460  ret &= fromLegacy<double>( aCfg, "PlotLineWidth_mm", "plot.line_width" );
461 
462  aCfg->SetPath( "/dialogs/cleanup_tracks" );
463  ret &= fromLegacy<bool>( aCfg, "DialogCleanupVias", "cleanup.cleanup_vias" );
464  ret &= fromLegacy<bool>( aCfg, "DialogCleanupMergeSegments", "cleanup.merge_segments" );
465  ret &= fromLegacy<bool>( aCfg, "DialogCleanupUnconnected", "cleanup.cleanup_unconnected" );
466  ret &= fromLegacy<bool>( aCfg, "DialogCleanupShortCircuit", "cleanup.cleanup_short_circuits" );
467  ret &= fromLegacy<bool>( aCfg, "DialogCleanupTracksInPads", "cleanup.cleanup_tracks_in_pad" );
468  aCfg->SetPath( "../.." );
469 
470  ret &= fromLegacy<bool>( aCfg, "RefillZonesBeforeDrc", "drc_dialog.refill_zones" );
471  ret &= fromLegacy<bool>( aCfg, "DrcTrackToZoneTest", "drc_dialog.test_track_to_zone" );
472  ret &= fromLegacy<bool>( aCfg, "DrcTestFootprints", "drc_dialog.test_footprints" );
473 
474  ret &= fromLegacy<bool>( aCfg, "DrillMergePTHNPTH", "gen_drill.merge_pth_npth" );
475  ret &= fromLegacy<bool>( aCfg, "DrillMinHeader", "gen_drill.minimal_header" );
476  ret &= fromLegacy<bool>( aCfg, "DrillMirrorYOpt", "gen_drill.mirror" );
477  ret &= fromLegacy<bool>( aCfg, "DrillUnit", "gen_drill.unit_drill_is_inch" );
478  ret &= fromLegacy<bool>( aCfg, "OvalHolesRouteMode", "gen_drill.use_route_for_oval_holes" );
479  ret &= fromLegacy<int>( aCfg, "DrillFileType", "gen_drill.drill_file_type" );
480  ret &= fromLegacy<int>( aCfg, "DrillMapFileType", "gen_drill.map_file_type" );
481  ret &= fromLegacy<int>( aCfg, "DrillZerosFormat", "gen_drill.zeros_format" );
482 
483  ret &= fromLegacy<bool>( aCfg, "IDFRefAutoAdj", "export_idf.auto_adjust" );
484  ret &= fromLegacy<int>( aCfg, "IDFRefUnits", "export_idf.ref_units" );
485  ret &= fromLegacy<double>( aCfg, "IDFRefX", "export_idf.ref_x" );
486  ret &= fromLegacy<double>( aCfg, "IDFRefY", "export_idf.ref_y" );
487  ret &= fromLegacy<bool>( aCfg, "IDFExportThou", "export_idf.units_mils" );
488 
489  ret &= fromLegacy<int>( aCfg, "STEP_Origin_Opt", "export_step.origin_mode" );
490  ret &= fromLegacy<int>( aCfg, "STEP_UserOriginUnits", "export_step.origin_units" );
491  ret &= fromLegacy<double>( aCfg, "STEP_UserOriginX", "export_step.origin_x" );
492  ret &= fromLegacy<double>( aCfg, "STEP_UserOriginY", "export_step.origin_y" );
493  ret &= fromLegacy<bool>( aCfg, "STEP_NoVirtual", "export_step.no_virtual" );
494 
495  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeColor", "export_svg.black_and_white" );
496  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeMirror", "export_svg.mirror" );
497  ret &= fromLegacy<bool>( aCfg, "PlotSVGModeOneFile", "export_svg.one_file" );
498  ret &= fromLegacy<bool>( aCfg, "PlotSVGBrdEdge", "export_svg.plot_board_edges" );
499  ret &= fromLegacy<int>( aCfg, "PlotSVGPageOpt", "export_svg.page_size" );
500  ret &= fromLegacyString( aCfg, "PlotSVGDirectory", "export_svg.output_dir" );
501 
502  {
503  nlohmann::json js = nlohmann::json::array();
504  wxString key;
505  bool val = false;
506 
507  for( unsigned i = 0; i < PCB_LAYER_ID_COUNT; ++i )
508  {
509  key.Printf( wxT( "PlotSVGLayer_%d" ), i );
510 
511  if( aCfg->Read( key, &val ) && val )
512  js.push_back( i );
513  }
514 
515  ( *this )[PointerFromString( "export_svg.layers" ) ] = js;
516  }
517 
518  {
519  nlohmann::json js = nlohmann::json::array();
520 
521  wxString packed;
522 
523  if( aCfg->Read( "ActionPluginButtons", &packed ) )
524  {
525  wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed, ";" );
526 
527  while( pluginSettingsTokenizer.HasMoreTokens() )
528  {
529  nlohmann::json row;
530  wxString plugin = pluginSettingsTokenizer.GetNextToken();
531  wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" );
532 
533  if( pluginTokenizer.CountTokens() != 2 )
534  {
535  // Bad config
536  continue;
537  }
538 
539  std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
540 
541  js.push_back( nlohmann::json( {
542  { key, pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 } } ) );
543  }
544  }
545 
546  ( *this )[PointerFromString( "action_plugins" ) ] = js;
547  }
548 
549  //
550  // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
551  //
552  ret &= fromLegacy<int>( aCfg, "VrmlExportUnit", "export_vrml.units" );
553  ret &= fromLegacy<bool>( aCfg, "VrmlExportCopyFiles", "export_vrml.copy_3d_models" );
554  ret &= fromLegacy<bool>( aCfg, "VrmlUseRelativePaths", "export_vrml.use_relative_paths" );
555  ret &= fromLegacy<bool>( aCfg, "VrmlUsePlainPCB", "export_vrml.use_plain_pcb" );
556  ret &= fromLegacy<int>( aCfg, "VrmlRefUnits", "export_vrml.ref_units" );
557  ret &= fromLegacy<double>( aCfg, "VrmlRefX", "export_vrml.ref_x" );
558  ret &= fromLegacy<double>( aCfg, "VrmlRefY", "export_vrml.ref_y" );
559 
560  ret &= fromLegacy<int>( aCfg, "Zone_Ouline_Hatch_Opt", "zones.hatching_style" );
561  ret &= fromLegacyString( aCfg, "Zone_Filter_Opt", "zones.net_filter" );
562  ret &= fromLegacy<int>( aCfg, "Zone_NetSort_Opt", "zones.net_sort_mode" );
563  ret &= fromLegacy<double>( aCfg, "Zone_Clearance", "zones.clearance" );
564  ret &= fromLegacy<double>( aCfg, "Zone_Thickness", "zones.min_thickness" );
565  ret &= fromLegacy<double>( aCfg, "Zone_TH_Gap", "zones.thermal_relief_gap" );
566  ret &= fromLegacy<double>( aCfg, "Zone_TH_Copper_Width", "zones.thermal_relief_copper_width" );
567 
568  aCfg->SetPath( "ImportGraphics" );
569  ret &= fromLegacy<int>( aCfg, "BoardLayer", "import_graphics.layer" );
570  ret &= fromLegacy<bool>( aCfg, "InteractivePlacement", "import_graphics.interactive_placement" );
571  ret &= fromLegacyString( aCfg, "LastFile", "import_graphics.last_file" );
572  ret &= fromLegacy<double>( aCfg, "LineWidth", "import_graphics.line_width" );
573  ret &= fromLegacy<int>( aCfg, "LineWidthUnits", "import_graphics.line_width_units" );
574  ret &= fromLegacy<int>( aCfg, "PositionUnits", "import_graphics.origin_units" );
575  ret &= fromLegacy<double>( aCfg, "PositionX", "import_graphics.origin_x" );
576  ret &= fromLegacy<double>( aCfg, "PositionY", "import_graphics.origin_y" );
577  aCfg->SetPath( ".." );
578 
579  ret &= fromLegacy<int>( aCfg, "NetlistReportFilterMsg", "netlist.report_filter" );
580  ret &= fromLegacy<bool>( aCfg, "NetlistUpdateFootprints", "netlist.update_footprints" );
581  ret &= fromLegacy<bool>( aCfg, "NetlistDeleteShortingTracks", "netlist.delete_shorting_tracks" );
582  ret &= fromLegacy<bool>( aCfg, "NetlistDeleteExtraFootprints", "netlist.delete_extra_footprints" );
583  ret &= fromLegacy<bool>( aCfg, "NetlistDeleteSinglePadNets", "netlist.delete_single_pad_nets" );
584 
585  ret &= fromLegacy<int>( aCfg, "PlaceFileUnits", "place_file.units" );
586  ret &= fromLegacy<int>( aCfg, "PlaceFileOpts", "place_file.file_options" );
587  ret &= fromLegacy<int>( aCfg, "PlaceFileFormat", "place_file.file_format" );
588  ret &= fromLegacy<bool>( aCfg, "PlaceFileIncludeBrdEdge", "place_file.include_board_edge" );
589 
590  ret &= fromLegacy<int>( aCfg, "PrintSinglePage", "plot.one_page_per_layer" );
591  ret &= fromLegacy<int>( aCfg, "PrintPadsDrillOpt", "plot.pads_drill_mode" );
592  ret &= fromLegacy<double>( aCfg, "PlotXFineScaleAdj", "plot.fine_scale_x" );
593  ret &= fromLegacy<double>( aCfg, "PlotYFineScaleAdj", "plot.fine_scale_y" );
594  ret &= fromLegacy<double>( aCfg, "PSPlotFineWidthAdj", "plot.ps_fine_width_adjust" );
595  ret &= fromLegacy<bool>( aCfg, "CheckZonesBeforePlotting", "plot.check_zones_before_plotting" );
596 
597  ret &= fromLegacyString( aCfg, "FootprintTextShownColumns", "window.footprint_text_shown_columns" );
598 
599  ret &= fromLegacy<int>( aCfg, "FpWizardListWidth", "footprint_wizard_list.width" );
600  ret &= fromLegacy<int>( aCfg, "FpWizardListHeight", "footprint_wizard_list.height" );
601 
602  migrateWindowConfig( aCfg, "ModViewFrame", "footprint_viewer" );
603 
604  ret &= fromLegacy<bool>( aCfg, "ModViewFrameAutoZoom", "footprint_viewer.auto_zoom" );
605  ret &= fromLegacy<double>( aCfg, "ModViewFrameZoom", "footprint_viewer.zoom" );
606 
607  migrateWindowConfig( aCfg, "FootprintWizard", "footprint_wizard" );
608  ret &= fromLegacyString( aCfg, "Fpwizard_auiPerspective", "footprint_wizard.perspective" );
609 
610 
611  const std::string p = "pcbnew.InteractiveRouter.";
612 
613  ( *this )[PointerFromString( "tools.pns.meta" )] = nlohmann::json( {
614  { "filename", "pns" },
615  { "version", 0 }
616  } );
617 
618  ret &= fromLegacy<int>( aCfg, p + "Mode", "tools.pns.mode" );
619  ret &= fromLegacy<int>( aCfg, p + "OptimizerEffort", "tools.pns.effort" );
620  ret &= fromLegacy<bool>( aCfg, p + "RemoveLoops", "tools.pns.remove_loops" );
621  ret &= fromLegacy<bool>( aCfg, p + "SmartPads", "tools.pns.smart_pads" );
622  ret &= fromLegacy<bool>( aCfg, p + "ShoveVias", "tools.pns.shove_vias" );
623  ret &= fromLegacy<bool>( aCfg, p + "StartDiagonal", "tools.pns.start_diagonal" );
624  ret &= fromLegacy<int>( aCfg, p + "ShoveTimeLimit", "tools.pns.shove_time_limit" );
625  ret &= fromLegacy<int>( aCfg, p + "ShoveIterationLimit", "tools.pns.shove_iteration_limit" );
626  ret &= fromLegacy<int>( aCfg,
627  p + "WalkaroundIterationLimit", "tools.pns.walkaround_iteration_limit" );
628  ret &= fromLegacy<bool>( aCfg, p + "JumpOverObstacles", "tools.pns.jump_over_obstacles" );
629  ret &= fromLegacy<bool>( aCfg,
630  p + "SmoothDraggedSegments", "tools.pns.smooth_dragged_segments" );
631  ret &= fromLegacy<bool>( aCfg, p + "CanViolateDRC", "tools.pns.can_violate_drc" );
632  ret &= fromLegacy<bool>( aCfg, p + "SuggestFinish", "tools.pns.suggest_finish" );
633  ret &= fromLegacy<bool>( aCfg, p + "FreeAngleMode", "tools.pns.free_angle_mode" );
634  ret &= fromLegacy<bool>( aCfg, p + "InlineDragEnabled", "tools.pns.inline_drag" );
635 
636  // Migrate color settings that were stored in the pcbnew config file
637 
638  COLOR_SETTINGS* cs = Pgm().GetSettingsManager().GetColorSettings();
639 
640  auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId ) {
641  wxString str;
642 
643  if( aCfg->Read( aKey, &str ) )
644  cs->SetColor( aLayerId, COLOR4D( str ) );
645  };
646 
647  for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
648  {
649  wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
650  migrateLegacyColor( "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
651  }
652 
653  migrateLegacyColor( "Color4DAnchorEx", LAYER_ANCHOR );
654  migrateLegacyColor( "Color4DAuxItems", LAYER_AUX_ITEMS );
655  migrateLegacyColor( "Color4DGrid", LAYER_GRID );
656  migrateLegacyColor( "Color4DNoNetPadMarker", LAYER_NO_CONNECTS );
657  migrateLegacyColor( "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
658  migrateLegacyColor( "Color4DPadBackEx", LAYER_PAD_BK );
659  migrateLegacyColor( "Color4DPadFrontEx", LAYER_PAD_FR );
660  migrateLegacyColor( "Color4DPadThruHoleEx", LAYER_PADS_TH );
661  migrateLegacyColor( "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
662  migrateLegacyColor( "Color4DPCBCursor", LAYER_CURSOR );
663  migrateLegacyColor( "Color4DRatsEx", LAYER_RATSNEST );
664  migrateLegacyColor( "Color4DTxtBackEx", LAYER_MOD_TEXT_BK );
665  migrateLegacyColor( "Color4DTxtFrontEx", LAYER_MOD_TEXT_FR );
666  migrateLegacyColor( "Color4DTxtInvisEx", LAYER_MOD_TEXT_INVISIBLE );
667  migrateLegacyColor( "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
668  migrateLegacyColor( "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
669  migrateLegacyColor( "Color4DViaThruEx", LAYER_VIA_THROUGH );
670  migrateLegacyColor( "Color4DWorksheet", LAYER_WORKSHEET );
671 
672  Pgm().GetSettingsManager().SaveColorSettings( cs, "board" );
673 
674  // Footprint editor settings were stored in pcbnew config file. Migrate them here.
675  auto fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( false );
676  fpedit->MigrateFromLegacy( aCfg );
677  fpedit->Load();
678 
679  // Same with 3D viewer
680  auto viewer3d = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( false );
681  viewer3d->MigrateFromLegacy( aCfg );
682  viewer3d->Load();
683 
684  return ret;
685 }
DIALOG_GENERATE_DRILL m_GenDrill
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath)
Adds parameters for the given window object.
to draw blind/buried vias
show a marker on pads with no nets
DIALOG_EXPORT_STEP m_ExportStep
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:104
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
DIALOG_CLEANUP m_Cleanup
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:173
multilayer pads, usually with holes
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
handle color for not plated holes (holes, not pads)
anchor of items having an anchor point (texts, footprints)
USER_GRID m_UserGrid
DIALOG_EXPORT_IDF m_ExportIdf
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 in the footprint viewer.
wxString m_FootprintTextShownColumns
DIALOG_EXPORT_VRML m_ExportVrml
nlohmann::json json
Definition: gerbview.cpp:40
FOOTPRINT_CHOOSER m_FootprintChooser
TRACE_CLEARANCE_DISPLAY_MODE_T m_ShowTrackClearanceMode
How trace clearances are displayed.
DIALOG_FOOTPRINT_WIZARD_LIST m_FootprintWizardList
bool m_Use45DegreeGraphicSegments
WINDOW_SETTINGS m_FootprintWizard
PCB_LAYER_ID
A quick note on layer IDs:
DIALOG_EXPORT_SVG m_ExportSvg
Auxiliary items (guides, rule, etc)
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:73
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Function Name returns the fixed name association with aLayerId.
Definition: lset.cpp:78
DIALOG_NETLIST m_NetlistDialog
to draw usual through hole vias
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
WINDOW_SETTINGS m_FootprintViewer
#define ZONE_THICKNESS_MIL
Definition: zones.h:31
virtual std::string getLegacyFrameName() const override
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.
smd pads, front layer
see class PGM_BASE
virtual ~PCBNEW_SETTINGS()
Board layer functions and definitions.
MAGNETIC_OPTIONS pads
AUI_PANELS m_AuiPanels
The common library.
DIALOG_PLOT m_Plot
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
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
bool m_FootprintViewerAutoZoom
Should the footprint viewer auto zoom on select.
PCB_DISPLAY_OPTIONS m_Display
static nlohmann::json::json_pointer PointerFromString(std::string aPath)
Builds a JSON pointer based on a given string.
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrates legacy window settings into the JSON document.
MAGNETIC_OPTIONS tracks
void SetColor(int aLayer, COLOR4D aColor)
COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:40