62#include <wx/tokenzr.h>
83#if defined( KICAD_IPC_API )
104 SCH_IO* pi = SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD );
105 std::unique_ptr<SCHEMATIC> schematic = std::make_unique<SCHEMATIC>(
nullptr );
109 wxFileName pro( aFilename );
112 wxString projectPath = pro.GetFullPath();
123 schematic->SetProject(
project );
129 std::vector<SCH_SHEET*> topLevelSheets = schematic->GetTopLevelSheets();
130 bool rootIsTopLevel = std::find( topLevelSheets.begin(), topLevelSheets.end(), rootSheet )
131 != topLevelSheets.end();
132 bool rootIsVirtualRoot = rootSheet == &schematic->Root() || rootSheet->
IsVirtualRootSheet();
134 if( !rootIsTopLevel && !rootIsVirtualRoot )
135 schematic->SetTopLevelSheets( { rootSheet } );
140 screen->UpdateLocalLibSymbolLinks();
147 if( schematic->RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
150 screen->FixLegacyPowerSymbolMismatches();
154 screen->MigrateSimModels();
160 sheet.UpdateAllScreenReferences();
168 schematic->ConnectionGraph()->Recalculate( sheets,
true );
200 void Reset()
override;
233 catch(
const SIMULATOR_INIT_ERR& )
246 bool cancelled =
false;
301 return new PANEL_SYM_EDITING_OPTIONS( aParent,
this, frame );
309 std::vector<TOOL_ACTION*> actions;
310 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
313 actions.push_back( action );
316 controls.push_back( control );
322 return new PANEL_SYM_COLOR_SETTINGS( aParent );
341 return new PANEL_GRID_SETTINGS( aParent,
this, frame, cfg,
FRAME_SCH );
357 return new PANEL_EESCHEMA_EDITING_OPTIONS( aParent,
this, frame );
365 std::vector<TOOL_ACTION*> actions;
366 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
369 actions.push_back( action );
372 controls.push_back( control );
374 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb,
FRAME_SCH, actions, controls );
378 return new PANEL_EESCHEMA_COLOR_SETTINGS( aParent );
381 return new PANEL_TEMPLATE_FIELDNAMES( aParent,
nullptr );
397 return new PANEL_SIMULATOR_PREFERENCES( aParent );
430 void SaveFileAs(
const wxString& aProjectBasePath,
const wxString& aProjectName,
431 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
432 const wxString& aSrcFilePath, wxString& aErrors )
override;
439#if defined( KICAD_IPC_API )
442 wxString* aError )
override;
446 wxString* aError )
override;
460#if defined( KICAD_IPC_API )
463 KIWAY* m_kiway =
nullptr;
465 std::shared_ptr<HEADLESS_SCH_CONTEXT> m_openContext;
466 std::unique_ptr<API_HANDLER_SCH> m_openHandler;
506#if defined( KICAD_IPC_API )
510 m_jobHandler = std::make_unique<EESCHEMA_JOBS_HANDLER>( aKiway );
529 constexpr static int interval = 150;
530 constexpr static int timeLimit = 120000;
548 [
this, aKiway]() ->
void
550 std::shared_ptr<BACKGROUND_JOB_REPORTER>
reporter =
557 reporter->Report(
_(
"Loading Symbol Libraries" ) );
568 std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
572 float progress = *loadStatus;
573 reporter->SetCurrentProgress( progress );
586 if( elapsed > timeLimit )
595 wxLogTrace(
traceLibraries,
"eeschema PreloadLibraries: errors.IsEmpty()=%d, length=%zu",
596 errors.IsEmpty(), errors.length() );
598 std::vector<LOAD_MESSAGE> messages =
601 if( !messages.empty() )
603 wxLogTrace(
traceLibraries,
" -> collected %zu messages, calling AddLibraryLoadMessages",
609 wxLogTrace(
traceLibraries,
" -> no errors from symbol libraries" );
616 std::string payload =
"";
622 std::future<void> preloadFuture = std::async( std::launch::async, preload );
653 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
654 const wxString& aSrcFilePath, wxString& aErrors )
656 wxFileName destFile( aSrcFilePath );
657 wxString destPath = destFile.GetPathWithSep();
658 wxUniChar pathSep = wxFileName::GetPathSeparator();
659 wxString ext = destFile.GetExt();
661 if( destPath.StartsWith( aProjectBasePath + pathSep ) )
662 destPath.Replace( aProjectBasePath, aNewProjectBasePath,
false );
664 destFile.SetPath( destPath );
671 if( destFile.GetName() == aProjectName )
673 destFile.SetName( aNewProjectName );
675 else if( destFile.GetName() == aNewProjectName )
679 if( !aErrors.empty() )
680 aErrors += wxS(
"\n" );
682 msg.Printf(
_(
"Cannot copy file '%s' as it will be overwritten by the new root "
683 "sheet file." ), destFile.GetFullPath() );
689 [&](
const std::string& token, wxString& value ) ->
bool
691 if( token ==
"project" && value == aProjectName )
693 value = aNewProjectName;
704 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
710 if( destFile.GetName() == aProjectName + wxS(
"-cache" ) )
711 destFile.SetName( aNewProjectName + wxS(
"-cache" ) );
713 if( destFile.GetName() == aProjectName + wxS(
"-rescue" ) )
714 destFile.SetName( aNewProjectName + wxS(
"-rescue" ) );
716 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
720 if( destFile.GetName() == aProjectName )
721 destFile.SetName( aNewProjectName );
724 [&](
const std::string& token, wxString& value ) ->
bool
726 if( token ==
"source" )
728 for( const wxString& extension : { wxString( wxT(
".sch" ) ), wxString( wxT(
".kicad_sch" ) ) } )
730 if( value == aProjectName + extension )
732 value = aNewProjectName + extension;
735 else if( value == aProjectBasePath +
"/" + aProjectName + extension )
737 value = aNewProjectBasePath +
"/" + aNewProjectName + extension;
740 else if( value.StartsWith( aProjectBasePath ) )
742 value.Replace( aProjectBasePath, aNewProjectBasePath, false );
754 wxFileName libTableFn( aSrcFilePath );
756 libTable.SetPath( destFile.GetFullPath() );
759 for( LIBRARY_TABLE_ROW& row : libTable.Rows() )
761 wxString uri = row.URI();
763 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
"-cache.lib" ),
764 wxS(
"/" ) + aNewProjectName + wxS(
"-cache.lib" ) );
765 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
"-rescue.lib" ),
766 wxS(
"/" ) + aNewProjectName + wxS(
"-rescue.lib" ) );
767 uri.Replace( wxS(
"/" ) + aProjectName + wxS(
".lib" ),
768 wxS(
"/" ) + aNewProjectName + wxS(
".lib" ) );
773 libTable.Save().map_error(
774 [&](
const LIBRARY_ERROR& aError )
778 if( !aErrors.empty() )
779 aErrors += wxT(
"\n" );
781 msg.Printf(
_(
"Cannot copy file '%s'." ), destFile.GetFullPath() );
787 wxFAIL_MSG( wxS(
"Unexpected filetype for Eeschema::SaveFileAs()" ) );
794 return m_jobHandler->RunJob( aJob, aReporter, aProgressReporter );
804#if defined( KICAD_IPC_API )
813 m_openHandler.reset();
816 m_openContext.reset();
818 delete m_openSchematic;
819 m_openSchematic =
nullptr;
830 wxCHECK( aServer,
false );
832 if( aPath.IsEmpty() )
835 *aError = wxS(
"No path specified to open" );
840 wxFileName projectPath( aPath );
847 projectPath.MakeAbsolute();
852 closeCurrentDocument( aServer );
856 if( !settingsManager.
LoadProject( projectPath.GetFullPath(),
true ) )
858 wxLogTrace(
traceApi,
"Warning: no project file found for %s", aPath );
866 *aError = wxString::Format( wxS(
"Error loading project for %s" ), aPath );
871 wxFileName schPath( projectPath );
874 if( !schPath.FileExists() )
877 *aError = wxString::Format( wxS(
"File not found: %s" ), schPath.GetFullPath() );
891 *aError = wxS(
"Failed to load schematic" );
899 *aError = wxS(
"Failed to load schematic" );
904 m_openSchematic = schematic;
906 m_openContext = std::make_shared<HEADLESS_SCH_CONTEXT>( m_openSchematic,
project, m_kiway );
907 m_openHandler = std::make_unique<API_HANDLER_SCH>( m_openContext );
917 wxCHECK( aServer,
false );
922 *aError = wxS(
"No document is currently open" );
927 if( !aSchFileName.IsEmpty() )
929 wxFileName currentSch( m_openContext->GetCurrentFileName() );
931 if( currentSch.GetFullName() != aSchFileName )
934 *aError = wxS(
"Requested document does not match the open document" );
940 closeCurrentDocument( aServer );
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()
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)
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?
void CreateServer(int service, bool local=true)
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 async load progress between 0.0 and 1.0, or nullopt if load is not in progress.
wxString GetLibraryLoadErrors() const
Returns all library load errors as newline-separated strings for display.
void AsyncLoad()
Loads all available libraries for this adapter type in the background.
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 ClearLibraryLoadMessages()
Clear library load messages from all registered status bars.
void AddLibraryLoadMessages(const std::vector< LOAD_MESSAGE > &aMessages)
Add library load messages to all registered status bars.
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.
Base class that schematic file and library loading and saving plugins should derive from.
virtual SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load information from some input file format that this SCH_IO implementation knows about,...
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void AnnotatePowerSymbols()
Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list.
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.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
Symbol library viewer main window.
The symbol library editor main window.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
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.
#define KICAD_SCH_PORT_SERVICE_NUMBER
Eeschema listens on this port for commands from Pcbnew.
std::unique_ptr< EESCHEMA_JOBS_HANDLER > m_jobHandler
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.
@ KIFACE_NETLIST_SCHEMATIC
#define KFCTL_CLI
Running as CLI app.
static std::unique_ptr< SCHEMATIC > readSchematicFromFile(const std::string &aFilename)
SCH::IFACE KIFACE_BASE, UNITS_PROVIDER kiface("eeschema", KIWAY::FACE_SCH)
bool generateSchematicNetlist(const wxString &aFilename, std::string &aNetlist)
void InvokeEditDesignBlockLibTable(KIWAY *aKiway, wxWindow *aParent)
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
PGM_BASE & Pgm()
The global program "get" accessor.
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
std::vector< LOAD_MESSAGE > ExtractLibraryLoadErrors(const wxString &aErrorString, int aSeverity)
Parse library load error messages, extracting user-facing information while stripping internal code l...
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
Implement a participant in the KIWAY alchemy.
virtual bool HandleApiCloseDocument(const wxString &aBoardFileName, KICAD_API_SERVER *aServer, wxString *aError)
virtual bool HandleApiOpenDocument(const wxString &aPath, KICAD_API_SERVER *aServer, wxString *aError)
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
void PreloadLibraries(KIWAY *aKiway) override
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
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.
std::atomic_bool m_libraryPreloadAbort
IFACE(const char *aName, KIWAY::FACE_T aType)
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::atomic_bool m_libraryPreloadInProgress
bool HandleJobConfig(JOB *aJob, wxWindow *aParent) override
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.