91 [&]() -> nlohmann::json
93 nlohmann::json ret = nlohmann::json::array();
96 ret.push_back( libName );
100 [&](
const nlohmann::json& aJson )
102 if( aJson.empty() || !aJson.is_array() )
107 for(
const nlohmann::json& entry : aJson )
111 m_NetSettings = std::make_shared<NET_SETTINGS>(
this,
"net_settings" );
114 std::make_shared<COMPONENT_CLASS_SETTINGS>(
this,
"component_class_settings" );
117 std::make_shared<TIME_DOMAIN_PARAMETERS>(
this,
"time_domain_parameters" );
150 auto p(
"/board/layer_presets"_json_pointer );
157 for( nlohmann::json& entry : presets )
168 auto p(
"/board/layer_presets"_json_pointer );
175 for( nlohmann::json& entry : presets )
190 std::set<wxString> group_blacklist;
197 auto loadPinnedLibs =
198 [&](
const std::string& aDest )
201 wxString libKey = wxT(
"PinnedItems" );
204 nlohmann::json libs = nlohmann::json::array();
206 while( aCfg->Read( libKey, &str ) )
208 libs.push_back( str );
210 aCfg->DeleteEntry( libKey,
true );
212 libKey = wxT(
"PinnedItems" );
213 libKey << ++libIndex;
219 aCfg->SetPath( wxT(
"/LibeditFrame" ) );
220 loadPinnedLibs(
"libraries.pinned_symbol_libs" );
222 aCfg->SetPath( wxT(
"/ModEditFrame" ) );
223 loadPinnedLibs(
"libraries.pinned_footprint_libs" );
225 aCfg->SetPath( wxT(
"/cvpcb/equfiles" ) );
229 wxString eqKey = wxT(
"EquName" );
232 nlohmann::json eqs = nlohmann::json::array();
234 while( aCfg->Read( eqKey, &str ) )
236 eqs.push_back( str );
238 eqKey = wxT(
"EquName" );
242 Set(
"cvpcb.equivalence_files", eqs );
246 group_blacklist.insert( wxT(
"/cvpcb" ) );
248 aCfg->SetPath( wxT(
"/eeschema" ) );
251 aCfg->SetPath( wxT(
"/eeschema/libraries" ) );
255 wxString libKey = wxT(
"LibName" );
258 nlohmann::json libs = nlohmann::json::array();
260 while( aCfg->Read( libKey, &str ) )
262 libs.push_back( str );
264 libKey = wxT(
"LibName" );
268 Set(
"schematic.legacy_lib_list", libs );
271 group_blacklist.insert( wxT(
"/eeschema" ) );
273 aCfg->SetPath( wxT(
"/text_variables" ) );
280 nlohmann::json vars = nlohmann::json();
282 while( aCfg->Read( txtKey, &str ) )
284 wxArrayString tokens = wxSplit( str,
':' );
286 if( tokens.size() == 2 )
287 vars[ tokens[0].ToStdString() ] = tokens[1];
293 Set(
"text_variables", vars );
296 group_blacklist.insert( wxT(
"/text_variables" ) );
298 aCfg->SetPath( wxT(
"/schematic_editor" ) );
300 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"schematic.page_layout_descr_file" );
303 fromLegacy<bool>( aCfg,
"SpiceAjustPassiveValues",
"schematic.spice_adjust_passive_values" );
304 fromLegacy<int>( aCfg,
"SubpartIdSeparator",
"schematic.subpart_id_separator" );
305 fromLegacy<int>( aCfg,
"SubpartFirstId",
"schematic.subpart_first_id" );
307 fromLegacy<int>( aCfg,
"LineThickness",
"schematic.drawing.default_line_thickness" );
308 fromLegacy<int>( aCfg,
"WireThickness",
"schematic.drawing.default_wire_thickness" );
309 fromLegacy<int>( aCfg,
"BusThickness",
"schematic.drawing.default_bus_thickness" );
310 fromLegacy<int>( aCfg,
"LabSize",
"schematic.drawing.default_text_size" );
312 if( !
fromLegacy<int>( aCfg,
"PinSymbolSize",
"schematic.drawing.pin_symbol_size" ) )
315 Set(
"schematic.drawing.pin_symbol_size", 0 );
318 fromLegacy<int>( aCfg,
"JunctionSize",
"schematic.drawing.default_junction_size" );
320 fromLegacyString( aCfg,
"FieldNameTemplates",
"schematic.drawing.field_names" );
322 if( !
fromLegacy<double>( aCfg,
"TextOffsetRatio",
"schematic.drawing.text_offset_ratio" ) )
325 Set(
"schematic.drawing.text_offset_ratio", 0.08 );
326 Set(
"schematic.drawing.label_size_ratio", 0.25 );
330 group_blacklist.insert( wxT(
"/schematic_editor" ) );
332 aCfg->SetPath( wxT(
"/pcbnew" ) );
334 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"pcbnew.page_layout_descr_file" );
339 fromLegacyString( aCfg,
"LastSpecctraDSNExportPath",
"pcbnew.last_paths.specctra_dsn" );
340 fromLegacyString( aCfg,
"LastGenCADExportPath",
"pcbnew.last_paths.gencad" );
342 std::string bp =
"board.design_settings.";
346 wxString key = wxT(
"DRCExclusion" );
349 nlohmann::json exclusions = nlohmann::json::array();
351 while( aCfg->Read( key, &str ) )
353 exclusions.push_back( str );
355 key = wxT(
"DRCExclusion" );
359 Set( bp +
"drc_exclusions", exclusions );
363 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
369 if( !
fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
372 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
375 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
376 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
378 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
379 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
382 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
390 if( !
fromLegacy<double>( aCfg,
"SilkTextSizeThickness", bp +
"defaults.silk_text_thickness" ) )
391 fromLegacy<double>( aCfg,
"ModuleTextSizeThickness", bp +
"defaults.silk_text_thickness" );
393 fromLegacy<bool>( aCfg,
"SilkTextItalic", bp +
"defaults.silk_text_italic" );
394 fromLegacy<bool>( aCfg,
"SilkTextUpright", bp +
"defaults.silk_text_upright" );
396 if( !
fromLegacy<double>( aCfg,
"CopperLineWidth", bp +
"defaults.copper_line_width" ) )
399 if( !
fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
402 if( !
fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
405 if( !
fromLegacy<double>( aCfg,
"CopperTextThickness", bp +
"defaults.copper_text_thickness" ) )
406 fromLegacy<double>( aCfg,
"PcbTextThickness", bp +
"defaults.copper_text_thickness" );
408 fromLegacy<bool>( aCfg,
"CopperTextItalic", bp +
"defaults.copper_text_italic" );
409 fromLegacy<bool>( aCfg,
"CopperTextUpright", bp +
"defaults.copper_text_upright" );
411 if( !
fromLegacy<double>( aCfg,
"EdgeCutLineWidth", bp +
"defaults.board_outline_line_width" ) )
413 bp +
"defaults.board_outline_line_width" );
415 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
420 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
422 fromLegacy<bool>( aCfg,
"FabTextUpright", bp +
"defaults.fab_text_upright" );
424 if( !
fromLegacy<double>( aCfg,
"OthersLineWidth", bp +
"defaults.other_line_width" ) )
425 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.other_line_width" );
429 fromLegacy<double>( aCfg,
"OthersTextSizeThickness", bp +
"defaults.other_text_thickness" );
430 fromLegacy<bool>( aCfg,
"OthersTextItalic", bp +
"defaults.other_text_italic" );
431 fromLegacy<bool>( aCfg,
"OthersTextUpright", bp +
"defaults.other_text_upright" );
433 fromLegacy<int>( aCfg,
"DimensionUnits", bp +
"defaults.dimension_units" );
434 fromLegacy<int>( aCfg,
"DimensionPrecision", bp +
"defaults.dimension_precision" );
436 std::string sev = bp +
"rule_severities";
438 fromLegacy<bool>( aCfg,
"RequireCourtyardDefinitions", sev +
"legacy_no_courtyard_defined" );
440 fromLegacy<bool>( aCfg,
"ProhibitOverlappingCourtyards", sev +
"legacy_courtyards_overlap" );
444 wxString keyBase =
"TrackWidth";
445 wxString key = keyBase;
448 nlohmann::json widths = nlohmann::json::array();
452 while( aCfg->Read( key, &val ) )
454 widths.push_back( val );
459 Set( bp +
"track_widths", widths );
464 wxString keyBase =
"ViaDiameter";
465 wxString key = keyBase;
469 nlohmann::json vias = nlohmann::json::array();
473 while( aCfg->Read( key, &diameter ) )
476 aCfg->Read( key << idx, &drill );
478 nlohmann::json
via = { {
"diameter", diameter }, {
"drill", drill } };
479 vias.push_back(
via );
485 Set( bp +
"via_dimensions", vias );
490 wxString keyBase =
"dPairWidth";
491 wxString key = keyBase;
494 double via_gap = 1.0;
496 nlohmann::json pairs = nlohmann::json::array();
500 while( aCfg->Read( key, &width ) )
503 aCfg->Read( key << idx, &gap );
506 aCfg->Read( key << idx, &via_gap );
508 nlohmann::json pair = { {
"width", width }, {
"gap", gap }, {
"via_gap", via_gap } };
509 pairs.push_back( pair );
515 Set( bp +
"diff_pair_dimensions", pairs );
518 group_blacklist.insert( wxT(
"/pcbnew" ) );
521 group_blacklist.insert( wxT(
"/general" ) );
524 aCfg->SetPath( wxT(
"/" ) );
526 auto loadSheetNames =
531 nlohmann::json arr = nlohmann::json::array();
535 aCfg->SetPath( wxT(
"/sheetnames" ) );
537 while( aCfg->Read( wxString::Format(
"%d", sheet++ ), &entry ) )
539 wxArrayString tokens = wxSplit( entry,
':' );
541 if( tokens.size() == 2 )
543 wxLogTrace(
traceSettings, wxT(
"%d: %s = %s" ), sheet, tokens[0],
545 arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
549 Set(
"sheets", arr );
551 aCfg->SetPath(
"/" );
557 std::vector<wxString> groups;
559 groups.emplace_back( wxEmptyString );
561 auto loadLegacyPairs =
562 [&](
const std::string& aGroup ) ->
bool
564 wxLogTrace(
traceSettings, wxT(
"Migrating group %s" ), aGroup );
571 while( aCfg->GetNextEntry( keyStr, index ) )
573 if( !aCfg->Read( keyStr, &val ) )
576 std::string key( keyStr.ToUTF8() );
582 Set(
"legacy." + aGroup +
"." + key, val );
593 for(
size_t i = 0; i < groups.size(); i++ )
595 aCfg->SetPath( groups[i] );
597 if( groups[i] == wxT(
"/sheetnames" ) )
599 ret |= loadSheetNames();
603 aCfg->DeleteEntry( wxT(
"last_client" ),
true );
604 aCfg->DeleteEntry( wxT(
"update" ),
true );
605 aCfg->DeleteEntry( wxT(
"version" ),
true );
607 ret &= loadLegacyPairs( groups[i].ToStdString() );
611 while( aCfg->GetNextGroup( str, index ) )
613 wxString
group = groups[i] +
"/" + str;
615 if( !group_blacklist.count(
group ) )
616 groups.emplace_back(
group );
619 aCfg->SetPath(
"/" );
646 wxString oldProjectName = oldFilename.GetName();
647 wxString oldProjectPath = oldFilename.GetPath();
653 [&]( wxString& aPath )
655 if( aPath.StartsWith( oldProjectName + wxS(
"." ) ) )
656 aPath.Replace( oldProjectName, aFile,
false );
657 else if( aPath.StartsWith( oldProjectPath + wxS(
"/" ) ) )
658 aPath.Replace( oldProjectPath, aDirectory,
false );
666 auto updatePathByPtr =
667 [&](
const std::string& aPtr )
671 updatePath(
path.value() );
676 updatePathByPtr(
"schematic.page_layout_descr_file" );
677 updatePathByPtr(
"schematic.plot_directory" );
678 updatePathByPtr(
"schematic.ngspice.workbook_filename" );
679 updatePathByPtr(
"pcbnew.page_layout_descr_file" );
706 aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
712 wxCHECK( aJson.is_array() && aJson.size() == 2, );
713 aPair.first =
KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
714 aPair.second = wxString( aJson[1].get<std::string>().c_str(), wxConvUTF8 );
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...
void SetReadOnly(bool aReadOnly)
std::optional< ValueType > Get(const std::string &aPath) const
Fetches a value from within the JSON document.
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.
JSON_SETTINGS(const wxString &aFilename, SETTINGS_LOC aLocation, int aSchemaVersion)
bool m_deleteLegacyAfterMigration
Whether or not to delete legacy file after migration.
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
void SetFilename(const wxString &aFilename)
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
Calls Store() and then writes the contents of the JSON document to a file.
wxString GetFilename() const
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 list of strings holding directory paths.
Stores a path as a string with directory separators normalized to unix-style.
A helper for <wxString, wxString> maps.
std::map< wxString, wxString > m_TextVars
wxString getFileExt() const override
std::vector< LAYER_PAIR_INFO > m_LayerPairInfos
List of stored 3D viewports (view matrixes)
ERC_SETTINGS * m_ErcSettings
Eeschema params.
SCHEMATIC_SETTINGS * m_SchematicSettings
bool migrateSchema1To2()
IPC-2581 BOM settings.
wxString m_BoardDrawingSheetFile
PcbNew params.
std::shared_ptr< NET_SETTINGS > m_NetSettings
Net settings for this project (owned here)
struct IP2581_BOM m_IP2581Bom
Layer pair list for the board.
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
PROJECT * m_project
A link to the owning PROJECT.
std::shared_ptr< TIME_DOMAIN_PARAMETERS > m_timeDomainParameters
Time domain parameters for this project.
std::vector< VIEWPORT > m_Viewports
List of stored layer presets.
BOARD_DESIGN_SETTINGS * m_BoardSettings
Board design settings for this project's board.
bool SaveAs(const wxString &aDirectory, const wxString &aFile)
std::vector< wxString > m_EquivalenceFiles
CvPcb params.
bool migrateSchema2To3()
Schema version 3: move layer presets to use named render layers.
wxString getLegacyFileExt() const override
std::vector< wxString > m_PinnedFootprintLibs
The list of pinned footprint libraries.
std::vector< FILE_INFO_PAIR > m_sheets
An list of schematic sheets in this project.
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
std::vector< LAYER_PRESET > m_LayerPresets
std::vector< FILE_INFO_PAIR > m_boards
A list of board files in this project.
wxArrayString m_LegacyLibNames
std::vector< wxString > m_PinnedSymbolLibs
Below are project-level settings that have not been moved to a dedicated file.
std::vector< VIEWPORT3D > m_Viewports3D
List of stored viewports (pos + zoom)
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
Calls Store() and then writes the contents of the JSON document to a file.
PROJECT_FILE(const wxString &aFullPath)
Construct the project file for a project.
std::shared_ptr< COMPONENT_CLASS_SETTINGS > m_ComponentClassSettings
Component class settings for the project (owned here)
Container for project specific data.
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
void to_json(nlohmann::json &aJson, const FILE_INFO_PAIR &aPair)
void from_json(const nlohmann::json &aJson, FILE_INFO_PAIR &aPair)
const int projectFileSchemaVersion
! Update the schema version whenever a migration is required
std::pair< KIID, wxString > FILE_INFO_PAIR
For files like sheets and boards, a pair of that object KIID and display name Display name is typical...
Definition of file extensions used in Kicad.