155 [&]() -> nlohmann::json
157 nlohmann::json js = nlohmann::json::array();
161 js.push_back( nlohmann::json( { {
"lib", tab.m_lib.ToUTF8() },
162 {
"fp_name", tab.m_fpName.ToUTF8() },
163 {
"preview", tab.m_preview } } ) );
168 [&](
const nlohmann::json& aObj )
172 if( !aObj.is_array() )
175 for(
const nlohmann::json& entry : aObj )
177 if( !entry.is_object() || !entry.contains(
"lib" ) || !entry.contains(
"fp_name" ) )
181 tab.
m_lib = entry.at(
"lib" ).get<wxString>();
182 tab.
m_fpName = entry.at(
"fp_name" ).get<wxString>();
185 if( entry.contains(
"preview" ) )
186 tab.
m_preview = entry.at(
"preview" ).get<
bool>();
191 nlohmann::json::array() ) );
197 "design_settings.default_footprint_text_items",
198 [&] () -> nlohmann::json
200 nlohmann::json js = nlohmann::json::array();
204 js.push_back( nlohmann::json( { item.
m_Text.ToUTF8(),
211 [&] (
const nlohmann::json& aObj )
215 if( !aObj.is_array() )
218 for(
const nlohmann::json& entry : aObj )
220 if( entry.empty() || !entry.is_array() )
225 textInfo.
m_Text = entry.at(0).get<wxString>();
226 textInfo.
m_Visible = entry.at(1).get<
bool>();
227 wxString layerName = entry.at(2).get<wxString>();
229 textInfo.
m_Layer = candidateLayer >= 0
236 nlohmann::json::array( {
246 [
this]() { return m_DesignSettings.GetUserDefinedLayerCount(); },
247 [
this](
int aCount ) { m_DesignSettings.SetUserDefinedLayerCount( aCount ); },
376 [&]() -> nlohmann::json
380 ret[
"lockedItems"] = m_SelectionFilter.lockedItems;
381 ret[
"footprints"] = m_SelectionFilter.footprints;
382 ret[
"text"] = m_SelectionFilter.text;
383 ret[
"tracks"] = m_SelectionFilter.tracks;
384 ret[
"vias"] = m_SelectionFilter.vias;
385 ret[
"pads"] = m_SelectionFilter.pads;
386 ret[
"graphics"] = m_SelectionFilter.graphics;
387 ret[
"zones"] = m_SelectionFilter.zones;
388 ret[
"keepouts"] = m_SelectionFilter.keepouts;
389 ret[
"dimensions"] = m_SelectionFilter.dimensions;
390 ret[
"points"] = m_SelectionFilter.points;
391 ret[
"otherItems"] = m_SelectionFilter.otherItems;
395 [&](
const nlohmann::json& aVal )
397 if( aVal.empty() || !aVal.is_object() )
400 SetIfPresent( aVal,
"lockedItems", m_SelectionFilter.lockedItems );
401 SetIfPresent( aVal,
"footprints", m_SelectionFilter.footprints );
402 SetIfPresent( aVal,
"text", m_SelectionFilter.text );
403 SetIfPresent( aVal,
"tracks", m_SelectionFilter.tracks );
404 SetIfPresent( aVal,
"vias", m_SelectionFilter.vias );
405 SetIfPresent( aVal,
"pads", m_SelectionFilter.pads );
406 SetIfPresent( aVal,
"graphics", m_SelectionFilter.graphics );
407 SetIfPresent( aVal,
"zones", m_SelectionFilter.zones );
408 SetIfPresent( aVal,
"keepouts", m_SelectionFilter.keepouts );
409 SetIfPresent( aVal,
"dimensions", m_SelectionFilter.dimensions );
410 SetIfPresent( aVal,
"points", m_SelectionFilter.points );
411 SetIfPresent( aVal,
"otherItems", m_SelectionFilter.otherItems );
414 {
"lockedItems", false },
415 {
"footprints", true },
420 {
"graphics", true },
422 {
"keepouts", true },
423 {
"dimensions", true },
425 {
"otherItems", true }
430 registerMigration( 1, 2,
434 return migrateLibTreeWidth();
451 ret &=
fromLegacyString( aCfg,
"import_last_path",
"system.last_import_export_path" );
453 ret &=
fromLegacy<int>( aCfg,
"FpEditorMagneticPads",
"editing.magnetic_pads" );
454 ret &=
fromLegacy<bool>( aCfg,
"FpEditorDisplayPolarCoords",
"editing.polar_coords" );
455 ret &=
fromLegacy<int>( aCfg,
"FpEditorUse45DegreeGraphicSegments",
"editing.use_45_degree_graphic_segments" );
457 ret &=
fromLegacy<bool>( aCfg,
"FpEditorGraphicLinesDisplayMode",
"pcb_display.graphic_items_fill" );
458 ret &=
fromLegacy<bool>( aCfg,
"FpEditorPadDisplayMode",
"pcb_display.pad_fill" );
459 ret &=
fromLegacy<bool>( aCfg,
"FpEditorTextsDisplayMode",
"pcb_display.footprint_text" );
461 ret &=
fromLegacy<double>( aCfg,
"FpEditorSilkLineWidth",
"design_settings.silk_line_width" );
462 ret &=
fromLegacy<double>( aCfg,
"FpEditorSilkTextSizeH",
"design_settings.silk_text_size_h" );
463 ret &=
fromLegacy<double>( aCfg,
"FpEditorSilkTextSizeV",
"design_settings.silk_text_size_v" );
464 ret &=
fromLegacy<double>( aCfg,
"FpEditorSilkTextThickness",
"design_settings.silk_text_thickness" );
465 ret &=
fromLegacy<bool>( aCfg,
"FpEditorSilkTextItalic",
"design_settings.silk_text_italic" );
466 ret &=
fromLegacy<double>( aCfg,
"FpEditorCopperLineWidth",
"design_settings.copper_line_width" );
467 ret &=
fromLegacy<double>( aCfg,
"FpEditorCopperTextSizeH",
"design_settings.copper_text_size_h" );
468 ret &=
fromLegacy<double>( aCfg,
"FpEditorCopperTextSizeV",
"design_settings.copper_text_size_v" );
469 ret &=
fromLegacy<double>( aCfg,
"FpEditorCopperTextThickness",
"design_settings.copper_text_thickness" );
470 ret &=
fromLegacy<bool>( aCfg,
"FpEditorCopperTextItalic",
"design_settings.copper_text_italic" );
471 ret &=
fromLegacy<double>( aCfg,
"FpEditorEdgeCutLineWidth",
"design_settings.edge_line_width" );
472 ret &=
fromLegacy<double>( aCfg,
"FpEditorCourtyardLineWidth",
"design_settings.courtyard_line_width" );
473 ret &=
fromLegacy<double>( aCfg,
"FpEditorOthersLineWidth",
"design_settings.others_line_width" );
474 ret &=
fromLegacy<double>( aCfg,
"FpEditorOthersTextSizeH",
"design_settings.others_text_size_h" );
475 ret &=
fromLegacy<double>( aCfg,
"FpEditorOthersTextSizeV",
"design_settings.others_text_size_v" );
476 ret &=
fromLegacy<double>( aCfg,
"FpEditorOthersTextThickness",
"design_settings.others_text_thickness" );
477 ret &=
fromLegacy<bool>( aCfg,
"FpEditorOthersTextItalic",
"design_settings.others_text_italic" );
479 nlohmann::json textItems = nlohmann::json::array( {
484 Set(
"design_settings.default_footprint_text_items", std::move( textItems ) );
486 ret &=
fromLegacyString( aCfg,
"FpEditorRefDefaultText",
"design_settings.default_footprint_text_items.0.0" );
487 ret &=
fromLegacy<bool>( aCfg,
"FpEditorRefDefaultVisibility",
"design_settings.default_footprint_text_items.0.1" );
488 ret &=
fromLegacy<int>( aCfg,
"FpEditorRefDefaultLayer",
"design_settings.default_footprint_text_items.0.2" );
489 ret &=
fromLegacyString( aCfg,
"FpEditorValueDefaultText",
"design_settings.default_footprint_text_items.1.0" );
490 ret &=
fromLegacy<bool>( aCfg,
"FpEditorValueDefaultVisibility",
"design_settings.default_footprint_text_items.1.1" );
491 ret &=
fromLegacy<int>( aCfg,
"FpEditorValueDefaultLayer",
"design_settings.default_footprint_text_items.1.2" );
494 std::string f =
"ModEdit";
502 cs->
SetName( wxT(
"User (Footprints)" ) );
505 auto migrateLegacyColor = [&] (
const std::string& aKey,
int aLayerId )
509 if( aCfg->Read( aKey, &str ) )
516 migrateLegacyColor( f +
"Color4DPCBLayer_" + layer.ToStdString(),
PCB_LAYER_ID( i ) );
519 migrateLegacyColor( f +
"Color4DAnchorEx",
LAYER_ANCHOR );
521 migrateLegacyColor( f +
"Color4DGrid",
LAYER_GRID );
524 migrateLegacyColor( f +
"Color4DPCBCursor",
LAYER_CURSOR );
534 ( *m_internals )[
m_internals->PointerFromString(
"appearance.color_theme" )] =
"user_footprints";
539 if( aCfg->Read( f +
"PcbUserGrid_X", &x ) && aCfg->Read( f +
"PcbUserGrid_Y", &y ) )
568 wxT(
"Error: FOOTPRINT_EDITOR_SETTINGS migration cannot run unmanaged!" ) );
572 std::string theme_ptr(
"appearance.color_theme" );
577 wxString selected =
At( theme_ptr ).get<wxString>();
578 wxString search = selected + wxT(
"_footprints" );
580 for(
COLOR_SETTINGS* settings :
Pgm().GetSettingsManager().GetColorSettingsList() )
582 if( settings->GetFilename() == search )
584 wxLogTrace(
traceSettings, wxT(
"Updating footprint editor theme from %s to %s" ),
586 Set( theme_ptr, search );
601 auto p(
"/pcb_display/layer_presets"_json_pointer );
608 for( nlohmann::json& entry : presets )
620 auto p(
"/pcb_display/layer_presets"_json_pointer );
627 for( nlohmann::json& entry : presets )
639 auto p(
"/design_settings/default_footprint_text_items"_json_pointer );
648 for( nlohmann::json& entry : defaults )
652 textInfo.
m_Text = entry.at(0).get<wxString>();
653 textInfo.
m_Visible = entry.at(1).get<
bool>();
671 defaults = nlohmann::json::array( {
ARC_EDIT_MODE
Settings for arc editing.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
constexpr EDA_IU_SCALE pcbIUScale
#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
#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.
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)
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
bool fromLegacy(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
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.
static int NameToLayer(wxString &aName)
Return the layer number from a layer name.
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Stores an enum as an integer.
Like a normal param, but with custom getter and setter functions.
static void MigrateToV9Layers(nlohmann::json &aJson)
static void MigrateToNamedRenderLayers(nlohmann::json &aJson)
Represents a map of <std::string, Value>.
Represents a parameter that has a scaling factor between the value in the file and the value used int...
PCB_VIEWERS_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
virtual SETTINGS_MANAGER & GetSettingsManager() const
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.
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
static constexpr EDA_ANGLE ANGLE_90
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
LEADER_MODE
The kind of the leader line.
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
@ LAYER_PCB_BACKGROUND
PCB background color.
@ LAYER_CURSOR
PCB cursor.
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc).
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
@ LAYER_VIA_BURIED
Draw blind vias.
@ LAYER_VIA_BLIND
Draw micro vias.
@ LAYER_VIA_THROUGH
Draw buried vias.
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Return the string from aValue according to aUnits (inch, mm ...) for display.
@ OUTSIDE
Text appears outside the dimension line (default)
@ INLINE
Text appears in line with the dimension line.
PGM_BASE & Pgm()
The global program "get" accessor.
void AddSnapInferenceParams(std::vector< PARAM_BASE * > &aParams, SNAP_INFERENCE_SETTINGS &aSettings)
Register the snap inference parameters.