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 The 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, see <https://www.gnu.org/licenses/>.
18*/
19
20#include <common.h>
23#include <layer_ids.h>
24#include <lset.h>
25#include <pcbnew_settings.h>
26#include <pgm_base.h>
30#include <settings/parameters.h>
33#include <wx/config.h>
34#include <wx/tokenzr.h>
35#include <base_units.h>
36
38
39
41const int pcbnewSchemaVersion = 5;
42
43
50 m_Display(),
53 m_CtrlClickHighlight( false ),
56 m_AutoConstraints( true ),
58 m_PolarCoords( false ),
60 m_ShowPageLimits( true ),
62 m_AutoRefillZones( false ),
63 m_AllowFreePads( false ),
65 m_PnsSettings( nullptr ),
68{
71 m_MagneticItems.graphics = false;
72 m_MagneticItems.allLayers = false;
73
74 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
75 &m_AuiPanels.show_layer_manager, true ) );
76
77 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
78 &m_AuiPanels.right_panel_width, -1 ) );
79
80 m_params.emplace_back( new PARAM<int>( "aui.net_inspector_width",
81 &m_AuiPanels.net_inspector_width, -1 ) );
82
83 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
84 &m_AuiPanels.properties_panel_width, -1 ) );
85
86 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
87 &m_AuiPanels.properties_splitter, 0.5f ) );
88
89 m_params.emplace_back( new PARAM<int>( "aui.search_panel_height",
90 &m_AuiPanels.search_panel_height, -1 ) );
91
92 m_params.emplace_back( new PARAM<int>( "aui.search_panel_width",
93 &m_AuiPanels.search_panel_width, -1 ) );
94
95 m_params.emplace_back( new PARAM<int>( "aui.search_panel_dock_direction",
96 &m_AuiPanels.search_panel_dock_direction, 3 ) );
97
98 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
99 &m_AuiPanels.appearance_panel_tab, 0, 0, 2 ) );
100
101 m_params.emplace_back( new PARAM<bool>( "aui.appearance_expand_layer_display",
102 &m_AuiPanels.appearance_expand_layer_display, false ) );
103
104 m_params.emplace_back( new PARAM<bool>( "aui.appearance_expand_net_display",
105 &m_AuiPanels.appearance_expand_net_display, false ) );
106
107 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
108 &m_AuiPanels.show_properties, true ) );
109
110 m_params.emplace_back( new PARAM<bool>( "aui.show_search",
111 &m_AuiPanels.show_search, false ) );
112
113 m_params.emplace_back( new PARAM<bool>( "aui.show_net_inspector",
114 &m_AuiPanels.show_net_inspector, false ) );
115
116 m_params.emplace_back( new PARAM<bool>( "aui.design_blocks_show", &m_AuiPanels.design_blocks_show, false ) );
117
118 m_params.emplace_back( new PARAM<int>( "aui.design_blocks_panel_docked_width",
119 &m_AuiPanels.design_blocks_panel_docked_width, -1 ) );
120
121 m_params.emplace_back(
122 new PARAM<int>( "aui.design_blocks_panel_float_width", &m_AuiPanels.design_blocks_panel_float_width, -1 ) );
123
124 m_params.emplace_back( new PARAM<int>( "aui.design_blocks_panel_float_height",
125 &m_AuiPanels.design_blocks_panel_float_height, -1 ) );
126
127 m_params.emplace_back( new PARAM<int>( "footprint_chooser.width",
128 &m_FootprintChooser.width, -1 ) );
129
130 m_params.emplace_back( new PARAM<int>( "footprint_chooser.height",
131 &m_FootprintChooser.height, -1 ) );
132
133 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_h",
134 &m_FootprintChooser.sash_h, -1 ) );
135
136 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sash_v",
137 &m_FootprintChooser.sash_v, -1 ) );
138
139 m_params.emplace_back( new PARAM<int>( "footprint_chooser.sort_mode",
140 &m_FootprintChooser.sort_mode, 0 ) );
141
142 m_params.emplace_back( new PARAM<bool>( "footprint_chooser.filter_on_pin_count",
143 &m_FootprintChooser.filter_on_pin_count, false ) );
144
145 m_params.emplace_back( new PARAM<bool>( "footprint_chooser.use_fp_filters",
146 &m_FootprintChooser.use_fp_filters, false ) );
147
148 m_params.emplace_back( new PARAM<bool>( "editing.flip_left_right",
149 reinterpret_cast<bool*>( &m_FlipDirection ),
150 static_cast<bool>( FLIP_DIRECTION::LEFT_RIGHT ) ) );
151
152 m_params.emplace_back( new PARAM<bool>( "editing.esc_clears_net_highlight",
153 &m_ESCClearsNetHighlight, true ) );
154
155 m_params.emplace_back( new PARAM<bool>( "editing.show_courtyard_collisions",
156 &m_ShowCourtyardCollisions, true ) );
157
158 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
159 &m_MagneticItems.graphics, true ) );
160
161 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
162 reinterpret_cast<int*>( &m_MagneticItems.pads ),
164
165 m_params.emplace_back( new PARAM<int>( "editing.magnetic_tracks",
166 reinterpret_cast<int*>( &m_MagneticItems.tracks ),
168
169 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
170 &m_MagneticItems.allLayers, false ) );
171
173
174 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
175 &m_PolarCoords, false ) );
176
177 m_params.emplace_back( new PARAM<int>( "editing.track_drag_action",
178 reinterpret_cast<int*>( &m_TrackDragAction ),
179 static_cast<int>( TRACK_DRAG_ACTION::DRAG ) ) );
180
181 m_params.emplace_back( new PARAM<int>( "editing.arc_edit_mode",
182 reinterpret_cast<int*>( &m_ArcEditMode ),
184
185 m_params.emplace_back( new PARAM<bool>( "editing.ctrl_click_highlight",
186 &m_CtrlClickHighlight, false ) );
187
188 m_params.emplace_back( new PARAM<int>( "editing.pcb_angle_snap_mode",
189 reinterpret_cast<int*>( &m_AngleSnapMode ),
190 static_cast<int>( LEADER_MODE::DIRECT ) ) );
191
192 m_params.emplace_back( new PARAM<bool>( "editing.auto_constraints", &m_AutoConstraints, true ) );
193
194 m_params.emplace_back( new PARAM<bool>( "editing.auto_fill_zones",
195 &m_AutoRefillZones, false ) );
196
197 m_params.emplace_back( new PARAM<bool>( "editing.allow_free_pads",
198 &m_AllowFreePads, false ) );
199
200 m_params.emplace_back( new PARAM<bool>( "import.keep_kicad_layer_names",
201 &m_ImportKeepKiCadLayerNames, false ) );
202
203 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
204 [this] () -> int
205 {
206 int rot = m_RotationAngle.AsTenthsOfADegree();
207
208 // Don't store values larger than 360 degrees
209 return rot % 3600;
210 },
211 [this] ( int aVal )
212 {
213 if( aVal )
215
216 // A misconfiguration allowed some angles to be stored as tenth of a degree but read
217 // as tens of degrees. By disallowing storage of values larger than 360, we can weed out
218 // those invalid values here.
219 while( m_RotationAngle > ANGLE_360 )
221
222 },
223 900 ) );
224
225 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphic_items_fill",
226 &m_ViewersDisplay.m_DisplayGraphicsFill, true ) );
227
228 m_params.emplace_back( new PARAM<int>( "pcb_display.max_links_shown",
229 &m_Display.m_MaxLinksShowed, 3, 0, 15 ) );
230
231 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
232 &m_ViewersDisplay.m_DisplayGraphicsFill, true ) );
233
234 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
235 &m_ViewersDisplay.m_DisplayTextFill, true ) );
236
237 m_params.emplace_back( new PARAM<int>( "pcb_display.net_names_mode",
238 &m_Display.m_NetNames, 3, 0, 3 ) );
239
240 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_clearance",
241 &m_Display.m_PadClearance, true ) );
242
243 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_use_via_color_for_normal_th_padstacks",
244 &m_Display.m_UseViaColorForNormalTHPadstacks, false ) );
245
246 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
247 &m_ViewersDisplay.m_DisplayPadFill, true ) );
248
249 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
250 &m_ViewersDisplay.m_DisplayPadNumbers, true ) );
251
252 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_global",
253 &m_Display.m_ShowGlobalRatsnest, true ) );
254
255 m_params.emplace_back( new PARAM<bool>( "pcb_display.show_constraints", &m_Display.m_ShowConstraints, false ) );
256
257 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_footprint",
258 &m_Display.m_ShowModuleRatsnest, true ) );
259
260 m_params.emplace_back( new PARAM<bool>( "pcb_display.ratsnest_curved",
261 &m_Display.m_DisplayRatsnestLinesCurved, false ) );
262
263 m_params.emplace_back( new PARAM<double>( "pcb_display.ratsnest_thickness",
264 &m_Display.m_RatsnestThickness, 0.5 ) );
265
266 m_params.emplace_back( new PARAM<int>( "pcb_display.track_clearance_mode",
267 reinterpret_cast<int*>( &m_Display.m_TrackClearance ), SHOW_WITH_VIA_WHILE_ROUTING ) );
268
269 m_params.emplace_back( new PARAM<bool>( "pcb_display.track_fill",
270 &m_Display.m_DisplayPcbTrackFill, true ) );
271
272 m_params.emplace_back( new PARAM<bool>( "pcb_display.via_fill",
273 &m_Display.m_DisplayViaFill, true ) );
274
275 m_params.emplace_back( new PARAM<int>( "pcb_display.origin_mode",
276 reinterpret_cast<int*>( &m_Display.m_DisplayOrigin ),
278
279 m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_x_axis",
280 &m_Display.m_DisplayInvertXAxis, false ) );
281
282 m_params.emplace_back( new PARAM<bool>( "pcb_display.origin_invert_y_axis",
283 &m_Display.m_DisplayInvertYAxis, false ) );
284
285 m_params.emplace_back( new PARAM<bool>( "pcb_display.force_show_fields_when_fp_selected",
286 &m_Display.m_ForceShowFieldsWhenFPSelected, true ) );
287
288 m_params.emplace_back( new PARAM<bool>( "pcb_display.live_3d_refresh",
289 &m_Display.m_Live3DRefresh, false ) );
290
291 m_params.emplace_back( new PARAM<bool>( "pcb_display.show_page_borders",
292 &m_ShowPageLimits, true ) );
293
294 m_params.emplace_back( new PARAM<bool>( "export_d356.doNotExportUnconnectedPads",
295 &m_ExportD356.doNotExportUnconnectedPads, false ) );
296
297 addParamsForWindow( &m_FootprintViewer, "footprint_viewer" );
298
299 m_params.emplace_back( new PARAM<double>( "footprint_viewer.zoom",
300 &m_FootprintViewerZoom, 1.0 ) );
301
302 m_params.emplace_back( new PARAM<bool>( "footprint_viewer.autozoom",
304
305 m_params.emplace_back( new PARAM<int>( "footprint_viewer.lib_list_width",
307
308 m_params.emplace_back( new PARAM<int>( "footprint_viewer.fp_list_width",
310
311 addParamsForWindow( &m_FootprintWizard, "footprint_wizard" );
312
313 m_params.emplace_back( new PARAM<wxString>( "system.last_footprint_lib_dir",
314 &m_LastFootprintLibDir, "" ) );
315
316 m_params.emplace_back( new PARAM<wxString>( "system.last_footprint3d_dir",
317 &m_LastFootprint3dDir, "" ) );
318
319 m_params.emplace_back( new PARAM<bool>( "DRC.report_all_track_errors",
320 &m_DRCDialog.report_all_track_errors, false ) );
321
322 m_params.emplace_back( new PARAM<bool>( "DRC.crossprobe",
323 &m_DRCDialog.crossprobe, true ) );
324
325 m_params.emplace_back( new PARAM<bool>( "DRC.scroll_on_crossprobe",
326 &m_DRCDialog.scroll_on_crossprobe, true ) );
327
328 m_params.emplace_back( new PARAM<COLOR4D>( "diff_phase_skew.zero_color", &m_DiffPhaseSkewSettings.m_ZeroSkewColor,
329 COLOR4D( 1.0, 1.0, 1.0, 1.0 ) ) );
330
331 m_params.emplace_back( new PARAM<COLOR4D>( "diff_phase_skew.positive_color",
332 &m_DiffPhaseSkewSettings.m_PositiveSkewColor,
333 COLOR4D( 0.0, 0.0, 1.0, 1.0 ) ) );
334
335 m_params.emplace_back( new PARAM<COLOR4D>( "diff_phase_skew.negative_color",
336 &m_DiffPhaseSkewSettings.m_NegativeSkewColor,
337 COLOR4D( 1.0, 0.0, 0.0, 1.0 ) ) );
338
339 m_params.emplace_back( new PARAM<COLOR4D>( "diff_phase_skew.unknown_color",
340 &m_DiffPhaseSkewSettings.m_UnknownSkewColor,
341 COLOR4D( 0.5, 0.5, 0.5, 1.0 ) ) );
342
343 registerMigration( 0, 1,
344 [&]()
345 {
346 if( std::optional<int> optval = Get<int>( "pcb_display.rotation_angle" ) )
347 Set( "editing.rotation_angle", *optval );
348
349 try
350 {
351 At( "pcb_display" ).erase( "rotation_angle" );
352 }
353 catch( ... )
354 {}
355
356 return true;
357 } );
358
359 registerMigration( 1, 2,
360 [&]()
361 {
362 // In version 1 this meant "after Zone Properties dialog", but it now means
363 // "everywhere" so we knock it off on transition.
364 Set( "editing.auto_fill_zones", false );
365
366 return true;
367 } );
368
369
370 registerMigration( 2, 3,
371 [&]() -> bool
372 {
373 // We used to have a bug on GTK which would set the lib tree column width way
374 // too narrow.
375 if( std::optional<int> optval = Get<int>( "lib_tree.column_width" ) )
376 {
377 if( optval < 150 )
378 Set( "lib_tree.column_width", 300 );
379 }
380
381 return true;
382 } );
383
384 registerMigration( 3, 4,
385 [&]() -> bool
386 {
387 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
388 return migrateLibTreeWidth();
389 } );
390
391 registerMigration( 4, 5,
392 [&]() -> bool
393 {
394 // This default proved to be unpopular; bump it off for everyone
395 Set( "editing.auto_fill_zones", false );
396 return true;
397 } );
398}
399
400
402
403
404bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
405{
406 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
407
408 const std::string f = getLegacyFrameName();
409
410 //
411 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
412 //
413 ret &= fromLegacy<bool>( aCfg, "ShowLayerManagerTools", "aui.show_layer_manager" );
414
415 ret &= fromLegacy<int>( aCfg, "FootprintChooserHSashPosition", "footprint_chooser.sash_h" );
416 ret &= fromLegacy<int>( aCfg, "FootprintChooserVSashPosition", "footprint_chooser.sash_v" );
417 ret &= fromLegacy<int>( aCfg, "FootprintChooserWidth", "footprint_chooser.width" );
418 ret &= fromLegacy<int>( aCfg, "FootprintChooserHeight", "footprint_chooser.height" );
419
420 ret &= fromLegacy<bool>( aCfg, "FlipLeftRight", "editing.flip_left_right" );
421 ret &= fromLegacy<bool>( aCfg, "MagneticGraphics", "editing.magnetic_graphics" );
422 ret &= fromLegacy<int>( aCfg, "MagneticPads", "editing.magnetic_pads" );
423 ret &= fromLegacy<int>( aCfg, "MagneticTracks", "editing.magnetic_tracks" );
424 ret &= fromLegacy<bool>( aCfg, "DisplayPolarCoords", "editing.polar_coords" );
425 ret &= fromLegacy<bool>( aCfg, "Use45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
426
427 ret &= fromLegacy<bool>( aCfg, "PcbAffT", "pcb_display.graphic_items_fill" );
428 ret &= fromLegacy<int>( aCfg, "MaxLnkS", "pcb_display.max_links_shown" );
429 ret &= fromLegacy<bool>( aCfg, "ModAffC", "pcb_display.footprint_edge_fill" );
430 ret &= fromLegacy<bool>( aCfg, "ModAffT", "pcb_display.footprint_text_fill" );
431 ret &= fromLegacy<int>( aCfg, "ShowNetNamesMode", "pcb_display.net_names_mode" );
432 ret &= fromLegacy<int>( aCfg, "PcbDisplayOrigin", "pcb_display.origin_mode" );
433 ret &= fromLegacy<bool>( aCfg, "PcbInvertXAxis", "pcb_display.origin_invert_x_axis" );
434 ret &= fromLegacy<bool>( aCfg, "PcbInvertYAxis", "pcb_display.origin_invert_y_axis" );
435 ret &= fromLegacy<bool>( aCfg, "PadAffG", "pcb_display.pad_clearance" );
436 ret &= fromLegacy<bool>( aCfg, "PadFill", "pcb_display.pad_fill" );
437 ret &= fromLegacy<bool>( aCfg, "PadSNum", "pcb_display.pad_numbers" );
438 ret &= fromLegacy<bool>( aCfg, "ShowRatsnestLines", "pcb_display.ratsnest_global" );
439 ret &= fromLegacy<bool>( aCfg, "ShowRatsnestModuleLines", "pcb_display.ratsnest_footprint" );
440 ret &= fromLegacy<bool>( aCfg, "CurvedRatsnestLines", "pcb_display.ratsnest_curved" );
441 ret &= fromLegacy<int>( aCfg, "RotationAngle", "pcb_display.rotation_angle" );
442 ret &= fromLegacy<int>( aCfg, "TrackDisplayClearance", "pcb_display.track_clearance_mode" );
443 ret &= fromLegacy<bool>( aCfg, "DisplayTrackFilled", "pcb_display.track_fill" );
444 ret &= fromLegacy<bool>( aCfg, "ViaFill", "pcb_display.via_fill" );
445 ret &= fromLegacy<int>( aCfg, "PcbShowZonesMode", "pcb_display.zone_mode" );
446
447 ret &= fromLegacy<double>( aCfg, "PlotLineWidth_mm", "plot.line_width" );
448
449 {
450 nlohmann::json js = nlohmann::json::array();
451 wxString key;
452 bool val = false;
453
454 for( unsigned i = 0; i < PCB_LAYER_ID_COUNT; ++i )
455 {
456 key.Printf( wxT( "PlotSVGLayer_%d" ), i );
457
458 if( aCfg->Read( key, &val ) && val )
459 js.push_back( i );
460 }
461
462 Set( "export_svg.layers", js );
463 }
464
465 {
466 nlohmann::json js = nlohmann::json::array();
467
468 wxString packed;
469
470 if( aCfg->Read( "ActionPluginButtons", &packed ) )
471 {
472 wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed, ";" );
473
474 while( pluginSettingsTokenizer.HasMoreTokens() )
475 {
476 nlohmann::json row;
477 wxString plugin = pluginSettingsTokenizer.GetNextToken();
478 wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" );
479
480 if( pluginTokenizer.CountTokens() != 2 )
481 {
482 // Bad config
483 continue;
484 }
485
486 std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
487 bool value( pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 );
488
489 js.push_back( nlohmann::json( { { key, value } } ) );
490 }
491 }
492
493 Set( "action_plugins", js );
494 }
495
496 //
497 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
498 //
499 ret &= fromLegacy<int>( aCfg, "Zone_Ouline_Hatch_Opt", "zones.hatching_style" );
500 ret &= fromLegacy<int>( aCfg, "Zone_NetSort_Opt", "zones.net_sort_mode" );
501 ret &= fromLegacy<double>( aCfg, "Zone_Clearance", "zones.clearance" );
502 ret &= fromLegacy<double>( aCfg, "Zone_Thickness", "zones.min_thickness" );
503 ret &= fromLegacy<double>( aCfg, "Zone_TH_Gap", "zones.thermal_relief_gap" );
504 ret &= fromLegacy<double>( aCfg, "Zone_TH_Copper_Width", "zones.thermal_relief_copper_width" );
505
506 ret &= fromLegacy<int>( aCfg, "PrintSinglePage", "plot.all_layers_on_one_page" );
507 ret &= fromLegacy<int>( aCfg, "PrintPadsDrillOpt", "plot.pads_drill_mode" );
508 ret &= fromLegacy<double>( aCfg, "PlotXFineScaleAdj", "plot.fine_scale_x" );
509 ret &= fromLegacy<double>( aCfg, "PlotYFineScaleAdj", "plot.fine_scale_y" );
510 ret &= fromLegacy<double>( aCfg, "PSPlotFineWidthAdj", "plot.ps_fine_width_adjust" );
511 ret &= fromLegacy<bool>( aCfg, "CheckZonesBeforePlotting", "plot.check_zones_before_plotting" );
512
513 ret &= fromLegacy<int>( aCfg, "FpWizardListWidth", "footprint_wizard_list.width" );
514 ret &= fromLegacy<int>( aCfg, "FpWizardListHeight", "footprint_wizard_list.height" );
515
516 migrateWindowConfig( aCfg, "ModViewFrame", "footprint_viewer" );
517
518 ret &= fromLegacy<bool>( aCfg, "ModViewFrameAutoZoom", "footprint_viewer.auto_zoom" );
519 ret &= fromLegacy<double>( aCfg, "ModViewFrameZoom", "footprint_viewer.zoom" );
520
521 migrateWindowConfig( aCfg, "FootprintWizard", "footprint_wizard" );
522 ret &= fromLegacyString( aCfg, "Fpwizard_auiPerspective", "footprint_wizard.perspective" );
523
524
525 const std::string p = "pcbnew.InteractiveRouter.";
526
527 Set( "tools.pns.meta", nlohmann::json( {
528 { "filename", "pns" },
529 { "version", 0 }
530 } ) );
531
532 ret &= fromLegacy<int>( aCfg, p + "Mode", "tools.pns.mode" );
533 ret &= fromLegacy<int>( aCfg, p + "OptimizerEffort", "tools.pns.effort" );
534 ret &= fromLegacy<bool>( aCfg, p + "RemoveLoops", "tools.pns.remove_loops" );
535 ret &= fromLegacy<bool>( aCfg, p + "SmartPads", "tools.pns.smart_pads" );
536 ret &= fromLegacy<bool>( aCfg, p + "ShoveVias", "tools.pns.shove_vias" );
537 ret &= fromLegacy<bool>( aCfg, p + "StartDiagonal", "tools.pns.start_diagonal" );
538 ret &= fromLegacy<int>( aCfg, p + "ShoveTimeLimit", "tools.pns.shove_time_limit" );
539 ret &= fromLegacy<int>( aCfg, p + "ShoveIterationLimit", "tools.pns.shove_iteration_limit" );
540 ret &= fromLegacy<int>( aCfg, p + "WalkaroundIterationLimit", "tools.pns.walkaround_iteration_limit" );
541 ret &= fromLegacy<bool>( aCfg, p + "JumpOverObstacles", "tools.pns.jump_over_obstacles" );
542 ret &= fromLegacy<bool>( aCfg, p + "SmoothDraggedSegments", "tools.pns.smooth_dragged_segments" );
543 ret &= fromLegacy<bool>( aCfg, p + "CanViolateDRC", "tools.pns.can_violate_drc" );
544 ret &= fromLegacy<bool>( aCfg, p + "SuggestFinish", "tools.pns.suggest_finish" );
545 ret &= fromLegacy<bool>( aCfg, p + "FreeAngleMode", "tools.pns.free_angle_mode" );
546 ret &= fromLegacy<bool>( aCfg, p + "InlineDragEnabled", "editing.track_drag_action" );
547
548 // Initialize some new PNS settings to legacy behaviors if coming from legacy
549 Set( "tools.pns.fix_all_segments", false );
550
551 // Migrate color settings that were stored in the pcbnew config file
552
555
556 auto migrateLegacyColor =
557 [&] ( const std::string& aKey, int aLayerId )
558 {
559 wxString str;
560
561 if( aCfg->Read( aKey, &str ) )
562 cs->SetColor( aLayerId, COLOR4D( str ) );
563 };
564
565 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
566 {
567 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
568 migrateLegacyColor( "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
569 }
570
571 migrateLegacyColor( "Color4DAnchorEx", LAYER_ANCHOR );
572 migrateLegacyColor( "Color4DAuxItems", LAYER_AUX_ITEMS );
573 migrateLegacyColor( "Color4DGrid", LAYER_GRID );
574 migrateLegacyColor( "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
575 migrateLegacyColor( "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
576 migrateLegacyColor( "Color4DPCBCursor", LAYER_CURSOR );
577 migrateLegacyColor( "Color4DRatsEx", LAYER_RATSNEST );
578 migrateLegacyColor( "Color4DViaBBlindEx", LAYER_VIA_BLIND );
579 migrateLegacyColor( "Color4DViaBBlindEx", LAYER_VIA_BURIED );
580 migrateLegacyColor( "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
581 migrateLegacyColor( "Color4DViaThruEx", LAYER_VIA_THROUGH );
582 migrateLegacyColor( "Color4DWorksheet", LAYER_DRAWINGSHEET );
583 migrateLegacyColor( "Color4DGrid", LAYER_PAGE_LIMITS );
584
585 mgr.SaveColorSettings( cs, "board" );
586
587 Set( "appearance.color_theme", cs->GetFilename() );
588
589 double x = 0, y = 0;
590
591 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
592 {
593 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
594 static_cast<long>( EDA_UNITS::INCH ) ) );
595
596 // Convert to internal units
599
600 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
601 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
602 }
603
604 // Footprint editor settings were stored in pcbnew config file. Migrate them here.
606 fpedit->MigrateFromLegacy( aCfg );
607 fpedit->Load();
608
609 // Same with 3D viewer
611 viewer3d->MigrateFromLegacy( aCfg );
612 viewer3d->Load();
613
614 return ret;
615}
ARC_EDIT_MODE
Settings for arc editing.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrate legacy window settings into the JSON document.
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath, int aDefaultWidth=0, int aDefaultHeight=0)
Add parameters for the given window object.
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
bool migrateLibTreeWidth()
Migrate 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.
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.
bool fromLegacy(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig 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::optional< ValueType > Get(const std::string &aPath) const
Fetches a value from within the JSON document.
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
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition lset.cpp:184
Like a normal param, but with custom getter and setter functions.
Definition parameters.h:299
DIALOG_EXPORT_D356 m_ExportD356
DISPLAY_OPTIONS m_Display
wxString m_LastFootprintLibDir
EDA_ANGLE m_RotationAngle
DIALOG_DRC m_DRCDialog
ARC_EDIT_MODE m_ArcEditMode
FOOTPRINT_CHOOSER m_FootprintChooser
virtual ~PCBNEW_SETTINGS()
TRACK_DRAG_ACTION m_TrackDragAction
LEADER_MODE m_AngleSnapMode
virtual std::string getLegacyFrameName() const override
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
WINDOW_SETTINGS m_FootprintWizard
DIFF_PHASE_SKEW_SETTINGS m_DiffPhaseSkewSettings
AUI_PANELS m_AuiPanels
WINDOW_SETTINGS m_FootprintViewer
wxString m_LastFootprint3dDir
MAGNETIC_SETTINGS m_MagneticItems
FLIP_DIRECTION m_FlipDirection
SNAP_INFERENCE_SETTINGS m_SnapInference
std::unique_ptr< PNS::ROUTING_SETTINGS > m_PnsSettings
bool m_FootprintViewerAutoZoomOnSelect
true to use automatic zoom on fp selection
PCB_VIEWERS_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
double m_FootprintViewerZoom
The last zoom level used (0 for auto)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:124
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
COLOR_SETTINGS * GetMigratedColorSettings()
Return 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:413
@ TENTHS_OF_A_DEGREE_T
Definition eda_angle.h:30
static constexpr EDA_ANGLE ANGLE_360
Definition eda_angle.h:417
EDA_UNITS
Definition eda_units.h:44
LEADER_MODE
The kind of the leader line.
@ DIRECT
Unconstrained point-to-point.
@ LAYER_GRID
Definition layer_ids.h:250
@ LAYER_PAGE_LIMITS
Color for drawing the page extents (visibility stored in PCBNEW_SETTINGS::m_ShowPageLimits)
Definition layer_ids.h:328
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
Definition layer_ids.h:235
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
Definition layer_ids.h:274
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition layer_ids.h:277
@ LAYER_CURSOR
PCB cursor.
Definition layer_ids.h:278
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc).
Definition layer_ids.h:279
@ LAYER_RATSNEST
Definition layer_ids.h:249
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
Definition layer_ids.h:244
@ LAYER_VIA_BURIED
Draw blind vias.
Definition layer_ids.h:231
@ LAYER_VIA_BLIND
Draw micro vias.
Definition layer_ids.h:230
@ LAYER_VIA_MICROVIA
Definition layer_ids.h:229
@ LAYER_VIA_THROUGH
Draw buried vias.
Definition layer_ids.h:232
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ PCB_LAYER_ID_COUNT
Definition layer_ids.h:167
FLIP_DIRECTION
Definition mirror.h:23
@ LEFT_RIGHT
Flip left to right (around the Y axis)
Definition mirror.h:24
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",...
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)
Return the string from aValue according to aUnits (inch, mm ...) for display.
const int pcbnewSchemaVersion
! Update the schema version whenever a migration is required
@ SHOW_WITH_VIA_WHILE_ROUTING
@ PCB_ORIGIN_PAGE
TRACK_DRAG_ACTION
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
T * GetAppSettings(const char *aFilename)
void AddSnapInferenceParams(std::vector< PARAM_BASE * > &aParams, SNAP_INFERENCE_SETTINGS &aSettings)
Register the snap inference parameters.