KiCad PCB EDA Suite
pcbnew_scripting_helpers.cpp File Reference

Scripting helper functions for pcbnew functionality. More...

#include <Python.h>
#include "pcbnew_scripting_helpers.h"
#include <tool/tool_manager.h>
#include <action_plugin.h>
#include <board.h>
#include <board_design_settings.h>
#include <pcb_marker.h>
#include <cstdlib>
#include <drc/drc_engine.h>
#include <drc/drc_item.h>
#include <fp_lib_table.h>
#include <ignore.h>
#include <io_mgr.h>
#include <string_utils.h>
#include <macros.h>
#include <project.h>
#include <project/net_settings.h>
#include <project/project_file.h>
#include <settings/settings_manager.h>
#include <specctra.h>
#include <project/project_local_settings.h>
#include <wildcards_and_files_ext.h>
#include <locale_io.h>
#include <wx/app.h>

Go to the source code of this file.

Functions

BOARDGetBoard ()
 
void ScriptingSetPcbEditFrame (PCB_EDIT_FRAME *aPcbEditFrame)
 
BOARDLoadBoard (wxString &aFileName)
 
SETTINGS_MANAGERGetSettingsManager ()
 
PROJECTGetDefaultProject ()
 
BOARDLoadBoard (wxString &aFileName, IO_MGR::PCB_FILE_T aFormat)
 
BOARDNewBoard (wxString &aFileName)
 Creates a new board and project with the given filename (will overwrite existing files!) More...
 
BOARDCreateEmptyBoard ()
 Construct a default BOARD with a temporary (no filename) project. More...
 
bool SaveBoard (wxString &aFileName, BOARD *aBoard, IO_MGR::PCB_FILE_T aFormat)
 
bool SaveBoard (wxString &aFileName, BOARD *aBoard)
 Saves a copy of the given board and its associated project to the given path. More...
 
FP_LIB_TABLEGetFootprintLibraryTable ()
 
wxArrayString GetFootprintLibraries ()
 Get the nicknames of all of the footprint libraries configured in pcbnew in both the project and global library tables. More...
 
wxArrayString GetFootprints (const wxString &aNickName)
 Get the names of all of the footprints available in a footprint library. More...
 
bool ExportSpecctraDSN (wxString &aFullFilename)
 Will export the current BOARD to a specctra dsn file. More...
 
bool ExportSpecctraDSN (BOARD *aBoard, wxString &aFullFilename)
 Will export the BOARD to a specctra dsn file. More...
 
