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 <pgm_base.h>
25#include <eda_text.h>
28#include <settings/parameters.h>
30#include <wx/config.h>
31#include <base_units.h>
32#include <wx/log.h>
33
34
36const int fpEditSchemaVersion = 2;
37
38
41 m_DesignSettings( nullptr, "fpedit.settings" ),
42 m_MagneticItems(),
43 m_Display(),
44 m_UserGrid(),
45 m_PolarCoords( false ),
46 m_DisplayInvertXAxis( false ),
47 m_DisplayInvertYAxis( false ),
48 m_RotationAngle( ANGLE_90 ),
49 m_Use45Limit( true ),
51 m_LibWidth( 250 ),
52 m_LastExportPath(),
53 m_FootprintTextShownColumns()
54{
55 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
56 m_MagneticItems.tracks = MAGNETIC_OPTIONS::NO_EFFECT;
59
63
64 m_params.emplace_back( new PARAM<int>( "window.lib_width",
65 &m_LibWidth, 250 ) );
66
67 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
69
70 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
72
73 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
75
76 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
78
79 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
81
82 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
83 &m_AuiPanels.show_properties, false ) );
84
85 m_params.emplace_back( new PARAM<int>( "library.sort_mode",
86 &m_LibrarySortMode, 0 ) );
87
88 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
89 &m_LastExportPath, "" ) );
90
91 m_params.emplace_back( new PARAM<bool>( "pcb_display.graphics_fill",
93
94 m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
96
97 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_fill",
99
100 m_params.emplace_back( new PARAM<bool>( "pcb_display.pad_numbers",
102
103 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
104 &m_FootprintTextShownColumns, "0 1 2 3 4 5 7" ) );
105
106 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
107 reinterpret_cast<int*>( &m_MagneticItems.pads ),
108 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
109
110 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
111 &m_MagneticItems.graphics, true ) );
112
113 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_all_layers",
114 &m_MagneticItems.allLayers, false ) );
115
116 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
117 &m_PolarCoords, false ) );
118
119 m_params.emplace_back( new PARAM<bool>( "origin_invert_x_axis",
120 &m_DisplayInvertXAxis, false ) );
121
122 m_params.emplace_back( new PARAM<bool>( "origin_invert_y_axis",
123 &m_DisplayInvertYAxis, false ) );
124
125 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
126 [this] () -> int
127 {
129 },
130 [this] ( int aVal )
131 {
132 if( aVal )
134 },
135 900 ) );
136
137 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
138 &m_Use45Limit, false ) );
139
140 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
141
142 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
143 &m_ActiveLayerPreset, "" ) );
144
145 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
146 "design_settings.default_footprint_text_items",
147 [&] () -> nlohmann::json
148 {
149 nlohmann::json js = nlohmann::json::array();
150
152 {
153 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
154 item.m_Visible,
155 item.m_Layer } ) );
156 }
157
158 return js;
159 },
160 [&] ( const nlohmann::json& aObj )
161 {
163
164 if( !aObj.is_array() )
165 return;
166
167 for( const nlohmann::json& entry : aObj )
168 {
169 if( entry.empty() || !entry.is_array() )
170 continue;
171
172 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
173
174 textInfo.m_Text = entry.at(0).get<wxString>();
175 textInfo.m_Visible = entry.at(1).get<bool>();
176 textInfo.m_Layer = entry.at(2).get<int>();
177
178 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
179 }
180 },
181 nlohmann::json::array( {
182 { "REF**", true, F_SilkS },
183 { "", true, F_Fab },
184 { "${REFERENCE}", true, F_Fab }
185 } ) ) );
186
187 int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
188 int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
189 int minStroke = 1;
190 int maxStroke = pcbIUScale.mmToIU( 100 );
191
192 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
194 pcbIUScale.mmToIU( DEFAULT_SILK_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
195
196 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
198 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
199
200 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
202 pcbIUScale.mmToIU( DEFAULT_SILK_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
203
204 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
207
208 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
210
211 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
213 pcbIUScale.mmToIU( DEFAULT_COPPER_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
214
215 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
217 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
218
219 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
221 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
222
223 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
225 pcbIUScale.mmToIU( DEFAULT_COPPER_TEXT_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
226
227 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
229
230 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
232 pcbIUScale.mmToIU( DEFAULT_EDGE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
233
234 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
236 pcbIUScale.mmToIU( DEFAULT_COURTYARD_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
237
238 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
240 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
241
242 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
244 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
245
246 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
248 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
249
250 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
253
254 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
256
257 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
259 pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), minStroke, maxStroke, pcbIUScale.MM_PER_IU ) );
260
261 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
263 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
264
265 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
267 pcbIUScale.mmToIU( DEFAULT_TEXT_SIZE ), minTextSize, maxTextSize, pcbIUScale.MM_PER_IU ) );
268
269 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
272
273 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
275
276 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
277 [&]() -> nlohmann::json
278 {
279 nlohmann::json ret;
280
281 ret["lockedItems"] = m_SelectionFilter.lockedItems;
282 ret["footprints"] = m_SelectionFilter.footprints;
283 ret["text"] = m_SelectionFilter.text;
284 ret["tracks"] = m_SelectionFilter.tracks;
285 ret["vias"] = m_SelectionFilter.vias;
286 ret["pads"] = m_SelectionFilter.pads;
287 ret["graphics"] = m_SelectionFilter.graphics;
288 ret["zones"] = m_SelectionFilter.zones;
289 ret["keepouts"] = m_SelectionFilter.keepouts;
290 ret["dimensions"] = m_SelectionFilter.dimensions;
291 ret["otherItems"] = m_SelectionFilter.otherItems;
292
293 return ret;
294 },
295 [&]( const nlohmann::json& aVal )
296 {
297 if( aVal.empty() || !aVal.is_object() )
298 return;
299
300 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
301 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
302 SetIfPresent( aVal, "text", m_SelectionFilter.text );
303 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
304 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
305 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
306 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
307 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
308 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
309 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
310 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
311 },
312 {
313 { "lockedItems", false },
314 { "footprints", true },
315 { "text", true },
316 { "tracks", true },
317 { "vias", true },
318 { "pads", true },
319 { "graphics", true },
320 { "zones", true },
321 { "keepouts", true },
322 { "dimensions", true },
323 { "otherItems", true }
324 } ) );
325
327
328 registerMigration( 1, 2,
329 [&]() -> bool
330 {
331 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
332 return migrateLibTreeWidth();
333 } );
334}
335
336
338{
339 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
340
341 //
342 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
343 //
344 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
345 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
346 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
347
348 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
349 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
350 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
351
352 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
353 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
354 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
355
356 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
357 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
358 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
359 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
360 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
361 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
362 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
363 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
364 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
365 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
366 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
367 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
368 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
369 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
370 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
371 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
372 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
373
374 nlohmann::json textItems = nlohmann::json::array( {
375 { "REF**", true, F_SilkS },
376 { "", true, F_Fab }
377 } );
378
379 Set( "design_settings.default_footprint_text_items", std::move( textItems ) );
380
381 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
382 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
383 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
384 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
385 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
386 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
387
388
389 std::string f = "ModEdit";
390
391 // Migrate color settings that were stored in the pcbnew config file
392 // We create a copy of the user scheme for the footprint editor context
393
395 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
396
397 cs->SetName( wxT( "User (Footprints)" ) );
398 manager.Save( cs );
399
400 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
401 {
402 wxString str;
403
404 if( aCfg->Read( aKey, &str ) )
405 cs->SetColor( aLayerId, COLOR4D( str ) );
406 };
407
408 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
409 {
410 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
411 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
412 }
413
414 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
415 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
416 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
417 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
418 migrateLegacyColor( f + "Color4DPadThruHoleEx", LAYER_PADS_TH );
419 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
420 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
421 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
422 migrateLegacyColor( f + "Color4DTxtInvisEx", LAYER_HIDDEN_TEXT );
423 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
424 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
425 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
426 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
427
428 manager.SaveColorSettings( cs, "board" );
429
430 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
431
432 double x = 0, y = 0;
433 f = "ModEditFrame";
434
435 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
436 {
437 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
438 static_cast<long>( EDA_UNITS::INCHES ) ) );
439
440 // Convert to internal units
443
444 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
445 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
446 }
447
448 return ret;
449}
450
451
453{
461 if( !m_manager )
462 {
463 wxLogTrace( traceSettings,
464 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
465 return false;
466 }
467
468 std::string theme_ptr( "appearance.color_theme" );
469
470 if( !Contains( theme_ptr ) )
471 return true;
472
473 wxString selected = At( theme_ptr ).get<wxString>();
474 wxString search = selected + wxT( "_footprints" );
475
476 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
477 {
478 if( settings->GetFilename() == search )
479 {
480 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
481 selected, search );
482 Set( theme_ptr, search );
483 return true;
484 }
485 }
486
487 return true;
488}
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:89
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:45
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:46
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.