KiCad PCB EDA Suite
project_file.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2020 CERN
5  * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
6  * @author Jon Evans <[email protected]>
7  *
8  * This program is free software: you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation, either version 3 of the License, or (at your
11  * option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <config_params.h>
23 #include <project.h>
24 #include <project/net_settings.h>
26 #include <project/project_file.h>
28 #include <settings/parameters.h>
30 #include <wx/config.h>
31 #include <wx/log.h>
32 
33 
36 
37 
38 PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
40  m_ErcSettings( nullptr ),
41  m_SchematicSettings( nullptr ),
42  m_BoardSettings(),
43  m_sheets(),
44  m_boards(),
45  m_project( nullptr )
46 {
47  // Keep old files around
49 
50  m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "sheets", &m_sheets, {} ) );
51 
52  m_params.emplace_back( new PARAM_LIST<FILE_INFO_PAIR>( "boards", &m_boards, {} ) );
53 
54  m_params.emplace_back( new PARAM_WXSTRING_MAP( "text_variables", &m_TextVars, {} ) );
55 
56  m_params.emplace_back(
57  new PARAM_LIST<wxString>( "libraries.pinned_symbol_libs", &m_PinnedSymbolLibs, {} ) );
58 
59  m_params.emplace_back( new PARAM_LIST<wxString>(
60  "libraries.pinned_footprint_libs", &m_PinnedFootprintLibs, {} ) );
61 
62  m_params.emplace_back(
63  new PARAM_PATH_LIST( "cvpcb.equivalence_files", &m_EquivalenceFiles, {} ) );
64 
65  m_params.emplace_back(
66  new PARAM_PATH( "pcbnew.page_layout_descr_file", &m_BoardDrawingSheetFile, "" ) );
67 
68  m_params.emplace_back(
69  new PARAM_PATH( "pcbnew.last_paths.netlist", &m_PcbLastPath[LAST_PATH_NETLIST], "" ) );
70 
71  m_params.emplace_back(
72  new PARAM_PATH( "pcbnew.last_paths.step", &m_PcbLastPath[LAST_PATH_STEP], "" ) );
73 
74  m_params.emplace_back(
75  new PARAM_PATH( "pcbnew.last_paths.idf", &m_PcbLastPath[LAST_PATH_IDF], "" ) );
76 
77  m_params.emplace_back(
78  new PARAM_PATH( "pcbnew.last_paths.vrml", &m_PcbLastPath[LAST_PATH_VRML], "" ) );
79 
80  m_params.emplace_back( new PARAM_PATH(
81  "pcbnew.last_paths.specctra_dsn", &m_PcbLastPath[LAST_PATH_SPECCTRADSN], "" ) );
82 
83  m_params.emplace_back(
84  new PARAM_PATH( "pcbnew.last_paths.gencad", &m_PcbLastPath[LAST_PATH_GENCAD], "" ) );
85 
86  m_params.emplace_back( new PARAM<wxString>( "schematic.legacy_lib_dir", &m_LegacyLibDir, "" ) );
87 
88  m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "schematic.legacy_lib_list",
89  [&]() -> nlohmann::json
90  {
91  nlohmann::json ret = nlohmann::json::array();
92 
93  for( const wxString& libName : m_LegacyLibNames )
94  ret.push_back( libName );
95 
96  return ret;
97  },
98  [&]( const nlohmann::json& aJson )
99  {
100  if( aJson.empty() || !aJson.is_array() )
101  return;
102 
103  m_LegacyLibNames.clear();
104 
105  for( const nlohmann::json& entry : aJson )
106  m_LegacyLibNames.push_back( entry.get<wxString>() );
107  }, {} ) );
108 
109  m_NetSettings = std::make_shared<NET_SETTINGS>( this, "net_settings" );
110 
111  m_params.emplace_back( new PARAM_LAYER_PRESET( "board.layer_presets", &m_LayerPresets ) );
112 }
113 
114 
115 bool PROJECT_FILE::MigrateFromLegacy( wxConfigBase* aCfg )
116 {
117  bool ret = true;
118  wxString str;
119  long index = 0;
120 
121  std::set<wxString> group_blacklist;
122 
123  // Legacy files don't store board info; they assume board matches project name
124  // We will leave m_boards empty here so it can be populated with other code
125 
126  // First handle migration of data that will be stored locally in this object
127 
128  auto loadPinnedLibs =
129  [&]( const std::string& aDest )
130  {
131  int libIndex = 1;
132  wxString libKey = wxT( "PinnedItems" );
133  libKey << libIndex;
134 
135  nlohmann::json libs = nlohmann::json::array();
136 
137  while( aCfg->Read( libKey, &str ) )
138  {
139  libs.push_back( str );
140 
141  aCfg->DeleteEntry( libKey, true );
142 
143  libKey = wxT( "PinnedItems" );
144  libKey << ++libIndex;
145  }
146 
147  Set( aDest, libs );
148  };
149 
150  aCfg->SetPath( wxT( "/LibeditFrame" ) );
151  loadPinnedLibs( "libraries.pinned_symbol_libs" );
152 
153  aCfg->SetPath( wxT( "/ModEditFrame" ) );
154  loadPinnedLibs( "libraries.pinned_footprint_libs" );
155 
156  aCfg->SetPath( wxT( "/cvpcb/equfiles" ) );
157 
158  {
159  int eqIdx = 1;
160  wxString eqKey = wxT( "EquName" );
161  eqKey << eqIdx;
162 
163  nlohmann::json eqs = nlohmann::json::array();
164 
165  while( aCfg->Read( eqKey, &str ) )
166  {
167  eqs.push_back( str );
168 
169  eqKey = wxT( "EquName" );
170  eqKey << ++eqIdx;
171  }
172 
173  Set( "cvpcb.equivalence_files", eqs );
174  }
175 
176  // All CvPcb params that we want to keep have been migrated above
177  group_blacklist.insert( wxT( "/cvpcb" ) );
178 
179  aCfg->SetPath( wxT( "/eeschema" ) );
180  fromLegacyString( aCfg, "LibDir", "schematic.legacy_lib_dir" );
181 
182  aCfg->SetPath( wxT( "/eeschema/libraries" ) );
183 
184  {
185  int libIdx = 1;
186  wxString libKey = wxT( "LibName" );
187  libKey << libIdx;
188 
189  nlohmann::json libs = nlohmann::json::array();
190 
191  while( aCfg->Read( libKey, &str ) )
192  {
193  libs.push_back( str );
194 
195  libKey = wxT( "LibName" );
196  libKey << ++libIdx;
197  }
198 
199  Set( "schematic.legacy_lib_list", libs );
200  }
201 
202  group_blacklist.insert( wxT( "/eeschema" ) );
203 
204  aCfg->SetPath( wxT( "/text_variables" ) );
205 
206  {
207  int txtIdx = 1;
208  wxString txtKey;
209  txtKey << txtIdx;
210 
212 
213  while( aCfg->Read( txtKey, &str ) )
214  {
215  wxArrayString tokens = wxSplit( str, ':' );
216 
217  if( tokens.size() == 2 )
218  vars[ tokens[0].ToStdString() ] = tokens[1];
219 
220  txtKey.clear();
221  txtKey << ++txtIdx;
222  }
223 
224  Set( "text_variables", vars );
225  }
226 
227  group_blacklist.insert( wxT( "/text_variables" ) );
228 
229  aCfg->SetPath( wxT( "/schematic_editor" ) );
230 
231  fromLegacyString( aCfg, "PageLayoutDescrFile", "schematic.page_layout_descr_file" );
232  fromLegacyString( aCfg, "PlotDirectoryName", "schematic.plot_directory" );
233  fromLegacyString( aCfg, "NetFmtName", "schematic.net_format_name" );
234  fromLegacy<bool>( aCfg, "SpiceAjustPassiveValues", "schematic.spice_adjust_passive_values" );
235  fromLegacy<int>( aCfg, "SubpartIdSeparator", "schematic.subpart_id_separator" );
236  fromLegacy<int>( aCfg, "SubpartFirstId", "schematic.subpart_first_id" );
237 
238  fromLegacy<int>( aCfg, "LineThickness", "schematic.drawing.default_line_thickness" );
239  fromLegacy<int>( aCfg, "WireThickness", "schematic.drawing.default_wire_thickness" );
240  fromLegacy<int>( aCfg, "BusThickness", "schematic.drawing.default_bus_thickness" );
241  fromLegacy<int>( aCfg, "LabSize", "schematic.drawing.default_text_size" );
242 
243  if( !fromLegacy<int>( aCfg, "PinSymbolSize", "schematic.drawing.pin_symbol_size" ) )
244  {
245  // Use the default symbol size algorithm of Eeschema V5 (based on pin name/number size)
246  Set( "schematic.drawing.pin_symbol_size", 0 );
247  }
248 
249  fromLegacy<int>( aCfg, "JunctionSize", "schematic.drawing.default_junction_size" );
250 
251  fromLegacyString( aCfg, "FieldNameTemplates", "schematic.drawing.field_names" );
252 
253  if( !fromLegacy<double>( aCfg, "TextOffsetRatio", "schematic.drawing.text_offset_ratio" ) )
254  {
255  // Use the spacing of Eeschema V5
256  Set( "schematic.drawing.text_offset_ratio", 0.08 );
257  Set( "schematic.drawing.label_size_ratio", 0.25 );
258  }
259 
260  // All schematic_editor keys we keep are migrated above
261  group_blacklist.insert( wxT( "/schematic_editor" ) );
262 
263  aCfg->SetPath( wxT( "/pcbnew" ) );
264 
265  fromLegacyString( aCfg, "PageLayoutDescrFile", "pcbnew.page_layout_descr_file" );
266  fromLegacyString( aCfg, "LastNetListRead", "pcbnew.last_paths.netlist" );
267  fromLegacyString( aCfg, "LastSTEPExportPath", "pcbnew.last_paths.step" );
268  fromLegacyString( aCfg, "LastIDFExportPath", "pcbnew.last_paths.idf" );
269  fromLegacyString( aCfg, "LastVRMLExportPath", "pcbnew.last_paths.vmrl" );
270  fromLegacyString( aCfg, "LastSpecctraDSNExportPath", "pcbnew.last_paths.specctra_dsn" );
271  fromLegacyString( aCfg, "LastGenCADExportPath", "pcbnew.last_paths.gencad" );
272 
273  std::string bp = "board.design_settings.";
274 
275  {
276  int idx = 1;
277  wxString key = wxT( "DRCExclusion" );
278  key << idx;
279 
280  nlohmann::json exclusions = nlohmann::json::array();
281 
282  while( aCfg->Read( key, &str ) )
283  {
284  exclusions.push_back( str );
285 
286  key = wxT( "DRCExclusion" );
287  key << ++idx;
288  }
289 
290  Set( bp + "drc_exclusions", exclusions );
291  }
292 
293  fromLegacy<bool>( aCfg, "AllowMicroVias", bp + "rules.allow_microvias" );
294  fromLegacy<bool>( aCfg, "AllowBlindVias", bp + "rules.allow_blind_buried_vias" );
295  fromLegacy<double>( aCfg, "MinClearance", bp + "rules.min_clearance" );
296  fromLegacy<double>( aCfg, "MinTrackWidth", bp + "rules.min_track_width" );
297  fromLegacy<double>( aCfg, "MinViaAnnulus", bp + "rules.min_via_annulus" );
298  fromLegacy<double>( aCfg, "MinViaDiameter", bp + "rules.min_via_diameter" );
299 
300  if( !fromLegacy<double>( aCfg, "MinThroughDrill", bp + "rules.min_through_hole_diameter" ) )
301  fromLegacy<double>( aCfg, "MinViaDrill", bp + "rules.min_through_hole_diameter" );
302 
303  fromLegacy<double>( aCfg, "MinMicroViaDiameter", bp + "rules.min_microvia_diameter" );
304  fromLegacy<double>( aCfg, "MinMicroViaDrill", bp + "rules.min_microvia_drill" );
305  fromLegacy<double>( aCfg, "MinHoleToHole", bp + "rules.min_hole_to_hole" );
306  fromLegacy<double>( aCfg, "CopperEdgeClearance", bp + "rules.min_copper_edge_clearance" );
307  fromLegacy<double>( aCfg, "SolderMaskClearance", bp + "rules.solder_mask_clearance" );
308  fromLegacy<double>( aCfg, "SolderMaskMinWidth", bp + "rules.solder_mask_min_width" );
309  fromLegacy<double>( aCfg, "SolderPasteClearance", bp + "rules.solder_paste_clearance" );
310  fromLegacy<double>( aCfg, "SolderPasteRatio", bp + "rules.solder_paste_margin_ratio" );
311 
312  if( !fromLegacy<double>( aCfg, "SilkLineWidth", bp + "defaults.silk_line_width" ) )
313  fromLegacy<double>( aCfg, "ModuleOutlineThickness", bp + "defaults.silk_line_width" );
314 
315  if( !fromLegacy<double>( aCfg, "SilkTextSizeV", bp + "defaults.silk_text_size_v" ) )
316  fromLegacy<double>( aCfg, "ModuleTextSizeV", bp + "defaults.silk_text_size_v" );
317 
318  if( !fromLegacy<double>( aCfg, "SilkTextSizeH", bp + "defaults.silk_text_size_h" ) )
319  fromLegacy<double>( aCfg, "ModuleTextSizeH", bp + "defaults.silk_text_size_h" );
320 
321  if( !fromLegacy<double>( aCfg, "SilkTextSizeThickness", bp + "defaults.silk_text_thickness" ) )
322  fromLegacy<double>( aCfg, "ModuleTextSizeThickness", bp + "defaults.silk_text_thickness" );
323 
324  fromLegacy<bool>( aCfg, "SilkTextItalic", bp + "defaults.silk_text_italic" );
325  fromLegacy<bool>( aCfg, "SilkTextUpright", bp + "defaults.silk_text_upright" );
326 
327  if( !fromLegacy<double>( aCfg, "CopperLineWidth", bp + "defaults.copper_line_width" ) )
328  fromLegacy<double>( aCfg, "DrawSegmentWidth", bp + "defaults.copper_line_width" );
329 
330  if( !fromLegacy<double>( aCfg, "CopperTextSizeV", bp + "defaults.copper_text_size_v" ) )
331  fromLegacy<double>( aCfg, "PcbTextSizeV", bp + "defaults.copper_text_size_v" );
332 
333  if( !fromLegacy<double>( aCfg, "CopperTextSizeH", bp + "defaults.copper_text_size_h" ) )
334  fromLegacy<double>( aCfg, "PcbTextSizeH", bp + "defaults.copper_text_size_h" );
335 
336  if( !fromLegacy<double>( aCfg, "CopperTextThickness", bp + "defaults.copper_text_thickness" ) )
337  fromLegacy<double>( aCfg, "PcbTextThickness", bp + "defaults.copper_text_thickness" );
338 
339  fromLegacy<bool>( aCfg, "CopperTextItalic", bp + "defaults.copper_text_italic" );
340  fromLegacy<bool>( aCfg, "CopperTextUpright", bp + "defaults.copper_text_upright" );
341 
342  if( !fromLegacy<double>( aCfg, "EdgeCutLineWidth", bp + "defaults.board_outline_line_width" ) )
343  fromLegacy<double>( aCfg, "BoardOutlineThickness", bp + "defaults.board_outline_line_width" );
344 
345  fromLegacy<double>( aCfg, "CourtyardLineWidth", bp + "defaults.courtyard_line_width" );
346 
347  fromLegacy<double>( aCfg, "FabLineWidth", bp + "defaults.fab_line_width" );
348  fromLegacy<double>( aCfg, "FabTextSizeV", bp + "defaults.fab_text_size_v" );
349  fromLegacy<double>( aCfg, "FabTextSizeH", bp + "defaults.fab_text_size_h" );
350  fromLegacy<double>( aCfg, "FabTextSizeThickness", bp + "defaults.fab_text_thickness" );
351  fromLegacy<bool>( aCfg, "FabTextItalic", bp + "defaults.fab_text_italic" );
352  fromLegacy<bool>( aCfg, "FabTextUpright", bp + "defaults.fab_text_upright" );
353 
354  if( !fromLegacy<double>( aCfg, "OthersLineWidth", bp + "defaults.other_line_width" ) )
355  fromLegacy<double>( aCfg, "ModuleOutlineThickness", bp + "defaults.other_line_width" );
356 
357  fromLegacy<double>( aCfg, "OthersTextSizeV", bp + "defaults.other_text_size_v" );
358  fromLegacy<double>( aCfg, "OthersTextSizeH", bp + "defaults.other_text_size_h" );
359  fromLegacy<double>( aCfg, "OthersTextSizeThickness", bp + "defaults.other_text_thickness" );
360  fromLegacy<bool>( aCfg, "OthersTextItalic", bp + "defaults.other_text_italic" );
361  fromLegacy<bool>( aCfg, "OthersTextUpright", bp + "defaults.other_text_upright" );
362 
363  fromLegacy<int>( aCfg, "DimensionUnits", bp + "defaults.dimension_units" );
364  fromLegacy<int>( aCfg, "DimensionPrecision", bp + "defaults.dimension_precision" );
365 
366  std::string sev = bp + "rule_severities";
367 
368  fromLegacy<bool>( aCfg, "RequireCourtyardDefinitions", sev + "legacy_no_courtyard_defined" );
369 
370  fromLegacy<bool>( aCfg, "ProhibitOverlappingCourtyards", sev + "legacy_courtyards_overlap" );
371 
372  {
373  int idx = 1;
374  wxString keyBase = "TrackWidth";
375  wxString key = keyBase;
376  double val;
377 
378  nlohmann::json widths = nlohmann::json::array();
379 
380  key << idx;
381 
382  while( aCfg->Read( key, &val ) )
383  {
384  widths.push_back( val );
385  key = keyBase;
386  key << ++idx;
387  }
388 
389  Set( bp + "track_widths", widths );
390  }
391 
392  {
393  int idx = 1;
394  wxString keyBase = "ViaDiameter";
395  wxString key = keyBase;
396  double diameter;
397  double drill = 1.0;
398 
399  nlohmann::json vias = nlohmann::json::array();
400 
401  key << idx;
402 
403  while( aCfg->Read( key, &diameter ) )
404  {
405  key = "ViaDrill";
406  aCfg->Read( key << idx, &drill );
407 
408  nlohmann::json via = { { "diameter", diameter }, { "drill", drill } };
409  vias.push_back( via );
410 
411  key = keyBase;
412  key << ++idx;
413  }
414 
415  Set( bp + "via_dimensions", vias );
416  }
417 
418  {
419  int idx = 1;
420  wxString keyBase = "dPairWidth";
421  wxString key = keyBase;
422  double width;
423  double gap = 1.0;
424  double via_gap = 1.0;
425 
426  nlohmann::json pairs = nlohmann::json::array();
427 
428  key << idx;
429 
430  while( aCfg->Read( key, &width ) )
431  {
432  key = "dPairGap";
433  aCfg->Read( key << idx, &gap );
434 
435  key = "dPairViaGap";
436  aCfg->Read( key << idx, &via_gap );
437 
438  nlohmann::json pair = { { "width", width }, { "gap", gap }, { "via_gap", via_gap } };
439  pairs.push_back( pair );
440 
441  key = keyBase;
442  key << ++idx;
443  }
444 
445  Set( bp + "diff_pair_dimensions", pairs );
446  }
447 
448  group_blacklist.insert( wxT( "/pcbnew" ) );
449 
450  // General group is unused these days, we can throw it away
451  group_blacklist.insert( wxT( "/general" ) );
452 
453  // Next load sheet names and put all other legacy data in the legacy dict
454  aCfg->SetPath( wxT( "/" ) );
455 
456  auto loadSheetNames =
457  [&]() -> bool
458  {
459  int sheet = 1;
460  wxString entry;
461  nlohmann::json arr = nlohmann::json::array();
462 
463  wxLogTrace( traceSettings, wxT( "Migrating sheet names" ) );
464 
465  aCfg->SetPath( wxT( "/sheetnames" ) );
466 
467  while( aCfg->Read( wxString::Format( "%d", sheet++ ), &entry ) )
468  {
469  wxArrayString tokens = wxSplit( entry, ':' );
470 
471  if( tokens.size() == 2 )
472  {
473  wxLogTrace( traceSettings, wxT( "%d: %s = %s" ), sheet, tokens[0],
474  tokens[1] );
475  arr.push_back( nlohmann::json::array( { tokens[0], tokens[1] } ) );
476  }
477  }
478 
479  Set( "sheets", arr );
480 
481  aCfg->SetPath( "/" );
482 
483  // TODO: any reason we want to fail on this?
484  return true;
485  };
486 
487  std::vector<wxString> groups;
488 
489  groups.emplace_back( "" );
490 
491  auto loadLegacyPairs =
492  [&]( const std::string& aGroup ) -> bool
493  {
494  wxLogTrace( traceSettings, wxT( "Migrating group %s" ), aGroup );
495  bool success = true;
496  wxString keyStr;
497  wxString val;
498 
499  index = 0;
500 
501  while( aCfg->GetNextEntry( keyStr, index ) )
502  {
503  if( !aCfg->Read( keyStr, &val ) )
504  continue;
505 
506  std::string key( keyStr.ToUTF8() );
507 
508  wxLogTrace( traceSettings, wxT( " %s = %s" ), key, val );
509 
510  try
511  {
512  Set( "legacy." + aGroup + "." + key, val );
513  }
514  catch( ... )
515  {
516  success = false;
517  }
518  }
519 
520  return success;
521  };
522 
523  for( size_t i = 0; i < groups.size(); i++ )
524  {
525  aCfg->SetPath( groups[i] );
526 
527  if( groups[i] == wxT( "/sheetnames" ) )
528  {
529  ret |= loadSheetNames();
530  continue;
531  }
532 
533  aCfg->DeleteEntry( wxT( "last_client" ), true );
534  aCfg->DeleteEntry( wxT( "update" ), true );
535  aCfg->DeleteEntry( wxT( "version" ), true );
536 
537  ret &= loadLegacyPairs( groups[i].ToStdString() );
538 
539  index = 0;
540 
541  while( aCfg->GetNextGroup( str, index ) )
542  {
543  wxString group = groups[i] + "/" + str;
544 
545  if( !group_blacklist.count( group ) )
546  groups.emplace_back( group );
547  }
548 
549  aCfg->SetPath( "/" );
550  }
551 
552  return ret;
553 }
554 
555 
556 bool PROJECT_FILE::SaveToFile( const wxString& aDirectory, bool aForce )
557 {
558  wxASSERT( m_project );
559 
560  Set( "meta.filename", m_project->GetProjectName() + "." + ProjectFileExtension );
561 
562  return JSON_SETTINGS::SaveToFile( aDirectory, aForce );
563 }
564 
565 
566 bool PROJECT_FILE::SaveAs( const wxString& aDirectory, const wxString& aFile )
567 {
568  Set( "meta.filename", aFile + "." + ProjectFileExtension );
569  SetFilename( aFile );
570 
571  // While performing Save As, we have already checked that we can write to the directory
572  // so don't carry the previous flag
573  SetReadOnly( false );
574  return JSON_SETTINGS::SaveToFile( aDirectory, true );
575 }
576 
577 
578 wxString PROJECT_FILE::getFileExt() const
579 {
580  return ProjectFileExtension;
581 }
582 
583 
585 {
587 }
588 
589 
590 void to_json( nlohmann::json& aJson, const FILE_INFO_PAIR& aPair )
591 {
592  aJson = nlohmann::json::array( { aPair.first.AsString().ToUTF8(), aPair.second.ToUTF8() } );
593 }
594 
595 
596 void from_json( const nlohmann::json& aJson, FILE_INFO_PAIR& aPair )
597 {
598  wxCHECK( aJson.is_array() && aJson.size() == 2, /* void */ );
599  aPair.first = KIID( wxString( aJson[0].get<std::string>().c_str(), wxConvUTF8 ) );
600  aPair.second = wxString( aJson[1].get<std::string>().c_str(), wxConvUTF8 );
601 }
PROJECT * m_project
A link to the owning PROJECT.
Definition: project_file.h:181
std::map< wxString, wxString > m_TextVars
Definition: project_file.h:120
std::vector< wxString > m_PinnedSymbolLibs
Below are project-level settings that have not been moved to a dedicated file.
Definition: project_file.h:115
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...
std::vector< wxString > m_PinnedFootprintLibs
The list of pinned footprint libraries.
Definition: project_file.h:118
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
Container for project specific data.
Definition: project.h:62
const std::string ProjectFileExtension
wxArrayString m_LegacyLibNames
Definition: project_file.h:135
void SetReadOnly(bool aReadOnly)
Definition: json_settings.h:84
std::vector< FILE_INFO_PAIR > m_sheets
An list of schematic sheets in this project.
Definition: project_file.h:175
const int projectFileSchemaVersion
! Update the schema version whenever a migration is required
wxString getLegacyFileExt() const override
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
SETTINGS_LOC
Definition: json_settings.h:46
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
Definition: project_file.h:152
nlohmann::json json
Definition: gerbview.cpp:41
bool m_deleteLegacyAfterMigration
Whether or not to delete legacy file after migration.
Stores a path as a string with directory separators normalized to unix-style.
Definition: parameters.h:162
Definition: kiid.h:44
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...
Definition: project_file.h:35
wxString m_BoardDrawingSheetFile
PcbNew params.
Definition: project_file.h:149
std::shared_ptr< NET_SETTINGS > m_NetSettings
Net settings for this project (owned here)
Definition: project_file.h:168
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
std::vector< wxString > m_EquivalenceFiles
CvPcb params.
Definition: project_file.h:142
Definition of file extensions used in Kicad.
wxString getFileExt() const override
const std::string LegacyProjectFileExtension
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
A helper for <wxString, wxString> maps.
Definition: parameters.h:543
void to_json(nlohmann::json &aJson, const FILE_INFO_PAIR &aPair)
bool SaveAs(const wxString &aDirectory, const wxString &aFile)
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
void from_json(const nlohmann::json &aJson, FILE_INFO_PAIR &aPair)
wxString m_LegacyLibDir
Definition: project_file.h:133
virtual const wxString GetProjectName() const
Return the short name of the project.
Definition: project.cpp:128
const wxChar *const traceSettings
Flag to enable debug output of settings operations and management.
std::vector< LAYER_PRESET > m_LayerPresets
List of stored layer presets.
Definition: project_file.h:171
void SetFilename(const wxString &aFilename)
Definition: json_settings.h:76
Represents a list of strings holding directory paths.
Definition: parameters.h:452
PROJECT_FILE(const wxString &aFullPath)
Construct the project file for a project.
std::vector< FILE_INFO_PAIR > m_boards
A list of board files in this project.
Definition: project_file.h:178