39 m_ErcSettings( nullptr ), m_SchematicSettings( nullptr ), m_BoardSettings(),
40 m_project( nullptr ), m_wasMigrated( false )
95 [&]() -> nlohmann::json
97 nlohmann::json ret = nlohmann::json::array();
100 ret.push_back( libName );
104 [&](
const nlohmann::json& aJson )
106 if( aJson.empty() || !aJson.is_array() )
111 for(
const nlohmann::json& entry : aJson )
115 m_NetSettings = std::make_shared<NET_SETTINGS>(
this,
"net_settings" );
118 std::make_shared<COMPONENT_CLASS_SETTINGS>(
this,
"component_class_settings" );
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 );
362 fromLegacy<bool>( aCfg,
"AllowMicroVias", bp +
"rules.allow_microvias" );
363 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
364 fromLegacy<double>( aCfg,
"MinClearance", bp +
"rules.min_clearance" );
365 fromLegacy<double>( aCfg,
"MinTrackWidth", bp +
"rules.min_track_width" );
366 fromLegacy<double>( aCfg,
"MinViaAnnulus", bp +
"rules.min_via_annulus" );
367 fromLegacy<double>( aCfg,
"MinViaDiameter", bp +
"rules.min_via_diameter" );
369 if( !fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
370 fromLegacy<double>( aCfg,
"MinViaDrill", bp +
"rules.min_through_hole_diameter" );
372 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
373 fromLegacy<double>( aCfg,
"MinMicroViaDrill", bp +
"rules.min_microvia_drill" );
374 fromLegacy<double>( aCfg,
"MinHoleToHole", bp +
"rules.min_hole_to_hole" );
375 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
376 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
377 fromLegacy<double>( aCfg,
"SolderMaskMinWidth", bp +
"rules.solder_mask_min_width" );
378 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
379 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
381 if( !fromLegacy<double>( aCfg,
"SilkLineWidth", bp +
"defaults.silk_line_width" ) )
382 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
384 if( !fromLegacy<double>( aCfg,
"SilkTextSizeV", bp +
"defaults.silk_text_size_v" ) )
385 fromLegacy<double>( aCfg,
"ModuleTextSizeV", bp +
"defaults.silk_text_size_v" );
387 if( !fromLegacy<double>( aCfg,
"SilkTextSizeH", bp +
"defaults.silk_text_size_h" ) )
388 fromLegacy<double>( aCfg,
"ModuleTextSizeH", bp +
"defaults.silk_text_size_h" );
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" ) )
397 fromLegacy<double>( aCfg,
"DrawSegmentWidth", bp +
"defaults.copper_line_width" );
399 if( !fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
400 fromLegacy<double>( aCfg,
"PcbTextSizeV", bp +
"defaults.copper_text_size_v" );
402 if( !fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
403 fromLegacy<double>( aCfg,
"PcbTextSizeH", 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" ) )
412 fromLegacy<double>( aCfg,
"BoardOutlineThickness",
413 bp +
"defaults.board_outline_line_width" );
415 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
417 fromLegacy<double>( aCfg,
"FabLineWidth", bp +
"defaults.fab_line_width" );
418 fromLegacy<double>( aCfg,
"FabTextSizeV", bp +
"defaults.fab_text_size_v" );
419 fromLegacy<double>( aCfg,
"FabTextSizeH", bp +
"defaults.fab_text_size_h" );
420 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
421 fromLegacy<bool>( aCfg,
"FabTextItalic", bp +
"defaults.fab_text_italic" );
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" );
427 fromLegacy<double>( aCfg,
"OthersTextSizeV", bp +
"defaults.other_text_size_v" );
428 fromLegacy<double>( aCfg,
"OthersTextSizeH", bp +
"defaults.other_text_size_h" );
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 )
669 if( std::optional<wxString>
path = Get<wxString>( 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.
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::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.
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)
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::vector< VIEWPORT > m_Viewports
List of stored layer presets.
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.
virtual const wxString GetProjectName() const
Return the short name of the project.
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...
wxString mfg
Manufacturer name column.
wxString MPN
Manufacturer part number column.
wxString id
Internal ID column.
wxString dist
Distributor name column.
wxString distPN
Distributor part number column.
Definition of file extensions used in Kicad.