39 m_ErcSettings( nullptr ),
40 m_SchematicSettings( nullptr ),
99 [&]() -> nlohmann::json
101 nlohmann::json ret = nlohmann::json::array();
104 ret.push_back( libName );
108 [&](
const nlohmann::json& aJson )
110 if( aJson.empty() || !aJson.is_array() )
115 for(
const nlohmann::json& entry : aJson )
119 m_NetSettings = std::make_shared<NET_SETTINGS>(
this,
"net_settings" );
150 std::set<wxString> group_blacklist;
157 auto loadPinnedLibs =
158 [&](
const std::string& aDest )
161 wxString libKey = wxT(
"PinnedItems" );
164 nlohmann::json libs = nlohmann::json::array();
166 while( aCfg->Read( libKey, &str ) )
168 libs.push_back( str );
170 aCfg->DeleteEntry( libKey,
true );
172 libKey = wxT(
"PinnedItems" );
173 libKey << ++libIndex;
179 aCfg->SetPath( wxT(
"/LibeditFrame" ) );
180 loadPinnedLibs(
"libraries.pinned_symbol_libs" );
182 aCfg->SetPath( wxT(
"/ModEditFrame" ) );
183 loadPinnedLibs(
"libraries.pinned_footprint_libs" );
185 aCfg->SetPath( wxT(
"/cvpcb/equfiles" ) );
189 wxString eqKey = wxT(
"EquName" );
192 nlohmann::json eqs = nlohmann::json::array();
194 while( aCfg->Read( eqKey, &str ) )
196 eqs.push_back( str );
198 eqKey = wxT(
"EquName" );
202 Set(
"cvpcb.equivalence_files", eqs );
206 group_blacklist.insert( wxT(
"/cvpcb" ) );
208 aCfg->SetPath( wxT(
"/eeschema" ) );
211 aCfg->SetPath( wxT(
"/eeschema/libraries" ) );
215 wxString libKey = wxT(
"LibName" );
218 nlohmann::json libs = nlohmann::json::array();
220 while( aCfg->Read( libKey, &str ) )
222 libs.push_back( str );
224 libKey = wxT(
"LibName" );
228 Set(
"schematic.legacy_lib_list", libs );
231 group_blacklist.insert( wxT(
"/eeschema" ) );
233 aCfg->SetPath( wxT(
"/text_variables" ) );
240 nlohmann::json vars = nlohmann::json();
242 while( aCfg->Read( txtKey, &str ) )
244 wxArrayString tokens = wxSplit( str,
':' );
246 if( tokens.size() == 2 )
247 vars[ tokens[0].ToStdString() ] = tokens[1];
253 Set(
"text_variables", vars );
256 group_blacklist.insert( wxT(
"/text_variables" ) );
258 aCfg->SetPath( wxT(
"/schematic_editor" ) );
260 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"schematic.page_layout_descr_file" );
263 fromLegacy<bool>( aCfg,
"SpiceAjustPassiveValues",
"schematic.spice_adjust_passive_values" );
264 fromLegacy<int>( aCfg,
"SubpartIdSeparator",
"schematic.subpart_id_separator" );
265 fromLegacy<int>( aCfg,
"SubpartFirstId",
"schematic.subpart_first_id" );
267 fromLegacy<int>( aCfg,
"LineThickness",
"schematic.drawing.default_line_thickness" );
268 fromLegacy<int>( aCfg,
"WireThickness",
"schematic.drawing.default_wire_thickness" );
269 fromLegacy<int>( aCfg,
"BusThickness",
"schematic.drawing.default_bus_thickness" );
270 fromLegacy<int>( aCfg,
"LabSize",
"schematic.drawing.default_text_size" );
272 if( !fromLegacy<int>( aCfg,
"PinSymbolSize",
"schematic.drawing.pin_symbol_size" ) )
275 Set(
"schematic.drawing.pin_symbol_size", 0 );
278 fromLegacy<int>( aCfg,
"JunctionSize",
"schematic.drawing.default_junction_size" );
280 fromLegacyString( aCfg,
"FieldNameTemplates",
"schematic.drawing.field_names" );
282 if( !fromLegacy<double>( aCfg,
"TextOffsetRatio",
"schematic.drawing.text_offset_ratio" ) )
285 Set(
"schematic.drawing.text_offset_ratio", 0.08 );
286 Set(
"schematic.drawing.label_size_ratio", 0.25 );
290 group_blacklist.insert( wxT(
"/schematic_editor" ) );
292 aCfg->SetPath( wxT(
"/pcbnew" ) );
294 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"pcbnew.page_layout_descr_file" );
299 fromLegacyString( aCfg,
"LastSpecctraDSNExportPath",
"pcbnew.last_paths.specctra_dsn" );
300 fromLegacyString( aCfg,
"LastGenCADExportPath",
"pcbnew.last_paths.gencad" );
302 std::string bp =
"board.design_settings.";
306 wxString key = wxT(
"DRCExclusion" );
309 nlohmann::json exclusions = nlohmann::json::array();
311 while( aCfg->Read( key, &str ) )
313 exclusions.push_back( str );
315 key = wxT(
"DRCExclusion" );
319 Set( bp +
"drc_exclusions", exclusions );
322 fromLegacy<bool>( aCfg,
"AllowMicroVias", bp +
"rules.allow_microvias" );
323 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
324 fromLegacy<double>( aCfg,
"MinClearance", bp +
"rules.min_clearance" );
325 fromLegacy<double>( aCfg,
"MinTrackWidth", bp +
"rules.min_track_width" );
326 fromLegacy<double>( aCfg,
"MinViaAnnulus", bp +
"rules.min_via_annulus" );
327 fromLegacy<double>( aCfg,
"MinViaDiameter", bp +
"rules.min_via_diameter" );
329 if( !fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
330 fromLegacy<double>( aCfg,
"MinViaDrill", bp +
"rules.min_through_hole_diameter" );
332 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
333 fromLegacy<double>( aCfg,
"MinMicroViaDrill", bp +
"rules.min_microvia_drill" );
334 fromLegacy<double>( aCfg,
"MinHoleToHole", bp +
"rules.min_hole_to_hole" );
335 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
336 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
337 fromLegacy<double>( aCfg,
"SolderMaskMinWidth", bp +
"rules.solder_mask_min_width" );
338 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
339 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
341 if( !fromLegacy<double>( aCfg,
"SilkLineWidth", bp +
"defaults.silk_line_width" ) )
342 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
344 if( !fromLegacy<double>( aCfg,
"SilkTextSizeV", bp +
"defaults.silk_text_size_v" ) )
345 fromLegacy<double>( aCfg,
"ModuleTextSizeV", bp +
"defaults.silk_text_size_v" );
347 if( !fromLegacy<double>( aCfg,
"SilkTextSizeH", bp +
"defaults.silk_text_size_h" ) )
348 fromLegacy<double>( aCfg,
"ModuleTextSizeH", bp +
"defaults.silk_text_size_h" );
350 if( !fromLegacy<double>( aCfg,
"SilkTextSizeThickness", bp +
"defaults.silk_text_thickness" ) )
351 fromLegacy<double>( aCfg,
"ModuleTextSizeThickness", bp +
"defaults.silk_text_thickness" );
353 fromLegacy<bool>( aCfg,
"SilkTextItalic", bp +
"defaults.silk_text_italic" );
354 fromLegacy<bool>( aCfg,
"SilkTextUpright", bp +
"defaults.silk_text_upright" );
356 if( !fromLegacy<double>( aCfg,
"CopperLineWidth", bp +
"defaults.copper_line_width" ) )
357 fromLegacy<double>( aCfg,
"DrawSegmentWidth", bp +
"defaults.copper_line_width" );
359 if( !fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
360 fromLegacy<double>( aCfg,
"PcbTextSizeV", bp +
"defaults.copper_text_size_v" );
362 if( !fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
363 fromLegacy<double>( aCfg,
"PcbTextSizeH", bp +
"defaults.copper_text_size_h" );
365 if( !fromLegacy<double>( aCfg,
"CopperTextThickness", bp +
"defaults.copper_text_thickness" ) )
366 fromLegacy<double>( aCfg,
"PcbTextThickness", bp +
"defaults.copper_text_thickness" );
368 fromLegacy<bool>( aCfg,
"CopperTextItalic", bp +
"defaults.copper_text_italic" );
369 fromLegacy<bool>( aCfg,
"CopperTextUpright", bp +
"defaults.copper_text_upright" );
371 if( !fromLegacy<double>( aCfg,
"EdgeCutLineWidth", bp +
"defaults.board_outline_line_width" ) )
372 fromLegacy<double>( aCfg,
"BoardOutlineThickness", bp +
"defaults.board_outline_line_width" );
374 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
376 fromLegacy<double>( aCfg,
"FabLineWidth", bp +
"defaults.fab_line_width" );
377 fromLegacy<double>( aCfg,
"FabTextSizeV", bp +
"defaults.fab_text_size_v" );
378 fromLegacy<double>( aCfg,
"FabTextSizeH", bp +
"defaults.fab_text_size_h" );
379 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
380 fromLegacy<bool>( aCfg,
"FabTextItalic", bp +
"defaults.fab_text_italic" );
381 fromLegacy<bool>( aCfg,
"FabTextUpright", bp +
"defaults.fab_text_upright" );
383 if( !fromLegacy<double>( aCfg,
"OthersLineWidth", bp +
"defaults.other_line_width" ) )
384 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.other_line_width" );
386 fromLegacy<double>( aCfg,
"OthersTextSizeV", bp +
"defaults.other_text_size_v" );
387 fromLegacy<double>( aCfg,
"OthersTextSizeH", bp +
"defaults.other_text_size_h" );
388 fromLegacy<double>( aCfg,
"OthersTextSizeThickness", bp +
"defaults.other_text_thickness" );
389 fromLegacy<bool>( aCfg,
"OthersTextItalic", bp +
"defaults.other_text_italic" );
390 fromLegacy<bool>( aCfg,
"OthersTextUpright", bp +
"defaults.other_text_upright" );
392 fromLegacy<int>( aCfg,
"DimensionUnits", bp +
"defaults.dimension_units" );
393 fromLegacy<int>( aCfg,
"DimensionPrecision", bp +
"defaults.dimension_precision" );
395 std::string sev = bp +
"rule_severities";
397 fromLegacy<bool>( aCfg,
"RequireCourtyardDefinitions", sev +
"legacy_no_courtyard_defined" );
399 fromLegacy<bool>( aCfg,
"ProhibitOverlappingCourtyards", sev +
"legacy_courtyards_overlap" );
403 wxString keyBase =
"TrackWidth";
404 wxString key = keyBase;
407 nlohmann::json widths = nlohmann::json::array();
411 while( aCfg->Read( key, &val ) )
413 widths.push_back( val );
418 Set( bp +
"track_widths", widths );
423 wxString keyBase =
"ViaDiameter";
424 wxString key = keyBase;
428 nlohmann::json vias = nlohmann::json::array();
432 while( aCfg->Read( key, &diameter ) )
435 aCfg->Read( key << idx, &drill );
437 nlohmann::json
via = { {
"diameter", diameter }, {
"drill", drill } };
438 vias.push_back(
via );
444 Set( bp +
"via_dimensions", vias );
449 wxString keyBase =
"dPairWidth";
450 wxString key = keyBase;
453 double via_gap = 1.0;
455 nlohmann::json pairs = nlohmann::json::array();
459 while( aCfg->Read( key, &width ) )
462 aCfg->Read( key << idx, &gap );
465 aCfg->Read( key << idx, &via_gap );
467 nlohmann::json pair = { {
"width", width }, {
"gap", gap }, {
"via_gap", via_gap } };
468 pairs.push_back( pair );
474 Set( bp +
"diff_pair_dimensions", pairs );
477 group_blacklist.insert( wxT(
"/pcbnew" ) );
480 group_blacklist.insert( wxT(
"/general" ) );
483 aCfg->SetPath( wxT(
"/" ) );
485 auto loadSheetNames =
490 nlohmann::json arr = nlohmann::json::array();
494 aCfg->SetPath( wxT(
"/sheetnames" ) );
496 while( aCfg->Read( wxString::Format(
"%d", sheet++ ), &entry ) )
498 wxArrayString tokens = wxSplit( entry,
':' );
500 if( tokens.size() == 2 )
502 wxLogTrace(
traceSettings, wxT(
"%d: %s = %s" ), sheet, tokens[0],
504 arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
508 Set(
"sheets", arr );
510 aCfg->SetPath(
"/" );
516 std::vector<wxString> groups;
518 groups.emplace_back( wxEmptyString );
520 auto loadLegacyPairs =
521 [&](
const std::string& aGroup ) ->
bool
523 wxLogTrace(
traceSettings, wxT(
"Migrating group %s" ), aGroup );
530 while( aCfg->GetNextEntry( keyStr, index ) )
532 if( !aCfg->Read( keyStr, &val ) )
535 std::string key( keyStr.ToUTF8() );
541 Set(
"legacy." + aGroup +
"." + key, val );
552 for(
size_t i = 0; i < groups.size(); i++ )
554 aCfg->SetPath( groups[i] );
556 if( groups[i] == wxT(
"/sheetnames" ) )
558 ret |= loadSheetNames();
562 aCfg->DeleteEntry( wxT(
"last_client" ),
true );
563 aCfg->DeleteEntry( wxT(
"update" ),
true );
564 aCfg->DeleteEntry( wxT(
"version" ),
true );
566 ret &= loadLegacyPairs( groups[i].ToStdString() );
570 while( aCfg->GetNextGroup( str, index ) )
572 wxString
group = groups[i] +
"/" + str;
574 if( !group_blacklist.count(
group ) )
575 groups.emplace_back(
group );
578 aCfg->SetPath(
"/" );
598 wxString oldProjectName = oldFilename.GetName();
599 wxString oldProjectPath = oldFilename.GetPath();
605 [&]( wxString& aPath )
607 if( aPath.StartsWith( oldProjectName + wxS(
"." ) ) )
608 aPath.Replace( oldProjectName, aFile,
false );
609 else if( aPath.StartsWith( oldProjectPath + wxS(
"/" ) ) )
610 aPath.Replace( oldProjectPath, aDirectory,
false );
618 auto updatePathByPtr =
619 [&](
const std::string& aPtr )
621 if( std::optional<wxString>
path = Get<wxString>( aPtr ) )
623 updatePath(
path.value() );
628 updatePathByPtr(
"schematic.page_layout_descr_file" );
629 updatePathByPtr(
"schematic.plot_directory" );
630 updatePathByPtr(
"schematic.ngspice.workbook_filename" );
631 updatePathByPtr(
"pcbnew.page_layout_descr_file" );
654 aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
660 wxCHECK( aJson.is_array() && aJson.size() == 2, );
661 aPair.first =
KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
662 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)
bool m_deleteLegacyAfterMigration
Whether or not to delete legacy file after migration.
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.
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
wxString m_BoardDrawingSheetFile
PcbNew params.
std::shared_ptr< NET_SETTINGS > m_NetSettings
Net settings for this project (owned here)
struct IP2581_BOM m_IP2581Bom
List of stored 3D viewports (view matrixes)
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.
wxString getLegacyFileExt() const override
std::vector< wxString > m_PinnedFootprintLibs
The list of pinned footprint libraries.
std::vector< FILE_INFO_PAIR > m_sheets
IPC-2581 BOM settings.
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.
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.