bool ExportVRML (const wxString &aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
 Export the current BOARD to a VRML (wrl) file. More...
 
bool ImportSpecctraSES (wxString &aFullFilename)
 Import a specctra *.ses file and use it to relocate MODULEs and to replace all vias and tracks in an existing and loaded BOARD. More...
 
bool ExportFootprintsToLibrary (bool aStoreInNewLib, const wxString &aLibName, wxString *aLibPath)
 Save footprints in a library: More...
 
void Refresh ()
 Update the board display after modifying it by a python script (note: it is automatically called by action plugins, after running the plugin, so call this function is usually not needed inside action plugins. More...
 
void UpdateUserInterface ()
 Update the layer manager and other widgets from the board setup (layer and items visibility, colors ...) (note: it is automatically called by action plugins, after running the plugin, so call this function is usually not needed inside action plugins. More...
 
int GetUserUnits ()
 Return the currently selected user unit value for the interface. More...
 
bool IsActionRunning ()
 Are we currently in an action plugin? More...
 
bool WriteDRCReport (BOARD *aBoard, const wxString &aFileName, EDA_UNITS aUnits, bool aReportAllTrackErrors)
 Run the DRC check on the given board and writes the results to a report file. More...
 

Variables

static PCB_EDIT_FRAMEs_PcbEditFrame = nullptr
 
static SETTINGS_MANAGERs_SettingsManager = nullptr
 

Detailed Description

Scripting helper functions for pcbnew functionality.

Definition in file pcbnew_scripting_helpers.cpp.

Function Documentation

◆ CreateEmptyBoard()

BOARD* CreateEmptyBoard ( )

Construct a default BOARD with a temporary (no filename) project.

Returns
the created board.

Definition at line 227 of file pcbnew_scripting_helpers.cpp.

228 {
229  // Creating a new board is not possible if running inside KiCad
230  if( s_PcbEditFrame )
231  return nullptr;
232 
233  BOARD* brd = new BOARD();
234 
235  brd->SetProject( GetDefaultProject() );
236 
237  return brd;
238 }
PROJECT * GetDefaultProject()
void SetProject(PROJECT *aProject)
Link a board to a given project.
Definition: board.cpp:143
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
static PCB_EDIT_FRAME * s_PcbEditFrame

References GetDefaultProject(), s_PcbEditFrame, and BOARD::SetProject().

◆ ExportFootprintsToLibrary()

bool ExportFootprintsToLibrary ( bool  aStoreInNewLib,
const wxString &  aLibName = wxEmptyString,
wxString *  aLibPath = nullptr 
)

Save footprints in a library:

Parameters
aStoreInNewLibset to true to save footprints in a existing lib. Existing footprints will be kept or updated. This lib should be in fp lib table, and is type is .pretty. Set to false to save footprints in a new lib. If it is an existing lib, previous footprints will be removed.
aLibNameis the optional library name to create, stops dialog call. Must be called with aStoreInNewLib as true.

Definition at line 378 of file pcbnew_scripting_helpers.cpp.

379 {
380  if( s_PcbEditFrame )
381  {
382  s_PcbEditFrame->ExportFootprintsToLibrary( aStoreInNewLib, aLibName, aLibPath );
383  return true;
384  }
385  else
386  {
387  return false;
388  }
389 }
void ExportFootprintsToLibrary(bool aStoreInNewLib, const wxString &aLibName=wxEmptyString, wxString *aLibPath=nullptr)
Save footprints in a library:
static PCB_EDIT_FRAME * s_PcbEditFrame

References PCB_EDIT_FRAME::ExportFootprintsToLibrary(), and s_PcbEditFrame.

◆ ExportSpecctraDSN() [1/2]

bool ExportSpecctraDSN ( wxString &  aFullFilename)

Will export the current BOARD to a specctra dsn file.

See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification.

Returns
true if OK

Definition at line 319 of file pcbnew_scripting_helpers.cpp.

320 {
321  if( s_PcbEditFrame )
322  {
323  bool ok = s_PcbEditFrame->ExportSpecctraFile( aFullFilename );
324  return ok;
325  }
326  else
327  {
328  return false;
329  }
330 }
static PCB_EDIT_FRAME * s_PcbEditFrame
bool ExportSpecctraFile(const wxString &aFullFilename)
Export the current BOARD to a specctra dsn file.

References PCB_EDIT_FRAME::ExportSpecctraFile(), and s_PcbEditFrame.

◆ ExportSpecctraDSN() [2/2]

bool ExportSpecctraDSN ( BOARD aBoard,
wxString &  aFullFilename 
)

Will export the BOARD to a specctra dsn file.

Unlike first overload doesn't need a valid PCB_EDIT_FRAME set and can be used in a standalone python script.

See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification.

Returns
true if OK

Definition at line 333 of file pcbnew_scripting_helpers.cpp.

334 {
335  try
336  {
337  ExportBoardToSpecctraFile( aBoard, aFullFilename );
338  }
339  catch( ... )
340  {
341  return false;
342  }
343 
344  return true;
345 }
void ExportBoardToSpecctraFile(BOARD *aBoard, const wxString &aFullFilename)
Helper method to export board to DSN file.

References ExportBoardToSpecctraFile().

◆ ExportVRML()

bool ExportVRML ( const wxString &  aFullFileName,
double  aMMtoWRMLunit,
bool  aExport3DFiles,
bool  aUseRelativePaths,
const wxString &  a3D_Subdir,
double  aXRef,
double  aYRef 
)

Export the current BOARD to a VRML (wrl) file.

See ExportVRML_File in pcb_edit_frame.h for detailed documentation.

Returns
true if OK.

Definition at line 348 of file pcbnew_scripting_helpers.cpp.

350 {
351  if( s_PcbEditFrame )
352  {
353  bool ok = s_PcbEditFrame->ExportVRML_File( aFullFileName, aMMtoWRMLunit,
354  aExport3DFiles, aUseRelativePaths,
355  a3D_Subdir, aXRef, aYRef );
356  return ok;
357  }
358  else
359  {
360  return false;
361  }
362 }
bool ExportVRML_File(const wxString &aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Create the file(s) exporting current BOARD to a VRML file.
static PCB_EDIT_FRAME * s_PcbEditFrame

References PCB_EDIT_FRAME::ExportVRML_File(), and s_PcbEditFrame.

Referenced by VRML_WRITER::ExportVRML_File().

◆ GetBoard()

BOARD* GetBoard ( )

Definition at line 64 of file pcbnew_scripting_helpers.cpp.

65 {
66  if( s_PcbEditFrame )
67  return s_PcbEditFrame->GetBoard();
68  else
69  return nullptr;
70 }
BOARD * GetBoard() const
static PCB_EDIT_FRAME * s_PcbEditFrame

References PCB_BASE_FRAME::GetBoard(), and s_PcbEditFrame.

Referenced by PCB_EDIT_FRAME::canCloseWindow(), ZONE_FILLER_TOOL::CheckAllZones(), DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME(), PCB_EDIT_FRAME::doCloseWindow(), EVT_GRID_CMD_CELL_CHANGED(), EVT_TOOL_RANGE(), PCB_EDIT_FRAME::ExportSpecctraFile(), PCB_EDIT_FRAME::ExportSVG(), EDIT_TOOL::FilletTracks(), FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME(), PCB_EDIT_FRAME::GetCurrentFileName(), PCB_BASE_FRAME::GetFootprintFromBoardByReference(), GetFootprintLibraryTable(), PCB_EDIT_FRAME::GetLastPath(), PCB_EDIT_FRAME::ImportSpecctraSession(), PCB_EDIT_FRAME::IsElementVisible(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), PCB_EDIT_FRAME::onBoardLoaded(), PCB_EDIT_FRAME::OnExportHyperlynx(), PCB_EDIT_FRAME::OnNetlistChanged(), FOOTPRINT_EDIT_FRAME::OpenProjectFiles(), PCB_BASE_EDIT_FRAME::PutDataInPreviousState(), PCB_EDIT_FRAME::RecordDRCExclusions(), PCB_EDIT_FRAME::RecreateBOMFileFromBoard(), PCB_EDIT_FRAME::ResolveDRCExclusions(), PCB_BASE_EDIT_FRAME::SaveCopyInUndoList(), ROUTER_TOOL::SelectCopperLayerPair(), PCB_EDIT_FRAME::SetElementVisibility(), PCB_EDIT_FRAME::SetLastPath(), PCB_EDIT_FRAME::SetPageSettings(), PCB_EDIT_FRAME::setupUIConditions(), PCB_EDIT_FRAME::ShowBoardSetupDialog(), GLOBAL_EDIT_TOOL::SwapLayers(), PCB_EDIT_FRAME::UpdateTitle(), PCB_EDIT_FRAME::UpdateUserInterface(), and PCB_EDIT_FRAME::~PCB_EDIT_FRAME().

◆ GetDefaultProject()

PROJECT* GetDefaultProject ( )

Definition at line 111 of file pcbnew_scripting_helpers.cpp.

112 {
113  // For some reasons, LoadProject() needs a C locale, so ensure we have the right locale
114  // This is mainly when running QA Python tests
116 
118 
119  if( !project )
120  {
123  }
124 
125  return project;
126 }
Container for project specific data.
Definition: project.h:62
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:72
SETTINGS_MANAGER * GetSettingsManager()
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
PROJECT * GetProject(const wxString &aFullPath) const
Retrieves a loaded project by name.

References dummy(), SETTINGS_MANAGER::GetProject(), GetSettingsManager(), SETTINGS_MANAGER::LoadProject(), and project.

Referenced by CreateEmptyBoard(), and LoadBoard().

◆ GetFootprintLibraries()

wxArrayString GetFootprintLibraries ( )

Get the nicknames of all of the footprint libraries configured in pcbnew in both the project and global library tables.

Returns
the list of footprint library nicknames, empty on error.

Definition at line 288 of file pcbnew_scripting_helpers.cpp.

289 {
290  wxArrayString footprintLibraryNames;
291 
293 
294  if( !tbl )
295  return footprintLibraryNames;
296 
297  for( const wxString& name : tbl->GetLogicalLibs() )
298  footprintLibraryNames.Add( name );
299 
300  return footprintLibraryNames;
301 }
FP_LIB_TABLE * GetFootprintLibraryTable()
const char * name
Definition: DXF_plotter.cpp:56
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.

References GetFootprintLibraryTable(), LIB_TABLE::GetLogicalLibs(), and name.

◆ GetFootprintLibraryTable()

FP_LIB_TABLE* GetFootprintLibraryTable ( )

Definition at line 272 of file pcbnew_scripting_helpers.cpp.

273 {
274  BOARD* board = GetBoard();
275 
276  if( !board )
277  return nullptr;
278 
279  PROJECT* project = board->GetProject();
280 
281  if( !project )
282  return nullptr;
283 
284  return project->PcbFootprintLibs();
285 }
Container for project specific data.
Definition: project.h:62
PROJECT * GetProject() const
Definition: board.h:361
BOARD * GetBoard()
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191

References GetBoard(), BOARD::GetProject(), and project.

Referenced by GetFootprintLibraries(), and GetFootprints().

◆ GetFootprints()

wxArrayString GetFootprints ( const wxString &  aNickName)

Get the names of all of the footprints available in a footprint library.

Parameters
aNickNameis the nickname specifying which footprint library to fetch from.
Returns
the list of footprint names, empty on error.

Definition at line 304 of file pcbnew_scripting_helpers.cpp.

305 {
306  wxArrayString footprintNames;
307 
309 
310  if( !tbl )
311  return footprintNames;
312 
313  tbl->FootprintEnumerate( footprintNames, aNickName, true );
314 
315  return footprintNames;
316 }
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aNickname, bool aBestEfforts)
Return a list of footprint names contained within the library given by aNickname.
FP_LIB_TABLE * GetFootprintLibraryTable()

References FP_LIB_TABLE::FootprintEnumerate(), and GetFootprintLibraryTable().

◆ GetSettingsManager()

◆ GetUserUnits()

int GetUserUnits ( )

Return the currently selected user unit value for the interface.

Returns
0 = Inches, 1=mm, -1 if the frame isn't set

Definition at line 427 of file pcbnew_scripting_helpers.cpp.

428 {
429  if( s_PcbEditFrame )
430  return static_cast<int>( s_PcbEditFrame->GetUserUnits() );
431 
432  return -1;
433 }
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
static PCB_EDIT_FRAME * s_PcbEditFrame

References EDA_BASE_FRAME::GetUserUnits(), and s_PcbEditFrame.

Referenced by DRAWING_TOOL::drawArc(), and PCB_CONTROL::placeBoardItems().

◆ ImportSpecctraSES()

bool ImportSpecctraSES ( wxString &  aFullFilename)

Import a specctra *.ses file and use it to relocate MODULEs and to replace all vias and tracks in an existing and loaded BOARD.

See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification.

Returns
true if OK

Definition at line 364 of file pcbnew_scripting_helpers.cpp.

365 {
366  if( s_PcbEditFrame )
367  {
368  bool ok = s_PcbEditFrame->ImportSpecctraSession( aFullFilename );
369  return ok;
370  }
371  else
372  {
373  return false;
374  }
375 }
bool ImportSpecctraSession(const wxString &aFullFilename)
Import a specctra *.ses file and use it to relocate MODULEs and to replace all vias and tracks in an ...
static PCB_EDIT_FRAME * s_PcbEditFrame

References PCB_EDIT_FRAME::ImportSpecctraSession(), and s_PcbEditFrame.

◆ IsActionRunning()

bool IsActionRunning ( )

Are we currently in an action plugin?

Definition at line 436 of file pcbnew_scripting_helpers.cpp.

437 {
439 }
static bool IsActionRunning()

References ACTION_PLUGINS::IsActionRunning().

◆ LoadBoard() [1/2]

BOARD* LoadBoard ( wxString &  aFileName)

Definition at line 79 of file pcbnew_scripting_helpers.cpp.

80 {
81  if( aFileName.EndsWith( KiCadPcbFileExtension ) )
82  return LoadBoard( aFileName, IO_MGR::KICAD_SEXP );
83  else if( aFileName.EndsWith( LegacyPcbFileExtension ) )
84  return LoadBoard( aFileName, IO_MGR::LEGACY );
85 
86  // as fall back for any other kind use the legacy format
87  return LoadBoard( aFileName, IO_MGR::LEGACY );
88 }
BOARD * LoadBoard(wxString &aFileName)
const std::string LegacyPcbFileExtension
const std::string KiCadPcbFileExtension
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:55
S-expression Pcbnew file format.
Definition: io_mgr.h:56

References IO_MGR::KICAD_SEXP, KiCadPcbFileExtension, IO_MGR::LEGACY, LegacyPcbFileExtension, and LoadBoard().

Referenced by LoadBoard().

◆ LoadBoard() [2/2]

BOARD* LoadBoard ( wxString &  aFileName,
IO_MGR::PCB_FILE_T  aFormat 
)

Definition at line 129 of file pcbnew_scripting_helpers.cpp.

130 {
131  wxFileName pro = aFileName;
132  pro.SetExt( ProjectFileExtension );
133  pro.MakeAbsolute();
134  wxString projectPath = pro.GetFullPath();
135 
136  // Ensure the "C" locale is temporary set, before reading any file
137  // It also avoid wxWidget alerts about locale issues, later, when using Python 3
139 
140  PROJECT* project = GetSettingsManager()->GetProject( projectPath );
141 
142  if( !project )
143  {
144  GetSettingsManager()->LoadProject( projectPath, false );
145  project = GetSettingsManager()->GetProject( projectPath );
146  }
147  else if( s_PcbEditFrame && project == &GetSettingsManager()->Prj() )
148  {
149  // Project is already loaded? Then so is the board
150  return s_PcbEditFrame->GetBoard();
151  }
152 
153  // Board cannot be loaded without a project, so create the default project
154  if( !project )
156 
157  BOARD* brd = IO_MGR::Load( aFormat, aFileName );
158 
159  if( brd )
160  {
161  brd->SetProject( project );
162 
164  project->GetProjectFile().NetSettings().RebuildNetClassAssignments();
165 
166  // Move legacy view settings to local project settings
167  if( !brd->m_LegacyVisibleLayers.test( Rescue ) )
168  project->GetLocalSettings().m_VisibleLayers = brd->m_LegacyVisibleLayers;
169 
171  project->GetLocalSettings().m_VisibleItems = brd->m_LegacyVisibleItems;
172 
174  bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( brd, &bds );
175 
176  try
177  {
178  wxFileName rules = pro;
179  rules.SetExt( DesignRulesFileExtension );
180  bds.m_DRCEngine->InitEngine( rules );
181  }
182  catch( ... )
183  {
184  // Best efforts...
185  }
186 
187  for( PCB_MARKER* marker : brd->ResolveDRCExclusions() )
188  brd->Add( marker );
189 
190  brd->BuildConnectivity();
191  brd->BuildListOfNets();
193  }
194 
195  return brd;
196 }
void BuildListOfNets()
Definition: board.h:659
Container for project specific data.
Definition: project.h:62
bool m_LegacyDesignSettingsLoaded
True if the legacy board design settings were loaded from a file.
Definition: board.h:269
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
const std::string ProjectFileExtension
PROJECT & Prj()
Definition: kicad.cpp:403
const std::string DesignRulesFileExtension
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:590
This is the end of the layers used for visibility bit masks in Pcbnew.
Definition: layer_ids.h:233
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:72
void SynchronizeNetsAndNetClasses()
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition: board.cpp:1394
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT) override
Adds an item to the container.
Definition: board.cpp:608
std::vector< PCB_MARKER * > ResolveDRCExclusions()
Rebuild DRC markers from the serialized data in BOARD_DESIGN_SETTINGS.
Definition: board.cpp:208
#define GAL_LAYER_INDEX(x)
Use this macro to convert a GAL layer to a 0-indexed offset from LAYER_VIAS.
Definition: layer_ids.h:260
SETTINGS_MANAGER * GetSettingsManager()
PROJECT * GetDefaultProject()
void BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition: board.cpp:137
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
void SetProject(PROJECT *aProject)
Link a board to a given project.
Definition: board.cpp:143
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
BOARD * GetBoard() const
static BOARD * Load(PCB_FILE_T aFileType, const wxString &aFileName, BOARD *aAppendToMe=nullptr, const PROPERTIES *aProperties=nullptr, PROJECT *aProject=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Find the requested PLUGIN and if found, calls the PLUGIN::Load() function on it using the arguments p...
Definition: io_mgr.cpp:158
LSET m_LegacyVisibleLayers
Visibility settings stored in board prior to 6.0, only used for loading legacy files.
Definition: board.h:265
std::shared_ptr< DRC_ENGINE > m_DRCEngine
PROJECT * GetProject(const wxString &aFullPath) const
Retrieves a loaded project by name.
static PCB_EDIT_FRAME * s_PcbEditFrame
Container for design settings for a BOARD object.
GAL_SET m_LegacyVisibleItems
Definition: board.h:266

References BOARD::Add(), BOARD::BuildConnectivity(), BOARD::BuildListOfNets(), DesignRulesFileExtension, dummy(), GAL_LAYER_ID_BITMASK_END, GAL_LAYER_INDEX, PCB_BASE_FRAME::GetBoard(), GetDefaultProject(), BOARD::GetDesignSettings(), SETTINGS_MANAGER::GetProject(), GetSettingsManager(), IO_MGR::Load(), SETTINGS_MANAGER::LoadProject(), BOARD_DESIGN_SETTINGS::m_DRCEngine, BOARD::m_LegacyDesignSettingsLoaded, BOARD::m_LegacyVisibleItems, BOARD::m_LegacyVisibleLayers, Prj(), project, ProjectFileExtension, Rescue, BOARD::ResolveDRCExclusions(), s_PcbEditFrame, BOARD::SetProject(), and BOARD::SynchronizeNetsAndNetClasses().

◆ NewBoard()

BOARD* NewBoard ( wxString &  aFileName)

Creates a new board and project with the given filename (will overwrite existing files!)

Parameters
aFileNameis the filename (including full path if desired) of the kicad_pcb to create
Returns
a pointer to the board if it was created, or None if not

Definition at line 199 of file pcbnew_scripting_helpers.cpp.

200 {
201  wxFileName boardFn = aFileName;
202  wxFileName proFn = aFileName;
203  proFn.SetExt( ProjectFileExtension );
204  proFn.MakeAbsolute();
205 
206  wxString projectPath = proFn.GetFullPath();
207 
208  // Ensure the "C" locale is temporary set, before reading any file
209  // It also avoids wxWidgets alerts about locale issues, later, when using Python 3
211 
212  GetSettingsManager()->LoadProject( projectPath, false );
213  PROJECT* project = GetSettingsManager()->GetProject( projectPath );
214 
215  BOARD* brd = new BOARD();
216 
217  brd->SetProject( project );
219  bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( brd, &bds );
220 
221  SaveBoard( aFileName, brd );
222 
223  return brd;
224 }
Container for project specific data.
Definition: project.h:62
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
const std::string ProjectFileExtension
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:590
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:72
SETTINGS_MANAGER * GetSettingsManager()
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
void SetProject(PROJECT *aProject)
Link a board to a given project.
Definition: board.cpp:143
bool SaveBoard(wxString &aFileName, BOARD *aBoard, IO_MGR::PCB_FILE_T aFormat)
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
std::shared_ptr< DRC_ENGINE > m_DRCEngine
PROJECT * GetProject(const wxString &aFullPath) const
Retrieves a loaded project by name.
Container for design settings for a BOARD object.

References dummy(), BOARD::GetDesignSettings(), SETTINGS_MANAGER::GetProject(), GetSettingsManager(), SETTINGS_MANAGER::LoadProject(), BOARD_DESIGN_SETTINGS::m_DRCEngine, project, ProjectFileExtension, SaveBoard(), and BOARD::SetProject().

◆ Refresh()

void Refresh ( )

Update the board display after modifying it by a python script (note: it is automatically called by action plugins, after running the plugin, so call this function is usually not needed inside action plugins.

Could be deprecated because modifying a board (especially deleting items) outside a action plugin can crash Pcbnew.

Definition at line 391 of file pcbnew_scripting_helpers.cpp.

392 {
393  if( s_PcbEditFrame )
394  {
396  BOARD* board = s_PcbEditFrame->GetBoard();
398 
399  canvas->SyncLayersVisibility( board );
400 
401  canvas->GetView()->Clear();
402  canvas->GetView()->InitPreview();
403  canvas->GetGAL()->SetGridOrigin( VECTOR2D( board->GetDesignSettings().GetGridOrigin() ) );
404  canvas->DisplayBoard( board );
405 
406  // allow tools to re-add their view items (selection previews, grids, etc.)
407  if( toolMgr )
408  toolMgr->ResetTools( TOOL_BASE::GAL_SWITCH );
409 
410  // reload the drawing-sheet
412 
413  board->BuildConnectivity();
414 
415  canvas->Refresh();
416  }
417 }
void DisplayBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Add all items from the current board to the VIEW, so they can be displayed by GAL.
void SetPageSettings(const PAGE_INFO &aPageSettings) override
const PAGE_INFO & GetPageSettings() const
Definition: board.h:536
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void InitPreview()
Definition: view.cpp:1607
const wxPoint & GetGridOrigin()
void SetGridOrigin(const VECTOR2D &aGridOrigin)
Set the origin point for the grid.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:590
Master controller class:
Definition: tool_manager.h:54
VECTOR2< double > VECTOR2D
Definition: vector2d.h:621
void Clear()
Remove all items from the view.
Definition: view.cpp:1100
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition: board.cpp:137
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
BOARD * GetBoard() const
Rendering engine changes.
Definition: tool_base.h:81
static PCB_EDIT_FRAME * s_PcbEditFrame

References BOARD::BuildConnectivity(), KIGFX::VIEW::Clear(), PCB_DRAW_PANEL_GAL::DisplayBoard(), TOOL_BASE::GAL_SWITCH, PCB_BASE_FRAME::GetBoard(), PCB_BASE_FRAME::GetCanvas(), BOARD::GetDesignSettings(), EDA_DRAW_PANEL_GAL::GetGAL(), BOARD_DESIGN_SETTINGS::GetGridOrigin(), BOARD::GetPageSettings(), TOOLS_HOLDER::GetToolManager(), PCB_DRAW_PANEL_GAL::GetView(), KIGFX::VIEW::InitPreview(), EDA_DRAW_PANEL_GAL::Refresh(), TOOL_MANAGER::ResetTools(), s_PcbEditFrame, KIGFX::GAL::SetGridOrigin(), PCB_EDIT_FRAME::SetPageSettings(), and PCB_DRAW_PANEL_GAL::SyncLayersVisibility().

Referenced by EDA_MSG_PANEL::AppendMessage(), BITMAP_BUTTON::Check(), EDA_3D_MODEL_VIEWER::Clear3DModel(), ACTION_TOOLBAR::doSelectAction(), SYMBOL_EDIT_FRAME::emptyScreen(), SPLIT_BUTTON::Enable(), BITMAP_BUTTON::Enable(), EDA_MSG_PANEL::EraseMsgBox(), PCB_EDIT_FRAME::ImportSpecctraSession(), ACTION_TOOLBAR::KiRealize(), SYMBOL_EDIT_FRAME::LoadOneLibrarySymbolAux(), SYMBOL_EDIT_FRAME::LoadSymbolFromSchematic(), PANEL_ATTENUATORS::OnAttenuatorSelection(), APPEARANCE_CONTROLS::OnBoardChanged(), PCB_EDIT_FRAME::onBoardLoaded(), WX_COLLAPSIBLE_PANE_HEADER::onEnterWindow(), EDA_3D_CANVAS::OnEvent(), WX_COLLAPSIBLE_PANE_HEADER::onFocus(), SPLIT_BUTTON::OnKillFocus(), BITMAP_BUTTON::OnKillFocus(), APPEARANCE_CONTROLS::OnLanguageChanged(), APPEARANCE_CONTROLS::OnLayerChanged(), PANEL_SETUP_BOARD_STACKUP::OnLayersOptionsChanged(), WX_COLLAPSIBLE_PANE_HEADER::onLeaveWindow(), SPLIT_BUTTON::OnLeftButtonDown(), BITMAP_BUTTON::OnLeftButtonDown(), SPLIT_BUTTON::OnLeftButtonUp(), BITMAP_BUTTON::OnLeftButtonUp(), BM2CMP_FRAME::OnLoadFile(), SPLIT_BUTTON::OnMouseEnter(), BITMAP_BUTTON::OnMouseEnter(), SPLIT_BUTTON::OnMouseLeave(), BITMAP_BUTTON::OnMouseLeave(), EDA_3D_MODEL_VIEWER::OnMouseMove(), EDA_3D_MODEL_VIEWER::OnMouseWheel(), BM2CMP_FRAME::OnNegativeClicked(), DIALOG_TEMPLATE_SELECTOR::onNotebookResize(), BITMAP_BUTTON::OnSetFocus(), PANEL_PACKAGES_VIEW::OnSizeInfoBox(), BM2CMP_FRAME::OnThresholdChange(), PANEL_TRANSLINE::OnTransLineResetButtonClick(), PANEL_TRANSLINE::OnTranslineSelection(), ACTION_TOOLBAR::RefreshBitmaps(), PANEL_REGULATOR::RegulatorPageUpdate(), DIALOG_JUNCTION_PROPS::resetDefaults(), DIALOG_LINE_WIRE_BUS_PROPERTIES::resetDefaults(), TEMPLATE_WIDGET::Select(), EDA_3D_MODEL_VIEWER::Set3DModel(), WX_COLLAPSIBLE_PANE_HEADER::SetCollapsed(), EDA_MSG_PANEL::SetMessage(), PANEL_PACKAGE::SetSelected(), FOOTPRINTS_LISTBOX::SetSelection(), LIBRARY_LISTBOX::SetSelection(), PANEL_COLOR_CODE::ThemeChanged(), PANEL_ATTENUATORS::ThemeChanged(), PANEL_COLOR_CODE::ToleranceSelection(), TEMPLATE_WIDGET::Unselect(), mpWindow::UpdateAll(), KIGFX::OPENGL_GAL::updatedGalDisplayOptions(), KIGFX::CAIRO_GAL::updatedGalDisplayOptions(), DIALOG_PAGES_SETTINGS::UpdateDrawingSheetExample(), and NUMBER_BADGE::UpdateNumber().

◆ SaveBoard() [1/2]

bool SaveBoard ( wxString &  aFileName,
BOARD aBoard,
IO_MGR::PCB_FILE_T  aFormat 
)

Definition at line 241 of file pcbnew_scripting_helpers.cpp.

242 {
243  aBoard->BuildConnectivity();
245 
246  try
247  {
248  IO_MGR::Save( aFormat, aFileName, aBoard, nullptr );
249  }
250  catch( ... )
251  {
252  return false;
253  }
254 
255  wxFileName pro = aFileName;
256  pro.SetExt( ProjectFileExtension );
257  pro.MakeAbsolute();
258  wxString projectPath = pro.GetFullPath();
259 
260  GetSettingsManager()->SaveProjectAs( pro.GetFullPath(), aBoard->GetProject() );
261 
262  return true;
263 }
const std::string ProjectFileExtension
PROJECT * GetProject() const
Definition: board.h:361
void SynchronizeNetsAndNetClasses()
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition: board.cpp:1394
SETTINGS_MANAGER * GetSettingsManager()
void BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition: board.cpp:137
static void Save(PCB_FILE_T aFileType, const wxString &aFileName, BOARD *aBoard, const PROPERTIES *aProperties=nullptr)
Write either a full aBoard to a storage file in a format that this implementation knows about,...
Definition: io_mgr.cpp:174
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Sets the currently loaded project path and saves it (pointers remain valid) Note that this will not m...

References BOARD::BuildConnectivity(), BOARD::GetProject(), GetSettingsManager(), ProjectFileExtension, IO_MGR::Save(), SETTINGS_MANAGER::SaveProjectAs(), and BOARD::SynchronizeNetsAndNetClasses().

Referenced by NewBoard(), and SaveBoard().

◆ SaveBoard() [2/2]

bool SaveBoard ( wxString &  aFileName,
BOARD aBoard 
)

Saves a copy of the given board and its associated project to the given path.

Boards can only be saved in KiCad native format.

Parameters
aFileNameis the full path to save a copy to.
aBoardis a pointer to a loaded BOARD to save.
Returns
true if the save was completed.

Definition at line 266 of file pcbnew_scripting_helpers.cpp.

267 {
268  return SaveBoard( aFileName, aBoard, IO_MGR::KICAD_SEXP );
269 }
bool SaveBoard(wxString &aFileName, BOARD *aBoard, IO_MGR::PCB_FILE_T aFormat)
S-expression Pcbnew file format.
Definition: io_mgr.h:56

References IO_MGR::KICAD_SEXP, and SaveBoard().

◆ ScriptingSetPcbEditFrame()

void ScriptingSetPcbEditFrame ( PCB_EDIT_FRAME aPcbEditFrame)

Definition at line 73 of file pcbnew_scripting_helpers.cpp.

74 {
75  s_PcbEditFrame = aPcbEditFrame;
76 }
static PCB_EDIT_FRAME * s_PcbEditFrame

References s_PcbEditFrame.

Referenced by PCB::IFACE::CreateWindow().

◆ UpdateUserInterface()

void UpdateUserInterface ( )

Update the layer manager and other widgets from the board setup (layer and items visibility, colors ...) (note: it is automatically called by action plugins, after running the plugin, so call this function is usually not needed inside action plugins.

Definition at line 420 of file pcbnew_scripting_helpers.cpp.

421 {
422  if( s_PcbEditFrame )
424 }
void UpdateUserInterface()
Update the layer manager and other widgets from the board setup (layer and items visibility,...
static PCB_EDIT_FRAME * s_PcbEditFrame

References s_PcbEditFrame, and PCB_EDIT_FRAME::UpdateUserInterface().

Referenced by PCB_EDIT_FRAME::ShowBoardSetupDialog().

◆ WriteDRCReport()

bool WriteDRCReport ( BOARD aBoard,
const wxString &  aFileName,
EDA_UNITS  aUnits,
bool  aReportAllTrackErrors 
)

Run the DRC check on the given board and writes the results to a report file.

Requires that the project for the board be loaded, and note that unlike the DRC dialog this does not attempt to fill zones, so zones must be valid before calling.

Parameters
aBoardis a valid loaded board.
aFileNameis the full path and name of the report file to write.
aUnitsis the units to use in the report.
aReportAllTrackErrorscontrols whether all errors or just the first error is reported for each track.
Returns
true if successful, false if not.

Definition at line 442 of file pcbnew_scripting_helpers.cpp.

444 {
445  wxCHECK( aBoard, false );
446 
447  BOARD_DESIGN_SETTINGS& bds = aBoard->GetDesignSettings();
448  std::shared_ptr<DRC_ENGINE> engine = bds.m_DRCEngine;
449 
450  if( !engine )
451  {
452  bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard, &bds );
453  engine = bds.m_DRCEngine;
454  }
455 
456  wxCHECK( engine, false );
457 
458  wxFileName fn = aBoard->GetFileName();
459  fn.SetExt( DesignRulesFileExtension );
460  PROJECT* prj = nullptr;
461 
462  if( aBoard->GetProject() )
463  prj = aBoard->GetProject();
464  else if( s_SettingsManager )
465  prj = &s_SettingsManager->Prj();
466 
467  wxCHECK( prj, false );
468 
469  wxString drcRulesPath = prj->AbsolutePath( fn.GetFullName() );
470 
471  try
472  {
473  engine->InitEngine( drcRulesPath );
474  }
475  catch( PARSE_ERROR& )
476  {
477  return false;
478  }
479 
480  std::vector<std::shared_ptr<DRC_ITEM>> footprints;
481  std::vector<std::shared_ptr<DRC_ITEM>> unconnected;
482  std::vector<std::shared_ptr<DRC_ITEM>> violations;
483 
484  engine->SetProgressReporter( nullptr );
485 
486  engine->SetViolationHandler(
487  [&]( const std::shared_ptr<DRC_ITEM>& aItem, wxPoint aPos )
488  {
489  if( aItem->GetErrorCode() == DRCE_MISSING_FOOTPRINT
490  || aItem->GetErrorCode() == DRCE_DUPLICATE_FOOTPRINT
491  || aItem->GetErrorCode() == DRCE_EXTRA_FOOTPRINT
492  || aItem->GetErrorCode() == DRCE_NET_CONFLICT )
493  {
494  footprints.push_back( aItem );
495  }
496  else if( aItem->GetErrorCode() == DRCE_UNCONNECTED_ITEMS )
497  {
498  unconnected.push_back( aItem );
499  }
500  else
501  {
502  violations.push_back( aItem );
503  }
504  } );
505 
506  engine->RunTests( aUnits, aReportAllTrackErrors, false );
507  engine->ClearViolationHandler();
508 
509  // TODO: Unify this with DIALOG_DRC::writeReport
510 
511  FILE* fp = wxFopen( aFileName, wxT( "w" ) );
512 
513  if( fp == nullptr )
514  return false;
515 
516  std::map<KIID, EDA_ITEM*> itemMap;
517  aBoard->FillItemMap( itemMap );
518 
519  fprintf( fp, "** Drc report for %s **\n", TO_UTF8( aBoard->GetFileName() ) );
520 
521  wxDateTime now = wxDateTime::Now();
522 
523  fprintf( fp, "** Created on %s **\n", TO_UTF8( now.Format( wxT( "%F %T" ) ) ) );
524 
525  fprintf( fp, "\n** Found %d DRC violations **\n", static_cast<int>( violations.size() ) );
526 
527  for( const std::shared_ptr<DRC_ITEM>& item : violations )
528  {
529  SEVERITY severity = bds.GetSeverity( item->GetErrorCode() );
530  fprintf( fp, "%s", TO_UTF8( item->ShowReport( aUnits, severity, itemMap ) ) );
531  }
532 
533  fprintf( fp, "\n** Found %d unconnected pads **\n", static_cast<int>( unconnected.size() ) );
534 
535  for( const std::shared_ptr<DRC_ITEM>& item : unconnected )
536  {
537  SEVERITY severity = bds.GetSeverity( item->GetErrorCode() );
538  fprintf( fp, "%s", TO_UTF8( item->ShowReport( aUnits, severity, itemMap ) ) );
539  }
540 
541  fprintf( fp, "\n** Found %d Footprint errors **\n", static_cast<int>( footprints.size() ) );
542 
543  for( const std::shared_ptr<DRC_ITEM>& item : footprints )
544  {
545  SEVERITY severity = bds.GetSeverity( item->GetErrorCode() );
546  fprintf( fp, "%s", TO_UTF8( item->ShowReport( aUnits, severity, itemMap ) ) );
547  }
548 
549  fprintf( fp, "\n** End of Report **\n" );
550  fclose( fp );
551 
552  return true;
553 }
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
Container for project specific data.
Definition: project.h:62
const std::string DesignRulesFileExtension
PROJECT * GetProject() const
Definition: board.h:361
const wxString & GetFileName() const
Definition: board.h:229
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:590
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.
Definition: project.cpp:269
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
static SETTINGS_MANAGER * s_SettingsManager
SEVERITY GetSeverity(int aDRCErrorCode)
SEVERITY
A filename or source description, a problem input line, a line number, a byte offset,...
Definition: ki_exception.h:118
void FillItemMap(std::map< KIID, EDA_ITEM * > &aMap)
Definition: board.cpp:924
std::shared_ptr< DRC_ENGINE > m_DRCEngine
Container for design settings for a BOARD object.

References PROJECT::AbsolutePath(), DesignRulesFileExtension, DRCE_DUPLICATE_FOOTPRINT, DRCE_EXTRA_FOOTPRINT, DRCE_MISSING_FOOTPRINT, DRCE_NET_CONFLICT, DRCE_UNCONNECTED_ITEMS, BOARD::FillItemMap(), BOARD::GetDesignSettings(), BOARD::GetFileName(), BOARD::GetProject(), BOARD_DESIGN_SETTINGS::GetSeverity(), BOARD_DESIGN_SETTINGS::m_DRCEngine, SETTINGS_MANAGER::Prj(), s_SettingsManager, and TO_UTF8.

Variable Documentation

◆ s_PcbEditFrame

◆ s_SettingsManager

SETTINGS_MANAGER* s_SettingsManager = nullptr
static

Definition at line 61 of file pcbnew_scripting_helpers.cpp.

Referenced by GetSettingsManager(), and WriteDRCReport().