42 m_ErcSettings( nullptr ),
43 m_SchematicSettings( nullptr ),
48 m_wasMigrated( false )
103 [&]() -> nlohmann::json
105 nlohmann::json ret = nlohmann::json::array();
108 ret.push_back( libName );
112 [&](
const nlohmann::json& aJson )
114 if( aJson.empty() || !aJson.is_array() )
119 for(
const nlohmann::json& entry : aJson )
123 m_NetSettings = std::make_shared<NET_SETTINGS>(
this,
"net_settings" );
126 std::make_shared<COMPONENT_CLASS_SETTINGS>(
this,
"component_class_settings" );
129 std::make_shared<TIME_DOMAIN_PARAMETERS>(
this,
"time_domain_parameters" );
161 auto p(
"/board/layer_presets"_json_pointer );
168 for( nlohmann::json& entry : presets )
179 auto p(
"/board/layer_presets"_json_pointer );
186 for( nlohmann::json& entry : presets )
201 std::set<wxString> group_blacklist;
208 auto loadPinnedLibs =
209 [&](
const std::string& aDest )
212 wxString libKey = wxT(
"PinnedItems" );
215 nlohmann::json libs = nlohmann::json::array();
217 while( aCfg->Read( libKey, &str ) )
219 libs.push_back( str );
221 aCfg->DeleteEntry( libKey,
true );
223 libKey = wxT(
"PinnedItems" );
224 libKey << ++libIndex;
230 aCfg->SetPath( wxT(
"/LibeditFrame" ) );
231 loadPinnedLibs(
"libraries.pinned_symbol_libs" );
233 aCfg->SetPath( wxT(
"/ModEditFrame" ) );
234 loadPinnedLibs(
"libraries.pinned_footprint_libs" );
236 aCfg->SetPath( wxT(
"/cvpcb/equfiles" ) );
240 wxString eqKey = wxT(
"EquName" );
243 nlohmann::json eqs = nlohmann::json::array();
245 while( aCfg->Read( eqKey, &str ) )
247 eqs.push_back( str );
249 eqKey = wxT(
"EquName" );
253 Set(
"cvpcb.equivalence_files", eqs );
257 group_blacklist.insert( wxT(
"/cvpcb" ) );
259 aCfg->SetPath( wxT(
"/eeschema" ) );
262 aCfg->SetPath( wxT(
"/eeschema/libraries" ) );
266 wxString libKey = wxT(
"LibName" );
269 nlohmann::json libs = nlohmann::json::array();
271 while( aCfg->Read( libKey, &str ) )
273 libs.push_back( str );
275 libKey = wxT(
"LibName" );
279 Set(
"schematic.legacy_lib_list", libs );
282 group_blacklist.insert( wxT(
"/eeschema" ) );
284 aCfg->SetPath( wxT(
"/text_variables" ) );
291 nlohmann::json vars = nlohmann::json();
293 while( aCfg->Read( txtKey, &str ) )
295 wxArrayString tokens = wxSplit( str,
':' );
297 if( tokens.size() == 2 )
298 vars[ tokens[0].ToStdString() ] = tokens[1];
304 Set(
"text_variables", vars );
307 group_blacklist.insert( wxT(
"/text_variables" ) );
309 aCfg->SetPath( wxT(
"/schematic_editor" ) );
311 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"schematic.page_layout_descr_file" );
314 fromLegacy<bool>( aCfg,
"SpiceAjustPassiveValues",
"schematic.spice_adjust_passive_values" );
315 fromLegacy<int>( aCfg,
"SubpartIdSeparator",
"schematic.subpart_id_separator" );
316 fromLegacy<int>( aCfg,
"SubpartFirstId",
"schematic.subpart_first_id" );
318 fromLegacy<int>( aCfg,
"LineThickness",
"schematic.drawing.default_line_thickness" );
319 fromLegacy<int>( aCfg,
"WireThickness",
"schematic.drawing.default_wire_thickness" );
320 fromLegacy<int>( aCfg,
"BusThickness",
"schematic.drawing.default_bus_thickness" );
321 fromLegacy<int>( aCfg,
"LabSize",
"schematic.drawing.default_text_size" );
323 if( !fromLegacy<int>( aCfg,
"PinSymbolSize",
"schematic.drawing.pin_symbol_size" ) )
326 Set(
"schematic.drawing.pin_symbol_size", 0 );
329 fromLegacy<int>( aCfg,
"JunctionSize",
"schematic.drawing.default_junction_size" );
331 fromLegacyString( aCfg,
"FieldNameTemplates",
"schematic.drawing.field_names" );
333 if( !fromLegacy<double>( aCfg,
"TextOffsetRatio",
"schematic.drawing.text_offset_ratio" ) )
336 Set(
"schematic.drawing.text_offset_ratio", 0.08 );
337 Set(
"schematic.drawing.label_size_ratio", 0.25 );
341 group_blacklist.insert( wxT(
"/schematic_editor" ) );
343 aCfg->SetPath( wxT(
"/pcbnew" ) );
345 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"pcbnew.page_layout_descr_file" );
350 fromLegacyString( aCfg,
"LastSpecctraDSNExportPath",
"pcbnew.last_paths.specctra_dsn" );
351 fromLegacyString( aCfg,
"LastGenCADExportPath",
"pcbnew.last_paths.gencad" );
353 std::string bp =
"board.design_settings.";
357 wxString key = wxT(
"DRCExclusion" );
360 nlohmann::json exclusions = nlohmann::json::array();
362 while( aCfg->Read( key, &str ) )
364 exclusions.push_back( str );
366 key = wxT(
"DRCExclusion" );
370 Set( bp +
"drc_exclusions", exclusions );
373 fromLegacy<bool>( aCfg,
"AllowMicroVias", bp +
"rules.allow_microvias" );
374 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
375 fromLegacy<double>( aCfg,
"MinClearance", bp +
"rules.min_clearance" );
376 fromLegacy<double>( aCfg,
"MinTrackWidth", bp +
"rules.min_track_width" );
377 fromLegacy<double>( aCfg,
"MinViaAnnulus", bp +
"rules.min_via_annulus" );
378 fromLegacy<double>( aCfg,
"MinViaDiameter", bp +
"rules.min_via_diameter" );
380 if( !fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
381 fromLegacy<double>( aCfg,
"MinViaDrill", bp +
"rules.min_through_hole_diameter" );
383 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
384 fromLegacy<double>( aCfg,
"MinMicroViaDrill", bp +
"rules.min_microvia_drill" );
385 fromLegacy<double>( aCfg,
"MinHoleToHole", bp +
"rules.min_hole_to_hole" );
386 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
387 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
388 fromLegacy<double>( aCfg,
"SolderMaskMinWidth", bp +
"rules.solder_mask_min_width" );
389 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
390 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
392 if( !fromLegacy<double>( aCfg,
"SilkLineWidth", bp +
"defaults.silk_line_width" ) )
393 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
395 if( !fromLegacy<double>( aCfg,
"SilkTextSizeV", bp +
"defaults.silk_text_size_v" ) )
396 fromLegacy<double>( aCfg,
"ModuleTextSizeV", bp +
"defaults.silk_text_size_v" );
398 if( !fromLegacy<double>( aCfg,
"SilkTextSizeH", bp +
"defaults.silk_text_size_h" ) )
399 fromLegacy<double>( aCfg,
"ModuleTextSizeH", bp +
"defaults.silk_text_size_h" );
401 if( !fromLegacy<double>( aCfg,
"SilkTextSizeThickness", bp +
"defaults.silk_text_thickness" ) )
402 fromLegacy<double>( aCfg,
"ModuleTextSizeThickness", bp +
"defaults.silk_text_thickness" );
404 fromLegacy<bool>( aCfg,
"SilkTextItalic", bp +
"defaults.silk_text_italic" );
405 fromLegacy<bool>( aCfg,
"SilkTextUpright", bp +
"defaults.silk_text_upright" );
407 if( !fromLegacy<double>( aCfg,
"CopperLineWidth", bp +
"defaults.copper_line_width" ) )
408 fromLegacy<double>( aCfg,
"DrawSegmentWidth", bp +
"defaults.copper_line_width" );
410 if( !fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
411 fromLegacy<double>( aCfg,
"PcbTextSizeV", bp +
"defaults.copper_text_size_v" );
413 if( !fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
414 fromLegacy<double>( aCfg,
"PcbTextSizeH", bp +
"defaults.copper_text_size_h" );
416 if( !fromLegacy<double>( aCfg,
"CopperTextThickness", bp +
"defaults.copper_text_thickness" ) )
417 fromLegacy<double>( aCfg,
"PcbTextThickness", bp +
"defaults.copper_text_thickness" );
419 fromLegacy<bool>( aCfg,
"CopperTextItalic", bp +
"defaults.copper_text_italic" );
420 fromLegacy<bool>( aCfg,
"CopperTextUpright", bp +
"defaults.copper_text_upright" );
422 if( !fromLegacy<double>( aCfg,
"EdgeCutLineWidth", bp +
"defaults.board_outline_line_width" ) )
423 fromLegacy<double>( aCfg,
"BoardOutlineThickness",
424 bp +
"defaults.board_outline_line_width" );
426 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
428 fromLegacy<double>( aCfg,
"FabLineWidth", bp +
"defaults.fab_line_width" );
429 fromLegacy<double>( aCfg,
"FabTextSizeV", bp +
"defaults.fab_text_size_v" );
430 fromLegacy<double>( aCfg,
"FabTextSizeH", bp +
"defaults.fab_text_size_h" );
431 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
432 fromLegacy<bool>( aCfg,
"FabTextItalic", bp +
"defaults.fab_text_italic" );
433 fromLegacy<bool>( aCfg,
"FabTextUpright", bp +
"defaults.fab_text_upright" );
435 if( !fromLegacy<double>( aCfg,
"OthersLineWidth", bp +
"defaults.other_line_width" ) )
436 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.other_line_width" );
438 fromLegacy<double>( aCfg,
"OthersTextSizeV", bp +
"defaults.other_text_size_v" );
439 fromLegacy<double>( aCfg,
"OthersTextSizeH", bp +
"defaults.other_text_size_h" );
440 fromLegacy<double>( aCfg,
"OthersTextSizeThickness", bp +
"defaults.other_text_thickness" );
441 fromLegacy<bool>( aCfg,
"OthersTextItalic", bp +
"defaults.other_text_italic" );
442 fromLegacy<bool>( aCfg,
"OthersTextUpright", bp +
"defaults.other_text_upright" );
444 fromLegacy<int>( aCfg,
"DimensionUnits", bp +
"defaults.dimension_units" );
445 fromLegacy<int>( aCfg,
"DimensionPrecision", bp +
"defaults.dimension_precision" );
447 std::string sev = bp +
"rule_severities";
449 fromLegacy<bool>( aCfg,
"RequireCourtyardDefinitions", sev +
"legacy_no_courtyard_defined" );
451 fromLegacy<bool>( aCfg,
"ProhibitOverlappingCourtyards", sev +
"legacy_courtyards_overlap" );
455 wxString keyBase =
"TrackWidth";
456 wxString key = keyBase;
459 nlohmann::json widths = nlohmann::json::array();
463 while( aCfg->Read( key, &val ) )
465 widths.push_back( val );
470 Set( bp +
"track_widths", widths );
475 wxString keyBase =
"ViaDiameter";
476 wxString key = keyBase;
480 nlohmann::json vias = nlohmann::json::array();
484 while( aCfg->Read( key, &diameter ) )
487 aCfg->Read( key << idx, &drill );
489 nlohmann::json
via = { {
"diameter", diameter }, {
"drill", drill } };
490 vias.push_back(
via );
496 Set( bp +
"via_dimensions", vias );
501 wxString keyBase =
"dPairWidth";
502 wxString key = keyBase;
505 double via_gap = 1.0;
507 nlohmann::json pairs = nlohmann::json::array();
511 while( aCfg->Read( key, &width ) )
514 aCfg->Read( key << idx, &gap );
517 aCfg->Read( key << idx, &via_gap );
519 nlohmann::json pair = { {
"width", width }, {
"gap", gap }, {
"via_gap", via_gap } };
520 pairs.push_back( pair );
526 Set( bp +
"diff_pair_dimensions", pairs );
529 group_blacklist.insert( wxT(
"/pcbnew" ) );
532 group_blacklist.insert( wxT(
"/general" ) );
535 aCfg->SetPath( wxT(
"/" ) );
537 auto loadSheetNames =
542 nlohmann::json arr = nlohmann::json::array();
546 aCfg->SetPath( wxT(
"/sheetnames" ) );
548 while( aCfg->Read( wxString::Format(
"%d", sheet++ ), &entry ) )
550 wxArrayString tokens = wxSplit( entry,
':' );
552 if( tokens.size() == 2 )
554 wxLogTrace(
traceSettings, wxT(
"%d: %s = %s" ), sheet, tokens[0],
556 arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
560 Set(
"sheets", arr );
562 aCfg->SetPath(
"/" );
568 std::vector<wxString> groups;
570 groups.emplace_back( wxEmptyString );
572 auto loadLegacyPairs =
573 [&](
const std::string& aGroup ) ->
bool
575 wxLogTrace(
traceSettings, wxT(
"Migrating group %s" ), aGroup );
582 while( aCfg->GetNextEntry( keyStr, index ) )
584 if( !aCfg->Read( keyStr, &val ) )
587 std::string key( keyStr.ToUTF8() );
593 Set(
"legacy." + aGroup +
"." + key, val );
604 for(
size_t i = 0; i < groups.size(); i++ )
606 aCfg->SetPath( groups[i] );
608 if( groups[i] == wxT(
"/sheetnames" ) )
610 ret |= loadSheetNames();
614 aCfg->DeleteEntry( wxT(
"last_client" ),
true );
615 aCfg->DeleteEntry( wxT(
"update" ),
true );
616 aCfg->DeleteEntry( wxT(
"version" ),
true );
618 ret &= loadLegacyPairs( groups[i].ToStdString() );
622 while( aCfg->GetNextGroup( str, index ) )
624 wxString
group = groups[i] +
"/" + str;
626 if( !group_blacklist.count(
group ) )
627 groups.emplace_back(
group );
630 aCfg->SetPath(
"/" );
657 wxString oldProjectName = oldFilename.GetName();
658 wxString oldProjectPath = oldFilename.GetPath();
664 [&]( wxString& aPath )
666 if( aPath.StartsWith( oldProjectName + wxS(
"." ) ) )
667 aPath.Replace( oldProjectName, aFile,
false );
668 else if( aPath.StartsWith( oldProjectPath + wxS(
"/" ) ) )
669 aPath.Replace( oldProjectPath, aDirectory,
false );
677 auto updatePathByPtr =
678 [&](
const std::string& aPtr )
680 if( std::optional<wxString>
path = Get<wxString>( aPtr ) )
682 updatePath(
path.value() );
687 updatePathByPtr(
"schematic.page_layout_descr_file" );
688 updatePathByPtr(
"schematic.plot_directory" );
689 updatePathByPtr(
"schematic.ngspice.workbook_filename" );
690 updatePathByPtr(
"pcbnew.page_layout_descr_file" );
717 aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
723 wxCHECK( aJson.is_array() && aJson.size() == 2, );
724 aPair.first =
KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
725 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::shared_ptr< TIME_DOMAIN_PARAMETERS > m_timeDomainParameters
Time domain parameters for this 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.