39 m_ErcSettings( nullptr ),
40 m_SchematicSettings( nullptr ),
98 [&]() -> nlohmann::json
100 nlohmann::json ret = nlohmann::json::array();
103 ret.push_back( libName );
107 [&](
const nlohmann::json& aJson )
109 if( aJson.empty() || !aJson.is_array() )
114 for(
const nlohmann::json& entry : aJson )
118 m_NetSettings = std::make_shared<NET_SETTINGS>(
this,
"net_settings" );
149 std::set<wxString> group_blacklist;
156 auto loadPinnedLibs =
157 [&](
const std::string& aDest )
160 wxString libKey = wxT(
"PinnedItems" );
163 nlohmann::json libs = nlohmann::json::array();
165 while( aCfg->Read( libKey, &str ) )
167 libs.push_back( str );
169 aCfg->DeleteEntry( libKey,
true );
171 libKey = wxT(
"PinnedItems" );
172 libKey << ++libIndex;
178 aCfg->SetPath( wxT(
"/LibeditFrame" ) );
179 loadPinnedLibs(
"libraries.pinned_symbol_libs" );
181 aCfg->SetPath( wxT(
"/ModEditFrame" ) );
182 loadPinnedLibs(
"libraries.pinned_footprint_libs" );
184 aCfg->SetPath( wxT(
"/cvpcb/equfiles" ) );
188 wxString eqKey = wxT(
"EquName" );
191 nlohmann::json eqs = nlohmann::json::array();
193 while( aCfg->Read( eqKey, &str ) )
195 eqs.push_back( str );
197 eqKey = wxT(
"EquName" );
201 Set(
"cvpcb.equivalence_files", eqs );
205 group_blacklist.insert( wxT(
"/cvpcb" ) );
207 aCfg->SetPath( wxT(
"/eeschema" ) );
210 aCfg->SetPath( wxT(
"/eeschema/libraries" ) );
214 wxString libKey = wxT(
"LibName" );
217 nlohmann::json libs = nlohmann::json::array();
219 while( aCfg->Read( libKey, &str ) )
221 libs.push_back( str );
223 libKey = wxT(
"LibName" );
227 Set(
"schematic.legacy_lib_list", libs );
230 group_blacklist.insert( wxT(
"/eeschema" ) );
232 aCfg->SetPath( wxT(
"/text_variables" ) );
239 nlohmann::json vars = nlohmann::json();
241 while( aCfg->Read( txtKey, &str ) )
243 wxArrayString tokens = wxSplit( str,
':' );
245 if( tokens.size() == 2 )
246 vars[ tokens[0].ToStdString() ] = tokens[1];
252 Set(
"text_variables", vars );
255 group_blacklist.insert( wxT(
"/text_variables" ) );
257 aCfg->SetPath( wxT(
"/schematic_editor" ) );
259 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"schematic.page_layout_descr_file" );
262 fromLegacy<bool>( aCfg,
"SpiceAjustPassiveValues",
"schematic.spice_adjust_passive_values" );
263 fromLegacy<int>( aCfg,
"SubpartIdSeparator",
"schematic.subpart_id_separator" );
264 fromLegacy<int>( aCfg,
"SubpartFirstId",
"schematic.subpart_first_id" );
266 fromLegacy<int>( aCfg,
"LineThickness",
"schematic.drawing.default_line_thickness" );
267 fromLegacy<int>( aCfg,
"WireThickness",
"schematic.drawing.default_wire_thickness" );
268 fromLegacy<int>( aCfg,
"BusThickness",
"schematic.drawing.default_bus_thickness" );
269 fromLegacy<int>( aCfg,
"LabSize",
"schematic.drawing.default_text_size" );
271 if( !fromLegacy<int>( aCfg,
"PinSymbolSize",
"schematic.drawing.pin_symbol_size" ) )
274 Set(
"schematic.drawing.pin_symbol_size", 0 );
277 fromLegacy<int>( aCfg,
"JunctionSize",
"schematic.drawing.default_junction_size" );
279 fromLegacyString( aCfg,
"FieldNameTemplates",
"schematic.drawing.field_names" );
281 if( !fromLegacy<double>( aCfg,
"TextOffsetRatio",
"schematic.drawing.text_offset_ratio" ) )
284 Set(
"schematic.drawing.text_offset_ratio", 0.08 );
285 Set(
"schematic.drawing.label_size_ratio", 0.25 );
289 group_blacklist.insert( wxT(
"/schematic_editor" ) );
291 aCfg->SetPath( wxT(
"/pcbnew" ) );
293 fromLegacyString( aCfg,
"PageLayoutDescrFile",
"pcbnew.page_layout_descr_file" );
298 fromLegacyString( aCfg,
"LastSpecctraDSNExportPath",
"pcbnew.last_paths.specctra_dsn" );
299 fromLegacyString( aCfg,
"LastGenCADExportPath",
"pcbnew.last_paths.gencad" );
301 std::string bp =
"board.design_settings.";
305 wxString key = wxT(
"DRCExclusion" );
308 nlohmann::json exclusions = nlohmann::json::array();
310 while( aCfg->Read( key, &str ) )
312 exclusions.push_back( str );
314 key = wxT(
"DRCExclusion" );
318 Set( bp +
"drc_exclusions", exclusions );
321 fromLegacy<bool>( aCfg,
"AllowMicroVias", bp +
"rules.allow_microvias" );
322 fromLegacy<bool>( aCfg,
"AllowBlindVias", bp +
"rules.allow_blind_buried_vias" );
323 fromLegacy<double>( aCfg,
"MinClearance", bp +
"rules.min_clearance" );
324 fromLegacy<double>( aCfg,
"MinTrackWidth", bp +
"rules.min_track_width" );
325 fromLegacy<double>( aCfg,
"MinViaAnnulus", bp +
"rules.min_via_annulus" );
326 fromLegacy<double>( aCfg,
"MinViaDiameter", bp +
"rules.min_via_diameter" );
328 if( !fromLegacy<double>( aCfg,
"MinThroughDrill", bp +
"rules.min_through_hole_diameter" ) )
329 fromLegacy<double>( aCfg,
"MinViaDrill", bp +
"rules.min_through_hole_diameter" );
331 fromLegacy<double>( aCfg,
"MinMicroViaDiameter", bp +
"rules.min_microvia_diameter" );
332 fromLegacy<double>( aCfg,
"MinMicroViaDrill", bp +
"rules.min_microvia_drill" );
333 fromLegacy<double>( aCfg,
"MinHoleToHole", bp +
"rules.min_hole_to_hole" );
334 fromLegacy<double>( aCfg,
"CopperEdgeClearance", bp +
"rules.min_copper_edge_clearance" );
335 fromLegacy<double>( aCfg,
"SolderMaskClearance", bp +
"rules.solder_mask_clearance" );
336 fromLegacy<double>( aCfg,
"SolderMaskMinWidth", bp +
"rules.solder_mask_min_width" );
337 fromLegacy<double>( aCfg,
"SolderPasteClearance", bp +
"rules.solder_paste_clearance" );
338 fromLegacy<double>( aCfg,
"SolderPasteRatio", bp +
"rules.solder_paste_margin_ratio" );
340 if( !fromLegacy<double>( aCfg,
"SilkLineWidth", bp +
"defaults.silk_line_width" ) )
341 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.silk_line_width" );
343 if( !fromLegacy<double>( aCfg,
"SilkTextSizeV", bp +
"defaults.silk_text_size_v" ) )
344 fromLegacy<double>( aCfg,
"ModuleTextSizeV", bp +
"defaults.silk_text_size_v" );
346 if( !fromLegacy<double>( aCfg,
"SilkTextSizeH", bp +
"defaults.silk_text_size_h" ) )
347 fromLegacy<double>( aCfg,
"ModuleTextSizeH", bp +
"defaults.silk_text_size_h" );
349 if( !fromLegacy<double>( aCfg,
"SilkTextSizeThickness", bp +
"defaults.silk_text_thickness" ) )
350 fromLegacy<double>( aCfg,
"ModuleTextSizeThickness", bp +
"defaults.silk_text_thickness" );
352 fromLegacy<bool>( aCfg,
"SilkTextItalic", bp +
"defaults.silk_text_italic" );
353 fromLegacy<bool>( aCfg,
"SilkTextUpright", bp +
"defaults.silk_text_upright" );
355 if( !fromLegacy<double>( aCfg,
"CopperLineWidth", bp +
"defaults.copper_line_width" ) )
356 fromLegacy<double>( aCfg,
"DrawSegmentWidth", bp +
"defaults.copper_line_width" );
358 if( !fromLegacy<double>( aCfg,
"CopperTextSizeV", bp +
"defaults.copper_text_size_v" ) )
359 fromLegacy<double>( aCfg,
"PcbTextSizeV", bp +
"defaults.copper_text_size_v" );
361 if( !fromLegacy<double>( aCfg,
"CopperTextSizeH", bp +
"defaults.copper_text_size_h" ) )
362 fromLegacy<double>( aCfg,
"PcbTextSizeH", bp +
"defaults.copper_text_size_h" );
364 if( !fromLegacy<double>( aCfg,
"CopperTextThickness", bp +
"defaults.copper_text_thickness" ) )
365 fromLegacy<double>( aCfg,
"PcbTextThickness", bp +
"defaults.copper_text_thickness" );
367 fromLegacy<bool>( aCfg,
"CopperTextItalic", bp +
"defaults.copper_text_italic" );
368 fromLegacy<bool>( aCfg,
"CopperTextUpright", bp +
"defaults.copper_text_upright" );
370 if( !fromLegacy<double>( aCfg,
"EdgeCutLineWidth", bp +
"defaults.board_outline_line_width" ) )
371 fromLegacy<double>( aCfg,
"BoardOutlineThickness", bp +
"defaults.board_outline_line_width" );
373 fromLegacy<double>( aCfg,
"CourtyardLineWidth", bp +
"defaults.courtyard_line_width" );
375 fromLegacy<double>( aCfg,
"FabLineWidth", bp +
"defaults.fab_line_width" );
376 fromLegacy<double>( aCfg,
"FabTextSizeV", bp +
"defaults.fab_text_size_v" );
377 fromLegacy<double>( aCfg,
"FabTextSizeH", bp +
"defaults.fab_text_size_h" );
378 fromLegacy<double>( aCfg,
"FabTextSizeThickness", bp +
"defaults.fab_text_thickness" );
379 fromLegacy<bool>( aCfg,
"FabTextItalic", bp +
"defaults.fab_text_italic" );
380 fromLegacy<bool>( aCfg,
"FabTextUpright", bp +
"defaults.fab_text_upright" );
382 if( !fromLegacy<double>( aCfg,
"OthersLineWidth", bp +
"defaults.other_line_width" ) )
383 fromLegacy<double>( aCfg,
"ModuleOutlineThickness", bp +
"defaults.other_line_width" );
385 fromLegacy<double>( aCfg,
"OthersTextSizeV", bp +
"defaults.other_text_size_v" );
386 fromLegacy<double>( aCfg,
"OthersTextSizeH", bp +
"defaults.other_text_size_h" );
387 fromLegacy<double>( aCfg,
"OthersTextSizeThickness", bp +
"defaults.other_text_thickness" );
388 fromLegacy<bool>( aCfg,
"OthersTextItalic", bp +
"defaults.other_text_italic" );
389 fromLegacy<bool>( aCfg,
"OthersTextUpright", bp +
"defaults.other_text_upright" );
391 fromLegacy<int>( aCfg,
"DimensionUnits", bp +
"defaults.dimension_units" );
392 fromLegacy<int>( aCfg,
"DimensionPrecision", bp +
"defaults.dimension_precision" );
394 std::string sev = bp +
"rule_severities";
396 fromLegacy<bool>( aCfg,
"RequireCourtyardDefinitions", sev +
"legacy_no_courtyard_defined" );
398 fromLegacy<bool>( aCfg,
"ProhibitOverlappingCourtyards", sev +
"legacy_courtyards_overlap" );
402 wxString keyBase =
"TrackWidth";
403 wxString key = keyBase;
406 nlohmann::json widths = nlohmann::json::array();
410 while( aCfg->Read( key, &val ) )
412 widths.push_back( val );
417 Set( bp +
"track_widths", widths );
422 wxString keyBase =
"ViaDiameter";
423 wxString key = keyBase;
427 nlohmann::json vias = nlohmann::json::array();
431 while( aCfg->Read( key, &diameter ) )
434 aCfg->Read( key << idx, &drill );
436 nlohmann::json
via = { {
"diameter", diameter }, {
"drill", drill } };
437 vias.push_back(
via );
443 Set( bp +
"via_dimensions", vias );
448 wxString keyBase =
"dPairWidth";
449 wxString key = keyBase;
452 double via_gap = 1.0;
454 nlohmann::json pairs = nlohmann::json::array();
458 while( aCfg->Read( key, &width ) )
461 aCfg->Read( key << idx, &gap );
464 aCfg->Read( key << idx, &via_gap );
466 nlohmann::json pair = { {
"width", width }, {
"gap", gap }, {
"via_gap", via_gap } };
467 pairs.push_back( pair );
473 Set( bp +
"diff_pair_dimensions", pairs );
476 group_blacklist.insert( wxT(
"/pcbnew" ) );
479 group_blacklist.insert( wxT(
"/general" ) );
482 aCfg->SetPath( wxT(
"/" ) );
484 auto loadSheetNames =
489 nlohmann::json arr = nlohmann::json::array();
493 aCfg->SetPath( wxT(
"/sheetnames" ) );
495 while( aCfg->Read( wxString::Format(
"%d", sheet++ ), &entry ) )
497 wxArrayString tokens = wxSplit( entry,
':' );
499 if( tokens.size() == 2 )
501 wxLogTrace(
traceSettings, wxT(
"%d: %s = %s" ), sheet, tokens[0],
503 arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
507 Set(
"sheets", arr );
509 aCfg->SetPath(
"/" );
515 std::vector<wxString> groups;
517 groups.emplace_back( wxEmptyString );
519 auto loadLegacyPairs =
520 [&](
const std::string& aGroup ) ->
bool
522 wxLogTrace(
traceSettings, wxT(
"Migrating group %s" ), aGroup );
529 while( aCfg->GetNextEntry( keyStr, index ) )
531 if( !aCfg->Read( keyStr, &val ) )
534 std::string key( keyStr.ToUTF8() );
540 Set(
"legacy." + aGroup +
"." + key, val );
551 for(
size_t i = 0; i < groups.size(); i++ )
553 aCfg->SetPath( groups[i] );
555 if( groups[i] == wxT(
"/sheetnames" ) )
557 ret |= loadSheetNames();
561 aCfg->DeleteEntry( wxT(
"last_client" ),
true );
562 aCfg->DeleteEntry( wxT(
"update" ),
true );
563 aCfg->DeleteEntry( wxT(
"version" ),
true );
565 ret &= loadLegacyPairs( groups[i].ToStdString() );
569 while( aCfg->GetNextGroup( str, index ) )
571 wxString
group = groups[i] +
"/" + str;
573 if( !group_blacklist.count(
group ) )
574 groups.emplace_back(
group );
577 aCfg->SetPath(
"/" );
597 wxString oldProjectName = oldFilename.GetName();
598 wxString oldProjectPath = oldFilename.GetPath();
604 [&]( wxString& aPath )
606 if( aPath.StartsWith( oldProjectName + wxS(
"." ) ) )
607 aPath.Replace( oldProjectName, aFile,
false );
608 else if( aPath.StartsWith( oldProjectPath + wxS(
"/" ) ) )
609 aPath.Replace( oldProjectPath, aDirectory,
false );
617 auto updatePathByPtr =
618 [&](
const std::string& aPtr )
620 if( std::optional<wxString>
path = Get<wxString>( aPtr ) )
622 updatePath(
path.value() );
627 updatePathByPtr(
"schematic.page_layout_descr_file" );
628 updatePathByPtr(
"schematic.plot_directory" );
629 updatePathByPtr(
"schematic.ngspice.workbook_filename" );
630 updatePathByPtr(
"pcbnew.page_layout_descr_file" );
653 aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
659 wxCHECK( aJson.is_array() && aJson.size() == 2, );
660 aPair.first =
KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
661 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 SetReadOnly(bool aReadOnly)
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
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...
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)
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
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.
const std::string LegacyProjectFileExtension
const std::string ProjectFileExtension
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.
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.