69#include <wx/filedlg.h>
71#include <wx/stdpaths.h>
82#include "widgets/filedlg_hook_save_project.h"
95 if( aFileSet.size() != 1 )
97 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
102 wxString fullFileName( aFileSet[0] );
103 wxFileName wx_filename( fullFileName );
106 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
110 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
126 wxFileName pro = fullFileName;
129 bool is_new = !wxFileName::IsFileReadable( fullFileName );
135 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ),
138 if( !
IsOK(
this, msg ) )
142 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
143 ProcessEventLocally( e );
153 SetStatusText( wxEmptyString );
157 :
_(
"Loading Schematic" ), 1 );
161 if( differentProject )
163 if( !
Prj().IsNullProject() )
174 wxFileName legacyPro( pro );
179 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
187 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
217 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
227 if( is_new || schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
233 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
235 msg.Printf(
_(
"Unsupported schematic file '%s'." ), fullFileName );
236 progressReporter.Hide();
242 wxFileName autoSaveFn = fullFileName;
245 autoSaveFn.ClearExt();
261 pi->SetProgressReporter( &progressReporter );
263 bool failedLoad =
false;
275 if( !pi->GetError().IsEmpty() )
278 "occurred attempting to load hierarchical sheets." ),
284 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName);
285 progressReporter.Hide();
292 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName);
293 progressReporter.Hide();
298 catch(
const std::bad_alloc& )
300 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
301 progressReporter.Hide();
319 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
332 _(
"An error was found when loading the schematic that has "
333 "been automatically fixed. Please save the schematic to "
334 "repair the broken file or it may not be usable with other "
335 "versions of KiCad." ) );
346 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
351 std::vector<SCH_ITEM*> deleted;
353 for(
SCH_ITEM* item : screen->Items() )
358 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
362 wire->SetEndPoint( entry->
GetEnd() );
364 screen->Append( wire.release() );
365 deleted.push_back( item );
370 screen->Remove( item );
386 wxArrayString libNames;
390 if( !libNames.IsEmpty() )
392 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
394 wxRichMessageDialog invalidLibDlg(
396 _(
"Illegal entry found in project file symbol library list." ),
397 _(
"Project Load Warning" ),
398 wxOK | wxCENTER | wxICON_EXCLAMATION );
399 invalidLibDlg.ShowDetailedText(
400 _(
"Symbol libraries defined in the project file symbol library "
401 "list are no longer supported and will be removed.\n\n"
402 "This may cause broken symbol library links under certain "
404 invalidLibDlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
405 invalidLibDlg.ShowModal();
407 !invalidLibDlg.IsCheckBoxChecked();
418 editor->RescueSymbolLibTableProject(
false );
428 wxFileName cacheFn = pro;
430 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
433 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ),
434 cacheFn.GetFullName() );
435 extMsg =
_(
"This can result in a broken schematic under certain conditions. "
436 "If the schematic does not have any missing symbols upon opening, "
437 "save it immediately before making any changes to prevent data "
438 "loss. If there are missing symbols, either manual recovery of "
439 "the schematic or recovery of the symbol cache library file and "
440 "reloading the schematic is required." );
442 wxMessageDialog dlgMissingCache(
this, msg,
_(
"Warning" ),
443 wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
444 dlgMissingCache.SetExtendedMessage( extMsg );
445 dlgMissingCache.SetOKCancelLabels(
446 wxMessageDialog::ButtonLabel(
_(
"Load Without Cache File" ) ),
447 wxMessageDialog::ButtonLabel(
_(
"Abort" ) ) );
449 if( dlgMissingCache.ShowModal() == wxID_CANCEL )
463 "It will be converted to the new format when saved." ),
471 screen->FixLegacyPowerSymbolMismatches();
483 "It will be converted to the new format when saved." ),
488 screen->UpdateLocalLibSymbolLinks();
491 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221002 )
494 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221110 )
497 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
499 screen->FixLegacyPowerSymbolMismatches();
502 screen->MigrateSimModels();
520 if(
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() > 0 )
549 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
559 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
560 ProcessEventLocally( changedEvt );
564 wxCHECK2( listener,
continue );
568 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
571 win->HandleWindowEvent( e );
573 listener->SafelyProcessEvent( e );
581 if( fn.FileExists() && !fn.IsFileWritable() )
606 wxLogError( wxS(
"Document not ready, cannot import" ) );
611 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
613 wxFileDialog dlg(
this,
_(
"Insert Schematic" ),
path, wxEmptyString,
616 if( dlg.ShowModal() == wxID_CANCEL )
663 commit.
Push(
_(
"Import Schematic Sheet Content..." ) );
675 wxString msg =
_(
"This operation cannot be undone.\n\n"
676 "Do you want to save the current document before proceeding?" );
678 if(
IsOK(
this, msg ) )
690 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
691 "which will be permanently lost.\n\n"
692 "Do you want to proceed?" );
694 if( !
IsOK(
this, msg ) )
700 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
702 wxString fileFiltersStr;
703 wxString allWildcardsStr;
705 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
707 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
720 if( !fileFiltersStr.IsEmpty() )
721 fileFiltersStr += wxChar(
'|' );
729 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" )
732 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
733 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
735 if( dlg.ShowModal() == wxID_CANCEL )
752 wxFileName projectFn( dlg.GetPath() );
759 wxFileName fn = dlg.GetPath();
761 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
763 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
770 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
777 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
779 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
794 wxFileName schematicFileName;
795 wxFileName oldFileName;
800 wxCHECK( screen,
false );
803 wxCHECK( !aSavePath.IsEmpty(),
false );
807 oldFileName = schematicFileName;
815 wxFileName projectFile( schematicFileName );
819 if( projectFile.FileExists() )
826 wxString tempFile = wxFileName::CreateTempFileName( wxS(
"eeschema" ) );
829 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
835 schematicFileName.GetFullPath() );
837 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
838 pluginType = SCH_IO_MGR::SCH_KICAD;
844 pi->SaveSchematicFile( tempFile, aSheet, &
Schematic() );
849 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
850 schematicFileName.GetFullPath(),
854 msg.Printf(
_(
"Failed to create temporary file '%s'." ),
859 wxRemoveFile( tempFile );
870 success = wxRenameFile( tempFile, schematicFileName.GetFullPath() );
874 msg.Printf(
_(
"Error saving schematic file '%s'.\n"
875 "Failed to rename temporary file '%s'." ),
876 schematicFileName.GetFullPath(),
880 msg.Printf(
_(
"Failed to rename temporary file '%s'." ),
889 wxFileName autoSaveFileName = schematicFileName;
892 if( autoSaveFileName.FileExists() )
895 wxS(
"Removing auto save file <" ) + autoSaveFileName.GetFullPath() +
898 wxRemoveFile( autoSaveFileName.GetFullPath() );
903 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
904 SetStatusText( msg, 0 );
922 bool updateFileHistory =
false;
923 bool createNewProject =
false;
927 wxFileName fn = fileName;
931 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
934 if(
Prj().IsNullProject() || aSaveAs )
937 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
939 wxFileName newFileName;
940 wxFileName savePath(
Prj().GetProjectFullName() );
942 if( !savePath.IsOk() || !savePath.IsDirWritable() )
946 if( !savePath.IsOk() || !savePath.IsDirWritable() )
950 if( savePath.HasExt() )
953 savePath.SetName( wxEmptyString );
955 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
957 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
962 if(
Kiface().IsSingle() || aSaveAs )
964 dlg.SetCustomizeHook( newProjectHook );
967 if( dlg.ShowModal() == wxID_CANCEL )
972 if( ( !newFileName.DirExists() && !newFileName.Mkdir() ) ||
973 !newFileName.IsDirWritable() )
975 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
976 "Make sure you have write permissions and try again." ),
977 newFileName.GetPath() );
979 wxMessageDialog dlgBadPath(
this, msg,
_(
"Error" ),
980 wxOK | wxICON_EXCLAMATION | wxCENTER );
982 dlgBadPath.ShowModal();
993 updateFileHistory =
true;
1001 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1005 wxCHECK2( screen,
continue );
1008 if( screen ==
Schematic().RootScreen() )
1016 if( tmp.FileExists() )
1019 if( tmp.GetPath().IsEmpty() )
1021 tmp.SetPath( newFileName.GetPath() );
1023 else if( tmp.GetPath() == fn.GetPath() )
1025 tmp.SetPath( newFileName.GetPath() );
1027 else if( tmp.GetPath().StartsWith( fn.GetPath() ) )
1031 wxString newPath = newFileName.GetPath();
1032 newPath += tmp.GetPath().Right( fn.GetPath().Length() );
1033 tmp.SetPath( newPath );
1037 wxS(
"Moving schematic from '%s' to '%s'." ),
1039 tmp.GetFullPath() );
1041 if( !tmp.DirExists() && !tmp.Mkdir() )
1043 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1044 "Make sure you have write permissions and try again." ),
1045 newFileName.GetPath() );
1047 wxMessageDialog dlgBadFilePath(
this, msg,
_(
"Error" ),
1048 wxOK | wxICON_EXCLAMATION | wxCENTER );
1050 dlgBadFilePath.ShowModal();
1055 filenameMap[screen] = tmp.GetFullPath();
1065 if( sheet.Last()->IsRootSheet() )
1068 sheet.MakeFilePathRelativeToParentSheet();
1071 else if( !fn.FileExists() )
1074 updateFileHistory =
true;
1076 else if( !
Schematic().GetSheets().IsModified() )
1081 if( filenameMap.empty() || !saveCopy )
1083 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1088 wxArrayString overwrittenFiles;
1089 wxArrayString lockedFiles;
1091 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1095 wxCHECK2( screen,
continue );
1098 wxFileName tmpFn = filenameMap[screen];
1103 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1104 lockedFiles.Add( tmpFn.GetFullPath() );
1111 if( tmpFn.FileExists() )
1112 overwrittenFiles.Add( tmpFn.GetFullPath() );
1115 if( !lockedFiles.IsEmpty() )
1117 for(
const wxString& lockedFile : lockedFiles )
1122 msg +=
"\n" + lockedFile;
1125 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
1127 _(
"Locked File Warning" ),
1128 wxOK | wxICON_WARNING | wxCENTER );
1129 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1135 if( !overwrittenFiles.IsEmpty() )
1137 for(
const wxString& overwrittenFile : overwrittenFiles )
1140 msg = overwrittenFile;
1142 msg +=
"\n" + overwrittenFile;
1145 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
1146 _(
"Save Warning" ),
1147 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER |
1148 wxICON_EXCLAMATION );
1149 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1150 dlg.SetOKCancelLabels( wxMessageDialog::ButtonLabel(
_(
"Overwrite Files" ) ),
1151 wxMessageDialog::ButtonLabel(
_(
"Abort Project Save" ) ) );
1153 if( dlg.ShowModal() == wxID_CANCEL )
1159 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1163 wxCHECK2( screen,
continue );
1166 wxFileName tmpFn = filenameMap[screen];
1170 updateFileHistory =
true;
1178 if( !sheetFileName.IsOk()
1183 sheet->
SetFileName( sheetFileName.GetFullPath() );
1187 filenameMap[screen] = tmpFn.GetFullPath();
1199 if( sheets.size() == 1 )
1205 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1215 if( !aSaveAs && !success )
1218 if( aSaveAs && success )
1221 if( updateFileHistory )
1232 wxCHECK2( sheet,
continue );
1239 wxCHECK2( screen,
continue );
1241 sheets.emplace_back( std::make_pair( screen->
GetUuid(), sheet->
GetName() ) );
1245 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1249 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1250 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1253 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1258 else if( saveCopy && createNewProject )
1268 if( !
Kiface().IsSingle() )
1273 SetStatusText( msg, 0 );
1288 wxFileName fn = tmpFileName;
1296 bool autoSaveOk =
true;
1298 if( fn.GetPath().IsEmpty() )
1299 tmp.AssignDir(
Prj().GetProjectPath() );
1301 tmp.AssignDir( fn.GetPath() );
1309 wxString title = GetTitle();
1311 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1354 wxFileName filename( aFileName );
1355 wxFileName newfilename;
1357 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1359 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1360 ProcessEventLocally( changingEvt );
1364 case SCH_IO_MGR::SCH_ALTIUM:
1365 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1366 case SCH_IO_MGR::SCH_EAGLE:
1367 case SCH_IO_MGR::SCH_LTSPICE:
1368 case SCH_IO_MGR::SCH_EASYEDA:
1369 case SCH_IO_MGR::SCH_EASYEDAPRO:
1372 wxCHECK_MSG( filename.IsAbsolute(),
false,
1373 wxS(
"Import schematic: path is not absolute!" ) );
1384 if( projectChooserPlugin )
1388 std::placeholders::_1 ) );
1392 pi->SetProgressReporter( &progressReporter );
1395 pi->LoadSchematicFile( aFileName, &
Schematic(),
nullptr, aProperties );
1404 errorReporter.ShowModal();
1413 newfilename.SetPath(
Prj().GetProjectPath() );
1414 newfilename.SetName(
Prj().GetProjectName() );
1440 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1443 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1446 catch(
const std::exception& exc )
1451 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic "
1452 "'%s'." ), aFileName );
1455 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1467 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1468 ProcessEventLocally( e );
1472 wxCHECK2( listener,
continue );
1476 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1479 win->HandleWindowEvent( e );
1481 listener->SafelyProcessEvent( e );
1507 if( simFrame && !simFrame->Close() )
1510 if( screen->IsContentModified() )
1533 wxLogTrace(
traceAutoSave,
"Creating auto save file %s", autoSaveFileName.GetFullPath() );
1535 wxCHECK( autoSaveFileName.IsDirWritable(),
false );
1539 std::vector< wxString > autoSavedFiles;
1541 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1551 autoSavedFiles.emplace_back( fn.GetFullPath() );
1554 wxTextFile autoSaveFile( autoSaveFileName.GetFullPath() );
1556 if( autoSaveFileName.FileExists() && !wxRemoveFile( autoSaveFileName.GetFullPath() ) )
1558 wxLogTrace(
traceAutoSave,
"Error removing auto save file %s",
1559 autoSaveFileName.GetFullPath() );
1565 if( autoSavedFiles.empty() )
1568 if( !autoSaveFile.Create() )
1571 for(
const wxString& fileName : autoSavedFiles )
1573 wxLogTrace(
traceAutoSave,
"Adding auto save file %s to %s",
1574 fileName, autoSaveFileName.GetName() );
1575 autoSaveFile.AddLine( fileName );
1578 if( !autoSaveFile.Write() )
1581 wxLogTrace(
traceAutoSave,
"Auto save file '%s' written", autoSaveFileName.GetFullName() );
1587void removeFile(
const wxString& aFilename, wxArrayString& aUnremoved )
1589 wxLogTrace(
traceAutoSave, wxS(
"Removing auto save file " ) + aFilename );
1591 if( wxFileExists( aFilename ) && !wxRemoveFile( aFilename ) )
1592 aUnremoved.Add( aFilename );
1598 if( !
Pgm().IsGUI() )
1601 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1604 wxS(
"Checking for auto save file " ) + aFileName.GetFullPath() );
1606 if( !aFileName.FileExists() )
1610 "Well this is potentially embarrassing!\n"
1611 "It appears that the last time you were editing one or more of the schematic files\n"
1612 "were not saved properly. Do you wish to restore the last saved edits you made?" );
1614 int response = wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
1617 wxTextFile fileList( aFileName.GetFullPath() );
1619 if( !fileList.Open() )
1621 msg.Printf(
_(
"The file '%s' could not be opened.\n"
1622 "Manual recovery of automatically saved files is required." ),
1623 aFileName.GetFullPath() );
1625 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1629 if( response == wxYES )
1631 wxArrayString unrecoveredFiles;
1633 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1635 wxFileName recoveredFn = fn;
1636 wxString tmp = recoveredFn.GetName();
1640 recoveredFn.SetName( tmp );
1642 wxFileName backupFn = recoveredFn;
1646 wxLogTrace(
traceAutoSave, wxS(
"Recovering auto save file:\n"
1647 " Original file: '%s'\n"
1648 " Backup file: '%s'\n"
1649 " Auto save file: '%s'" ),
1650 recoveredFn.GetFullPath(), backupFn.GetFullPath(), fn );
1652 if( !wxFileExists( fn ) )
1654 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1658 else if( !wxCopyFile( recoveredFn.GetFullPath(), backupFn.GetFullPath() ) )
1660 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1663 else if( !wxRenameFile( fn, recoveredFn.GetFullPath() ) )
1665 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1669 if( !unrecoveredFiles.IsEmpty() )
1671 msg =
_(
"The following automatically saved file(s) could not be restored\n" );
1673 for(
size_t i = 0; i < unrecoveredFiles.GetCount(); i++ )
1674 msg += unrecoveredFiles[i] + wxS(
"\n" );
1676 msg +=
_(
"Manual recovery will be required to restore the file(s) above." );
1677 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
1681 wxArrayString unremovedFiles;
1682 removeFile( aFileName.GetFullPath(), unremovedFiles );
1684 if( !unremovedFiles.IsEmpty() )
1686 msg.Printf(
_(
"The autosave file '%s' could not be removed.\n"
1687 "Manual removal will be required." ),
1688 unremovedFiles[0] );
1690 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1702 if( !
Pgm().IsGUI() )
1705 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1707 if( !aFileName.FileExists() )
1710 wxTextFile fileList( aFileName.GetFullPath() );
1711 wxArrayString unremovedFiles;
1713 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1716 removeFile( aFileName.GetFullPath(), unremovedFiles );
1718 if( !unremovedFiles.IsEmpty() )
1720 wxString msg =
_(
"The following automatically saved file(s) could not be removed\n" );
1722 for(
size_t i = 0; i < unremovedFiles.GetCount(); i++ )
1723 msg += unremovedFiles[i] + wxS(
"\n" );
1725 msg +=
_(
"Manual removal will be required for the file(s) above." );
1726 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1733 static wxString autoSaveFileName( wxS(
"#auto_saved_files#" ) );
1735 return autoSaveFileName;
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION zoomFitScreen
bool IsContentModified() const
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)
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
static std::vector< IMPORT_PROJECT_DESC > GetSelectionsModal(wxWindow *aParent, const std::vector< IMPORT_PROJECT_DESC > &aProjectDesc)
Create and show a dialog (modal) and returns the data from it after completion.
Handle the graphic items list to draw/plot the frame and title block.
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void LoadWindowState(const wxString &aFileName)
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
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)
Checks if aFileName can be written.
static wxString GetAutoSaveFilePrefix()
std::unique_ptr< LOCKFILE > m_file_checker
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.
A base class for most all the KiCad significant classes used in schematics and boards.
EE_TYPE OfType(KICAD_T aType) const
bool GetCreateNewProject() const
Gets if this hook has attached controls to a dialog box.
bool IsAttachedToDialog() 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?
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
static REPORTER & GetInstance()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
A small class to help profiling.
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
Plugin class for import plugins that support choosing a project.
virtual void RegisterChooseProjectCallback(CHOOSE_PROJECT_HANDLER aChooseProjectHandler)
Register a different handler to be called when a non-KiCad project contains multiple PCB+Schematic co...
std::vector< FILE_INFO_PAIR > & GetSheets()
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
static SYMBOL_LIBS * SchLibs(PROJECT *aProject)
virtual void SetReadOnly(bool aReadOnly=true)
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual PROJECT_FILE & GetProjectFile() const
virtual void SetElem(ELEM_T aIndex, _ELEM *aElem)
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.
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
CONNECTION_GRAPH * ConnectionGraph() const override
void FixupJunctions()
Add junctions to this schematic where required.
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
void SetProject(PROJECT *aPrj)
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
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
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
virtual void Revert() override
void DisplaySheet(SCH_SCREEN *aScreen)
Handle actions specific to the schematic editor.
bool LoadSheetFromFile(SCH_SHEET *aSheet, SCH_SHEET_PATH *aCurrentSheet, const wxString &aFileName)
Load a the KiCad schematic file aFileName into the sheet aSheet.
bool IsContentModified() const override
Get if the current schematic has been modified but not saved.
const wxString & getAutoSaveFileName() const
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.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
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.
bool doAutoSave() override
Save the schematic files that have been modified and not yet saved.
bool importFile(const wxString &aFileName, int aFileType, const STRING_UTF8_MAP *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
std::vector< wxEvtHandler * > m_schematicChangeListeners
void HardRedraw() override
Rebuild the GAL and redraw the screen.
void OnAppendProject(wxCommandEvent &event)
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void updateTitle()
Set the main window title bar text.
bool saveSchematicFile(SCH_SHEET *aSheet, const wxString &aSavePath)
Save aSheet to a schematic file.
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 ...
bool updateAutoSaveFile()
virtual void DeleteAutoSaveFile(const wxFileName &aFileName) override
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
bool AddSheetAndUpdateDisplay(const wxString aFullFileName)
Add a sheet file into the current sheet and updates display.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void initScreenZoom()
Initialize the zoom value of the current screen and mark the screen as zoom-initialized.
void OnImportProject(wxCommandEvent &event)
bool AppendSchematic()
Import a KiCad schematic into the current sheet.
virtual void CheckForAutoSaveFile(const wxFileName &aFileName) override
This overloaded version checks if the auto save master file "#auto_saved_files#" exists and recovers ...
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void UpdateHierarchyNavigator()
Update the hierarchy navigation tree and history.
wxString GetCurrentFileName() const override
Get the full filename + path of the currently opened file in the frame.
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
Saves any design-related project settings associated with this frame.
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()
built the list of sheet paths sharing a screen for each screen in use
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()
Gets the full RTree, usually for iterating.
const wxString & GetFileName() const
const KIID & GetUuid() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
int GetFileFormatVersionAtLoad() 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.
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
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Sets the currently loaded project path and saves it (pointers remain valid) Note that this will not m...
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Saves a copy of the current project under the given path.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Calls BackupProject if a new backup is needed according to the current backup policy.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
A name/value tuple with unique names and optional values.
A collection of SYMBOL_LIB objects.
static void SetLibNamesAndPaths(PROJECT *aProject, const wxString &aPaths, const wxArrayString &aNames)
static void GetLibNamesAndPaths(PROJECT *aProject, wxString *aPaths, wxArrayString *aNames=nullptr)
static void ResolvePossibleSymlinks(wxFileName &aFilename)
void Flush()
Build the HTML messages page.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
MESSAGE_TYPE GetMessageType() const
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
A wrapper for reporting to a wxString object.
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 DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
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.
This file is part of the common library.
static bool empty(const wxTextEntryBase *aCtrl)
#define ENDPOINT
ends. (Used to support dragging.)
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define STARTPOINT
When a line is selected, these flags indicate which.
void removeFile(const wxString &aFilename, wxArrayString &aUnremoved)
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string LegacySymbolLibFileExtension
static const std::string BackupFileSuffix
static wxString KiCadSchematicFileWildcard()
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_REVERT
reverting to a previously-saved (KiCad) file.
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
std::vector< FAB_LAYER_COLOR > dummy
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
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.
wxString FileFilter() const
Definition for symbol library class.
wxLogTrace helper definitions.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.