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-2022 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>
27#include <settings/parameters.h>
29#include <wx/config.h>
30#include <base_units.h>
31#include <widgets/ui_common.h>
32#include <wx/log.h>
33#include <pcbnew.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_RotationAngle( ANGLE_90 ),
48 m_Use45Limit( true ),
50 m_LibWidth( 250 ),
51 m_LastImportExportPath(),
52 m_FootprintTextShownColumns()
53{
54 m_MagneticItems.pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
55 m_MagneticItems.tracks = MAGNETIC_OPTIONS::NO_EFFECT;
57
61
62 m_params.emplace_back( new PARAM<int>( "window.lib_width",
63 &m_LibWidth, 250 ) );
64
65 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
67
68 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
70
71 m_params.emplace_back( new PARAM<int>( "aui.appearance_panel_tab",
73
74 m_params.emplace_back( new PARAM<int>( "aui.properties_panel_width",
76
77 m_params.emplace_back( new PARAM<float>( "aui.properties_splitter_proportion",
79
80 m_params.emplace_back( new PARAM<bool>( "aui.show_properties",
81 &m_AuiPanels.show_properties, false ) );
82
83 m_params.emplace_back( new PARAM<int>( "library.sort_mode",
84 &m_LibrarySortMode, 0 ) );
85
86 m_params.emplace_back( new PARAM<wxString>( "system.last_import_export_path",
88
89 m_params.emplace_back( new PARAM<wxString>( "window.footprint_text_shown_columns",
90 &m_FootprintTextShownColumns, "0 1 2 3 4 5 6" ) );
91
92 m_params.emplace_back( new PARAM<int>( "editing.magnetic_pads",
93 reinterpret_cast<int*>( &m_MagneticItems.pads ),
94 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_ALWAYS ) ) );
95
96 m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
97 &m_MagneticItems.graphics, true ) );
98
99 m_params.emplace_back( new PARAM<bool>( "editing.polar_coords",
100 &m_PolarCoords, false ) );
101
102 m_params.emplace_back( new PARAM_LAMBDA<int>( "editing.rotation_angle",
103 [this] () -> int
104 {
106 },
107 [this] ( int aVal )
108 {
109 if( aVal )
111 },
112 900 ) );
113
114 m_params.emplace_back( new PARAM<bool>( "editing.fp_use_45_degree_limit",
115 &m_Use45Limit, false ) );
116
117 m_params.emplace_back( new PARAM_LAYER_PRESET( "pcb_display.layer_presets", &m_LayerPresets ) );
118
119 m_params.emplace_back( new PARAM<wxString>( "pcb_display.active_layer_preset",
120 &m_ActiveLayerPreset, "" ) );
121
122 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
123 "design_settings.default_footprint_text_items",
124 [&] () -> nlohmann::json
125 {
126 nlohmann::json js = nlohmann::json::array();
127
129 {
130 js.push_back( nlohmann::json( { item.m_Text.ToUTF8(),
131 item.m_Visible,
132 item.m_Layer } ) );
133 }
134
135 return js;
136 },
137 [&] ( const nlohmann::json& aObj )
138 {
140
141 if( !aObj.is_array() )
142 return;
143
144 for( const nlohmann::json& entry : aObj )
145 {
146 if( entry.empty() || !entry.is_array() )
147 continue;
148
149 TEXT_ITEM_INFO textInfo( wxT( "" ), true, F_SilkS );
150
151 textInfo.m_Text = entry.at(0).get<wxString>();
152 textInfo.m_Visible = entry.at(1).get<bool>();
153 textInfo.m_Layer = entry.at(2).get<int>();
154
155 m_DesignSettings.m_DefaultFPTextItems.push_back( std::move( textInfo ) );
156 }
157 },
158 nlohmann::json::array( {
159 { "REF**", true, F_SilkS },
160 { "", true, F_Fab },
161 { "${REFERENCE}", true, F_Fab }
162 } ) ) );
163
164 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_line_width",
168
169 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_h",
172
173 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_size_v",
176
177 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.silk_text_thickness",
180
181 m_params.emplace_back( new PARAM<bool>( "design_settings.silk_text_italic",
183
184 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_line_width",
188
189 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_h",
193
194 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_size_v",
198
199 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.copper_text_thickness",
203
204 m_params.emplace_back( new PARAM<bool>( "design_settings.copper_text_italic",
206
207 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.edge_line_width",
211
212 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.courtyard_line_width",
216
217 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_line_width",
221
222 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_h",
225
226 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_size_v",
229
230 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.fab_text_thickness",
233
234 m_params.emplace_back( new PARAM<bool>( "design_settings.fab_text_italic",
236
237 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_line_width",
241
242 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_h",
245
246 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_size_v",
249
250 m_params.emplace_back( new PARAM_SCALED<int>( "design_settings.others_text_thickness",
253
254 m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
256
257 m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
258 [&]() -> nlohmann::json
259 {
260 nlohmann::json ret;
261
262 ret["lockedItems"] = m_SelectionFilter.lockedItems;
263 ret["footprints"] = m_SelectionFilter.footprints;
264 ret["text"] = m_SelectionFilter.text;
265 ret["tracks"] = m_SelectionFilter.tracks;
266 ret["vias"] = m_SelectionFilter.vias;
267 ret["pads"] = m_SelectionFilter.pads;
268 ret["graphics"] = m_SelectionFilter.graphics;
269 ret["zones"] = m_SelectionFilter.zones;
270 ret["keepouts"] = m_SelectionFilter.keepouts;
271 ret["dimensions"] = m_SelectionFilter.dimensions;
272 ret["otherItems"] = m_SelectionFilter.otherItems;
273
274 return ret;
275 },
276 [&]( const nlohmann::json& aVal )
277 {
278 if( aVal.empty() || !aVal.is_object() )
279 return;
280
281 SetIfPresent( aVal, "lockedItems", m_SelectionFilter.lockedItems );
282 SetIfPresent( aVal, "footprints", m_SelectionFilter.footprints );
283 SetIfPresent( aVal, "text", m_SelectionFilter.text );
284 SetIfPresent( aVal, "tracks", m_SelectionFilter.tracks );
285 SetIfPresent( aVal, "vias", m_SelectionFilter.vias );
286 SetIfPresent( aVal, "pads", m_SelectionFilter.pads );
287 SetIfPresent( aVal, "graphics", m_SelectionFilter.graphics );
288 SetIfPresent( aVal, "zones", m_SelectionFilter.zones );
289 SetIfPresent( aVal, "keepouts", m_SelectionFilter.keepouts );
290 SetIfPresent( aVal, "dimensions", m_SelectionFilter.dimensions );
291 SetIfPresent( aVal, "otherItems", m_SelectionFilter.otherItems );
292 },
293 {
294 { "lockedItems", false },
295 { "footprints", true },
296 { "text", true },
297 { "tracks", true },
298 { "vias", true },
299 { "pads", true },
300 { "graphics", true },
301 { "zones", true },
302 { "keepouts", true },
303 { "dimensions", true },
304 { "otherItems", true }
305 } ) );
306
308
309 registerMigration( 1, 2,
310 [&]() -> bool
311 {
312 // This is actually a migration for APP_SETTINGS_BASE::m_LibTree
313 return migrateLibTreeWidth();
314 } );
315}
316
317
319{
320 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
321
322 //
323 // NOTE: there's no value in line-wrapping these; it just makes the table unreadable.
324 //
325 ret &= fromLegacy<int>( aCfg, "ModeditLibWidth", "window.lib_width" );
326 ret &= fromLegacyString( aCfg, "import_last_path", "system.last_import_export_path" );
327 ret &= fromLegacyString( aCfg, "LibFootprintTextShownColumns", "window.footprint_text_shown_columns" );
328
329 ret &= fromLegacy<int>( aCfg, "FpEditorMagneticPads", "editing.magnetic_pads" );
330 ret &= fromLegacy<bool>( aCfg, "FpEditorDisplayPolarCoords", "editing.polar_coords" );
331 ret &= fromLegacy<int>( aCfg, "FpEditorUse45DegreeGraphicSegments", "editing.use_45_degree_graphic_segments" );
332
333 ret &= fromLegacy<bool>( aCfg, "FpEditorGraphicLinesDisplayMode", "pcb_display.graphic_items_fill" );
334 ret &= fromLegacy<bool>( aCfg, "FpEditorPadDisplayMode", "pcb_display.pad_fill" );
335 ret &= fromLegacy<bool>( aCfg, "FpEditorTextsDisplayMode", "pcb_display.footprint_text" );
336
337 ret &= fromLegacy<double>( aCfg, "FpEditorSilkLineWidth", "design_settings.silk_line_width" );
338 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeH", "design_settings.silk_text_size_h" );
339 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextSizeV", "design_settings.silk_text_size_v" );
340 ret &= fromLegacy<double>( aCfg, "FpEditorSilkTextThickness", "design_settings.silk_text_thickness" );
341 ret &= fromLegacy<bool>( aCfg, "FpEditorSilkTextItalic", "design_settings.silk_text_italic" );
342 ret &= fromLegacy<double>( aCfg, "FpEditorCopperLineWidth", "design_settings.copper_line_width" );
343 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeH", "design_settings.copper_text_size_h" );
344 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextSizeV", "design_settings.copper_text_size_v" );
345 ret &= fromLegacy<double>( aCfg, "FpEditorCopperTextThickness", "design_settings.copper_text_thickness" );
346 ret &= fromLegacy<bool>( aCfg, "FpEditorCopperTextItalic", "design_settings.copper_text_italic" );
347 ret &= fromLegacy<double>( aCfg, "FpEditorEdgeCutLineWidth", "design_settings.edge_line_width" );
348 ret &= fromLegacy<double>( aCfg, "FpEditorCourtyardLineWidth", "design_settings.courtyard_line_width" );
349 ret &= fromLegacy<double>( aCfg, "FpEditorOthersLineWidth", "design_settings.others_line_width" );
350 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeH", "design_settings.others_text_size_h" );
351 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextSizeV", "design_settings.others_text_size_v" );
352 ret &= fromLegacy<double>( aCfg, "FpEditorOthersTextThickness", "design_settings.others_text_thickness" );
353 ret &= fromLegacy<bool>( aCfg, "FpEditorOthersTextItalic", "design_settings.others_text_italic" );
354
355 nlohmann::json textItems = nlohmann::json::array( {
356 { "REF**", true, F_SilkS },
357 { "", true, F_Fab }
358 } );
359
360 Set( "design_settings.default_footprint_text_items", textItems );
361
362 ret &= fromLegacyString( aCfg, "FpEditorRefDefaultText", "design_settings.default_footprint_text_items.0.0" );
363 ret &= fromLegacy<bool>( aCfg, "FpEditorRefDefaultVisibility", "design_settings.default_footprint_text_items.0.1" );
364 ret &= fromLegacy<int>( aCfg, "FpEditorRefDefaultLayer", "design_settings.default_footprint_text_items.0.2" );
365 ret &= fromLegacyString( aCfg, "FpEditorValueDefaultText", "design_settings.default_footprint_text_items.1.0" );
366 ret &= fromLegacy<bool>( aCfg, "FpEditorValueDefaultVisibility", "design_settings.default_footprint_text_items.1.1" );
367 ret &= fromLegacy<int>( aCfg, "FpEditorValueDefaultLayer", "design_settings.default_footprint_text_items.1.2" );
368
369
370 std::string f = "ModEdit";
371
372 // Migrate color settings that were stored in the pcbnew config file
373 // We create a copy of the user scheme for the footprint editor context
374
375 SETTINGS_MANAGER& manager = Pgm().GetSettingsManager();
376 COLOR_SETTINGS* cs = manager.AddNewColorSettings( "user_footprints" );
377
378 cs->SetName( wxT( "User (Footprints)" ) );
379 manager.Save( cs );
380
381 auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId )
382 {
383 wxString str;
384
385 if( aCfg->Read( aKey, &str ) )
386 cs->SetColor( aLayerId, COLOR4D( str ) );
387 };
388
389 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
390 {
391 wxString layer = LSET::Name( PCB_LAYER_ID( i ) );
392 migrateLegacyColor( f + "Color4DPCBLayer_" + layer.ToStdString(), PCB_LAYER_ID( i ) );
393 }
394
395 migrateLegacyColor( f + "Color4DAnchorEx", LAYER_ANCHOR );
396 migrateLegacyColor( f + "Color4DAuxItems", LAYER_AUX_ITEMS );
397 migrateLegacyColor( f + "Color4DGrid", LAYER_GRID );
398 migrateLegacyColor( f + "Color4DNonPlatedEx", LAYER_NON_PLATEDHOLES );
399 migrateLegacyColor( f + "Color4DPadThruHoleEx", LAYER_PADS_TH );
400 migrateLegacyColor( f + "Color4DPCBBackground", LAYER_PCB_BACKGROUND );
401 migrateLegacyColor( f + "Color4DPCBCursor", LAYER_CURSOR );
402 migrateLegacyColor( f + "Color4DRatsEx", LAYER_RATSNEST );
403 migrateLegacyColor( f + "Color4DTxtInvisEx", LAYER_MOD_TEXT_INVISIBLE );
404 migrateLegacyColor( f + "Color4DViaBBlindEx", LAYER_VIA_BBLIND );
405 migrateLegacyColor( f + "Color4DViaMicroEx", LAYER_VIA_MICROVIA );
406 migrateLegacyColor( f + "Color4DViaThruEx", LAYER_VIA_THROUGH );
407 migrateLegacyColor( f + "Color4DWorksheet", LAYER_DRAWINGSHEET );
408
409 manager.SaveColorSettings( cs, "board" );
410
411 ( *m_internals )[m_internals->PointerFromString( "appearance.color_theme" )] = "user_footprints";
412
413 double x = 0, y = 0;
414 f = "ModEditFrame";
415
416 if( aCfg->Read( f + "PcbUserGrid_X", &x ) && aCfg->Read( f + "PcbUserGrid_Y", &y ) )
417 {
418 EDA_UNITS u = static_cast<EDA_UNITS>( aCfg->ReadLong( f + "PcbUserGrid_Unit",
419 static_cast<long>( EDA_UNITS::INCHES ) ) );
420
421 // Convert to internal units
424
425 Set( "window.grid.user_grid_x", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, x ) );
426 Set( "window.grid.user_grid_y", EDA_UNIT_UTILS::UI::StringFromValue( pcbIUScale, u, y ) );
427 }
428
429 return ret;
430}
431
432
434{
442 if( !m_manager )
443 {
444 wxLogTrace( traceSettings,
445 wxT( "Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
446 return false;
447 }
448
449 std::string theme_ptr( "appearance.color_theme" );
450
451 if( !Contains( theme_ptr ) )
452 return true;
453
454 wxString selected = At( theme_ptr ).get<wxString>();
455 wxString search = selected + wxT( "_footprints" );
456
457 for( COLOR_SETTINGS* settings : Pgm().GetSettingsManager().GetColorSettingsList() )
458 {
459 if( settings->GetFilename() == search )
460 {
461 wxLogTrace( traceSettings, wxT( "Updating footprint editor theme from %s to %s" ),
462 selected, search );
463 Set( theme_ptr, search );
464 return true;
465 }
466 }
467
468 return true;
469}
ARC_EDIT_MODE
Settings for arc editing.
Definition: app_settings.h:70
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
#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
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:110
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:151
BOARD_DESIGN_SETTINGS m_DesignSettings
Only some of these settings are actually used for footprint editing.
std::vector< LAYER_PRESET > m_LayerPresets
SELECTION_FILTER_OPTIONS m_SelectionFilter
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.
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...
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...
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:82
Like a normal param, but with custom getter and setter functions.
Definition: parameters.h:282
Represents a parameter that has a scaling factor between the value in the file and the value used int...
Definition: parameters.h:335
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.
@ TENTHS_OF_A_DEGREE_T
Definition: eda_angle.h:30
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:431
EDA_UNITS
Definition: eda_units.h:43
const int fpEditSchemaVersion
! Update the schema version whenever a migration is required
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.
@ LAYER_GRID
Definition: layer_ids.h:205
@ LAYER_MOD_TEXT_INVISIBLE
text marked as invisible
Definition: layer_ids.h:200
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:197
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:217
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:220
@ LAYER_CURSOR
PCB cursor.
Definition: layer_ids.h:221
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
Definition: layer_ids.h:222
@ LAYER_RATSNEST
Definition: layer_ids.h:204
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:201
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:213
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:194
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:196
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:195
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ F_Fab
Definition: layer_ids.h:120
@ F_SilkS
Definition: layer_ids.h:104
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:137
double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".
Definition: eda_units.cpp:385
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:225
#define TEXTS_MAX_SIZE
Maximum text size in internal units (10 inches)
Definition: pcbnew.h:32
#define TEXTS_MIN_SIZE
Minimum text size in internal units (1 mil)
Definition: pcbnew.h:31
#define TEXTS_MAX_WIDTH
Maximum text width in internal units (10 inches)
Definition: pcbnew.h:33
SETTINGS_MANAGER * GetSettingsManager()
see class PGM_BASE
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:115
const double MM_PER_IU
Definition: base_units.h:79
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
MAGNETIC_OPTIONS tracks
MAGNETIC_OPTIONS pads
bool graphics
Graphic lines, shapes, polygons.
bool text
Text (free or attached to a footprint)
bool lockedItems
Allow selecting locked items.
bool footprints
Allow selecting entire footprints.
bool dimensions
Dimension items.
bool otherItems
Anything not fitting one of the above categories.
Functions to provide common constants and other functions to assist in making a consistent UI.