37#include <wx/snglinst.h>
53#include <nlohmann/json.hpp>
74#include <wx/tokenzr.h>
87#if defined( KICAD_IPC_API )
111 using json = nlohmann::json;
115 json input = json::parse( aFilterJson.ToStdString() );
117 int pinCount = input.value(
"pin_count", 0 );
118 bool zeroFilters = input.value(
"zero_filters",
true );
119 int maxResults = input.value(
"max_results", 400 );
121 std::vector<std::unique_ptr<EDA_PATTERN_MATCH>> filterMatchers;
123 if( input.contains(
"filters" ) && input[
"filters"].is_array() )
125 for(
const auto& f : input[
"filters"] )
129 wxString pattern = wxString::FromUTF8( f.get<std::string>() );
130 auto matcher = std::make_unique<EDA_PATTERN_MATCH_WILDCARD_ANCHORED>();
131 matcher->SetPattern( pattern.Lower() );
132 filterMatchers.push_back( std::move( matcher ) );
137 bool hasFilters = ( pinCount > 0 || !filterMatchers.empty() );
139 if( zeroFilters && !hasFilters )
146 wxWindow* focus = wxWindow::FindFocus();
147 wxWindow*
top = focus ? wxGetTopLevelParent( focus ) : wxTheApp->GetTopWindow();
173 std::vector<FOOTPRINT*> footprints = adapter->
GetFootprints( nickname,
true );
185 if( fpPadCount != pinCount )
190 if( !filterMatchers.empty() )
192 bool matches =
false;
194 for(
const auto& matcher : filterMatchers )
199 if( matcher->GetPattern().Contains( wxS(
":" ) ) )
200 name = fp->GetFPID().GetLibNickname().wx_str().Lower() + wxS(
":" );
202 name += fp->GetFPID().GetLibItemName().wx_str().Lower();
204 if( matcher->Find(
name ) )
215 wxString libId = fp->GetFPID().Format();
216 output.push_back( libId.ToStdString() );
218 if( ++count >= maxResults )
222 if( count >= maxResults )
226 return wxString::FromUTF8(
output.dump() );
228 catch(
const std::exception& e )
248 void Reset()
override;
291 dlg.SetKiway( &dlg, aKiway );
294 if( dlg.ShowQuasiModal() == wxID_OK )
375 return new PANEL_FP_EDITOR_GRAPHICS_DEFAULTS( aParent,
this );
386 std::vector<TOOL_ACTION*> actions;
387 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
390 actions.push_back( action );
393 controls.push_back( control );
399 return new PANEL_FP_EDITOR_COLOR_SETTINGS( aParent );
418 return new PANEL_GRID_SETTINGS( aParent,
this, frame, cfg,
FRAME_PCB_EDITOR );
438 return new PANEL_EDIT_OPTIONS( aParent,
this, frame,
false );
443 BOARD* board =
nullptr;
447 board =
static_cast<PCB_EDIT_FRAME*
>( boardProvider )->GetBoard();
449 return new PANEL_PCBNEW_COLOR_SETTINGS( aParent, board );
457 std::vector<TOOL_ACTION*> actions;
458 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
461 actions.push_back( action );
464 controls.push_back( control );
466 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb,
FRAME_PCB_EDITOR, actions, controls );
470 return new PANEL_PCBNEW_ACTION_PLUGINS( aParent );
473 return new PANEL_3D_DISPLAY_OPTIONS( aParent );
476 return new PANEL_3D_OPENGL_OPTIONS( aParent );
479 return new PANEL_3D_RAYTRACING_OPTIONS( aParent );
486 std::vector<TOOL_ACTION*> actions;
487 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
490 actions.push_back( action );
493 controls.push_back( control );
495 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb,
FRAME_PCB_DISPLAY3D, actions, controls );
525 wxWindow* focus = wxWindow::FindFocus();
526 wxWindow*
top = focus ? wxGetTopLevelParent( focus ) : wxTheApp->GetTopWindow();
558 void SaveFileAs(
const wxString& aProjectBasePath,
const wxString& aSrcProjectName,
559 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
560 const wxString& aSrcFilePath, wxString& aErrors )
override;
566#if defined( KICAD_IPC_API )
569 wxString* aError )
override;
573 wxString* aError )
override;
587#if defined( KICAD_IPC_API )
590 KIWAY* m_kiway =
nullptr;
591 std::shared_ptr<HEADLESS_BOARD_CONTEXT> m_openContext;
592 std::unique_ptr<API_HANDLER_PCB> m_openHandler;
637#if defined( KICAD_IPC_API )
641 m_jobHandler = std::make_unique<PCBNEW_JOBS_HANDLER>( aKiway );
665 const wxString& aNewProjectBasePath,
const wxString& aNewProjectName,
666 const wxString& aSrcFilePath, wxString& aErrors )
668 wxFileName destFile( aSrcFilePath );
669 wxString destPath = destFile.GetPathWithSep();
670 wxUniChar pathSep = wxFileName::GetPathSeparator();
671 wxString ext = destFile.GetExt();
673 if( destPath.StartsWith( aProjectBasePath + pathSep ) )
674 destPath.Replace( aProjectBasePath, aNewProjectBasePath,
false );
676 wxString srcProjectFootprintLib = pathSep + aSrcProjectName + wxT(
".pretty" ) + pathSep;
677 wxString newProjectFootprintLib = pathSep + aNewProjectName + wxT(
".pretty" ) + pathSep;
679 destPath.Replace( srcProjectFootprintLib, newProjectFootprintLib,
true );
681 destFile.SetPath( destPath );
686 if( destFile.GetName() == aSrcProjectName )
687 destFile.SetName( aNewProjectName );
690 [&](
const std::string& token, wxString& value )
692 if( token ==
"sheetfile" )
694 for( const wxString extension : { wxT(
".sch" ), wxT(
".kicad_sch" ) } )
696 if( value == aSrcProjectName + extension )
698 value = aNewProjectName + extension;
701 else if( value == aProjectBasePath +
"/" + aSrcProjectName + extension )
703 value = aNewProjectBasePath +
"/" + aNewProjectName + extension;
706 else if( value.StartsWith( aProjectBasePath ) )
708 value.Replace( aProjectBasePath, aNewProjectBasePath, false );
720 if( destFile.GetName() == aSrcProjectName )
721 destFile.SetName( aNewProjectName );
723 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
729 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
735 else if( ext == wxT(
"rpt" ) )
741 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
745 wxFileName libTableFn( aSrcFilePath );
747 libTable.SetPath( destFile.GetFullPath() );
750 for( LIBRARY_TABLE_ROW& row : libTable.Rows() )
752 wxString uri = row.URI();
754 uri.Replace( wxT(
"/" ) + aSrcProjectName + wxT(
".pretty" ),
755 wxT(
"/" ) + aNewProjectName + wxT(
".pretty" ) );
760 libTable.Save().map_error(
761 [&](
const LIBRARY_ERROR& aError )
765 if( !aErrors.empty() )
766 aErrors += wxT(
"\n" );
768 msg.Printf(
_(
"Cannot copy file '%s'." ), destFile.GetFullPath() );
774 wxFAIL_MSG( wxT(
"Unexpected filetype for Pcbnew::SaveFileAs()" ) );
781 return m_jobHandler->RunJob( aJob, aReporter, aProgressReporter );
791#if defined( KICAD_IPC_API )
799 m_openHandler.reset();
802 m_openContext.reset();
808 wxCHECK( aServer,
false );
810 if( aPath.IsEmpty() )
813 *aError = wxS(
"No path specified to open" );
818 wxFileName projectPath( aPath );
825 projectPath.MakeAbsolute();
829 if( !settingsManager.
LoadProject( projectPath.GetFullPath(),
true ) )
831 wxLogTrace(
traceApi,
"Warning: no project file found for %s", aPath );
839 *aError = wxString::Format( wxS(
"Error loading project for %s" ), aPath );
844 wxFileName boardPath( projectPath );
847 if( !boardPath.FileExists() )
850 *aError = wxString::Format( wxS(
"File not found: %s" ), aPath );
861 *aError = wxString::Format( wxS(
"%s is not a recognized file type" ), aPath );
866 std::shared_ptr<HEADLESS_BOARD_CONTEXT> newContext;
875 *aError = wxS(
"Failed to load board" );
880 newContext = std::make_shared<HEADLESS_BOARD_CONTEXT>( std::move( loadedBoard ),
project,
887 *aError = wxS(
"Failed to load board" );
892 closeCurrentDocument( aServer );
893 m_openContext = std::move( newContext );
895 m_openHandler = std::make_unique<API_HANDLER_PCB>( m_openContext,
nullptr );
904 wxCHECK( aServer,
false );
909 *aError = wxS(
"No document is currently open" );
914 if( !aFileName.IsEmpty() )
916 wxFileName currentBoard( m_openContext->GetCurrentFileName() );
918 if( currentBoard.GetFullName() != aFileName )
921 *aError = wxS(
"Requested document does not match the open document" );
927 closeCurrentDocument( aServer );
935 constexpr static int interval = 150;
936 constexpr static int timeLimit = 120000;
954 [
this, aKiway]() ->
void
956 std::shared_ptr<BACKGROUND_JOB_REPORTER> reporter =
962 bool aborted =
false;
964 reporter->Report(
_(
"Loading Footprint Libraries" ) );
975 std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
979 float progress = *loadStatus;
980 reporter->SetCurrentProgress( progress );
987 reporter->SetCurrentProgress( 1 );
993 if( elapsed > timeLimit )
1012 "pcbnew PreloadLibraries: adapter errors.IsEmpty()=%d, length=%zu",
1013 errors.IsEmpty(), errors.length() );
1015 if( !errors.IsEmpty() )
1017 std::vector<LOAD_MESSAGE> messages =
1020 wxLogTrace(
traceLibraries,
" -> adapter: collected %zu messages",
1023 if( !messages.empty() )
1028 wxLogTrace(
traceLibraries,
" -> no errors from footprint adapter" );
1033 wxLogTrace(
traceLibraries,
"pcbnew PreloadLibraries: aborted, skipping footprint processing" );
1044 std::string payload =
"";
constexpr EDA_IU_SCALE pcbIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
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 std::unique_ptr< BOARD > Load(const wxString &aFileName, PCB_IO_MGR::PCB_FILE_T aFormat, PROJECT *aProject, const OPTIONS &aOptions)
static CLI_PROGRESS_REPORTER & GetInstance()
static CLI_REPORTER & GetInstance()
The base frame for deriving all KiCad main window classes.
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?
A mix in class which holds the location of a wxWindow's KIWAY.
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 void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
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.
std::vector< wxString > GetLibraryNames() const
Returns a list of library nicknames that are available (skips any that failed to load)
void AsyncLoad()
Loads all available libraries for this adapter type in the background.
The main frame for Pcbnew.
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
static PCB_FILE_T FindPluginTypeFromBoardPath(const wxString &aFileName, int aCtl=0)
Return a plugin type given a path for a board file.
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 FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
Container for project specific data.
A pure virtual class used to derive REPORTER objects from.
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.
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
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_PCB_PORT_SERVICE_NUMBER
Pcbnew listens on this port for commands from Eeschema.
Abstract pattern-matching tool and implementations.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
@ PANEL_FP_DEFAULT_GRAPHICS_VALUES
@ PANEL_FP_DISPLAY_OPTIONS
@ PANEL_FP_USER_LAYER_NAMES
@ DIALOG_PCB_LIBRARY_TABLE
@ FRAME_FOOTPRINT_PREVIEW
@ FRAME_FOOTPRINT_CHOOSER
@ PANEL_FP_DEFAULT_FIELDS
@ PANEL_PCB_ACTION_PLUGINS
@ PANEL_3DV_DISPLAY_OPTIONS
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 ProjectFileExtension
static const std::string LegacyPcbFileExtension
static const std::string FootprintLibraryTableFileName
static const std::string BackupFileSuffix
static const std::string LegacyFootprintLibPathExtension
static const std::string FootprintAssignmentFileExtension
static const std::string KiCadFootprintFileExtension
static const std::string KiCadPcbFileExtension
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_FOOTPRINT_LIBRARY_ADAPTER
@ KIFACE_FILTER_FOOTPRINTS
Function pointer type: wxString (*)(const wxString& aFilterJson) Input JSON: {"pin_count": N,...
#define KFCTL_CLI
Running as CLI app.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
This file contains miscellaneous commonly used macros and functions.
PCB::IFACE KIFACE_BASE, UNITS_PROVIDER kiface("pcbnew", KIWAY::FACE_PCB)
void InvokePcbLibTableEditor(KIWAY *aKiway, wxWindow *aCaller)
Function InvokePcbLibTableEditor shows the modal DIALOG_FP_LIB_TABLE for purposes of editing the glob...
static wxString filterFootprints(const wxString &aFilterJson)
Filter footprints based on criteria passed as JSON.
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
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::atomic_bool m_libraryPreloadInProgress
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
void PreloadLibraries(KIWAY *aKiway) override
void ProjectChanged() override
void SaveFileAs(const wxString &aProjectBasePath, const wxString &aSrcProjectName, 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 CancelPreload(bool aBlock=true) override
std::shared_ptr< BACKGROUND_JOB > m_libraryPreloadBackgroundJob
void * IfaceOrAddress(int aDataId) override
Return a pointer to the requested object.
void Reset() override
Reloads global state.
wxWindow * CreateKiWindow(wxWindow *aParent, int aClassId, KIWAY *aKiway, int aCtlBits=0) override
Create a wxWindow for the current project.
IFACE(const char *aName, KIWAY::FACE_T aType)
std::atomic_bool m_libraryPreloadAbort
int HandleJob(JOB *aJob, REPORTER *aReporter, PROGRESS_REPORTER *aProgressReporter) override
std::unique_ptr< PCBNEW_JOBS_HANDLER > m_jobHandler
bool HandleJobConfig(JOB *aJob, wxWindow *aParent) override
void OnKifaceEnd() override
Called just once just before the DSO is to be unloaded.
std::future< void > m_libraryPreloadReturn
KIBIS top(path, &reporter)
VECTOR3I expected(15, 30, 45)
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::priority_thread_pool thread_pool
wxLogTrace helper definitions.
Definition of file extensions used in Kicad.