80#include <wx/filedlg.h>
82#include <wx/richmsgdlg.h>
83#include <wx/stdpaths.h>
108 if( aFileSet.size() != 1 )
110 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
115 wxString fullFileName( aFileSet[0] );
116 wxFileName wx_filename( fullFileName );
119 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
124 if(
Prj().IsLockOverrideGranted() )
130 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
147 wxFileName pro = fullFileName;
150 bool is_new = !wxFileName::IsFileReadable( fullFileName );
156 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ), fullFileName );
158 if( !
IsOK(
this, msg ) )
162 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
163 ProcessEventLocally( e );
173 SetStatusText( wxEmptyString );
177 statusBar->ClearWarningMessages(
"load" );
187 if( differentProject )
189 if( !
Prj().IsNullProject() )
201 wxFileName legacyPro( pro );
206 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
216 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
220 bool isNonKicadImport = schFileType != SCH_IO_MGR::SCH_KICAD
221 && schFileType != SCH_IO_MGR::SCH_LEGACY
222 && schFileType != SCH_IO_MGR::SCH_FILE_UNKNOWN;
228 if( isNonKicadImport )
230 progressReporter.Hide();
231 return importFile( fullFileName, schFileType,
nullptr );
234 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
255 wxFileName rfn( fullFileName );
256 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
266 if( is_new || schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
268 newSchematic->CreateDefaultScreens();
275 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
279 msg.Printf(
_(
"'%s' is not a KiCad schematic file.\n"
280 "Use File -> Import for non-KiCad schematic files." ), fullFileName );
285 msg.Printf(
_(
"'%s' is not a recognised schematic format." ), fullFileName );
288 progressReporter.Hide();
298 pi->SetProgressReporter( &progressReporter );
300 bool failedLoad =
false;
310 const std::vector<TOP_LEVEL_SHEET_INFO>& topLevelSheets = projectFile.
GetTopLevelSheets();
312 if( !topLevelSheets.empty() )
314 std::vector<SCH_SHEET*> loadedSheets;
319 wxFileName sheetFileName(
Prj().GetProjectPath(), sheetInfo.filename );
322 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
325 wxString sheetPath = sheetFileName.GetFullPath();
327 if( !wxFileName::FileExists( sheetPath ) )
329 wxLogWarning( wxT(
"Top-level sheet file not found: %s" ), sheetPath );
333 SCH_SHEET* sheet = pi->LoadSchematicFile( sheetPath, newSchematic.get() );
339 if( sheetInfo.uuid !=
niluuid )
341 const_cast<KIID&
>( sheet->
m_Uuid ) = sheetInfo.uuid;
344 sheet->
SetName( sheetInfo.name );
345 loadedSheets.push_back( sheet );
347 wxLogTrace(
tracePathsAndFiles, wxS(
"Loaded top-level sheet '%s' (UUID %s) from %s" ),
352 if( !loadedSheets.empty() )
354 newSchematic->SetTopLevelSheets( loadedSheets );
359 wxS(
"Loaded multi-root schematic with no top-level sheets!" ) );
360 newSchematic->CreateDefaultScreens();
366 SCH_SHEET* rootSheet = pi->LoadSchematicFile( fullFileName, newSchematic.get() );
370 newSchematic->SetTopLevelSheets( { rootSheet } );
374 if(
SCH_SHEET* topSheet = newSchematic->GetTopLevelSheet() )
375 topSheet->SetName(
_(
"Root" ) );
380 wxS(
"After loading: Current sheet path='%s', size=%zu, empty=%d" ),
381 newSchematic->CurrentSheet().Path().AsString(),
382 newSchematic->CurrentSheet().size(),
383 newSchematic->CurrentSheet().empty() ? 1 : 0 );
387 newSchematic->CreateDefaultScreens();
393 if( !pi->GetError().IsEmpty() )
396 "occurred attempting to load hierarchical sheets." ),
402 newSchematic->CreateDefaultScreens();
403 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
404 progressReporter.Hide();
411 newSchematic->CreateDefaultScreens();
412 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
413 progressReporter.Hide();
418 catch(
const std::bad_alloc& )
420 newSchematic->CreateDefaultScreens();
421 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
422 progressReporter.Hide();
444 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
446 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
458 bool repairedPageNumbers =
false;
468 if( sheetList.
IsModified() || repairedPageNumbers )
470 DisplayInfoMessage(
this,
_(
"An error was found when loading the schematic that has been "
471 "automatically fixed. Please save the schematic to repair the "
472 "broken file or it may not be usable with other versions of "
479 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
484 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
489 std::vector<SCH_ITEM*> deleted;
491 for(
SCH_ITEM* item : screen->Items() )
496 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
500 wire->SetEndPoint( entry->
GetEnd() );
502 screen->Append( wire.release() );
503 deleted.push_back( item );
508 screen->Remove( item );
524 wxArrayString libNames;
528 if( !libNames.IsEmpty() )
530 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
532 wxRichMessageDialog dlg(
this,
533 _(
"Illegal entry found in project file symbol library list." ),
534 _(
"Project Load Warning" ),
535 wxOK | wxCENTER | wxICON_EXCLAMATION );
536 dlg.ShowDetailedText(
_(
"Symbol libraries defined in the project file symbol library "
537 "list are no longer supported and will be removed.\n\n"
538 "This may cause broken symbol library links under certain "
540 dlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
551 wxFileName cacheFn( fullFileName );
552 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
554 bool cacheExists = cacheFn.FileExists();
565 if( !(*table)->HasRow( nickname ) )
569 row.
SetURI( cacheFn.GetFullPath() );
575 std::vector<KI_ERROR> libErrors;
580 statusBar->AddWarningMessages(
"load", libErrors );
587 editor->RescueSymbolLibTableProject(
false );
596 wxFileName cacheFn = pro;
598 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn BEFORE path='%s' name='%s' full='%s' arg='%s'",
599 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath(), cacheFn.GetName() +
"-cache" );
600 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
601 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn AFTER path='%s' name='%s' full='%s'",
602 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath() );
605 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ), cacheFn.GetFullName() );
607 KICAD_MESSAGE_DIALOG dlg(
this, msg,
_(
"Warning" ), wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
608 dlg.SetExtendedMessage(
_(
"This can result in a broken schematic under certain conditions. If the "
609 "schematic does not have any missing symbols upon opening, save it "
610 "immediately before making any changes to prevent data loss. If there "
611 "are missing symbols, either manual recovery of the schematic or "
612 "recovery of the symbol cache library file and reloading the schematic is "
614 dlg.SetOKCancelLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Load Without Cache File" ) ),
615 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Abort" ) ) );
617 if( dlg.ShowModal() == wxID_CANCEL )
630 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
631 "It will be converted to the new format when saved." ),
632 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
639 screen->FixLegacyPowerSymbolMismatches();
650 first_screen = schematic.
GetNext();
656 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
657 "It will be converted to the new format when saved." ),
658 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
676 screen->FixLegacyPowerSymbolMismatches();
679 screen->MigrateSimModels();
690 wxLogTrace(
traceSchCurrentSheet,
"Before CheckForMissingSymbolInstances: Current sheet path='%s', size=%zu",
706 if( repairedPageNumbers )
714 const bool nativeNeedsFixup = schFileType == SCH_IO_MGR::SCH_KICAD
718 if( schFileType == SCH_IO_MGR::SCH_LEGACY || nativeNeedsFixup )
723 progressReporter.
Report(
_(
"Updating connections..." ) );
736 schFileVersion,
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() ) )
738 progressReporter.Hide();
748 progressReporter.Show();
752 dummy.Push(
_(
"Schematic Cleanup" ),
758 m_infoBar->QueueShowMessage(
_(
"This schematic contains symbols that have leading "
759 "and/or trailing white space field names." ),
786 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
787 ProcessEventLocally( changedEvt );
789 if( !differentProject )
800 wxCHECK2( listener,
continue );
804 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
807 win->HandleWindowEvent( e );
809 listener->SafelyProcessEvent( e );
817 if( fn.FileExists() && !fn.IsFileWritable() )
821 m_infoBar->ShowMessage(
_(
"Schematic is read only." ), wxICON_WARNING,
822 WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
852 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
853 "which will be permanently lost.\n\n"
854 "Do you want to proceed?" );
856 if( !
IsOK(
this, msg ) )
862 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
864 wxString fileFiltersStr;
865 wxString allWildcardsStr;
867 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
869 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
882 if( !fileFiltersStr.IsEmpty() )
883 fileFiltersStr += wxChar(
'|' );
891 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" ) + fileFiltersStr;
893 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
894 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
897 dlg.SetCustomizeHook( importOptions );
901 if( dlg.ShowModal() == wxID_CANCEL )
921 wxFileName projectFn( dlg.GetPath() );
926 wxFileName fn = dlg.GetPath();
928 if( !fn.IsFileReadable() )
930 wxLogError(
_(
"Insufficient permissions to read file '%s'." ), fn.GetFullPath() );
934 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
936 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
943 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
950 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
952 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
967 wxFileName schematicFileName;
968 wxFileName oldFileName;
973 wxCHECK( screen,
false );
976 if( aSavePath.IsEmpty() )
981 oldFileName = schematicFileName;
986 if( !schematicFileName.DirExists() )
988 if( !wxMkdir( schematicFileName.GetPath() ) )
990 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
991 schematicFileName.GetFullPath(),
992 "Could not create directory: %s" + schematicFileName.GetPath() );
1002 wxFileName projectFile( schematicFileName );
1006 if( projectFile.FileExists() )
1014 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
1016 if(
m_infoBar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE )
1021 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1022 pluginType = SCH_IO_MGR::SCH_KICAD;
1028 if( schematicFileName.FileExists() )
1033 pi->SaveSchematicFile( schematicFileName.GetFullPath(), aSheet, &
Schematic() );
1038 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
1039 schematicFileName.GetFullPath(),
1051 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
1052 SetStatusText( msg, 0 );
1060 const wxFileName& aNewRoot,
bool aSaveCopy,
bool aCopySubsheets,
bool aIncludeExternSheets,
1061 std::unordered_map<SCH_SCREEN*, wxString>& aFilenameMap, wxString& aErrorMsg )
1065 for(
size_t i = 0; i < aScreens.
GetCount(); i++ )
1069 wxCHECK2( screen,
continue );
1081 if( !src.IsAbsolute() )
1082 src.MakeAbsolute( aOldRoot.GetPath() );
1084 bool internalSheet = src.GetPath().StartsWith( aOldRoot.GetPath() );
1086 if( aCopySubsheets && ( internalSheet || aIncludeExternSheets ) )
1088 wxFileName dest = src;
1090 if( internalSheet && dest.MakeRelativeTo( aOldRoot.GetPath() ) )
1091 dest.MakeAbsolute( aNewRoot.GetPath() );
1093 dest.Assign( aNewRoot.GetPath(), dest.GetFullName() );
1098 if( !dest.DirExists() && !dest.Mkdir() )
1100 aErrorMsg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1101 "Make sure you have write permissions and try again." ),
1107 aFilenameMap[screen] = dest.GetFullPath();
1114 aFilenameMap[screen] = wxString();
1122 if( !sheet.Last()->IsTopLevelSheet() )
1123 sheet.MakeFilePathRelativeToParentSheet();
1135 bool success =
true;
1136 bool updateFileHistory =
false;
1137 bool createNewProject =
false;
1138 bool copySubsheets =
false;
1139 bool includeExternSheets =
false;
1143 wxFileName fn = fileName;
1147 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
1150 if(
Prj().IsNullProject() || aSaveAs )
1153 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
1155 wxFileName newFileName;
1156 wxFileName savePath(
Prj().GetProjectFullName() );
1158 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1162 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1166 if( savePath.HasExt() )
1169 savePath.SetName( wxEmptyString );
1171 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
1177 if(
Kiface().IsSingle() || aSaveAs )
1179 dlg.SetCustomizeHook( newProjectHook );
1184 if( dlg.ShowModal() == wxID_CANCEL )
1189 if( ( !newFileName.DirExists() && !newFileName.Mkdir() )
1190 || !newFileName.IsDirWritable() )
1192 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1193 "Make sure you have write permissions and try again." ),
1194 newFileName.GetPath() );
1198 dlgBadPath.ShowModal();
1213 updateFileHistory =
true;
1221 filenameMap, msg ) )
1223 KICAD_MESSAGE_DIALOG dlgBadFilePath(
this, msg,
_(
"Error" ), wxOK | wxICON_EXCLAMATION | wxCENTER );
1225 dlgBadFilePath.ShowModal();
1229 else if( !fn.FileExists() )
1232 updateFileHistory =
true;
1243 if( filenameMap.empty() || !saveCopy )
1245 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1250 wxArrayString overwrittenFiles;
1251 wxArrayString lockedFiles;
1253 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1257 wxCHECK2( screen,
continue );
1260 wxFileName tmpFn = filenameMap[screen];
1265 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1266 lockedFiles.Add( tmpFn.GetFullPath() );
1273 if( tmpFn.FileExists() )
1274 overwrittenFiles.Add( tmpFn.GetFullPath() );
1277 if( !lockedFiles.IsEmpty() )
1279 for(
const wxString& lockedFile : lockedFiles )
1284 msg +=
"\n" + lockedFile;
1287 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
Schematic().Root().GetFileName() ),
1288 _(
"Locked File Warning" ), wxOK | wxICON_WARNING | wxCENTER );
1289 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1295 if( !overwrittenFiles.IsEmpty() )
1297 for(
const wxString& overwrittenFile : overwrittenFiles )
1300 msg = overwrittenFile;
1302 msg +=
"\n" + overwrittenFile;
1305 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
_(
"Save Warning" ),
1306 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER | wxICON_EXCLAMATION );
1307 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1308 dlg.SetOKCancelLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Overwrite Files" ) ),
1309 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Abort Project Save" ) ) );
1311 if( dlg.ShowModal() == wxID_CANCEL )
1317 std::vector<wxString> savedSheetPaths;
1319 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1323 wxCHECK2( screen,
continue );
1326 wxFileName tmpFn = filenameMap[screen];
1330 updateFileHistory =
true;
1342 sheet->
SetFileName( sheetFileName.GetFullPath() );
1346 filenameMap[screen] = tmpFn.GetFullPath();
1358 if( sheets.size() == 1 )
1364 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1369 if( savedThisSheet )
1370 savedSheetPaths.push_back( tmpFn.GetFullPath() );
1372 success &= savedThisSheet;
1386 if( updateFileHistory )
1397 wxCHECK2( sheet,
continue );
1401 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1404 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1405 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1408 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1413 else if( saveCopy && createNewProject )
1426 if( success && !
Prj().IsNullProject() )
1441 if( !
Kiface().IsSingle() )
1449 sheet.LastScreen()->SetVirtualPageNumber( sheet.GetVirtualPageNumber() );
1461 if(
m_infoBar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE )
1466 wxString backupMsg = backupReporter.
GetMessages();
1467 m_infoBar->ShowMessageFor( backupMsg.Trim(), 10000, wxICON_WARNING );
1475 const std::map<std::string, UTF8>* aProperties )
1477 bool success =
true;
1478 wxFileName filename( aFileName );
1479 wxFileName newfilename;
1480 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1482 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1483 ProcessEventLocally( changingEvt );
1486 statusBar->ClearWarningMessages(
"load" );
1491 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
1495 case SCH_IO_MGR::SCH_ALTIUM:
1496 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1497 case SCH_IO_MGR::SCH_EAGLE:
1498 case SCH_IO_MGR::SCH_LTSPICE:
1499 case SCH_IO_MGR::SCH_EASYEDA:
1500 case SCH_IO_MGR::SCH_EASYEDAPRO:
1501 case SCH_IO_MGR::SCH_EASYEDAPRO_V3:
1502 case SCH_IO_MGR::SCH_PADS:
1503 case SCH_IO_MGR::SCH_GEDA:
1504 case SCH_IO_MGR::SCH_DIPTRACE:
1505 case SCH_IO_MGR::SCH_PCAD:
1506 case SCH_IO_MGR::SCH_ORCAD:
1507 case SCH_IO_MGR::SCH_EASYPC:
1511 wxCHECK_MSG( aFileName.IsEmpty() || filename.IsAbsolute(),
false,
1512 wxS(
"Import schematic: path is not absolute!" ) );
1523 this, std::placeholders::_1 ) );
1526 if(
eeconfig()->m_System.show_import_issues )
1531 pi->SetProgressReporter( &progressReporter );
1533 SCH_SHEET* loadedSheet = pi->LoadSchematicFile( aFileName, newSchematic.get(),
nullptr, aProperties );
1546 bool loadedIsTopLevel = std::find( topLevelSheets.begin(), topLevelSheets.end(), loadedSheet )
1547 != topLevelSheets.end();
1548 bool loadedIsVirtualRoot = loadedSheet == &
Schematic().
Root()
1553 if( !loadedIsTopLevel && !loadedIsVirtualRoot )
1562 std::vector<wxString> sourceFpLibs;
1579 const wxString embeddedPrefix = wxS(
"kicad-embed://" );
1582 if( drawingSheetName.StartsWith( embeddedPrefix ) )
1584 wxString sheetFile = drawingSheetName.Mid( embeddedPrefix.length() );
1588 if( !embeddedWorksheet
1600 newfilename.SetPath(
Prj().GetProjectPath() );
1601 newfilename.SetName(
Prj().GetProjectName() );
1607 topSheet->SetFileName( newfilename.GetFullName() );
1612 progressReporter.
Report(
_(
"Updating connections..." ) );
1634 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1637 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1642 catch(
const std::exception& exc )
1647 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic '%s'." ), aFileName );
1650 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1674 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1675 ProcessEventLocally( e );
1679 wxCHECK2( listener,
continue );
1683 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1686 win->HandleWindowEvent( e );
1688 listener->SafelyProcessEvent( e );
1694 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
1718 if( simFrame && !simFrame->Close() )
1721 if( screen->IsContentModified() )
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION zoomFitScreen
void SetVirtualPageNumber(int aPageNumber)
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
void SetContentModified(bool aModified=true)
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
static std::vector< IMPORT_PROJECT_DESC > RunModal(wxWindow *aParent, const std::vector< IMPORT_PROJECT_DESC > &aProjectDesc)
Create and show a dialog (modal) and returns the data from it after completion.
static bool ShouldPrompt(int aFileFormatVersionAtLoad, size_t aBusesNeedingMigration)
Multiple differently-named labels on a single bus subgraph were only permitted before KiCad 6....
static DS_DATA_MODEL & GetTheInstance()
Return the instance of DS_DATA_MODEL used in the application.
static const wxString & EmptyLayoutName()
Return the reserved drawing-sheet name that marks a design as deliberately having no sheet,...
void LoadWindowState(const wxString &aFileName)
void CheckForAutosaveFiles(const wxString &aProjectPath, const std::vector< wxString > &aExtensions)
Check for autosave files newer than their source files for the given project.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
wxTimer * m_autoSaveTimer
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxString GetMruPath() const
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Check if aFileName can be written.
std::unique_ptr< LOCKFILE > m_file_checker
Prevents opening same file multiple times.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
void RefreshCanvas() override
bool LockFile(const wxString &aFileName)
Mark a schematic file as being in use.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
EE_TYPE OfType(KICAD_T aType) const
EMBEDDED_FILE * GetEmbeddedFile(const wxString &aName) const
Returns the embedded file with the given name or nullptr if it does not exist.
bool GetCreateNewProject() const
Gets the selected state of the create new project option.
bool GetCopySubsheets() const
Gets the selected state of the copy subsheets option.
bool IsAttachedToDialog() const
Gets if this hook has attached controls to a dialog box.
bool GetIncludeExternSheets() const
Gets the selected state of the include external sheets option.
bool GetShowIssues() const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
virtual const wxString Problem() const
what was the problem?
APP_SETTINGS_BASE * KifaceSettings() const
bool IsSingle() const
Is this KIFACE running under single_top?
void RefreshDrawingSheetPageInfo()
Update the drawing sheet proxy's page number and first-page flag from the current edit frame state.
wxString AsString() const
KISTATUSBAR is a wxStatusBar suitable for Kicad manager.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
A collection of LIB_SYMBOL objects.
static void GetLibNamesAndPaths(PROJECT *aProject, wxString *aPaths, wxArrayString *aNames=nullptr)
static void SetLibNamesAndPaths(PROJECT *aProject, const wxString &aPaths, const wxArrayString &aNames)
std::optional< LIBRARY_TABLE * > ProjectTable() const
Retrieves the project library table for this adapter type, or nullopt if one doesn't exist.
void SetNickname(const wxString &aNickname)
void SetType(const wxString &aType)
void SetDescription(const wxString &aDescription)
void SetURI(const wxString &aUri)
bool RunRegisteredSaversAndCommit(const wxString &aProjectPath, const wxString &aTitle, const wxString &aTagFileType=wxEmptyString)
Run all registered savers and, if any staged changes differ from HEAD, create a commit.
void RemoveAutosaveFiles(const wxString &aProjectPath) const
Remove every autosave file under the project at aProjectPath regardless of which source it shadowed.
static REPORTER & GetInstance()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
void PreloadDesignBlockLibraries(KIWAY *aKiway)
Starts a background job to preload the global and project design block libraries.
A small class to help profiling.
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
virtual void Report(const wxString &aMessage) override
Display aMessage in the progress bar dialog.
bool KeepRefreshing(bool aWait=false) override
Update the UI dialog.
Plugin class for import plugins that support choosing a project.
The backing store for a PROJECT, in JSON format.
std::vector< FILE_INFO_PAIR > & GetSheets()
std::vector< TOP_LEVEL_SHEET_INFO > & GetTopLevelSheets()
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
static LEGACY_SYMBOL_LIBS * LegacySchLibs(PROJECT *aProject)
Returns the list of symbol libraries from a legacy (pre-5.x) design This is only used from the remapp...
virtual void SetReadOnly(bool aReadOnly=true)
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_FILE & GetProjectFile() const
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
virtual bool HasMessage() const
Returns true if any messages were reported.
wxString m_SchDrawingSheetFileName
Holds all the data relating to one schematic.
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
void LoadVariants()
This is a throw away method for variant testing.
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
void SetProject(PROJECT *aPrj)
EMBEDDED_FILES * GetEmbeddedFiles() override
CONNECTION_GRAPH * ConnectionGraph() const
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
void SetTopLevelSheets(const std::vector< SCH_SHEET * > &aSheets)
Replace the top level sheets, rebuilding the hierarchy and connectivity around them.
std::vector< SCH_SHEET * > GetTopLevelSheets() const
Get the list of top-level sheets.
int FixupJunctionsAfterImport(const std::function< void(SCH_LINE *, SCH_LINE *)> &aOnSplit={})
Add junctions to this schematic where required.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
Class for a bus to bus entry.
VECTOR2I GetPosition() const override
Commit for the schematic and symbol editors.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the KIGFX::VIEW instance used in the panel.
void DisplaySheet(SCH_SCREEN *aScreen)
bool IsContentModified() const override
Get if the current schematic has been modified but not saved.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
void SaveProjectLocalSettings() override
Save changes to the project settings to the project (.pro) file.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Open a project or set of files given by aFileList.
NET_NAVIGATOR_TREE * m_netNavigator
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr, const std::vector< wxString > *aChangedNets=nullptr)
void SetScreen(BASE_SCREEN *aScreen) override
bool AskToSaveChanges()
Check if any of the screens has unsaved changes and asks the user whether to save or drop them.
friend class SCH_EDITOR_CONTROL
void SetCurrentVariant(const wxString &aVariantName)
void UpdateVariantSelectionCtrl(const wxArrayString &aVariantNames)
Update the variant name control on the main toolbar.
bool RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr, bool aCleanupDone=false)
Generate the connection data for the entire schematic hierarchy.
std::vector< wxEvtHandler * > m_schematicChangeListeners
void CreateDefaultScreens()
PANEL_REMOTE_SYMBOL * m_remoteSymbolPane
bool saveSchematicFile(SCH_SHEET *aSheet, const wxString &aSavePath, bool isSaveAs)
Save aSheet to a schematic file.
SCHEMATIC * m_schematic
The currently loaded schematic.
SCH_SHEET_PATH & GetCurrentSheet() const
void ProjectChanged() override
Notification event that the project has changed.
SCHEMATIC & Schematic() const
void updateTitle()
Set the main window title bar text.
void SetSchematic(SCHEMATIC *aSchematic)
bool LoadProjectSettings()
Load the KiCad project file (*.pro) settings specific to Eeschema.
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true, bool aClear=false)
Update the hierarchy navigation tree and history.
bool importFile(const wxString &aFileName, int aFileType, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
void LoadDrawingSheet()
Load the drawing sheet file.
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void ClearRepeatItemsList()
Clear the list of items which are to be repeated with the insert key.
void initScreenZoom()
Initialize the zoom value of the current screen and mark the screen as zoom-initialized.
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
bool SaveProject(bool aSaveAs=false)
Save the currently-open schematic (including its hierarchy) and associated project.
void saveProjectSettings() override
Save any design-related project settings associated with this frame.
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
static SCH_FILE_T GuessPluginTypeFromSchPath(const wxString &aSchematicPath, int aCtl=0)
Return a plugin type given a schematic using the file extension of aSchematicPath.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
SCH_SCREEN * GetScreen(unsigned int aIndex) const
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
void BuildClientSheetPathList()
Build the list of sheet paths sharing a screen for each screen in use.
bool HasSymbolFieldNamesWithWhiteSpace() const
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
SCH_SHEET * GetSheet(unsigned int aIndex) const
int ReplaceDuplicateTimeStamps()
Test all sheet and symbol objects in the schematic for duplicate time stamps and replaces them as nec...
void ClearDrawingState()
Clear the state flags of all the items in the screen.
std::vector< SCH_SHEET_PATH > & GetClientSheetPaths()
Return the number of times this screen is used.
void TestDanglingEnds(const SCH_SHEET_PATH *aPath=nullptr, std::function< void(SCH_ITEM *)> *aChangedHandler=nullptr) const
Test all of the connectable objects in the schematic for unused connection points.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
void UpdateLocalLibSymbolLinks()
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic with the local projec...
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
const std::vector< SCH_SYMBOL_INSTANCE > & GetSymbolInstances() const
int GetFileFormatVersionAtLoad() const
const std::vector< SCH_SHEET_INSTANCE > & GetSheetInstances() const
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void UpdateSheetInstanceData(const std::vector< SCH_SHEET_INSTANCE > &aSheetInstances)
Update all of the sheet instance information using aSheetInstances.
void SetInitialPageNumbers()
Set initial sheet page numbers.
bool AllSheetPageNumbersEmpty() const
Check all of the sheet instance for empty page numbers.
bool IsModified() const
Check the entire hierarchy for any modifications.
void UpdateSymbolInstanceData(const std::vector< SCH_SYMBOL_INSTANCE > &aSymbolInstances)
Update all of the symbol instance information using aSymbolInstances.
bool RepairPageNumbers()
Assign valid page numbers to sheet paths whose stored page number is missing or collides with an earl...
void CheckForMissingSymbolInstances(const wxString &aProjectName)
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
void SetName(const wxString &aName)
SCH_SCREEN * GetScreen() const
bool IsVirtualRootSheet() const
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Set the currently loaded project path and saves it (pointers remain valid).
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Save a loaded project.
bool SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Save, unload and unregister the given PROJECT.
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Call BackupProject() if a new backup is needed according to the current backup policy.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
Temporarily disable a window, and then re-enable on destruction.
static void ResolvePossibleSymlinks(wxFileName &aFilename)
void Flush()
Build the HTML messages page.
bool HasMessage() const override
Returns true if any messages were reported.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
A wrapper for reporting to a wxString object.
const wxString & GetMessages() const
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
bool AskOverrideLock(wxWindow *aParent, const wxString &aMessage)
Display a dialog indicating the file is already open, with an option to reset the lock.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
#define KICAD_MESSAGE_DIALOG
static bool empty(const wxTextEntryBase *aCtrl)
bool PrepareSaveAsFiles(SCHEMATIC &aSchematic, SCH_SCREENS &aScreens, const wxFileName &aOldRoot, const wxFileName &aNewRoot, bool aSaveCopy, bool aCopySubsheets, bool aIncludeExternSheets, std::unordered_map< SCH_SCREEN *, wxString > &aFilenameMap, wxString &aErrorMsg)
#define THROW_IO_CANCELLED()
static const std::string LegacySchematicFileExtension
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string LegacySymbolLibFileExtension
static wxString KiCadSchematicFileWildcard()
const wxChar *const traceSchCurrentSheet
Flag to enable debug output of current sheet tracking in the schematic editor.
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const tracePathsAndFiles
Flag to enable path and file name debug output.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
#define KICTL_CREATE
caller thinks requested project files may not exist.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
int ReconcileLegacyCacheSymbols(SYMBOL_LIBRARY_ADAPTER &aAdapter, const wxString &aCacheNickname, SCH_SCREENS &aScreens, std::vector< KI_ERROR > &aErrors)
Point symbols that are only available in a legacy project cache library at that cache.
Definition for symbol library class.
void ReadFootprintProps(const std::map< std::string, UTF8 > *aProps, wxString &aCacheNickname, std::vector< wxString > &aSourceFpLibs)
Read the footprint-import coordination properties out of a properties map.
PGM_BASE & Pgm()
The global program "get" accessor.
#define SKIP_CONNECTIVITY
#define DELETE_REMOVED_ITEMS
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
bool show_import_issues
Stored value for "show import issues" when importing non-KiCad designs to this application.
bool show_illegal_symbol_lib_dialog
Container that describes file type info.
std::vector< std::string > m_FileExtensions
Filter used for file pickers if m_IsFile is true.
bool m_CanRead
Whether the IO can read this file type.
wxString FileFilter() const
Implement a participant in the KIWAY alchemy.
virtual void PreloadLibraries(KIWAY *aKiway)
Information about a top-level schematic sheet.
SYMBOL_IMPORT_RECONCILE_RESULT ReconcileImportedSymbols(SCH_IO &aPlugin, SCHEMATIC &aSchematic, PROJECT &aProject, const wxString &aSchematicPath, const std::map< std::string, UTF8 > *aProperties, REPORTER &aReporter)
Reconcile aSchematic against the definitions aPlugin retained while loading it.
wxLogTrace helper definitions.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.