KiCad PCB EDA Suite
BOM_GENERATOR_HANDLER Class Reference

Bill of material output generator. More...

#include <bom_plugins.h>

Public Member Functions

 BOM_GENERATOR_HANDLER (const wxString &aFile)
 
bool IsOk ()
 Return true if the plugin is ready to work, i.e. More...
 
const wxString & GetInfo () const
 Return plugin description stored in the plugin header file (if available). More...
 
const wxFileName & GetFile () const
 Return the file name of the plugin. More...
 
wxString GetStoredPath () const
 
wxFileName FindFilePath () const
 Returns the calculated path to the plugin: if the path is already absolute and exists, just return it. More...
 
const wxString & GetName () const
 Return the customisable plugin name. More...
 
void SetName (const wxString &aName)
 Set the customisable plugin name. More...
 
const wxString & GetCommand () const
 Return the command to execute the plugin. More...
 
void SetCommand (const wxString &aCommand)
 Set the command to execute the plugin. More...
 
wxArrayString & Options ()
 Accessor to array of options. More...
 

Static Public Member Functions

static bool IsValidGenerator (const wxString &aFile)
 Return true if a file name matches a recognized plugin format. More...
 

Protected Member Functions

wxString readHeader (const wxString &aEndSection)
 Read the plugin file header. More...
 

Static Protected Member Functions

static wxString getOutputExtension (const wxString &aHeader)
 Extracts the output BOM file's extension, including the '. More...
 

Protected Attributes

bool m_isOk
 Path to the plugin. More...
 
wxFileName m_file
 Path to the plugin stored in config (can be absolute or just a filename) More...
 
const wxString m_storedPath
 User customisable name. More...
 
wxString m_name
 Command to execute the plugin. More...
 
wxString m_cmd
 Description of the plugin (normally from the plugin header) More...
 
wxString m_info
 Plugin specific options. More...
 
wxArrayString m_options
 

Detailed Description

Bill of material output generator.

A Material output generator is an external application called by Eeschema to create a BOM from our intermediate XML netlist. A generator can be a script or an executable that can read the intermediate XML netlist file and generates a output (the BOM file)

Definition at line 45 of file bom_plugins.h.

Constructor & Destructor Documentation

◆ BOM_GENERATOR_HANDLER()

BOM_GENERATOR_HANDLER::BOM_GENERATOR_HANDLER ( const wxString &  aFile)
Parameters
aFileis path to the plugin file.

Definition at line 35 of file bom_plugins.cpp.

