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 (C) 2020-2023 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
21#include <common.h>
23#include <layer_ids.h>
24#include <lset.h>
25#include <pgm_base.h>
26#include <eda_text.h>
29#include <settings/parameters.h>
31#include <wx/config.h>
32#include <base_units.h>
33#include <wx/log.h>
34
35
37const int fpEditSchemaVersion = 2;
38
39
42 m_DesignSettings( nullptr, "fpedit.settings" ),
43 m_MagneticItems(),
44 m_Display(),
45 m_UserGrid(),
46 m_PolarCoords( false ),
47 m_DisplayInvertXAxis( false ),
48 m_DisplayInvertYAxis( false ),
49 m_RotationAngle( ANGLE_90 ),
50 m_Use45Limit( true ),
52 m_LibWidth( 250 ),
53 m_LastExportPath(),
54 m_FootprintTextShownColumns()
55{
56 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
57 m_MagneticItems.tracks = MAGNETIC_OPTIONS::NO_EFFECT;
60
64
65 m_params.emplace_back( new PARAM<int>( "window.lib_width",
66 &m_LibWidth, 250 ) );
67
68 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
70
71 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
73
74 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
76
77 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
79
80 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
82
83 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
84 &m_AuiPanels.show_properties, false ) );
85
86 m_params.emplace_back( new PARAM<int>( "library.sort_mode",
87 &m_LibrarySortMode, 0 ) );
88
89 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
90 &m_LastExportPath, "" ) );
91
92 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
94
95 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
97
98 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
100
101 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
103
104 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
105 &m_FootprintTextShownColumns, "0 1 2 3 4 5 7" ) );
106
107 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
108 reinterpret_cast<int*>( &m_MagneticItems.pads ),
109 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
110
111 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
112 &m_MagneticItems.graphics, true ) );
113
114 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
115 &m_MagneticItems.allLayers, false ) );
116
117 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
118 &m_PolarCoords, false ) );
119
120 m_params.emplace_back( new PARAM<bool>( "origin_invert_x_axis",
121 &m_DisplayInvertXAxis, false ) );
122
123 m_params.emplace_back( new PARAM<bool>( "origin_invert_y_axis",
124 &m_DisplayInvertYAxis, false ) );
125
126 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
127 [this] () -> int
128 {
130 },
131 [this] ( int aVal )
132 {
133 if( aVal )
135 },
136 900 ) );
137
138 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
139 &m_Use45Limit, false ) );
140
141 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
142
143 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
144 &m_ActiveLayerPreset, "" ) );
145
146 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
147 "design_settings.default_footprint_text_items",
148 [&] () -> nlohmann::json
149 {
150 nlohmann::json js = nlohmann::json::array();
151
153 {
154 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
155 item.m_Visible,
156 item.m_Layer } ) );
157 }
158
159 return js;
160 },
161 [&] ( const nlohmann::json& aObj )
162 {
164
165 if( !aObj.is_array() )
166 return;
167
168 for( const nlohmann::json& entry : aObj )
169 {
170 if( entry.empty() || !entry.is_array() )
171 continue;
172
173 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
174
175 textInfo.m_Text = entry.at(0).get<wxString>();
176 textInfo.m_Visible = entry.at(1).get<bool>();
177 textInfo.m_Layer = entry.at(2).get<int>();
178
179 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
180 }
181 },
182 nlohmann::json::array( {
183 { "REF**", true, F_SilkS },
184 { "", true, F_Fab },
185 { "${REFERENCE}", true, F_Fab }
186 } ) ) );
187
188 int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
189 int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
190 int minStroke = 1;
191 int maxStroke = pcbIUScale.mmToIU( 100 );
192
193 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
195 pcbIUScale.mmToIU( DEFAULT_SILK_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
196
197 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
199 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
200
201 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
203 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
204
205 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
208
209 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
211
212 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
214 pcbIUScale.mmToIU( DEFAULT_COPPER_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
215
216 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
218 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
219
220 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
222 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
223
224 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
226 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
227
228 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
230
231 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
233 pcbIUScale.mmToIU( DEFAULT_EDGE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
234
235 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
237 pcbIUScale.mmToIU( DEFAULT_COURTYARD_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
238
239 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
241 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
242
243 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
245 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
246
247 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
249 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
250
251 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
254
255 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
257
258 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
260 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
261
262 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
264 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
265
266 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
268 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
269
270 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
273
274 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
276
277 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
278 [&]() -> nlohmann::json
279 {
280 nlohmann::json ret;
281
282 ret["lockedItems"] = m_SelectionFilter.lockedItems;
283 ret["footprints"] = m_SelectionFilter.footprints;
284 ret["text"] = m_SelectionFilter.text;
285 ret["tracks"] = m_SelectionFilter.tracks;
286 ret["vias"] = m_SelectionFilter.vias;
287 ret["pads"] = m_SelectionFilter.pads;
288 ret["graphics"] = m_SelectionFilter.graphics;
289 ret["zones"] = m_SelectionFilter.zones;
290 ret["keepouts"] = m_SelectionFilter.keepouts;
291 ret["dimensions"] = m_SelectionFilter.dimensions;
292 ret["otherItems"] = m_SelectionFilter.otherItems;
293
294 return ret;
295 },
296 [&]( const nlohmann::json& aVal )
297 {
298 if( aVal.empty() || !aVal.is_object() )
299 return;
300
301 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
302 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
303 SetIfPresent( aVal, "text", m_SelectionFilter.text );
304 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
305 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
306 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
307 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
308 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
309 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
310 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
311 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
312 },
313 {
314 { "lockedItems", false },
315 { "footprints", true },
316 { "text", true },
317 { "tracks", true },
318 { "vias", true },
319 { "pads", true },
320 { "graphics", true },
321 { "zones", true },
322 { "keepouts", true },
323 { "dimensions", true },
324 { "otherItems", true }
325 } ) );
326
328
329 registerMigration( 1, 2,
330 [&]() -> bool
331 {
332 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
333 return migrateLibTreeWidth();
334 } );
335}
336
337
339{
340 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
341
342 //
343 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
344 //
345 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
346 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
347 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
348
349 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
350 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
351 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
352
353 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
354 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
355 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
356
357 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
358 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
359 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
360 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
361 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
362 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
363 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
364 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
365 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
366 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
367 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
368 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
369 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
370 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
371 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
372 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
373 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
374
375 nlohmann::json textItems = nlohmann::json::array( {
376 { "REF**", true, F_SilkS },
377 { "", true, F_Fab }
378 } );
379
380 Set( "design_settings.default_footprint_text_items", std::move( textItems ) );
381
382 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
383 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
384 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
385 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
386 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
387 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
388
389
390 std::string f = "ModEdit";
391
392 // Migrate color settings that were stored in the pcbnew config file
393 // We create a copy of the user scheme for the footprint editor context
394
396 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
397
398 cs->SetName( wxT( "User (Footprints)" ) );
399 manager.Save( cs );
400
401 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
402 {
403 wxString str;
404
405 if( aCfg->Read( aKey, &str ) )
406 cs->SetColor( aLayerId, COLOR4D( str ) );
407 };
408
409 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
410 {
411 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
412 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
413 }
414
415 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
416 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
417 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
418 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
419 migrateLegacyColor( f + "Color4DPadThruHoleEx", LAYER_PADS_TH );
420 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
421 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
422 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
423 migrateLegacyColor( f + "Color4DTxtInvisEx", LAYER_HIDDEN_TEXT );
424 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
425 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
426 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
427 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
428
429 manager.SaveColorSettings( cs, "board" );
430
431 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
432
433 double x = 0, y = 0;
434 f = "ModEditFrame";
435
436 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
437 {
438 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
439 static_cast<long>( EDA_UNITS::INCHES ) ) );
440
441 // Convert to internal units
444
445 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
446 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
447 }
448
449 return ret;
450}
451
452
454{
462 if( !m_manager )
463 {
464 wxLogTrace( traceSettings,
465 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
466 return false;
467 }
468
469 std::string theme_ptr( "appearance.color_theme" );
470
471 if( !Contains( theme_ptr ) )
472 return true;
473
474 wxString selected = At( theme_ptr ).get<wxString>();
475 wxString search = selected + wxT( "_footprints" );
476
477 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
478 {
479 if( settings->GetFilename() == search )
480 {
481 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
482 selected, search );
483 Set( theme_ptr, search );
484 return true;
485 }
486 }
487
488 return true;
489}
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
@ LAYER_CLASS_OTHERS
@ LAYER_CLASS_FAB
@ LAYER_CLASS_COURTYARD
@ LAYER_CLASS_SILK
@ LAYER_CLASS_COPPER
@ LAYER_CLASS_EDGES
#define DEFAULT_SILK_TEXT_SIZE
#define DEFAULT_COPPER_LINE_WIDTH
#define DEFAULT_SILK_LINE_WIDTH
#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.
bool migrateLibTreeWidth()
Migrates the library tree width setting from a single column (Item) to multi-column.
std::vector< TEXT_ITEM_INFO > m_DefaultFPTextItems
int m_TextThickness[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
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
BOARD_DESIGN_SETTINGS m_DesignSettings
Only some of these settings are actually used for footprint editing.
std::vector< LAYER_PRESET > m_LayerPresets
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
PCB_SELECTION_FILTER_OPTIONS m_SelectionFilter
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
static bool SetIfPresent(const nlohmann::json &aObj, const std::string &aPath, wxString &aTarget)
Sets the given string if the given key/path is present.
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...
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:63
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:293
Represents a parameter that has a scaling factor between the value in the file and the value used int...
Definition: parameters.h:390
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
COLOR_SETTINGS * AddNewColorSettings(const wxString &aFilename)
Registers 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:46
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:47
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:209
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:201
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:221
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:224
@ LAYER_HIDDEN_TEXT
text marked as invisible
Definition: layer_ids.h:204
@ LAYER_CURSOR
PCB cursor.
Definition: layer_ids.h:225
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:226
@ LAYER_RATSNEST
Definition: layer_ids.h:208
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:205
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:217
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:198
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:200
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:199
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ F_Fab
Definition: layer_ids.h:120
@ F_SilkS
Definition: layer_ids.h:104
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:137
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:510
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)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:300
SETTINGS_MANAGER * GetSettingsManager()
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
const double MM_PER_IU
Definition: base_units.h:78
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
MAGNETIC_OPTIONS tracks
MAGNETIC_OPTIONS pads
bool otherItems
Anything not fitting one of the above categories.
bool graphics
Graphic lines, shapes, polygons.
bool footprints
Allow selecting entire footprints.
bool text
Text (free or attached to a footprint)
bool lockedItems
Allow selecting locked items.