81#include <wx/filedlg.h>
83#include <wx/richmsgdlg.h>
84#include <wx/stdpaths.h>
120 screen->SetContentModified(
false );
138 if( aFileSet.size() != 1 )
140 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
145 wxString fullFileName( aFileSet[0] );
146 wxFileName wx_filename( fullFileName );
149 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
154 if(
Prj().IsLockOverrideGranted() )
160 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
177 wxFileName pro = fullFileName;
180 bool is_new = !wxFileName::IsFileReadable( fullFileName );
186 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ), fullFileName );
188 if( !
IsOK(
this, msg ) )
192 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
193 ProcessEventLocally( e );
203 SetStatusText( wxEmptyString );
207 statusBar->ClearWarningMessages(
"load" );
217 if( differentProject )
219 if( !
Prj().IsNullProject() )
231 wxFileName legacyPro( pro );
236 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
246 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
250 bool isNonKicadImport = schFileType != SCH_IO_MGR::SCH_KICAD
251 && schFileType != SCH_IO_MGR::SCH_LEGACY
252 && schFileType != SCH_IO_MGR::SCH_FILE_UNKNOWN;
258 if( isNonKicadImport )
260 progressReporter.Hide();
261 return importFile( fullFileName, schFileType,
nullptr );
264 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
285 wxFileName rfn( fullFileName );
286 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
296 if( is_new || schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
298 newSchematic->CreateDefaultScreens();
305 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
309 msg.Printf(
_(
"'%s' is not a KiCad schematic file.\n"
310 "Use File -> Import for non-KiCad schematic files." ), fullFileName );
315 msg.Printf(
_(
"'%s' is not a recognised schematic format." ), fullFileName );
318 progressReporter.Hide();
328 pi->SetProgressReporter( &progressReporter );
330 bool failedLoad =
false;
340 const std::vector<TOP_LEVEL_SHEET_INFO>& topLevelSheets = projectFile.
GetTopLevelSheets();
342 if( !topLevelSheets.empty() )
344 std::vector<SCH_SHEET*> loadedSheets;
349 wxFileName sheetFileName( sheetInfo.filename );
350 sheetFileName.MakeAbsolute(
Prj().GetProjectPath() );
353 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
356 wxString sheetPath = sheetFileName.GetFullPath();
358 if( !wxFileName::FileExists( sheetPath ) )
360 wxLogWarning( wxT(
"Top-level sheet file not found: %s" ), sheetPath );
364 SCH_SHEET* sheet = pi->LoadSchematicFile( sheetPath, newSchematic.get() );
370 if( sheetInfo.uuid !=
niluuid )
372 const_cast<KIID&
>( sheet->
m_Uuid ) = sheetInfo.uuid;
375 sheet->
SetName( sheetInfo.name );
376 loadedSheets.push_back( sheet );
378 wxLogTrace(
tracePathsAndFiles, wxS(
"Loaded top-level sheet '%s' (UUID %s) from %s" ),
383 if( !loadedSheets.empty() )
385 newSchematic->SetTopLevelSheets( loadedSheets );
390 wxS(
"Loaded multi-root schematic with no top-level sheets!" ) );
391 newSchematic->CreateDefaultScreens();
397 SCH_SHEET* rootSheet = pi->LoadSchematicFile( fullFileName, newSchematic.get() );
401 newSchematic->SetTopLevelSheets( { rootSheet } );
405 if(
SCH_SHEET* topSheet = newSchematic->GetTopLevelSheet() )
406 topSheet->SetName(
_(
"Root" ) );
411 wxS(
"After loading: Current sheet path='%s', size=%zu, empty=%d" ),
412 newSchematic->CurrentSheet().Path().AsString(),
413 newSchematic->CurrentSheet().size(),
414 newSchematic->CurrentSheet().empty() ? 1 : 0 );
418 newSchematic->CreateDefaultScreens();
424 if( !pi->GetError().IsEmpty() )
427 "occurred attempting to load hierarchical sheets." ),
433 newSchematic->CreateDefaultScreens();
434 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
435 progressReporter.Hide();
442 newSchematic->CreateDefaultScreens();
443 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
444 progressReporter.Hide();
449 catch(
const std::bad_alloc& )
451 newSchematic->CreateDefaultScreens();
452 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
453 progressReporter.Hide();
475 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
477 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
489 bool repairedPageNumbers =
false;
499 if( sheetList.
IsModified() || repairedPageNumbers )
501 DisplayInfoMessage(
this,
_(
"An error was found when loading the schematic that has been "
502 "automatically fixed. Please save the schematic to repair the "
503 "broken file or it may not be usable with other versions of "
510 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
515 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
520 std::vector<SCH_ITEM*> deleted;
522 for(
SCH_ITEM* item : screen->Items() )
527 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
531 wire->SetEndPoint( entry->
GetEnd() );
533 screen->Append( wire.release() );
534 deleted.push_back( item );
539 screen->Remove( item );
555 wxArrayString libNames;
559 if( !libNames.IsEmpty() )
561 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
563 wxRichMessageDialog dlg(
this,
564 _(
"Illegal entry found in project file symbol library list." ),
565 _(
"Project Load Warning" ),
566 wxOK | wxCENTER | wxICON_EXCLAMATION );
567 dlg.ShowDetailedText(
_(
"Symbol libraries defined in the project file symbol library "
568 "list are no longer supported and will be removed.\n\n"
569 "This may cause broken symbol library links under certain "
571 dlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
582 wxFileName cacheFn( fullFileName );
583 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
585 bool cacheExists = cacheFn.FileExists();
596 if( !(*table)->HasRow( nickname ) )
600 row.
SetURI( cacheFn.GetFullPath() );
606 std::vector<KI_ERROR> libErrors;
611 statusBar->AddWarningMessages(
"load", libErrors );
618 editor->RescueSymbolLibTableProject(
false );
627 wxFileName cacheFn = pro;
629 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn BEFORE path='%s' name='%s' full='%s' arg='%s'",
630 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath(), cacheFn.GetName() +
"-cache" );
631 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
632 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn AFTER path='%s' name='%s' full='%s'",
633 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath() );
636 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ), cacheFn.GetFullName() );
638 KICAD_MESSAGE_DIALOG dlg(
this, msg,
_(
"Warning" ), wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
639 dlg.SetExtendedMessage(
_(
"This can result in a broken schematic under certain conditions. If the "
640 "schematic does not have any missing symbols upon opening, save it "
641 "immediately before making any changes to prevent data loss. If there "
642 "are missing symbols, either manual recovery of the schematic or "
643 "recovery of the symbol cache library file and reloading the schematic is "
645 dlg.SetOKCancelLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Load Without Cache File" ) ),
646 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Abort" ) ) );
648 if( dlg.ShowModal() == wxID_CANCEL )
661 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
662 "It will be converted to the new format when saved." ),
663 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
670 screen->FixLegacyPowerSymbolMismatches();
681 first_screen = schematic.
GetNext();
687 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
688 "It will be converted to the new format when saved." ),
689 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
707 screen->FixLegacyPowerSymbolMismatches();
710 screen->MigrateSimModels();
721 wxLogTrace(
traceSchCurrentSheet,
"Before CheckForMissingSymbolInstances: Current sheet path='%s', size=%zu",
737 if( repairedPageNumbers )
745 const bool nativeNeedsFixup = schFileType == SCH_IO_MGR::SCH_KICAD
751 if( schFileType == SCH_IO_MGR::SCH_LEGACY || nativeNeedsFixup )
756 progressReporter.
Report(
_(
"Updating connections..." ) );
769 schFileVersion,
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() ) )
771 progressReporter.Hide();
781 progressReporter.Show();
785 dummy.Push(
_(
"Schematic Cleanup" ),
791 m_infoBar->QueueShowMessage(
_(
"This schematic contains symbols that have leading "
792 "and/or trailing white space field names." ),
819 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
820 ProcessEventLocally( changedEvt );
822 if( !differentProject )
833 wxCHECK2( listener,
continue );
837 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
840 win->HandleWindowEvent( e );
842 listener->SafelyProcessEvent( e );
850 if( fn.FileExists() && !fn.IsFileWritable() )
854 m_infoBar->ShowMessage(
_(
"Schematic is read only." ), wxICON_WARNING,
855 WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
888 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
889 "which will be permanently lost.\n\n"
890 "Do you want to proceed?" );
892 if( !
IsOK(
this, msg ) )
898 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
900 wxString fileFiltersStr;
901 wxString allWildcardsStr;
903 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
905 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
918 if( !fileFiltersStr.IsEmpty() )
919 fileFiltersStr += wxChar(
'|' );
927 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" ) + fileFiltersStr;
929 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
930 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
933 dlg.SetCustomizeHook( importOptions );
937 if( dlg.ShowModal() == wxID_CANCEL )
957 wxFileName projectFn( dlg.GetPath() );
962 wxFileName fn = dlg.GetPath();
964 if( !fn.IsFileReadable() )
966 wxLogError(
_(
"Insufficient permissions to read file '%s'." ), fn.GetFullPath() );
970 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
972 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
979 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
986 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
988 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
1003 wxFileName schematicFileName;
1004 wxFileName oldFileName;
1009 wxCHECK( screen,
false );
1012 if( aSavePath.IsEmpty() )
1017 oldFileName = schematicFileName;
1022 if( !schematicFileName.DirExists() )
1024 if( !wxMkdir( schematicFileName.GetPath() ) )
1026 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
1027 schematicFileName.GetFullPath(),
1028 "Could not create directory: %s" + schematicFileName.GetPath() );
1038 wxFileName projectFile( schematicFileName );
1042 if( projectFile.FileExists() )
1050 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
1052 if(
m_infoBar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE )
1057 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
1058 pluginType = SCH_IO_MGR::SCH_KICAD;
1064 if( schematicFileName.FileExists() )
1069 pi->SaveSchematicFile( schematicFileName.GetFullPath(), aSheet, &
Schematic() );
1074 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
1075 schematicFileName.GetFullPath(),
1087 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
1088 SetStatusText( msg, 0 );
1096 const wxFileName& aNewRoot,
bool aSaveCopy,
bool aCopySubsheets,
bool aIncludeExternSheets,
1097 std::unordered_map<SCH_SCREEN*, wxString>& aFilenameMap, wxString& aErrorMsg )
1101 for(
size_t i = 0; i < aScreens.
GetCount(); i++ )
1105 wxCHECK2( screen,
continue );
1117 if( !src.IsAbsolute() )
1118 src.MakeAbsolute( aOldRoot.GetPath() );
1120 bool internalSheet = src.GetPath().StartsWith( aOldRoot.GetPath() );
1122 if( aCopySubsheets && ( internalSheet || aIncludeExternSheets ) )
1124 wxFileName dest = src;
1126 if( internalSheet && dest.MakeRelativeTo( aOldRoot.GetPath() ) )
1127 dest.MakeAbsolute( aNewRoot.GetPath() );
1129 dest.Assign( aNewRoot.GetPath(), dest.GetFullName() );
1134 if( !dest.DirExists() && !dest.Mkdir() )
1136 aErrorMsg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1137 "Make sure you have write permissions and try again." ),
1143 aFilenameMap[screen] = dest.GetFullPath();
1150 aFilenameMap[screen] = wxString();
1158 if( !sheet.Last()->IsTopLevelSheet() )
1159 sheet.MakeFilePathRelativeToParentSheet();
1171 bool success =
true;
1172 bool updateFileHistory =
false;
1173 bool createNewProject =
false;
1174 bool copySubsheets =
false;
1175 bool includeExternSheets =
false;
1179 wxFileName fn = fileName;
1183 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
1186 if(
Prj().IsNullProject() || aSaveAs )
1189 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
1191 wxFileName newFileName;
1192 wxFileName savePath(
Prj().GetProjectFullName() );
1194 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1198 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1202 if( savePath.HasExt() )
1205 savePath.SetName( wxEmptyString );
1207 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
1213 if(
Kiface().IsSingle() || aSaveAs )
1215 dlg.SetCustomizeHook( newProjectHook );
1220 if( dlg.ShowModal() == wxID_CANCEL )
1225 if( ( !newFileName.DirExists() && !newFileName.Mkdir() )
1226 || !newFileName.IsDirWritable() )
1228 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1229 "Make sure you have write permissions and try again." ),
1230 newFileName.GetPath() );
1234 dlgBadPath.ShowModal();
1249 updateFileHistory =
true;
1257 filenameMap, msg ) )
1259 KICAD_MESSAGE_DIALOG dlgBadFilePath(
this, msg,
_(
"Error" ), wxOK | wxICON_EXCLAMATION | wxCENTER );
1261 dlgBadFilePath.ShowModal();
1265 else if( !fn.FileExists() )
1268 updateFileHistory =
true;
1279 if( filenameMap.empty() || !saveCopy )
1281 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1286 wxArrayString overwrittenFiles;
1287 wxArrayString lockedFiles;
1289 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1293 wxCHECK2( screen,
continue );
1296 wxFileName tmpFn = filenameMap[screen];
1301 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1302 lockedFiles.Add( tmpFn.GetFullPath() );
1309 if( tmpFn.FileExists() )
1310 overwrittenFiles.Add( tmpFn.GetFullPath() );
1313 if( !lockedFiles.IsEmpty() )
1315 for(
const wxString& lockedFile : lockedFiles )
1320 msg +=
"\n" + lockedFile;
1323 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
Schematic().Root().GetFileName() ),
1324 _(
"Locked File Warning" ), wxOK | wxICON_WARNING | wxCENTER );
1325 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1331 if( !overwrittenFiles.IsEmpty() )
1333 for(
const wxString& overwrittenFile : overwrittenFiles )
1336 msg = overwrittenFile;
1338 msg +=
"\n" + overwrittenFile;
1341 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
_(
"Save Warning" ),
1342 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER | wxICON_EXCLAMATION );
1343 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1344 dlg.SetOKCancelLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Overwrite Files" ) ),
1345 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Abort Project Save" ) ) );
1347 if( dlg.ShowModal() == wxID_CANCEL )
1353 std::vector<wxString> savedSheetPaths;
1355 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1359 wxCHECK2( screen,
continue );
1362 wxFileName tmpFn = filenameMap[screen];
1366 updateFileHistory =
true;
1378 sheet->
SetFileName( sheetFileName.GetFullPath() );
1382 filenameMap[screen] = tmpFn.GetFullPath();
1394 if( sheets.size() == 1 )
1400 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1405 if( savedThisSheet )
1406 savedSheetPaths.push_back( tmpFn.GetFullPath() );
1408 success &= savedThisSheet;
1422 if( updateFileHistory )
1433 wxCHECK2( sheet,
continue );
1437 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1440 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1441 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1444 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1449 else if( saveCopy && createNewProject )
1462 if( success && !saveCopy && !
Prj().IsNullProject() )
1477 if( !
Kiface().IsSingle() )
1485 sheet.LastScreen()->SetVirtualPageNumber( sheet.GetVirtualPageNumber() );
1497 if(
m_infoBar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE )
1502 wxString backupMsg = backupReporter.
GetMessages();
1503 m_infoBar->ShowMessageFor( backupMsg.Trim(), 10000, wxICON_WARNING );
1514 const std::map<std::string, UTF8>* aProperties )
1516 bool success =
true;
1517 wxFileName filename( aFileName );
1518 wxFileName newfilename;
1519 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1521 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1522 ProcessEventLocally( changingEvt );
1525 statusBar->ClearWarningMessages(
"load" );
1530 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
1534 case SCH_IO_MGR::SCH_ALTIUM:
1535 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1536 case SCH_IO_MGR::SCH_EAGLE:
1537 case SCH_IO_MGR::SCH_LTSPICE:
1538 case SCH_IO_MGR::SCH_EASYEDA:
1539 case SCH_IO_MGR::SCH_EASYEDAPRO:
1540 case SCH_IO_MGR::SCH_EASYEDAPRO_V3:
1541 case SCH_IO_MGR::SCH_PADS:
1542 case SCH_IO_MGR::SCH_GEDA:
1543 case SCH_IO_MGR::SCH_DIPTRACE:
1544 case SCH_IO_MGR::SCH_PCAD:
1545 case SCH_IO_MGR::SCH_ORCAD:
1546 case SCH_IO_MGR::SCH_EASYPC:
1547 case SCH_IO_MGR::SCH_TARGET3001:
1551 wxCHECK_MSG( aFileName.IsEmpty() || filename.IsAbsolute(),
false,
1552 wxS(
"Import schematic: path is not absolute!" ) );
1563 this, std::placeholders::_1 ) );
1566 if(
eeconfig()->m_System.show_import_issues )
1571 pi->SetProgressReporter( &progressReporter );
1573 SCH_SHEET* loadedSheet = pi->LoadSchematicFile( aFileName, newSchematic.get(),
nullptr, aProperties );
1586 bool loadedIsTopLevel = std::find( topLevelSheets.begin(), topLevelSheets.end(), loadedSheet )
1587 != topLevelSheets.end();
1588 bool loadedIsVirtualRoot = loadedSheet == &
Schematic().
Root()
1593 if( !loadedIsTopLevel && !loadedIsVirtualRoot )
1602 std::vector<wxString> sourceFpLibs;
1619 const wxString embeddedPrefix = wxS(
"kicad-embed://" );
1622 if( drawingSheetName.StartsWith( embeddedPrefix ) )
1624 wxString sheetFile = drawingSheetName.Mid( embeddedPrefix.length() );
1628 if( !embeddedWorksheet
1640 newfilename.SetPath(
Prj().GetProjectPath() );
1641 newfilename.SetName(
Prj().GetProjectName() );
1647 topSheet->SetFileName( newfilename.GetFullName() );
1652 progressReporter.
Report(
_(
"Updating connections..." ) );
1674 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1677 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1682 catch(
const std::exception& exc )
1687 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic '%s'." ), aFileName );
1690 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1714 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1715 ProcessEventLocally( e );
1719 wxCHECK2( listener,
continue );
1723 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1726 win->HandleWindowEvent( e );
1728 listener->SafelyProcessEvent( e );
1734 statusBar->AddWarningMessages(
"load", loadReporter.
GetMessages() );
1758 if( simFrame && !simFrame->Close() )
1761 if( screen->IsContentModified() )
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.
void ReleaseFile()
Release the current file marked in use.
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.
void RefreshGitCommitPane()
Attach the git session if needed and refresh the version-control pane, when it is shown.
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.
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
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.
static TOOL_ACTION changeSheet
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
bool ReloadFromDisk()
Reload the schematic and all its sheets from disk.
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
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
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_REVERT
reverting to a previously-saved (KiCad) file.
#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.