71#include <wx/tokenzr.h>
105static int eeschemaMergeExport(
int aKind,
const wxString& aAncestor,
const wxString& aOurs,
106 const wxString& aTheirs,
const wxString& aOutput,
bool aInteractive,
107 bool aSingleFile,
REPORTER* aReporter );
109 const wxString& aLabelA,
const wxString& aLabelB,
110 wxWindow* aParent,
REPORTER* aReporter );
118 std::unique_ptr<SCHEMATIC>
schematic = std::make_unique<SCHEMATIC>(
nullptr );
122 wxFileName pro( aFilename );
125 wxString projectPath = pro.GetFullPath();
142 std::vector<SCH_SHEET*> topLevelSheets =
schematic->GetTopLevelSheets();
143 bool rootIsTopLevel = std::find( topLevelSheets.begin(), topLevelSheets.end(), rootSheet )
144 != topLevelSheets.end();
147 if( !rootIsTopLevel && !rootIsVirtualRoot )
148 schematic->SetTopLevelSheets( { rootSheet } );
153 screen->UpdateLocalLibSymbolLinks();
160 if(
schematic->RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
163 screen->FixLegacyPowerSymbolMismatches();
167 screen->MigrateSimModels();
171 sheet.UpdateAllScreenReferences();
179 schematic->ConnectionGraph()->Recalculate( sheets,
true );
215 void Reset()
override;
240 return new SYMBOL_EDIT_FRAME( aKiway, aParent );
246 SIMULATOR_FRAME* frame =
new SIMULATOR_FRAME( aKiway, aParent );
249 catch(
const SIMULATOR_INIT_ERR& )
262 bool cancelled =
false;
321 return new PANEL_SYM_EDITING_OPTIONS( aParent,
this, frame );
329 std::vector<TOOL_ACTION*> actions;
330 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
333 actions.push_back( action );
336 controls.push_back( control );
342 return new PANEL_SYM_COLOR_SETTINGS( aParent );
361 return new PANEL_GRID_SETTINGS( aParent,
this, frame, cfg,
FRAME_SCH );
381 return new PANEL_EESCHEMA_EDITING_OPTIONS( aParent,
this, frame );
389 std::vector<TOOL_ACTION*> actions;
390 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
393 actions.push_back( action );
396 controls.push_back( control );
398 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb,
FRAME_SCH, actions, controls );
402 return new PANEL_EESCHEMA_COLOR_SETTINGS( aParent );
405 return new PANEL_TEMPLATE_FIELDNAMES( aParent,
nullptr );
421 return new PANEL_SIMULATOR_PREFERENCES( aParent );
463 void SaveFileAs(
const wxString& aProjectBasePath,
const wxString& aProjectName,
464 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
465 const wxString& aSrcFilePath, wxString& aErrors )
override;
474 wxString* aError )
override;
481 wxString* aError )
override;
512 const wxString& aTheirs,
const wxString& aOutput,
bool aInteractive,
513 bool aSingleFile,
REPORTER* aReporter )
516 aOurs, aTheirs, aOutput, aInteractive, aSingleFile,
522 const wxString& aLabelA,
const wxString& aLabelB,
523 wxWindow* aParent,
REPORTER* aReporter )
526 aFileB, aLabelA, aLabelB, aParent, aReporter );
566 m_jobHandler = std::make_unique<EESCHEMA_JOBS_HANDLER>( aKiway );
574 if(
Pgm().ApiServerOrNull() )
602 constexpr static int interval = 150;
603 constexpr static int timeLimit = 120000;
621 [
this, aKiway]() ->
void
623 std::shared_ptr<BACKGROUND_JOB_REPORTER>
reporter =
629 bool aborted =
false;
631 reporter->Report(
_(
"Loading Symbol Libraries" ) );
643 std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
647 float progress = *loadStatus;
648 reporter->SetCurrentProgress( progress );
661 if( elapsed > timeLimit )
684 wxLogTrace(
traceLibraries,
"eeschema PreloadLibraries: aborted, skipping symbol processing" );
694 std::string payload =
"";
701 std::future<void> preloadFuture = std::async( std::launch::async, preload );
729 if(
Pgm().ApiServerOrNull() )
745 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
746 const wxString& aSrcFilePath, wxString& aErrors )
748 wxFileName destFile( aSrcFilePath );
749 wxString destPath = destFile.GetPathWithSep();
750 wxUniChar pathSep = wxFileName::GetPathSeparator();
751 wxString ext = destFile.GetExt();
753 if( destPath.StartsWith( aProjectBasePath + pathSep ) )
754 destPath.Replace( aProjectBasePath, aNewProjectBasePath,
false );
756 destFile.SetPath( destPath );
763 if( destFile.GetName() == aProjectName )
765 destFile.SetName( aNewProjectName );
767 else if( destFile.GetName() == aNewProjectName )
771 if( !aErrors.empty() )
772 aErrors += wxS(
"\n" );
774 msg.Printf(
_(
"Cannot copy file '%s' as it will be overwritten by the new root "
775 "sheet file." ), destFile.GetFullPath() );
781 [&](
const std::string& token, wxString& value ) ->
bool
783 if( token ==
"project" && value == aProjectName )
785 value = aNewProjectName;
796 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
802 if( destFile.GetName() == aProjectName + wxS(
"-cache" ) )
803 destFile.SetName( aNewProjectName + wxS(
"-cache" ) );
805 if( destFile.GetName() == aProjectName + wxS(
"-rescue" ) )
806 destFile.SetName( aNewProjectName + wxS(
"-rescue" ) );
808 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
812 if( destFile.GetName() == aProjectName )
813 destFile.SetName( aNewProjectName );
816 [&](
const std::string& token, wxString& value ) ->
bool
818 if( token ==
"source" )
820 for( const wxString& extension : { wxString( wxT(
".sch" ) ), wxString( wxT(
".kicad_sch" ) ) } )
822 if( value == aProjectName + extension )
824 value = aNewProjectName + extension;
827 else if( value == aProjectBasePath +
"/" + aProjectName + extension )
829 value = aNewProjectBasePath +
"/" + aNewProjectName + extension;
832 else if( value.StartsWith( aProjectBasePath ) )
834 value.Replace( aProjectBasePath, aNewProjectBasePath, false );
846 wxFileName libTableFn( aSrcFilePath );
848 libTable.SetPath( destFile.GetFullPath() );
851 for( LIBRARY_TABLE_ROW& row : libTable.Rows() )
853 wxString uri = row.URI();
855 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
"-cache.lib" ),
856 wxS(
"/" ) + aNewProjectName + wxS(
"-cache.lib" ) );
857 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
"-rescue.lib" ),
858 wxS(
"/" ) + aNewProjectName + wxS(
"-rescue.lib" ) );
859 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
".lib" ),
860 wxS(
"/" ) + aNewProjectName + wxS(
".lib" ) );
865 libTable.Save().map_error(
866 [&](
const LIBRARY_ERROR& aError )
870 if( !aErrors.empty() )
871 aErrors += wxT(
"\n" );
873 msg.Printf(
_(
"Cannot copy file '%s'." ), destFile.GetFullPath() );
879 wxFAIL_MSG( wxS(
"Unexpected filetype for Eeschema::SaveFileAs()" ) );
886 return m_jobHandler->RunJob( aJob, aReporter, aProgressReporter );
936 wxCHECK( aServer,
false );
938 if( aSpec.
kind == DOCUMENT_SPEC::KIND::CREATE_KIND )
941 if( aSpec.
kind == DOCUMENT_SPEC::KIND::LIBID_KIND )
944 if( aSpec.
path.IsEmpty() )
947 *aError = wxS(
"No path specified to open" );
952 wxFileName projectPath( aSpec.
path );
959 projectPath.MakeAbsolute();
972 if( !settingsManager.
LoadProject( projectPath.GetFullPath(),
true ) )
973 wxLogTrace(
traceApi,
"Warning: no project file found for %s", aSpec.
path );
981 *aError = wxString::Format( wxS(
"Error loading project for %s" ), aSpec.
path );
986 wxFileName schPath( projectPath );
989 if( !schPath.FileExists() )
992 *aError = wxString::Format( wxS(
"File not found: %s" ), schPath.GetFullPath() );
1006 *aError = wxS(
"Failed to load schematic" );
1014 *aError = wxS(
"Failed to load schematic" );
1038 wxFileName schPath( aPath );
1039 schPath.MakeAbsolute();
1041 wxFileName projectPath( schPath );
1049 *aError = wxS(
"The current schematic has unsaved changes; save or revert it first" );
1065 settingsManager.
LoadProject( projectPath.GetFullPath(),
true );
1072 *aError = wxString::Format( wxS(
"Error creating project for %s" ), aPath );
1077 std::unique_ptr<SCHEMATIC>
schematic = std::make_unique<SCHEMATIC>(
project );
1081 schematic->RootScreen()->SetFileName( schPath.GetFullPath() );
1105 if( libId.
Parse( aLibIdStr ) >= 0 )
1108 *aError = wxString::Format( wxS(
"Invalid symbol LIB_ID: %s" ), aLibIdStr );
1113 wxFileName projectPath( aProjectPath );
1114 projectPath.MakeAbsolute();
1118 if( !settingsManager.
LoadProject( projectPath.GetFullPath(),
true ) )
1120 wxLogTrace(
traceApi,
"Warning: no project file found for %s", aProjectPath );
1128 *aError = wxString::Format( wxS(
"Error loading project for %s" ), aProjectPath );
1137 std::unique_ptr<LIB_SYMBOL> symbol;
1146 *aError = wxString::Format( wxS(
"Symbol not found: %s" ), aLibIdStr );
1151 symbol = std::make_unique<LIB_SYMBOL>( *loaded );
1156 *aError = wxString::Format( wxS(
"Failed to load symbol: %s" ), err.
What() );
1163 *aError = wxS(
"Failed to load symbol" );
1188 wxCHECK( aServer,
false );
1190 if( aSpec.
kind == DOCUMENT_SPEC::KIND::LIBID_KIND )
1195 *aError = wxS(
"No symbol is currently open" );
1203 *aError = wxS(
"Requested document does not match the open document" );
1215 *aError = wxS(
"No schematic is currently open" );
1220 if( !aSpec.
path.IsEmpty() )
1222 wxFileName currentSch(
m_openContext->GetCurrentFileName() );
1224 if( currentSch.GetFullName() != wxFileName( aSpec.
path ).GetFullName() )
1227 *aError = wxS(
"Requested document does not match the open document" );
1240 wxCHECK_RET( aServer,
"no API server provided" );
constexpr EDA_IU_SCALE schIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
std::shared_ptr< BACKGROUND_JOB > Create(const wxString &aName)
Creates a background job with the given name.
void Remove(std::shared_ptr< BACKGROUND_JOB > job)
Removes the given background job from any lists and frees it.
static CLI_PROGRESS_REPORTER & GetInstance()
static CLI_REPORTER & GetInstance()
static bool IsOnStandardSocketPath()
static void AnnounceToPrimary(FRAME_T aFrameType)
The base frame for deriving all KiCad main window classes.
static void SetSchEditFrame(SCH_EDIT_FRAME *aSchEditFrame)
static SCHEMATIC * LoadSchematic(const wxString &aFileName, bool aSetActive, bool aForceDefaultProject, PROJECT *aProject=nullptr, bool aCalculateConnectivity=true, REPORTER *aRootReporter=nullptr)
Handle Eeschema job dispatches.
SNAP_INFERENCE_SETTINGS m_SnapInference
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()
An simple container class that lets us dispatch output jobs to kifaces.
void RegisterHandler(API_HANDLER *aHandler)
Adds a new request handler to the server.
void DeregisterHandler(API_HANDLER *aHandler)
KIFACE_BASE(const char *aKifaceName, KIWAY::FACE_T aId)
void InitSettings(APP_SETTINGS_BASE *aSettings)
void end_common()
Common things to do for a top program module, during OnKifaceEnd();.
APP_SETTINGS_BASE * KifaceSettings() const
bool start_common(int aCtlBits)
Common things to do for a top program module, during OnKifaceStart().
int m_start_flags
flags provided in OnKifaceStart()
bool IsSingle() const
Is this KIFACE running under single_top?
static int Apply(const git_merge_driver_source *aSrc, const char **aPathOut, unsigned int *aModeOut, git_buf *aMergedOut)
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
FACE_T
Known KIFACE implementations.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
std::optional< float > AsyncLoadProgress() const
Returns the fraction of the libraries queued by AsyncLoad() that have been processed,...
std::vector< KI_ERROR > GetLibraryLoadErrors() const
Returns all library load errors as newline-separated strings for display.
void AbortAsyncLoad()
Aborts any async load in progress; blocks until fully done aborting.
void AsyncLoad()
Loads all available libraries for this adapter type in the background.
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
bool IsValid() const
Check if this LID_ID is valid.
wxString GetUniStringLibId() const
Define a library symbol object.
Generate the KiCad netlist format supported by Pcbnew.
void Format(OUTPUTFORMATTER *aOutputFormatter, int aCtl)
Output this s-expression netlist into aOutputFormatter.
Container for data for KiCad programs.
virtual BACKGROUND_JOBS_MONITOR & GetBackgroundJobMonitor() const
void AddLibraryLoadMessages(const std::vector< KI_ERROR > &aMessages)
Add library load messages to all registered status bars.
void ClearLibraryLoadMessages()
Clear library load messages from all registered status bars.
KICAD_API_SERVER & GetApiServer()
virtual SETTINGS_MANAGER & GetSettingsManager() const
A progress reporter interface for use in multi-threaded environments.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
Container for project specific data.
A pure virtual class used to derive REPORTER objects from.
Holds all the data relating to one schematic.
Schematic editor (Eeschema) main window.
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void UpdateSymbolInstanceData(const std::vector< SCH_SYMBOL_INSTANCE > &aSymbolInstances)
Update all of the symbol instance information using aSymbolInstances.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
bool IsVirtualRootSheet() const
T * RegisterSettings(T *aSettings, bool aLoadNow=true)
Take ownership of the pointer passed in.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
PROJECT * GetProject(const wxString &aFullPath) const
Retrieve a loaded project by name.
Symbol library viewer main window.
SNAP_INFERENCE_SETTINGS m_SnapInference
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
Symbol library viewer main window.
UNITS_PROVIDER(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
EDA_UNITS GetUserUnits() const
void SetUserUnits(EDA_UNITS aUnits)
This file is part of the common library.
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
@ FRAME_SCH_SYMBOL_EDITOR
@ PANEL_SCH_FIELD_NAME_TEMPLATES
@ DIALOG_SCH_LIBRARY_TABLE
@ DIALOG_DESIGN_BLOCK_LIBRARY_TABLE
void CopySexprFile(const wxString &aSrcPath, const wxString &aDestPath, std::function< bool(const std::string &token, wxString &value)> aCallback, wxString &aErrors)
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
static const std::string LegacySchematicFileExtension
static const std::string NetlistFileExtension
static const std::string SymbolLibraryTableFileName
static const std::string ProjectFileExtension
static const std::string SchematicSymbolFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string LegacySymbolLibFileExtension
static const std::string KiCadSymbolLibFileExtension
static const std::string BackupFileSuffix
static const std::string LegacySymbolDocumentFileExtension
const wxChar *const traceLibraries
Flag to enable library table and library manager tracing.
const wxChar *const traceApi
Flag to enable debug output related to the IPC API and its plugin system.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
@ KIFACE_MERGE_DOCUMENT
int (*)( int aKind, const wxString& aAncestor, const wxString& aOurs, const wxString& aTheirs,...
@ KIFACE_NETLIST_SCHEMATIC
@ KIFACE_OPEN_DIFF_DIALOG
int (*)( int aKind, const wxString& aFileA, const wxString& aFileB, const wxString& aLabelA,...
#define KFCTL_CLI
Running as CLI app.
DOC_KIND
Document type a diff/merge entry point should route to, derived from a file path's extension.
bool RegisterMergeDriver(const char *aName, MERGE_APPLY_FN aApply)
Register a KiCad merge driver with libgit2.
static int eeschemaMergeExport(int aKind, const wxString &aAncestor, const wxString &aOurs, const wxString &aTheirs, const wxString &aOutput, bool aInteractive, bool aSingleFile, REPORTER *aReporter)
bool generateSchematicNetlist(const wxString &aFilename, std::string &aNetlist, KIWAY *aKiway)
static std::unique_ptr< SCHEMATIC > readSchematicFromFile(const std::string &aFilename)
SCH::IFACE KIFACE_BASE, UNITS_PROVIDER kiface("eeschema", KIWAY::FACE_SCH)
static int eeschemaOpenDiffDialogExport(int aKind, const wxString &aFileA, const wxString &aFileB, const wxString &aLabelA, const wxString &aLabelB, wxWindow *aParent, REPORTER *aReporter)
void InvokeEditDesignBlockLibTable(KIWAY *aKiway, wxWindow *aParent)
PANEL_SNAPPING * CreateSnappingPanel(wxWindow *aParent, SETTINGS_T *aCfg, FRAME_T aFrameType, SNAP_INFERENCE_SETTINGS SETTINGS_T::*aInference=nullptr, MAGNETIC_SETTINGS SETTINGS_T::*aMagnetics=nullptr)
Build the snapping page for an editor.
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
PGM_BASE & Pgm()
The global program "get" accessor.
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
wxString path
File path (KIND::FILE_KIND) or project path (KIND::LIBID_KIND).
LIB_ID libId
Library identifier; valid when kind == KIND::LIBID_KIND.
Implement a participant in the KIWAY alchemy.
std::future< void > m_libraryPreloadReturn
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
std::shared_ptr< BACKGROUND_JOB > m_libraryPreloadBackgroundJob
std::unique_ptr< API_HANDLER_SCH > m_openHandler
void PreloadLibraries(KIWAY *aKiway) override
void closeSymbol(KICAD_API_SERVER *aServer)
void SaveFileAs(const wxString &aProjectBasePath, const wxString &aProjectName, const wxString &aNewProjectBasePath, const wxString &aNewProjectName, const wxString &aSrcFilePath, wxString &aErrors) override
Saving a file under a different name is delegated to the various KIFACEs because the project doesn't ...
void ProjectChanged() override
std::unique_ptr< API_HANDLER_SYMBOL > m_openSymbolHandler
void CancelPreload(bool aBlock=true) override
wxWindow * CreateKiWindow(wxWindow *aParent, int aClassId, KIWAY *aKiway, int aCtlBits=0) override
Create a wxWindow for the current project.
EESCHEMA_JOBS_HANDLER * JobHandler() const
Accessor for the non-job diff/merge exports (eeschemaMergeExport etc.).
std::atomic_bool m_libraryPreloadAbort
IFACE(const char *aName, KIWAY::FACE_T aType)
void RegisterLibraryHandlers(KICAD_API_SERVER *aServer) override
Register this face's library API handlers on the given server.
void Reset() override
Reloads global state.
void * IfaceOrAddress(int aDataId) override
Return a pointer to the requested object.
int HandleJob(JOB *aJob, REPORTER *aReporter, PROGRESS_REPORTER *aProgressReporter) override
std::unique_ptr< EESCHEMA_JOBS_HANDLER > m_jobHandler
std::unique_ptr< API_HANDLER_SCH_LIBRARIES > m_apiHandlerSchLibs
bool LoadAllLibraries() override
Starts a background load of all libraries of the type owned by this face.
std::atomic_bool m_libraryPreloadInProgress
bool HandleApiCloseDocument(const DOCUMENT_SPEC &aSpec, KICAD_API_SERVER *aServer, wxString *aError) override
Close the document identified by aSpec.
bool HandleApiOpenDocument(const DOCUMENT_SPEC &aSpec, KICAD_API_SERVER *aServer, wxString *aError) override
void closeSchematic(KICAD_API_SERVER *aServer)
std::shared_ptr< HEADLESS_SYMBOL_EDITOR_CONTEXT > m_openSymbolContext
bool handleOpenSymbol(const wxString &aProjectPath, const wxString &aLibIdStr, KICAD_API_SERVER *aServer, wxString *aError)
bool HandleJobConfig(JOB *aJob, wxWindow *aParent) override
std::shared_ptr< HEADLESS_SCH_CONTEXT > m_openContext
bool handleCreateSchematic(const wxString &aPath, KICAD_API_SERVER *aServer, wxString *aError)
SCHEMATIC * m_openSchematic
void OnKifaceEnd() override
Called just once just before the DSO is to be unloaded.
IbisParser parser & reporter
VECTOR3I expected(15, 30, 45)
static const long long MM
wxLogTrace helper definitions.
Definition of file extensions used in Kicad.