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" );
152 std::set<wxString> group_blacklist;
159 auto loadPinnedLibs =
160 [&](
const std::string& aDest )
163 wxString libKey = wxT(
"PinnedItems" );
166 nlohmann::json libs = nlohmann::json::array();
168 while( aCfg->Read( libKey, &str ) )
170 libs.push_back( str );
172 aCfg->DeleteEntry( libKey,
true );
174 libKey = wxT(
"PinnedItems" );
175 libKey << ++libIndex;
181 aCfg->SetPath( wxT(
"/LibeditFrame" ) );
182 loadPinnedLibs(
"libraries.pinned_symbol_libs" );
184 aCfg->SetPath( wxT(
"/ModEditFrame" ) );
185 loadPinnedLibs(
"libraries.pinned_footprint_libs" );
187 aCfg->SetPath( wxT(
"/cvpcb/equfiles" ) );
191 wxString eqKey = wxT(
"EquName" );
194 nlohmann::json eqs = nlohmann::json::array();
196 while( aCfg->Read( eqKey, &str ) )
198 eqs.push_back( str );
200 eqKey = wxT(
"EquName" );
204 Set(
"cvpcb.equivalence_files", eqs );
208 group_blacklist.insert( wxT(
"/cvpcb" ) );
210 aCfg->SetPath( wxT(
"/eeschema" ) );
213 aCfg->SetPath( wxT(
"/eeschema/libraries" ) );
217 wxString libKey = wxT(
"LibName" );
220 nlohmann::json libs = nlohmann::json::array();
222 while( aCfg->Read( libKey, &str ) )
224 libs.push_back( str );
226 libKey = wxT(
"LibName" );
230 Set(
"schematic.legacy_lib_list", libs );
233 group_blacklist.insert( wxT(
"/eeschema" ) );
235 aCfg->SetPath( wxT(
"/text_variables" ) );
242 nlohmann::json vars = nlohmann::json();
244 while( aCfg->Read( txtKey, &str ) )
246 wxArrayString tokens = wxSplit( str,
':' );
248 if( tokens.size() == 2 )
249 vars[ tokens[0].ToStdString() ] = tokens[1];
255 Set(
"text_variables", vars );
258 group_blacklist.insert( wxT(
"/text_variables" ) );
260 aCfg->SetPath( wxT(
"/schematic_editor" ) );
262 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"schematic.page_layout_descr_file" );
265 fromLegacy<bool>( aCfg,
"SpiceAjustPassiveValues",
"schematic.spice_adjust_passive_values" );
266 fromLegacy<int>( aCfg,
"SubpartIdSeparator",
"schematic.subpart_id_separator" );
267 fromLegacy<int>( aCfg,
"SubpartFirstId",
"schematic.subpart_first_id" );
269 fromLegacy<int>( aCfg,
"LineThickness",
"schematic.drawing.default_line_thickness" );
270 fromLegacy<int>( aCfg,
"WireThickness",
"schematic.drawing.default_wire_thickness" );
271 fromLegacy<int>( aCfg,
"BusThickness",
"schematic.drawing.default_bus_thickness" );
272 fromLegacy<int>( aCfg,
"LabSize",
"schematic.drawing.default_text_size" );
274 if( !fromLegacy<int>( aCfg,
"PinSymbolSize",
"schematic.drawing.pin_symbol_size" ) )
277 Set(
"schematic.drawing.pin_symbol_size", 0 );
280 fromLegacy<int>( aCfg,
"JunctionSize",
"schematic.drawing.default_junction_size" );
282 fromLegacyString( aCfg,
"FieldNameTemplates",
"schematic.drawing.field_names" );
284 if( !fromLegacy<double>( aCfg,
"TextOffsetRatio",
"schematic.drawing.text_offset_ratio" ) )
287 Set(
"schematic.drawing.text_offset_ratio", 0.08 );
288 Set(
"schematic.drawing.label_size_ratio", 0.25 );
292 group_blacklist.insert( wxT(
"/schematic_editor" ) );
294 aCfg->SetPath( wxT(
"/pcbnew" ) );
296 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"pcbnew.page_layout_descr_file" );
301 fromLegacyString( aCfg,
"LastSpecctraDSNExportPath",
"pcbnew.last_paths.specctra_dsn" );
302 fromLegacyString( aCfg,
"LastGenCADExportPath",
"pcbnew.last_paths.gencad" );
304 std::string bp =
"board.design_settings.";
308 wxString key = wxT(
"DRCExclusion" );
311 nlohmann::json exclusions = nlohmann::json::array();
313 while( aCfg->Read( key, &str ) )
315 exclusions.push_back( str );
317 key = wxT(
"DRCExclusion" );
321 Set( bp +
"drc_exclusions", exclusions );
324 fromLegacy<bool>( aCfg,
"AllowMicroVias", bp +
"rules.allow_microvias" );
325 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
326 fromLegacy<double>( aCfg,
"MinClearance", bp +
"rules.min_clearance" );
327 fromLegacy<double>( aCfg,
"MinTrackWidth", bp +
"rules.min_track_width" );
328 fromLegacy<double>( aCfg,
"MinViaAnnulus", bp +
"rules.min_via_annulus" );
329 fromLegacy<double>( aCfg,
"MinViaDiameter", bp +
"rules.min_via_diameter" );
331 if( !fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
332 fromLegacy<double>( aCfg,
"MinViaDrill", bp +
"rules.min_through_hole_diameter" );
334 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
335 fromLegacy<double>( aCfg,
"MinMicroViaDrill", bp +
"rules.min_microvia_drill" );
336 fromLegacy<double>( aCfg,
"MinHoleToHole", bp +
"rules.min_hole_to_hole" );
337 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
338 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
339 fromLegacy<double>( aCfg,
"SolderMaskMinWidth", bp +
"rules.solder_mask_min_width" );
340 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
341 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
343 if( !fromLegacy<double>( aCfg,
"SilkLineWidth", bp +
"defaults.silk_line_width" ) )
344 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
346 if( !fromLegacy<double>( aCfg,
"SilkTextSizeV", bp +
"defaults.silk_text_size_v" ) )
347 fromLegacy<double>( aCfg,
"ModuleTextSizeV", bp +
"defaults.silk_text_size_v" );
349 if( !fromLegacy<double>( aCfg,
"SilkTextSizeH", bp +
"defaults.silk_text_size_h" ) )
350 fromLegacy<double>( aCfg,
"ModuleTextSizeH", bp +
"defaults.silk_text_size_h" );
352 if( !fromLegacy<double>( aCfg,
"SilkTextSizeThickness", bp +
"defaults.silk_text_thickness" ) )
353 fromLegacy<double>( aCfg,
"ModuleTextSizeThickness", bp +
"defaults.silk_text_thickness" );
355 fromLegacy<bool>( aCfg,
"SilkTextItalic", bp +
"defaults.silk_text_italic" );
356 fromLegacy<bool>( aCfg,
"SilkTextUpright", bp +
"defaults.silk_text_upright" );
358 if( !fromLegacy<double>( aCfg,
"CopperLineWidth", bp +
"defaults.copper_line_width" ) )
359 fromLegacy<double>( aCfg,
"DrawSegmentWidth", bp +
"defaults.copper_line_width" );
361 if( !fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
362 fromLegacy<double>( aCfg,
"PcbTextSizeV", bp +
"defaults.copper_text_size_v" );
364 if( !fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
365 fromLegacy<double>( aCfg,
"PcbTextSizeH", bp +
"defaults.copper_text_size_h" );
367 if( !fromLegacy<double>( aCfg,
"CopperTextThickness", bp +
"defaults.copper_text_thickness" ) )
368 fromLegacy<double>( aCfg,
"PcbTextThickness", bp +
"defaults.copper_text_thickness" );
370 fromLegacy<bool>( aCfg,
"CopperTextItalic", bp +
"defaults.copper_text_italic" );
371 fromLegacy<bool>( aCfg,
"CopperTextUpright", bp +
"defaults.copper_text_upright" );
373 if( !fromLegacy<double>( aCfg,
"EdgeCutLineWidth", bp +
"defaults.board_outline_line_width" ) )
374 fromLegacy<double>( aCfg,
"BoardOutlineThickness", bp +
"defaults.board_outline_line_width" );
376 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
378 fromLegacy<double>( aCfg,
"FabLineWidth", bp +
"defaults.fab_line_width" );
379 fromLegacy<double>( aCfg,
"FabTextSizeV", bp +
"defaults.fab_text_size_v" );
380 fromLegacy<double>( aCfg,
"FabTextSizeH", bp +
"defaults.fab_text_size_h" );
381 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
382 fromLegacy<bool>( aCfg,
"FabTextItalic", bp +
"defaults.fab_text_italic" );
383 fromLegacy<bool>( aCfg,
"FabTextUpright", bp +
"defaults.fab_text_upright" );
385 if( !fromLegacy<double>( aCfg,
"OthersLineWidth", bp +
"defaults.other_line_width" ) )
386 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.other_line_width" );
388 fromLegacy<double>( aCfg,
"OthersTextSizeV", bp +
"defaults.other_text_size_v" );
389 fromLegacy<double>( aCfg,
"OthersTextSizeH", bp +
"defaults.other_text_size_h" );
390 fromLegacy<double>( aCfg,
"OthersTextSizeThickness", bp +
"defaults.other_text_thickness" );
391 fromLegacy<bool>( aCfg,
"OthersTextItalic", bp +
"defaults.other_text_italic" );
392 fromLegacy<bool>( aCfg,
"OthersTextUpright", bp +
"defaults.other_text_upright" );
394 fromLegacy<int>( aCfg,
"DimensionUnits", bp +
"defaults.dimension_units" );
395 fromLegacy<int>( aCfg,
"DimensionPrecision", bp +
"defaults.dimension_precision" );
397 std::string sev = bp +
"rule_severities";
399 fromLegacy<bool>( aCfg,
"RequireCourtyardDefinitions", sev +
"legacy_no_courtyard_defined" );
401 fromLegacy<bool>( aCfg,
"ProhibitOverlappingCourtyards", sev +
"legacy_courtyards_overlap" );
405 wxString keyBase =
"TrackWidth";
406 wxString key = keyBase;
409 nlohmann::json widths = nlohmann::json::array();
413 while( aCfg->Read( key, &val ) )
415 widths.push_back( val );
420 Set( bp +
"track_widths", widths );
425 wxString keyBase =
"ViaDiameter";
426 wxString key = keyBase;
430 nlohmann::json vias = nlohmann::json::array();
434 while( aCfg->Read( key, &diameter ) )
437 aCfg->Read( key << idx, &drill );
439 nlohmann::json
via = { {
"diameter", diameter }, {
"drill", drill } };
440 vias.push_back(
via );
446 Set( bp +
"via_dimensions", vias );
451 wxString keyBase =
"dPairWidth";
452 wxString key = keyBase;
455 double via_gap = 1.0;
457 nlohmann::json pairs = nlohmann::json::array();
461 while( aCfg->Read( key, &width ) )
464 aCfg->Read( key << idx, &gap );
467 aCfg->Read( key << idx, &via_gap );
469 nlohmann::json pair = { {
"width", width }, {
"gap", gap }, {
"via_gap", via_gap } };
470 pairs.push_back( pair );
476 Set( bp +
"diff_pair_dimensions", pairs );
479 group_blacklist.insert( wxT(
"/pcbnew" ) );
482 group_blacklist.insert( wxT(
"/general" ) );
485 aCfg->SetPath( wxT(
"/" ) );
487 auto loadSheetNames =
492 nlohmann::json arr = nlohmann::json::array();
496 aCfg->SetPath( wxT(
"/sheetnames" ) );
498 while( aCfg->Read( wxString::Format(
"%d", sheet++ ), &entry ) )
500 wxArrayString tokens = wxSplit( entry,
':' );
502 if( tokens.size() == 2 )
504 wxLogTrace(
traceSettings, wxT(
"%d: %s = %s" ), sheet, tokens[0],
506 arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
510 Set(
"sheets", arr );
512 aCfg->SetPath(
"/" );
518 std::vector<wxString> groups;
520 groups.emplace_back( wxEmptyString );
522 auto loadLegacyPairs =
523 [&](
const std::string& aGroup ) ->
bool
525 wxLogTrace(
traceSettings, wxT(
"Migrating group %s" ), aGroup );
532 while( aCfg->GetNextEntry( keyStr, index ) )
534 if( !aCfg->Read( keyStr, &val ) )
537 std::string key( keyStr.ToUTF8() );
543 Set(
"legacy." + aGroup +
"." + key, val );
554 for(
size_t i = 0; i < groups.size(); i++ )
556 aCfg->SetPath( groups[i] );
558 if( groups[i] == wxT(
"/sheetnames" ) )
560 ret |= loadSheetNames();
564 aCfg->DeleteEntry( wxT(
"last_client" ),
true );
565 aCfg->DeleteEntry( wxT(
"update" ),
true );
566 aCfg->DeleteEntry( wxT(
"version" ),
true );
568 ret &= loadLegacyPairs( groups[i].ToStdString() );
572 while( aCfg->GetNextGroup( str, index ) )
574 wxString
group = groups[i] +
"/" + str;
576 if( !group_blacklist.count(
group ) )
577 groups.emplace_back(
group );
580 aCfg->SetPath(
"/" );
600 wxString oldProjectName = oldFilename.GetName();
601 wxString oldProjectPath = oldFilename.GetPath();
607 [&]( wxString& aPath )
609 if( aPath.StartsWith( oldProjectName + wxS(
"." ) ) )
610 aPath.Replace( oldProjectName, aFile,
false );
611 else if( aPath.StartsWith( oldProjectPath + wxS(
"/" ) ) )
612 aPath.Replace( oldProjectPath, aDirectory,
false );
620 auto updatePathByPtr =
621 [&](
const std::string& aPtr )
623 if( std::optional<wxString>
path = Get<wxString>( aPtr ) )
625 updatePath(
path.value() );
630 updatePathByPtr(
"schematic.page_layout_descr_file" );
631 updatePathByPtr(
"schematic.plot_directory" );
632 updatePathByPtr(
"schematic.ngspice.workbook_filename" );
633 updatePathByPtr(
"pcbnew.page_layout_descr_file" );
656 aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
662 wxCHECK( aJson.is_array() && aJson.size() == 2, );
663 aPair.first =
KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
664 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
std::vector< LAYER_PAIR_INFO > m_LayerPairInfos
List of stored 3D viewports (view matrixes)
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.
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.