KiCad PCB EDA Suite
Loading...
Searching...
No Matches
footprint_editor_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 Jon Evans <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
22
23#include <common.h>
24#include <layer_ids.h>
25#include <lset.h>
26#include <pgm_base.h>
27#include <eda_text.h>
28#include <pcb_dimension.h>
31#include <settings/parameters.h>
33#include <base_units.h>
34
35#include <wx/config.h>
36#include <wx/log.h>
37
38
40const int fpEditSchemaVersion = 5;
41
42
45 m_DesignSettings( nullptr, "fpedit.settings" ),
46 m_MagneticItems(),
47 m_Display(),
48 m_UserGrid(),
49 m_PolarCoords( false ),
50 m_DisplayInvertXAxis( false ),
51 m_DisplayInvertYAxis( false ),
52 m_RotationAngle( ANGLE_90 ),
53 m_Use45Limit( true ),
55 m_LibWidth( 250 ),
56 m_LastExportPath(),
57 m_FootprintTextShownColumns()
58{
59 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
60 m_MagneticItems.tracks = MAGNETIC_OPTIONS::NO_EFFECT;
63
67
68 m_params.emplace_back( new PARAM<int>( "window.lib_width",
69 &m_LibWidth, 250 ) );
70
71 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
73
74 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
76
77 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
79
80 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
82
83 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
85
86 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
87 &m_AuiPanels.show_properties, false ) );
88
89 m_params.emplace_back( new PARAM<int>( "library.sort_mode",
90 &m_LibrarySortMode, 0 ) );
91
92 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
93 &m_LastExportPath, "" ) );
94
95 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
97
98 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
100
101 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
103
104 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
106
107 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
108 &m_FootprintTextShownColumns, "0 1 2 3 4 5 7" ) );
109
110 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
111 reinterpret_cast<int*>( &m_MagneticItems.pads ),
112 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
113
114 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
115 &m_MagneticItems.graphics, true ) );
116
117 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
118 &m_MagneticItems.allLayers, false ) );
119
120 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
121 &m_PolarCoords, false ) );
122
123 m_params.emplace_back( new PARAM<bool>( "origin_invert_x_axis",
124 &m_DisplayInvertXAxis, false ) );
125
126 m_params.emplace_back( new PARAM<bool>( "origin_invert_y_axis",
127 &m_DisplayInvertYAxis, false ) );
128
129 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
130 [this] () -> int
131 {
133 },
134 [this] ( int aVal )
135 {
136 if( aVal )
138 },
139 900 ) );
140
141 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
142 &m_Use45Limit, false ) );
143
144 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
145
146 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
147 &m_ActiveLayerPreset, "" ) );
148
149 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
150 "design_settings.default_footprint_text_items",
151 [&] () -> nlohmann::json
152 {
153 nlohmann::json js = nlohmann::json::array();
154
156 {
157 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
158 item.m_Visible,
159 LSET::Name( item.m_Layer ) } ) );
160 }
161
162 return js;
163 },
164 [&] ( const nlohmann::json& aObj )
165 {
167
168 if( !aObj.is_array() )
169 return;
170
171 for( const nlohmann::json& entry : aObj )
172 {
173 if( entry.empty() || !entry.is_array() )
174 continue;
175
176 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
177
178 textInfo.m_Text = entry.at(0).get<wxString>();
179 textInfo.m_Visible = entry.at(1).get<bool>();
180 wxString layerName = entry.at(2).get<wxString>();
181 int candidateLayer = LSET::NameToLayer( layerName );
182 textInfo.m_Layer = candidateLayer >= 0
183 ? static_cast<PCB_LAYER_ID>(candidateLayer)
184 : F_SilkS;
185
186 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
187 }
188 },
189 nlohmann::json::array( {
190 { "REF**", true, LSET::Name( F_SilkS ) },
191 { "", true, LSET::Name( F_Fab ) },
192 { "${REFERENCE}", true, LSET::Name( F_Fab ) }
193 } ) ) );
194
195 m_params.emplace_back( new PARAM_MAP<wxString>( "design_settings.default_footprint_layer_names",
197
198 int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
199 int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
200 int minStroke = 1;
201 int maxStroke = pcbIUScale.mmToIU( 100 );
202
203 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
204 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_SILK ],
205 pcbIUScale.mmToIU( DEFAULT_SILK_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
206
207 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
208 &m_DesignSettings.m_TextSize[ LAYER_CLASS_SILK ].x,
209 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
210
211 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
212 &m_DesignSettings.m_TextSize[ LAYER_CLASS_SILK ].y,
213 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
214
215 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
216 &m_DesignSettings.m_TextThickness[ LAYER_CLASS_SILK ],
218
219 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
220 &m_DesignSettings.m_TextItalic[ LAYER_CLASS_SILK ], false ) );
221
222 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
223 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_COPPER ],
224 pcbIUScale.mmToIU( DEFAULT_COPPER_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
225
226 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
227 &m_DesignSettings.m_TextSize[ LAYER_CLASS_COPPER ].x,
228 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
229
230 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
231 &m_DesignSettings.m_TextSize[ LAYER_CLASS_COPPER ].y,
232 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
233
234 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
235 &m_DesignSettings.m_TextThickness[ LAYER_CLASS_COPPER ],
236 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
237
238 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
239 &m_DesignSettings.m_TextItalic[ LAYER_CLASS_COPPER ], false ) );
240
241 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
242 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_EDGES ],
243 pcbIUScale.mmToIU( DEFAULT_EDGE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
244
245 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
246 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_COURTYARD ],
247 pcbIUScale.mmToIU( DEFAULT_COURTYARD_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
248
249 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
250 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_FAB ],
251 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
252
253 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
254 &m_DesignSettings.m_TextSize[ LAYER_CLASS_FAB ].x,
255 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
256
257 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
258 &m_DesignSettings.m_TextSize[ LAYER_CLASS_FAB ].y,
259 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
260
261 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
262 &m_DesignSettings.m_TextThickness[ LAYER_CLASS_FAB ],
264
265 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
266 &m_DesignSettings.m_TextItalic[ LAYER_CLASS_FAB ], false ) );
267
268 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
269 &m_DesignSettings.m_LineThickness[ LAYER_CLASS_OTHERS ],
270 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
271
272 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
273 &m_DesignSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x,
274 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
275
276 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
277 &m_DesignSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y,
278 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
279
280 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
281 &m_DesignSettings.m_TextThickness[ LAYER_CLASS_OTHERS ],
283
284 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
285 &m_DesignSettings.m_TextItalic[ LAYER_CLASS_OTHERS ], false ) );
286
287
288 // ---------------------------------------------------------------------------------------------
289 // Dimension settings
290
291 m_params.emplace_back( new PARAM_ENUM<DIM_UNITS_MODE>( "design_settings.dimensions.units",
292 &m_DesignSettings.m_DimensionUnitsMode, DIM_UNITS_MODE::AUTOMATIC, DIM_UNITS_MODE::INCHES,
294
295 m_params.emplace_back( new PARAM_ENUM<DIM_PRECISION>( "design_settings.dimensions.precision",
296 &m_DesignSettings.m_DimensionPrecision, DIM_PRECISION::X_XXXX, DIM_PRECISION::X, DIM_PRECISION::V_VVVVV ) );
297
298 m_params.emplace_back( new PARAM_ENUM<DIM_UNITS_FORMAT>( "design_settings.dimensions.units_format",
299 &m_DesignSettings.m_DimensionUnitsFormat, DIM_UNITS_FORMAT::NO_SUFFIX, DIM_UNITS_FORMAT::NO_SUFFIX,
301
302 m_params.emplace_back( new PARAM<bool>( "design_settings.dimensions.suppress_zeroes",
303 &m_DesignSettings.m_DimensionSuppressZeroes, true ) );
304
305 // NOTE: excluding DIM_TEXT_POSITION::MANUAL from the valid range here
306 m_params.emplace_back( new PARAM_ENUM<DIM_TEXT_POSITION>( "design_settings.dimensions.text_position",
307 &m_DesignSettings.m_DimensionTextPosition, DIM_TEXT_POSITION::OUTSIDE, DIM_TEXT_POSITION::OUTSIDE,
309
310 m_params.emplace_back( new PARAM<bool>( "design_settings.dimensions.keep_text_aligned",
311 &m_DesignSettings.m_DimensionKeepTextAligned, true ) );
312
313 m_params.emplace_back( new PARAM<int>( "design_settings.dimensions.arrow_length",
314 &m_DesignSettings.m_DimensionArrowLength,
316
317 m_params.emplace_back( new PARAM<int>( "design_settings.dimensions.extension_offset",
318 &m_DesignSettings.m_DimensionExtensionOffset,
320
321 // ---------------------------------------------------------------------------------------------
322
323 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
324 [&]() -> nlohmann::json
325 {
326 nlohmann::json ret;
327
328 ret["lockedItems"] = m_SelectionFilter.lockedItems;
329 ret["footprints"] = m_SelectionFilter.footprints;
330 ret["text"] = m_SelectionFilter.text;
331 ret["tracks"] = m_SelectionFilter.tracks;
332 ret["vias"] = m_SelectionFilter.vias;
333 ret["pads"] = m_SelectionFilter.pads;
334 ret["graphics"] = m_SelectionFilter.graphics;
335 ret["zones"] = m_SelectionFilter.zones;
336 ret["keepouts"] = m_SelectionFilter.keepouts;
337 ret["dimensions"] = m_SelectionFilter.dimensions;
338 ret["otherItems"] = m_SelectionFilter.otherItems;
339
340 return ret;
341 },
342 [&]( const nlohmann::json& aVal )
343 {
344 if( aVal.empty() || !aVal.is_object() )
345 return;
346
347 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
348 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
349 SetIfPresent( aVal, "text", m_SelectionFilter.text );
350 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
351 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
352 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
353 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
354 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
355 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
356 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
357 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
358 },
359 {
360 { "lockedItems", false },
361 { "footprints", true },
362 { "text", true },
363 { "tracks", true },
364 { "vias", true },
365 { "pads", true },
366 { "graphics", true },
367 { "zones", true },
368 { "keepouts", true },
369 { "dimensions", true },
370 { "otherItems", true }
371 } ) );
372
373 registerMigration( 0, 1, std::bind( &FOOTPRINT_EDITOR_SETTINGS::migrateSchema0to1, this ) );
374
375 registerMigration( 1, 2,
376 [&]() -> bool
377 {
378 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
379 return migrateLibTreeWidth();
380 } );
381
382 registerMigration( 2, 3, std::bind( &FOOTPRINT_EDITOR_SETTINGS::migrateSchema2To3, this ) );
383 registerMigration( 3, 4, std::bind( &FOOTPRINT_EDITOR_SETTINGS::migrateSchema3To4, this ) );
384 registerMigration( 4, 5, std::bind( &FOOTPRINT_EDITOR_SETTINGS::migrateSchema4To5, this ) );
385}
386
387
389{
390 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
391
392 //
393 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
394 //
395 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
396 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
397 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
398
399 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
400 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
401 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
402
403 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
404 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
405 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
406
407 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
408 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
409 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
410 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
411 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
412 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
413 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
414 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
415 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
416 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
417 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
418 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
419 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
420 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
421 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
422 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
423 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
424
425 nlohmann::json textItems = nlohmann::json::array( {
426 { "REF**", true, F_SilkS },
427 { "", true, F_Fab }
428 } );
429
430 Set( "design_settings.default_footprint_text_items", std::move( textItems ) );
431
432 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
433 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
434 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
435 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
436 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
437 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
438
439
440 std::string f = "ModEdit";
441
442 // Migrate color settings that were stored in the pcbnew config file
443 // We create a copy of the user scheme for the footprint editor context
444
446 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
447
448 cs->SetName( wxT( "User (Footprints)" ) );
449 manager.Save( cs );
450
451 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
452 {
453 wxString str;
454
455 if( aCfg->Read( aKey, &str ) )
456 cs->SetColor( aLayerId, COLOR4D( str ) );
457 };
458
459 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
460 {
461 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
462 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
463 }
464
465 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
466 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
467 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
468 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
469 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
470 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
471 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
472 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
473 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
474 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
475 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
476
477 manager.SaveColorSettings( cs, "board" );
478
479 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
480
481 double x = 0, y = 0;
482 f = "ModEditFrame";
483
484 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
485 {
486 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
487 static_cast<long>( EDA_UNITS::INCHES ) ) );
488
489 // Convert to internal units
492
493 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
494 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
495 }
496
497 return ret;
498}
499
500
502{
510 if( !m_manager )
511 {
512 wxLogTrace( traceSettings,
513 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
514 return false;
515 }
516
517 std::string theme_ptr( "appearance.color_theme" );
518
519 if( !Contains( theme_ptr ) )
520 return true;
521
522 wxString selected = At( theme_ptr ).get<wxString>();
523 wxString search = selected + wxT( "_footprints" );
524
525 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
526 {
527 if( settings->GetFilename() == search )
528 {
529 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
530 selected, search );
531 Set( theme_ptr, search );
532 return true;
533 }
534 }
535
536 return true;
537}
538
539
545{
546 auto p( "/pcb_display/layer_presets"_json_pointer );
547
548 if( !m_internals->contains( p ) || !m_internals->at( p ).is_array() )
549 return true;
550
551 nlohmann::json& presets = m_internals->at( p );
552
553 for( nlohmann::json& entry : presets )
555
556 return true;
557}
558
559
564{
565 auto p( "/pcb_display/layer_presets"_json_pointer );
566
567 if( !m_internals->contains( p ) || !m_internals->at( p ).is_array() )
568 return true;
569
570 nlohmann::json& presets = m_internals->at( p );
571
572 for( nlohmann::json& entry : presets )
574
575 return true;
576}
577
578
583{
584 auto p( "/design_settings/default_footprint_text_items"_json_pointer );
585
586 if( !m_internals->contains( p ) || !m_internals->at( p ).is_array() )
587 return true;
588
589 nlohmann::json& defaults = m_internals->at( p );
590
591 bool reset = false;
592
593 for( nlohmann::json& entry : defaults )
594 {
595 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
596
597 textInfo.m_Text = entry.at(0).get<wxString>();
598 textInfo.m_Visible = entry.at(1).get<bool>();
599 textInfo.m_Layer = static_cast<PCB_LAYER_ID>( entry.at(2).get<int>() );
600
601 if( textInfo.m_Layer == Rescue || textInfo.m_Layer >= User_5 )
602 {
603 // KiCad pre-9.0 nightlies would write buggy preferences out with invalid layers.
604 // If we detect that, reset to defaults
605 reset = true;
606 }
607 else
608 {
609 // Coming from 8.0 or earlier, just migrate to named layers
610 entry.at(2) = LSET::Name( textInfo.m_Layer );
611 }
612 }
613
614 if( reset )
615 {
616 defaults = nlohmann::json::array( {
617 { "REF**", true, LSET::Name( F_SilkS ) },
618 { "", true, LSET::Name( F_Fab ) },
619 { "${REFERENCE}", true, LSET::Name( F_Fab ) }
620 } );
621 }
622
623 return true;
624}
ARC_EDIT_MODE
Settings for arc editing.
Definition: app_settings.h:52
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
#define DEFAULT_TEXT_WIDTH
#define DEFAULT_COPPER_TEXT_WIDTH
#define DEFAULT_DIMENSION_EXTENSION_OFFSET
#define DEFAULT_DIMENSION_ARROW_LENGTH
#define DEFAULT_SILK_TEXT_SIZE
#define DEFAULT_COPPER_LINE_WIDTH
#define DEFAULT_SILK_LINE_WIDTH
@ LAYER_CLASS_OTHERS
@ LAYER_CLASS_FAB
@ LAYER_CLASS_COURTYARD
@ LAYER_CLASS_SILK
@ LAYER_CLASS_COPPER
@ LAYER_CLASS_EDGES
#define DEFAULT_SILK_TEXT_WIDTH
#define DEFAULT_EDGE_WIDTH
#define DEFAULT_COPPER_TEXT_SIZE
#define DEFAULT_LINE_WIDTH
#define DEFAULT_COURTYARD_WIDTH
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
std::vector< TEXT_ITEM_INFO > m_DefaultFPTextItems
std::map< std::string, wxString > m_UserLayerNames
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetName(const wxString &aName)
void SetColor(int aLayer, const COLOR4D &aColor)
int AsTenthsOfADegree() const
Definition: eda_angle.h:115
bool migrateSchema3To4()
Schema version 4: move layer presets to use named render layers.
BOARD_DESIGN_SETTINGS m_DesignSettings
Only some of these settings are actually used for footprint editing.
bool migrateSchema2To3()
Schema version 2: Bump for KiCad 9 layer numbering changes Migrate layer presets to use new enum valu...
std::vector< LAYER_PRESET > m_LayerPresets
bool migrateSchema4To5()
Schema version 5: move text defaults to used named layers.
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
SETTINGS_MANAGER * m_manager
A pointer to the settings manager managing this file (may be null)
bool Contains(const std::string &aPath) const
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
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...
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
static int NameToLayer(wxString &aName)
Return the layer number from a layer name.
Definition: lset.cpp:117
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:188
Stores an enum as an integer.
Definition: parameters.h:228
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:295
static void MigrateToV9Layers(nlohmann::json &aJson)
static void MigrateToNamedRenderLayers(nlohmann::json &aJson)
Represents a map of <std::string, Value>.
Definition: parameters.h:726
Represents a parameter that has a scaling factor between the value in the file and the value used int...
Definition: parameters.h:392
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 * AddNewColorSettings(const wxString &aFilename)
Register a new color settings object with the given filename.
The common library.
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
@ TENTHS_OF_A_DEGREE_T
Definition: eda_angle.h:30
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
Definition: eda_text.h:47
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:48
EDA_UNITS
Definition: eda_units.h:46
const int fpEditSchemaVersion
! Update the schema version whenever a migration is required
#define traceSettings
Definition: json_settings.h:52
@ LAYER_GRID
Definition: layer_ids.h:253
@ 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
@ User_5
Definition: layer_ids.h:128
@ F_Fab
Definition: layer_ids.h:119
@ F_SilkS
Definition: layer_ids.h:100
@ Rescue
Definition: layer_ids.h:121
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:171
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
Definition: eda_units.cpp:487
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.
Definition: eda_units.cpp:290
@ OUTSIDE
Text appears outside the dimension line (default)
@ INLINE
Text appears in line with the dimension line.
SETTINGS_MANAGER * GetSettingsManager()
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1073
see class PGM_BASE
const double MM_PER_IU
Definition: base_units.h:78
constexpr int MilsToIU(int mils) const
Definition: base_units.h:93
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
MAGNETIC_OPTIONS tracks
MAGNETIC_OPTIONS pads