70#include <wx/filedlg.h>
72#include <wx/richmsgdlg.h>
73#include <wx/stdpaths.h>
83#include "widgets/filedlg_hook_save_project.h"
96 if( aFileSet.size() != 1 )
98 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
103 wxString fullFileName( aFileSet[0] );
104 wxFileName wx_filename( fullFileName );
107 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
111 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
127 wxFileName pro = fullFileName;
130 bool is_new = !wxFileName::IsFileReadable( fullFileName );
136 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ),
139 if( !
IsOK(
this, msg ) )
143 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
144 ProcessEventLocally( e );
155 SetStatusText( wxEmptyString );
159 :
_(
"Load Schematic" ), 1,
164 if( differentProject )
166 if( !
Prj().IsNullProject() )
177 wxFileName legacyPro( pro );
182 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
191 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
221 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
231 if( is_new || schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
237 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
239 msg.Printf(
_(
"'%s' is not a KiCad schematic file.\nUse File -> Import for "
240 "non-KiCad schematic files." ),
243 progressReporter.Hide();
249 wxFileName autoSaveFn = fullFileName;
252 autoSaveFn.ClearExt();
268 pi->SetProgressReporter( &progressReporter );
270 bool failedLoad =
false;
287 if( !pi->GetError().IsEmpty() )
290 "occurred attempting to load hierarchical sheets." ),
296 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
297 progressReporter.Hide();
304 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
305 progressReporter.Hide();
310 catch(
const std::bad_alloc& )
312 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
313 progressReporter.Hide();
331 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
344 _(
"An error was found when loading the schematic that has "
345 "been automatically fixed. Please save the schematic to "
346 "repair the broken file or it may not be usable with other "
347 "versions of KiCad." ) );
358 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
363 std::vector<SCH_ITEM*> deleted;
365 for(
SCH_ITEM* item : screen->Items() )
370 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
374 wire->SetEndPoint( entry->
GetEnd() );
376 screen->Append( wire.release() );
377 deleted.push_back( item );
382 screen->Remove( item );
398 wxArrayString libNames;
402 if( !libNames.IsEmpty() )
404 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
406 wxRichMessageDialog invalidLibDlg(
408 _(
"Illegal entry found in project file symbol library list." ),
409 _(
"Project Load Warning" ),
410 wxOK | wxCENTER | wxICON_EXCLAMATION );
411 invalidLibDlg.ShowDetailedText(
412 _(
"Symbol libraries defined in the project file symbol library "
413 "list are no longer supported and will be removed.\n\n"
414 "This may cause broken symbol library links under certain "
416 invalidLibDlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
417 invalidLibDlg.ShowModal();
419 !invalidLibDlg.IsCheckBoxChecked();
430 editor->RescueSymbolLibTableProject(
false );
440 wxFileName cacheFn = pro;
442 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
445 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ),
446 cacheFn.GetFullName() );
447 extMsg =
_(
"This can result in a broken schematic under certain conditions. "
448 "If the schematic does not have any missing symbols upon opening, "
449 "save it immediately before making any changes to prevent data "
450 "loss. If there are missing symbols, either manual recovery of "
451 "the schematic or recovery of the symbol cache library file and "
452 "reloading the schematic is required." );
454 wxMessageDialog dlgMissingCache(
this, msg,
_(
"Warning" ),
455 wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
456 dlgMissingCache.SetExtendedMessage( extMsg );
457 dlgMissingCache.SetOKCancelLabels(
458 wxMessageDialog::ButtonLabel(
_(
"Load Without Cache File" ) ),
459 wxMessageDialog::ButtonLabel(
_(
"Abort" ) ) );
461 if( dlgMissingCache.ShowModal() == wxID_CANCEL )
475 "It will be converted to the new format when saved." ),
483 screen->FixLegacyPowerSymbolMismatches();
495 "It will be converted to the new format when saved." ),
500 screen->UpdateLocalLibSymbolLinks();
503 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221002 )
506 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221110 )
509 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
512 screen->FixLegacyPowerSymbolMismatches();
515 screen->MigrateSimModels();
533 if(
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() > 0 )
542 progressReporter.
Report(
_(
"Updating connections..." ) );
550 "and/or trailing white space field names." ),
572 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
582 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
583 ProcessEventLocally( changedEvt );
587 wxCHECK2( listener,
continue );
591 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
594 win->HandleWindowEvent( e );
596 listener->SafelyProcessEvent( e );
604 if( fn.FileExists() && !fn.IsFileWritable() )
627 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
628 "which will be permanently lost.\n\n"
629 "Do you want to proceed?" );
631 if( !
IsOK(
this, msg ) )
637 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
639 wxString fileFiltersStr;
640 wxString allWildcardsStr;
642 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
644 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
657 if( !fileFiltersStr.IsEmpty() )
658 fileFiltersStr += wxChar(
'|' );
666 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" )
669 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
670 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
673 dlg.SetCustomizeHook( importOptions );
675 if( dlg.ShowModal() == wxID_CANCEL )
695 wxFileName projectFn( dlg.GetPath() );
702 wxFileName fn = dlg.GetPath();
704 if( !fn.IsFileReadable() )
706 wxLogError(
_(
"Insufficient permissions to read file '%s'." ), fn.GetFullPath() );
710 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
712 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
719 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
726 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
728 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
743 wxFileName schematicFileName;
744 wxFileName oldFileName;
749 wxCHECK( screen,
false );
752 if( aSavePath.IsEmpty() )
757 oldFileName = schematicFileName;
762 if( !schematicFileName.DirExists() )
764 if( !wxMkdir( schematicFileName.GetPath() ) )
766 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
767 schematicFileName.GetFullPath(),
768 "Could not create directory: %s" + schematicFileName.GetPath() );
778 wxFileName projectFile( schematicFileName );
782 if( projectFile.FileExists() )
790 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
796 schematicFileName.GetFullPath() );
798 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
799 pluginType = SCH_IO_MGR::SCH_KICAD;
805 pi->SaveSchematicFile( schematicFileName.GetFullPath(), aSheet, &
Schematic() );
810 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
811 schematicFileName.GetFullPath(),
821 wxFileName autoSaveFileName = schematicFileName;
824 if( autoSaveFileName.FileExists() )
827 wxS(
"Removing auto save file <" ) + autoSaveFileName.GetFullPath() +
830 wxRemoveFile( autoSaveFileName.GetFullPath() );
835 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
836 SetStatusText( msg, 0 );
850 bool updateFileHistory =
false;
851 bool createNewProject =
false;
855 wxFileName fn = fileName;
859 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
862 if(
Prj().IsNullProject() || aSaveAs )
865 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
867 wxFileName newFileName;
868 wxFileName savePath(
Prj().GetProjectFullName() );
870 if( !savePath.IsOk() || !savePath.IsDirWritable() )
874 if( !savePath.IsOk() || !savePath.IsDirWritable() )
878 if( savePath.HasExt() )
881 savePath.SetName( wxEmptyString );
883 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
885 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
890 if(
Kiface().IsSingle() || aSaveAs )
892 dlg.SetCustomizeHook( newProjectHook );
895 if( dlg.ShowModal() == wxID_CANCEL )
900 if( ( !newFileName.DirExists() && !newFileName.Mkdir() ) ||
901 !newFileName.IsDirWritable() )
903 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
904 "Make sure you have write permissions and try again." ),
905 newFileName.GetPath() );
907 wxMessageDialog dlgBadPath(
this, msg,
_(
"Error" ),
908 wxOK | wxICON_EXCLAMATION | wxCENTER );
910 dlgBadPath.ShowModal();
921 updateFileHistory =
true;
929 for(
size_t i = 0; i < screens.
GetCount(); i++ )
933 wxCHECK2( screen,
continue );
944 if( tmp.FileExists() )
947 if( tmp.GetPath().IsEmpty() )
949 tmp.SetPath( newFileName.GetPath() );
951 else if( tmp.GetPath() == fn.GetPath() )
953 tmp.SetPath( newFileName.GetPath() );
955 else if( tmp.GetPath().StartsWith( fn.GetPath() ) )
959 wxString newPath = newFileName.GetPath();
960 newPath += tmp.GetPath().Right( fn.GetPath().Length() );
961 tmp.SetPath( newPath );
965 wxS(
"Moving schematic from '%s' to '%s'." ),
969 if( !tmp.DirExists() && !tmp.Mkdir() )
971 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
972 "Make sure you have write permissions and try again." ),
973 newFileName.GetPath() );
975 wxMessageDialog dlgBadFilePath(
this, msg,
_(
"Error" ),
976 wxOK | wxICON_EXCLAMATION | wxCENTER );
978 dlgBadFilePath.ShowModal();
983 filenameMap[screen] = tmp.GetFullPath();
991 if( !sheet.Last()->IsRootSheet() )
992 sheet.MakeFilePathRelativeToParentSheet();
995 else if( !fn.FileExists() )
998 updateFileHistory =
true;
1009 if( filenameMap.empty() || !saveCopy )
1011 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1016 wxArrayString overwrittenFiles;
1017 wxArrayString lockedFiles;
1019 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1023 wxCHECK2( screen,
continue );
1026 wxFileName tmpFn = filenameMap[screen];
1031 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1032 lockedFiles.Add( tmpFn.GetFullPath() );
1039 if( tmpFn.FileExists() )
1040 overwrittenFiles.Add( tmpFn.GetFullPath() );
1043 if( !lockedFiles.IsEmpty() )
1045 for(
const wxString& lockedFile : lockedFiles )
1050 msg +=
"\n" + lockedFile;
1053 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
1055 _(
"Locked File Warning" ),
1056 wxOK | wxICON_WARNING | wxCENTER );
1057 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1063 if( !overwrittenFiles.IsEmpty() )
1065 for(
const wxString& overwrittenFile : overwrittenFiles )
1068 msg = overwrittenFile;
1070 msg +=
"\n" + overwrittenFile;
1073 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
1074 _(
"Save Warning" ),
1075 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER |
1076 wxICON_EXCLAMATION );
1077 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1078 dlg.SetOKCancelLabels( wxMessageDialog::ButtonLabel(
_(
"Overwrite Files" ) ),
1079 wxMessageDialog::ButtonLabel(
_(
"Abort Project Save" ) ) );
1081 if( dlg.ShowModal() == wxID_CANCEL )
1087 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1091 wxCHECK2( screen,
continue );
1094 wxFileName tmpFn = filenameMap[screen];
1098 updateFileHistory =
true;
1106 if( !sheetFileName.IsOk()
1111 sheet->
SetFileName( sheetFileName.GetFullPath() );
1115 filenameMap[screen] = tmpFn.GetFullPath();
1127 if( sheets.size() == 1 )
1133 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1143 if( !aSaveAs && !success )
1146 if( aSaveAs && success )
1149 if( updateFileHistory )
1160 wxCHECK2( sheet,
continue );
1167 wxCHECK2( screen,
continue );
1171 sheets.emplace_back( std::make_pair( screen->
GetUuid(), wxT(
"Root" ) ) );
1175 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1179 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1180 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1183 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1188 else if( saveCopy && createNewProject )
1198 if( !
Kiface().IsSingle() )
1221 wxFileName fn = tmpFileName;
1229 bool autoSaveOk =
true;
1231 if( fn.GetPath().IsEmpty() )
1232 tmp.AssignDir(
Prj().GetProjectPath() );
1234 tmp.AssignDir( fn.GetPath() );
1242 wxString title = GetTitle();
1244 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1285 const std::map<std::string, UTF8>* aProperties )
1287 wxFileName filename( aFileName );
1288 wxFileName newfilename;
1289 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1291 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1292 ProcessEventLocally( changingEvt );
1296 case SCH_IO_MGR::SCH_ALTIUM:
1297 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1298 case SCH_IO_MGR::SCH_EAGLE:
1299 case SCH_IO_MGR::SCH_LTSPICE:
1300 case SCH_IO_MGR::SCH_EASYEDA:
1301 case SCH_IO_MGR::SCH_EASYEDAPRO:
1305 wxCHECK_MSG( aFileName.IsEmpty() || filename.IsAbsolute(),
false,
1306 wxS(
"Import schematic: path is not absolute!" ) );
1317 this, std::placeholders::_1 ) );
1320 if(
eeconfig()->m_System.show_import_issues )
1325 pi->SetProgressReporter( &progressReporter );
1346 newfilename.SetPath(
Prj().GetProjectPath() );
1347 newfilename.SetName(
Prj().GetProjectName() );
1356 progressReporter.
Report(
_(
"Updating connections..." ) );
1378 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1381 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1384 catch(
const std::exception& exc )
1389 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic "
1390 "'%s'." ), aFileName );
1393 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1406 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1407 ProcessEventLocally( e );
1411 wxCHECK2( listener,
continue );
1415 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1418 win->HandleWindowEvent( e );
1420 listener->SafelyProcessEvent( e );
1446 if( simFrame && !simFrame->Close() )
1449 if( screen->IsContentModified() )
1472 if( !autoSaveFileName.IsDirWritable() )
1474 wxLogTrace(
traceAutoSave,
"Insufficient permissions to auto save file '%s'",
1475 autoSaveFileName.GetFullPath() );
1479 wxLogTrace(
traceAutoSave,
"Creating auto save file '%s'", autoSaveFileName.GetFullPath() );
1483 std::vector< wxString > autoSavedFiles;
1485 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1495 autoSavedFiles.emplace_back( fn.GetFullPath() );
1498 wxTextFile autoSaveFile( autoSaveFileName.GetFullPath() );
1500 if( autoSaveFileName.FileExists() && !wxRemoveFile( autoSaveFileName.GetFullPath() ) )
1502 wxLogTrace(
traceAutoSave,
"Error removing auto save file '%s'",
1503 autoSaveFileName.GetFullPath() );
1509 if( autoSavedFiles.empty() )
1512 if( !autoSaveFile.Create() )
1515 for(
const wxString& fileName : autoSavedFiles )
1517 wxLogTrace(
traceAutoSave,
"Adding auto save file '%s' to '%s'",
1518 fileName, autoSaveFileName.GetName() );
1519 autoSaveFile.AddLine( fileName );
1522 if( !autoSaveFile.Write() )
1525 wxLogTrace(
traceAutoSave,
"Auto save file '%s' written", autoSaveFileName.GetFullName() );
1531void removeFile(
const wxString& aFilename, wxArrayString& aUnremoved )
1533 wxLogTrace(
traceAutoSave, wxS(
"Removing auto save file '%s'" ), aFilename );
1535 if( wxFileExists( aFilename ) && !wxRemoveFile( aFilename ) )
1536 aUnremoved.Add( aFilename );
1542 if( !
Pgm().IsGUI() )
1545 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1547 wxLogTrace(
traceAutoSave, wxS(
"Checking for auto save file '%s'" ), aFileName.GetFullPath() );
1549 if( !aFileName.FileExists() )
1552 wxString msg =
_(
"Well this is potentially embarrassing!\n"
1553 "It appears that the last time you were editing one or more of the schematic files\n"
1554 "were not saved properly. Do you wish to restore the last saved edits you made?" );
1556 int response = wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
this );
1558 wxTextFile fileList( aFileName.GetFullPath() );
1560 if( !fileList.Open() )
1562 msg.Printf(
_(
"The file '%s' could not be opened.\n"
1563 "Manual recovery of automatically saved files is required." ),
1564 aFileName.GetFullPath() );
1566 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1570 if( response == wxYES )
1572 wxArrayString unrecoveredFiles;
1574 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1576 wxFileName recoveredFn = fn;
1577 wxString tmp = recoveredFn.GetName();
1581 recoveredFn.SetName( tmp );
1583 wxFileName backupFn = recoveredFn;
1587 wxLogTrace(
traceAutoSave, wxS(
"Recovering auto save file:\n"
1588 " Original file: '%s'\n"
1589 " Backup file: '%s'\n"
1590 " Auto save file: '%s'" ),
1591 recoveredFn.GetFullPath(), backupFn.GetFullPath(), fn );
1593 if( !wxFileExists( fn ) )
1595 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1599 else if( recoveredFn.Exists()
1600 && !wxCopyFile( recoveredFn.GetFullPath(), backupFn.GetFullPath() ) )
1602 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1605 else if( !wxRenameFile( fn, recoveredFn.GetFullPath() ) )
1607 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1611 if( !unrecoveredFiles.IsEmpty() )
1613 msg =
_(
"The following automatically saved file(s) could not be restored\n" );
1615 for(
size_t i = 0; i < unrecoveredFiles.GetCount(); i++ )
1616 msg += unrecoveredFiles[i] + wxS(
"\n" );
1618 msg +=
_(
"Manual recovery will be required to restore the file(s) above." );
1619 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1622 wxArrayString unremovedFiles;
1623 removeFile( aFileName.GetFullPath(), unremovedFiles );
1625 if( !unremovedFiles.IsEmpty() )
1627 msg.Printf(
_(
"The autosave file '%s' could not be removed.\n"
1628 "Manual removal will be required." ),
1629 unremovedFiles[0] );
1631 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1643 if( !
Pgm().IsGUI() )
1646 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1648 if( !aFileName.FileExists() )
1651 wxTextFile fileList( aFileName.GetFullPath() );
1652 wxArrayString unremovedFiles;
1654 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1657 removeFile( aFileName.GetFullPath(), unremovedFiles );
1659 if( !unremovedFiles.IsEmpty() )
1661 wxString msg =
_(
"The following automatically saved file(s) could not be removed\n" );
1663 for(
size_t i = 0; i < unremovedFiles.GetCount(); i++ )
1664 msg += unremovedFiles[i] + wxS(
"\n" );
1666 msg +=
_(
"Manual removal will be required for the file(s) above." );
1667 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1674 static wxString autoSaveFileName( wxS(
"#auto_saved_files#" ) );
1676 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)
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.
Handle the graphic items list to draw/plot the frame and title block.
static DS_DATA_MODEL & GetTheInstance()
Return 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)
Check if aFileName can be written.
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
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?
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.
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.
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)
These are all prefaced with "Sch".
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 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.
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
void FixupJunctionsAfterImport()
Add junctions to this schematic where required.
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
void SetProject(PROJECT *aPrj)
CONNECTION_GRAPH * ConnectionGraph() const
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
void DisplaySheet(SCH_SCREEN *aScreen)
Handle actions specific to the schematic editor.
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.
std::vector< wxEvtHandler * > m_schematicChangeListeners
SCH_SHEET_PATH & GetCurrentSheet() const
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
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()
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.
virtual void DeleteAutoSaveFile(const wxFileName &aFileName) override
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 OnImportProject(wxCommandEvent &event)
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.
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
Save 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()
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
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.
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
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Set the currently loaded project path and saves it (pointers remain valid).
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Save a loaded project.
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.
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)
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 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 QueueShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION)
Send the infobar an event telling it to show a message.
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.
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.
static bool empty(const wxTextEntryBase *aCtrl)
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 const std::string AutoSaveFilePrefix
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 THROW_IO_ERROR(msg)
#define KICTL_CREATE
caller thinks requested project files may not exist.
#define KICTL_REVERT
reverting to a previously-saved (KiCad) file.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
PGM_BASE & Pgm()
The global program "get" accessor.
#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
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.