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