73#include <wx/filedlg.h>
75#include <wx/richmsgdlg.h>
76#include <wx/stdpaths.h>
101 if( aFileSet.size() != 1 )
103 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
108 wxString fullFileName( aFileSet[0] );
109 wxFileName wx_filename( fullFileName );
113 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
117 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
133 wxFileName pro = fullFileName;
136 bool is_new = !wxFileName::IsFileReadable( fullFileName );
142 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ),
145 if( !
IsOK(
this, msg ) )
149 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
150 ProcessEventLocally( e );
160 SetStatusText( wxEmptyString );
164 :
_(
"Load Schematic" ), 1,
170 if( differentProject )
172 if( !
Prj().IsNullProject() )
184 wxFileName legacyPro( pro );
189 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
194 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
199 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 )
233 newSchematic->CreateDefaultScreens();
240 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
242 msg.Printf(
_(
"'%s' is not a KiCad schematic file.\nUse File -> Import for "
243 "non-KiCad schematic files." ),
246 progressReporter.Hide();
256 pi->SetProgressReporter( &progressReporter );
258 bool failedLoad =
false;
268 const std::vector<TOP_LEVEL_SHEET_INFO>& topLevelSheets = projectFile.
GetTopLevelSheets();
270 if( !topLevelSheets.empty() )
278 wxFileName sheetFileName(
Prj().GetProjectPath(), sheetInfo.filename );
281 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
284 wxString sheetPath = sheetFileName.GetFullPath();
286 if( !wxFileName::FileExists( sheetPath ) )
288 wxLogWarning( wxT(
"Top-level sheet file not found: %s" ), sheetPath );
292 SCH_SHEET* sheet = pi->LoadSchematicFile( sheetPath, newSchematic.get() );
298 if( sheetInfo.uuid !=
niluuid )
300 const_cast<KIID&
>( sheet->
m_Uuid ) = sheetInfo.uuid;
303 sheet->
SetName( sheetInfo.name );
306 newSchematic->AddTopLevelSheet( sheet );
309 wxS(
"Loaded top-level sheet '%s' (UUID %s) from %s" ),
318 if( !newSchematic->GetTopLevelSheets().empty() )
320 newSchematic->CurrentSheet().clear();
321 newSchematic->CurrentSheet().push_back( newSchematic->GetTopLevelSheets()[0] );
324 wxS(
"Loaded multi-root schematic with %zu top-level sheets, current sheet set to '%s'" ),
325 newSchematic->GetTopLevelSheets().size(),
326 newSchematic->GetTopLevelSheets()[0]->GetName() );
331 wxS(
"Loaded multi-root schematic with no top-level sheets!" ) );
332 newSchematic->CreateDefaultScreens();
338 newSchematic->SetRoot( pi->LoadSchematicFile( fullFileName, newSchematic.get() ) );
342 newSchematic->Root().SetName(
_(
"Root" ) );
345 wxS(
"Loaded schematic with root sheet UUID %s" ),
346 newSchematic->Root().m_Uuid.AsString() );
348 "After loading: Current sheet path='%s', size=%zu, empty=%d",
349 newSchematic->CurrentSheet().Path().AsString(),
350 newSchematic->CurrentSheet().size(),
351 newSchematic->CurrentSheet().empty() ? 1 : 0 );
355 if( !pi->GetError().IsEmpty() )
358 "occurred attempting to load hierarchical sheets." ),
364 newSchematic->CreateDefaultScreens();
365 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
366 progressReporter.Hide();
373 newSchematic->CreateDefaultScreens();
374 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName );
375 progressReporter.Hide();
380 catch(
const std::bad_alloc& )
382 newSchematic->CreateDefaultScreens();
383 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
384 progressReporter.Hide();
404 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
421 _(
"An error was found when loading the schematic that has "
422 "been automatically fixed. Please save the schematic to "
423 "repair the broken file or it may not be usable with other "
424 "versions of KiCad." ) );
435 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
440 std::vector<SCH_ITEM*> deleted;
442 for(
SCH_ITEM* item : screen->Items() )
447 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
451 wire->SetEndPoint( entry->
GetEnd() );
453 screen->Append( wire.release() );
454 deleted.push_back( item );
459 screen->Remove( item );
475 wxArrayString libNames;
479 if( !libNames.IsEmpty() )
481 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
483 wxRichMessageDialog invalidLibDlg(
485 _(
"Illegal entry found in project file symbol library list." ),
486 _(
"Project Load Warning" ),
487 wxOK | wxCENTER | wxICON_EXCLAMATION );
488 invalidLibDlg.ShowDetailedText(
489 _(
"Symbol libraries defined in the project file symbol library "
490 "list are no longer supported and will be removed.\n\n"
491 "This may cause broken symbol library links under certain "
493 invalidLibDlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
494 invalidLibDlg.ShowModal();
496 !invalidLibDlg.IsCheckBoxChecked();
507 editor->RescueSymbolLibTableProject(
false );
517 wxFileName cacheFn = pro;
519 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn BEFORE path='%s' name='%s' full='%s' arg='%s'",
520 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath(), cacheFn.GetName() +
"-cache" );
521 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
522 wxLogTrace(
traceAutoSave,
"[SetName dbg] cacheFn AFTER path='%s' name='%s' full='%s'",
523 cacheFn.GetPath(), cacheFn.GetName(), cacheFn.GetFullPath() );
526 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ),
527 cacheFn.GetFullName() );
528 extMsg =
_(
"This can result in a broken schematic under certain conditions. "
529 "If the schematic does not have any missing symbols upon opening, "
530 "save it immediately before making any changes to prevent data "
531 "loss. If there are missing symbols, either manual recovery of "
532 "the schematic or recovery of the symbol cache library file and "
533 "reloading the schematic is required." );
535 wxMessageDialog dlgMissingCache(
this, msg,
_(
"Warning" ),
536 wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
537 dlgMissingCache.SetExtendedMessage( extMsg );
538 dlgMissingCache.SetOKCancelLabels(
539 wxMessageDialog::ButtonLabel(
_(
"Load Without Cache File" ) ),
540 wxMessageDialog::ButtonLabel(
_(
"Abort" ) ) );
542 if( dlgMissingCache.ShowModal() == wxID_CANCEL )
555 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
556 "It will be converted to the new format when saved." ),
564 screen->FixLegacyPowerSymbolMismatches();
575 first_screen = schematic.
GetNext();
581 m_infoBar->ShowMessage(
_(
"This file was created by an older version of KiCad. "
582 "It will be converted to the new format when saved." ),
590 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221002 )
593 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221110 )
596 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
599 screen->FixLegacyPowerSymbolMismatches();
602 screen->MigrateSimModels();
614 "Before CheckForMissingSymbolInstances: Current sheet path='%s', size=%zu",
624 "After SetScreen: Current sheet path='%s', size=%zu",
630 if(
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() > 0 )
639 progressReporter.
Report(
_(
"Updating connections..." ) );
646 m_infoBar->QueueShowMessage(
_(
"This schematic contains symbols that have leading "
647 "and/or trailing white space field names." ),
669 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
679 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
680 ProcessEventLocally( changedEvt );
682 if( !differentProject &&
Kiface().IsSingle() )
691 wxCHECK2( listener,
continue );
695 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
698 win->HandleWindowEvent( e );
700 listener->SafelyProcessEvent( e );
708 if( fn.FileExists() && !fn.IsFileWritable() )
712 m_infoBar->ShowMessage(
_(
"Schematic is read only." ),
742 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
743 "which will be permanently lost.\n\n"
744 "Do you want to proceed?" );
746 if( !
IsOK(
this, msg ) )
752 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
754 wxString fileFiltersStr;
755 wxString allWildcardsStr;
757 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
759 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
772 if( !fileFiltersStr.IsEmpty() )
773 fileFiltersStr += wxChar(
'|' );
781 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" )
784 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
785 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
788 dlg.SetCustomizeHook( importOptions );
790 if( dlg.ShowModal() == wxID_CANCEL )
810 wxFileName projectFn( dlg.GetPath() );
815 wxFileName fn = dlg.GetPath();
817 if( !fn.IsFileReadable() )
819 wxLogError(
_(
"Insufficient permissions to read file '%s'." ), fn.GetFullPath() );
823 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
825 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
832 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
839 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
841 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
856 wxFileName schematicFileName;
857 wxFileName oldFileName;
862 wxCHECK( screen,
false );
865 if( aSavePath.IsEmpty() )
870 oldFileName = schematicFileName;
875 if( !schematicFileName.DirExists() )
877 if( !wxMkdir( schematicFileName.GetPath() ) )
879 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
880 schematicFileName.GetFullPath(),
881 "Could not create directory: %s" + schematicFileName.GetPath() );
891 wxFileName projectFile( schematicFileName );
895 if( projectFile.FileExists() )
903 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
909 schematicFileName.GetFullPath() );
911 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
912 pluginType = SCH_IO_MGR::SCH_KICAD;
918 pi->SaveSchematicFile( schematicFileName.GetFullPath(), aSheet, &
Schematic() );
923 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
924 schematicFileName.GetFullPath(),
935 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
936 SetStatusText( msg, 0 );
954 const wxFileName& aOldRoot,
const wxFileName& aNewRoot,
955 bool aSaveCopy,
bool aCopySubsheets,
bool aIncludeExternSheets,
956 std::unordered_map<SCH_SCREEN*, wxString>& aFilenameMap,
957 wxString& aErrorMsg )
961 for(
size_t i = 0; i < aScreens.
GetCount(); i++ )
965 wxCHECK2( screen,
continue );
972 if( !src.IsAbsolute() )
973 src.MakeAbsolute( aOldRoot.GetPath() );
975 bool internalSheet = src.GetPath().StartsWith( aOldRoot.GetPath() );
977 if( aCopySubsheets && ( internalSheet || aIncludeExternSheets ) )
979 wxFileName dest = src;
981 if( internalSheet && dest.MakeRelativeTo( aOldRoot.GetPath() ) )
982 dest.MakeAbsolute( aNewRoot.GetPath() );
984 dest.Assign( aNewRoot.GetPath(), dest.GetFullName() );
987 wxS(
"Moving schematic from '%s' to '%s'." ),
989 dest.GetFullPath() );
991 if( !dest.DirExists() && !dest.Mkdir() )
993 aErrorMsg.Printf(
_(
"Folder '%s' could not be created.\n\n"
994 "Make sure you have write permissions and try again." ),
1000 aFilenameMap[screen] = dest.GetFullPath();
1007 aFilenameMap[screen] = wxString();
1015 if( !sheet.Last()->IsTopLevelSheet() )
1016 sheet.MakeFilePathRelativeToParentSheet();
1028 bool success =
true;
1029 bool updateFileHistory =
false;
1030 bool createNewProject =
false;
1031 bool copySubsheets =
false;
1032 bool includeExternSheets =
false;
1036 wxFileName fn = fileName;
1040 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
1043 if(
Prj().IsNullProject() || aSaveAs )
1046 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
1048 wxFileName newFileName;
1049 wxFileName savePath(
Prj().GetProjectFullName() );
1051 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1055 if( !savePath.IsOk() || !savePath.IsDirWritable() )
1059 if( savePath.HasExt() )
1062 savePath.SetName( wxEmptyString );
1064 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
1066 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1071 if(
Kiface().IsSingle() || aSaveAs )
1073 dlg.SetCustomizeHook( newProjectHook );
1076 if( dlg.ShowModal() == wxID_CANCEL )
1081 if( ( !newFileName.DirExists() && !newFileName.Mkdir() ) ||
1082 !newFileName.IsDirWritable() )
1084 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1085 "Make sure you have write permissions and try again." ),
1086 newFileName.GetPath() );
1088 wxMessageDialog dlgBadPath(
this, msg,
_(
"Error" ),
1089 wxOK | wxICON_EXCLAMATION | wxCENTER );
1091 dlgBadPath.ShowModal();
1106 updateFileHistory =
true;
1114 copySubsheets, includeExternSheets, filenameMap, msg ) )
1116 wxMessageDialog dlgBadFilePath(
this, msg,
_(
"Error" ),
1117 wxOK | wxICON_EXCLAMATION | wxCENTER );
1119 dlgBadFilePath.ShowModal();
1123 else if( !fn.FileExists() )
1126 updateFileHistory =
true;
1137 if( filenameMap.empty() || !saveCopy )
1139 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1144 wxArrayString overwrittenFiles;
1145 wxArrayString lockedFiles;
1147 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1151 wxCHECK2( screen,
continue );
1154 wxFileName tmpFn = filenameMap[screen];
1159 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1160 lockedFiles.Add( tmpFn.GetFullPath() );
1167 if( tmpFn.FileExists() )
1168 overwrittenFiles.Add( tmpFn.GetFullPath() );
1171 if( !lockedFiles.IsEmpty() )
1173 for(
const wxString& lockedFile : lockedFiles )
1178 msg +=
"\n" + lockedFile;
1181 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
1183 _(
"Locked File Warning" ),
1184 wxOK | wxICON_WARNING | wxCENTER );
1185 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1191 if( !overwrittenFiles.IsEmpty() )
1193 for(
const wxString& overwrittenFile : overwrittenFiles )
1196 msg = overwrittenFile;
1198 msg +=
"\n" + overwrittenFile;
1201 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
1202 _(
"Save Warning" ),
1203 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER |
1204 wxICON_EXCLAMATION );
1205 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1206 dlg.SetOKCancelLabels( wxMessageDialog::ButtonLabel(
_(
"Overwrite Files" ) ),
1207 wxMessageDialog::ButtonLabel(
_(
"Abort Project Save" ) ) );
1209 if( dlg.ShowModal() == wxID_CANCEL )
1215 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1219 wxCHECK2( screen,
continue );
1222 wxFileName tmpFn = filenameMap[screen];
1226 updateFileHistory =
true;
1234 if( !sheetFileName.IsOk()
1239 sheet->
SetFileName( sheetFileName.GetFullPath() );
1243 filenameMap[screen] = tmpFn.GetFullPath();
1255 if( sheets.size() == 1 )
1261 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1270 if( aSaveAs && success )
1273 if( updateFileHistory )
1284 wxCHECK2( sheet,
continue );
1289 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1293 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1294 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1297 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1302 else if( saveCopy && createNewProject )
1312 if( !
Kiface().IsSingle() )
1330 const std::map<std::string, UTF8>* aProperties )
1332 wxFileName filename( aFileName );
1333 wxFileName newfilename;
1334 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1336 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1337 ProcessEventLocally( changingEvt );
1339 std::unique_ptr<SCHEMATIC> newSchematic = std::make_unique<SCHEMATIC>( &
Prj() );
1343 case SCH_IO_MGR::SCH_ALTIUM:
1344 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1345 case SCH_IO_MGR::SCH_EAGLE:
1346 case SCH_IO_MGR::SCH_LTSPICE:
1347 case SCH_IO_MGR::SCH_EASYEDA:
1348 case SCH_IO_MGR::SCH_EASYEDAPRO:
1352 wxCHECK_MSG( aFileName.IsEmpty() || filename.IsAbsolute(),
false,
1353 wxS(
"Import schematic: path is not absolute!" ) );
1364 this, std::placeholders::_1 ) );
1367 if(
eeconfig()->m_System.show_import_issues )
1372 pi->SetProgressReporter( &progressReporter );
1374 SCH_SHEET* loadedSheet = pi->LoadSchematicFile( aFileName, newSchematic.get(),
nullptr,
1395 newfilename.SetPath(
Prj().GetProjectPath() );
1396 newfilename.SetName(
Prj().GetProjectName() );
1405 progressReporter.
Report(
_(
"Updating connections..." ) );
1427 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1430 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1433 catch(
const std::exception& exc )
1438 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic "
1439 "'%s'." ), aFileName );
1442 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1455 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1456 ProcessEventLocally( e );
1460 wxCHECK2( listener,
continue );
1464 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1467 win->HandleWindowEvent( e );
1469 listener->SafelyProcessEvent( e );
1495 if( simFrame && !simFrame->Close() )
1498 if( screen->IsContentModified() )
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION zoomFitScreen
void SetVirtualPageNumber(int aPageNumber)
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
void SetContentModified(bool aModified=true)
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
static std::vector< IMPORT_PROJECT_DESC > RunModal(wxWindow *aParent, const std::vector< IMPORT_PROJECT_DESC > &aProjectDesc)
Create and show a dialog (modal) and returns the data from it after completion.
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
wxTimer * m_autoSaveTimer
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxString GetMruPath() const
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Check if aFileName can be written.
std::unique_ptr< LOCKFILE > m_file_checker
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 the selected state of the copy subsheets option.
bool GetCopySubsheets() const
Gets the selected state of the include external sheets option.
bool IsAttachedToDialog() const
bool GetIncludeExternSheets() const
Gets if this hook has attached controls to a dialog box.
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?
wxString AsString() const
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 #SYMBOL_LIB objects.
static void GetLibNamesAndPaths(PROJECT *aProject, wxString *aPaths, wxArrayString *aNames=nullptr)
static void SetLibNamesAndPaths(PROJECT *aProject, const wxString &aPaths, const wxArrayString &aNames)
bool TagSave(const wxString &aProjectPath, const wxString &aFileType)
Tag a manual save in the local history repository.
bool Init(const wxString &aProjectPath)
Initialize the local history repository for the given project path.
bool CommitFullProjectSnapshot(const wxString &aProjectPath, const wxString &aTitle)
Commit a snapshot of the entire project directory (excluding the .history directory and ignored trans...
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 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 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.
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.
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)
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.
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.
friend class SCH_EDITOR_CONTROL
std::vector< wxEvtHandler * > m_schematicChangeListeners
void CreateDefaultScreens()
PANEL_REMOTE_SYMBOL * m_remoteSymbolPane
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.
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 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 ...
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 OnImportProject(wxCommandEvent &event)
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
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.
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
bool IsVirtualRootSheet() 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.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
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.
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
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)
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)
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 THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define KICTL_CREATE
caller thinks requested project files may not exist.
#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
Implement a participant in the KIWAY alchemy.
virtual void PreloadLibraries(KIWAY *aKiway)
Information about a top-level schematic sheet.
wxLogTrace helper definitions.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.