36 : m_storedPath( aFile )
37{
38 m_isOk = false;
39 m_file = wxFileName( aFile );
40
41 if( !wxFile::Exists( m_file.GetFullPath() ) )
43
44 if( !wxFile::Exists( m_file.GetFullPath() ) )
45 {
46 m_info.Printf( _("Script file:\n%s\nnot found. Script not available."), aFile );
47 return;
48 }
49
50 m_isOk = true;
51
52 m_name = m_file.GetName();
53 wxString extension = m_file.GetExt().Lower();
54
55 // Important note:
56 // On Windows the right command command to run a python script is:
57 // python <script_path>/script.py
58 // and *not* python <script_path>\script.py
59 // Otherwise the script does not find some auxiliary pythons scripts needed by this script
60 if( extension == "xsl" )
61 {
62 m_info = readHeader( "-->" );
63 m_cmd = wxString::Format( "xsltproc -o \"%%O%s\" \"%s\" \"%%I\"",
65 m_file.GetFullPath() );
66 }
67 else if( extension == "py" )
68 {
69 m_info = readHeader( "\"\"\"" );
70#ifdef __WINDOWS__
71 m_cmd = wxString::Format( "python \"%s/%s\" \"%%I\" \"%%O%s\"",
72 m_file.GetPath(),
73 m_file.GetFullName(),
75#else
76// For macOS, we want to use the Python we bundle along, rather than just PYTHON_EXECUTABLE.
77// For non-Windows, non-macOS, we can call out to PYTHON_EXECUTABLE.
78#ifdef __APPLE__
79 // python is at Contents/Frameworks/Python.framework/Versions/Current/bin/python3
80
81 // Of course, for macOS, it's not quite that simple, since the relative path
82 // will depend on if we are in standalone mode or not.
83
84 // (If we're going to call out to python like this in other places, we probably want to
85 // think about pulling this into PATHS.)
86
87 wxFileName python( PATHS::GetOSXKicadDataDir(), wxEmptyString );
88 python.RemoveLastDir();
89 python.AppendDir( wxT( "Frameworks" ) );
90 python.AppendDir( wxT( "Python.framework" ) );
91 python.AppendDir( wxT( "Versions" ) );
92 python.AppendDir( wxT( "Current" ) );
93 python.AppendDir( wxT( "bin" ) );
94 python.SetFullName(wxT( "python3" ) );
95
96 wxString interpreter = python.GetFullPath();
97#else
98 wxString interpreter = wxString::FromUTF8Unchecked( PYTHON_EXECUTABLE );
99#endif
100 if( interpreter.IsEmpty() )
101 interpreter = wxT( "python" ); // For macOS, should we log here? Error here?
102
103 m_cmd = wxString::Format( "%s \"%s\" \"%%I\" \"%%O%s\"",
104 interpreter,
105 m_file.GetFullPath(),
107#endif
108 }
109#ifdef __WINDOWS__
110 else if( extension == "pyw" )
111 {
112 m_info = readHeader( "\"\"\"" );
113 m_cmd = wxString::Format( "pythonw \"%s/%s\" \"%%I\" \"%%O%s\"",
114 m_file.GetPath(),
115 m_file.GetFullName(),
117 }
118#endif /* __WINDOWS__ */
119 else // fallback
120 {
121 m_cmd = m_file.GetFullPath();
122 }
123
124 wxLogTrace( BOM_TRACE, "%s: extracted command line %s", m_name, m_cmd );
125}
const wxChar BOM_TRACE[]
Definition: bom_plugins.cpp:32
wxString m_name
Command to execute the plugin.
Definition: bom_plugins.h:161
wxString readHeader(const wxString &aEndSection)
Read the plugin file header.
bool m_isOk
Path to the plugin.
Definition: bom_plugins.h:152
wxString m_info
Plugin specific options.
Definition: bom_plugins.h:167
wxFileName m_file
Path to the plugin stored in config (can be absolute or just a filename)
Definition: bom_plugins.h:155
const wxString m_storedPath
User customisable name.
Definition: bom_plugins.h:158
wxString m_cmd
Description of the plugin (normally from the plugin header)
Definition: bom_plugins.h:164
wxFileName FindFilePath() const
Returns the calculated path to the plugin: if the path is already absolute and exists,...
static wxString getOutputExtension(const wxString &aHeader)
Extracts the output BOM file's extension, including the '.
#define _(s)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200

References _, BOM_TRACE, FindFilePath(), Format(), getOutputExtension(), m_cmd, m_file, m_info, m_isOk, m_name, and readHeader().

Member Function Documentation

◆ FindFilePath()

wxFileName BOM_GENERATOR_HANDLER::FindFilePath ( ) const

Returns the calculated path to the plugin: if the path is already absolute and exists, just return it.

Otherwise if the path is just a filename, look for that file in the user and system plugin directories and return the first one found. If neither is found, just return m_file.

Returns
the full path to the plugin

Definition at line 197 of file bom_plugins.cpp.

198{
199 if( m_file.IsAbsolute() && m_file.Exists( wxFILE_EXISTS_REGULAR ) )
200 {
201 wxLogTrace( BOM_TRACE, "%s found directly", m_file.GetFullPath() );
202 return m_file;
203 }
204
205 wxFileName test( PATHS::GetUserPluginsPath(), m_file.GetName(), m_file.GetExt() );
206
207 if( test.Exists( wxFILE_EXISTS_REGULAR ) )
208 {
209 wxLogTrace( BOM_TRACE, "%s found in user plugins path %s", m_file.GetFullName(),
211 return test;
212 }
213
214 test = wxFileName( PATHS::GetStockPluginsPath(), m_file.GetName(), m_file.GetExt() );
215
216 if( test.Exists( wxFILE_EXISTS_REGULAR ) )
217 {
218 wxLogTrace( BOM_TRACE, "%s found in stock plugins path %s", m_file.GetFullName(),
220 return test;
221 }
222
223 wxLogTrace( BOM_TRACE, "Could not find %s (checked %s, %s)", m_file.GetFullName(),
225
226 return m_file;
227}
static wxString GetUserPluginsPath()
Gets the user path for plugins.
Definition: paths.cpp:53
static wxString GetStockPluginsPath()
Gets the stock (install) plugins path.
Definition: paths.cpp:262

References BOM_TRACE, PATHS::GetStockPluginsPath(), PATHS::GetUserPluginsPath(), and m_file.

Referenced by BOM_GENERATOR_HANDLER(), and DIALOG_BOM::pluginInit().

◆ GetCommand()

const wxString & BOM_GENERATOR_HANDLER::GetCommand ( ) const
inline

Return the command to execute the plugin.

Definition at line 114 of file bom_plugins.h.

115 {
116 return m_cmd;
117 }

References m_cmd.

Referenced by DIALOG_BOM::pluginInit().

◆ GetFile()

const wxFileName & BOM_GENERATOR_HANDLER::GetFile ( ) const
inline

Return the file name of the plugin.

Definition at line 76 of file bom_plugins.h.

77 {
78 return m_file;
79 }

References m_file.

Referenced by DIALOG_BOM::pluginInit().

◆ GetInfo()

const wxString & BOM_GENERATOR_HANDLER::GetInfo ( ) const
inline

Return plugin description stored in the plugin header file (if available).

Definition at line 68 of file bom_plugins.h.

69 {
70 return m_info;
71 }

References m_info.

Referenced by DIALOG_BOM::pluginInit().

◆ GetName()

const wxString & BOM_GENERATOR_HANDLER::GetName ( void  ) const
inline

Return the customisable plugin name.

Definition at line 96 of file bom_plugins.h.

97 {
98 return m_name;
99 }

References m_name.

Referenced by DIALOG_BOM::pluginInit().

◆ getOutputExtension()

wxString BOM_GENERATOR_HANDLER::getOutputExtension ( const wxString &  aHeader)
staticprotected

Extracts the output BOM file's extension, including the '.

', from the plugin file header. If the output extension cannot be determined from the plugin header, returns wxEmptyString.

Parameters
aHeaderis the plugin file's header, as returned by readHeader() true if the plugin is working (i.e. if the plugin file exists and was read

Definition at line 176 of file bom_plugins.cpp.

177{
178 // search header for extension after %O (extension includes '.')
179 // looks for output argument of the form `"%O.extension"`
180 const wxString outputarg( "\"%O" );
181
182 int strstart = aHeader.Find( outputarg );
183
184 if( strstart == wxNOT_FOUND )
185 return wxEmptyString;
186
187 strstart += outputarg.Length();
188 int strend = aHeader.find( "\"", strstart );
189
190 if( strend == wxNOT_FOUND )
191 return wxEmptyString;
192
193 return aHeader.SubString( strstart, strend - 1 );
194}

Referenced by BOM_GENERATOR_HANDLER().

◆ GetStoredPath()

wxString BOM_GENERATOR_HANDLER::GetStoredPath ( ) const
inline

Definition at line 81 of file bom_plugins.h.

81{ return m_storedPath; }

References m_storedPath.

◆ IsOk()

bool BOM_GENERATOR_HANDLER::IsOk ( )
inline

Return true if the plugin is ready to work, i.e.

if the plugin file is found and readable.

Definition at line 56 of file bom_plugins.h.

56{ return m_isOk; }

References m_isOk.

Referenced by DIALOG_BOM::pluginInit().

◆ IsValidGenerator()

bool BOM_GENERATOR_HANDLER::IsValidGenerator ( const wxString &  aFile)
static

Return true if a file name matches a recognized plugin format.

Parameters
aFileis path to the plugin file.

Definition at line 128 of file bom_plugins.cpp.

129{
130 wxFileName fn( aFile );
131 wxString ext = fn.GetExt().Lower();
132
133 for( const auto& pluginExt : { "xsl", "py", "pyw" } )
134 {
135 if( pluginExt == ext )
136 return true;
137 }
138
139 return false;
140}

◆ Options()

wxArrayString & BOM_GENERATOR_HANDLER::Options ( )
inline

Accessor to array of options.

Definition at line 130 of file bom_plugins.h.

131 {
132 return m_options;
133 }
wxArrayString m_options
Definition: bom_plugins.h:170

References m_options.

Referenced by DIALOG_BOM::pluginInit().

◆ readHeader()

wxString BOM_GENERATOR_HANDLER::readHeader ( const wxString &  aEndSection)
protected

Read the plugin file header.

Parameters
aEndSectionis a string marking end of the header.

Definition at line 143 of file bom_plugins.cpp.

144{
145 if( aEndSection.IsEmpty() )
146 return wxEmptyString;
147
148 wxFFile fdata( m_file.GetFullPath(), "rb" ); // dtor will close the file
149 wxString data;
150
151 if( !fdata.ReadAll( &data ) )
152 return wxEmptyString;
153
154 const wxString header( "@package" );
155
156 // Extract substring between @package and endsection
157 int strstart = data.Find( header );
158
159 if( strstart == wxNOT_FOUND )
160 return wxEmptyString;
161
162 strstart += header.Length();
163 int strend = data.find( aEndSection, strstart );
164
165 if( strend == wxNOT_FOUND )
166 return wxEmptyString;
167
168 // Remove empty line if any
169 while( data[strstart] < ' ' )
170 strstart++;
171
172 return data.SubString( strstart, strend - 1 );
173}

References m_file.

Referenced by BOM_GENERATOR_HANDLER().

◆ SetCommand()

void BOM_GENERATOR_HANDLER::SetCommand ( const wxString &  aCommand)
inline

Set the command to execute the plugin.

Definition at line 122 of file bom_plugins.h.

123 {
124 m_cmd = aCommand;
125 }

References m_cmd.

◆ SetName()

void BOM_GENERATOR_HANDLER::SetName ( const wxString &  aName)
inline

Set the customisable plugin name.

Parameters
aNameis the new name.

Definition at line 106 of file bom_plugins.h.

107 {
108 m_name = aName;
109 }

References m_name.

Member Data Documentation

◆ m_cmd

wxString BOM_GENERATOR_HANDLER::m_cmd
protected

Description of the plugin (normally from the plugin header)

Definition at line 164 of file bom_plugins.h.

Referenced by BOM_GENERATOR_HANDLER(), GetCommand(), and SetCommand().

◆ m_file

wxFileName BOM_GENERATOR_HANDLER::m_file
protected

Path to the plugin stored in config (can be absolute or just a filename)

Definition at line 155 of file bom_plugins.h.

Referenced by BOM_GENERATOR_HANDLER(), FindFilePath(), GetFile(), and readHeader().

◆ m_info

wxString BOM_GENERATOR_HANDLER::m_info
protected

Plugin specific options.

Definition at line 167 of file bom_plugins.h.

Referenced by BOM_GENERATOR_HANDLER(), and GetInfo().

◆ m_isOk

bool BOM_GENERATOR_HANDLER::m_isOk
protected

Path to the plugin.

Definition at line 152 of file bom_plugins.h.

Referenced by BOM_GENERATOR_HANDLER(), and IsOk().

◆ m_name

wxString BOM_GENERATOR_HANDLER::m_name
protected

Command to execute the plugin.

Definition at line 161 of file bom_plugins.h.

Referenced by BOM_GENERATOR_HANDLER(), GetName(), and SetName().

◆ m_options

wxArrayString BOM_GENERATOR_HANDLER::m_options
protected

Definition at line 170 of file bom_plugins.h.

Referenced by Options().

◆ m_storedPath

const wxString BOM_GENERATOR_HANDLER::m_storedPath
protected

User customisable name.

Definition at line 158 of file bom_plugins.h.

Referenced by GetStoredPath().


The documentation for this class was generated from the following files: