KiCad PCB EDA Suite
Loading...
Searching...
No Matches
board_loader.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 * @author Jon Evans <[email protected]>
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <board_loader.h>
22
23#include <base_screen.h>
24#include <board.h>
27#include <drc/drc_engine.h>
28#include <filename_resolver.h>
29#include <ki_exception.h>
30#include <pcb_marker.h>
31#include <pgm_base.h>
32#include <project.h>
34#include <properties/property.h>
35#include <reporter.h>
37#include <wx/image.h>
38#include <wx/log.h>
39
40
41std::unique_ptr<BOARD> BOARD_LOADER::Load( const wxString& aFileName,
43 PROJECT* aProject,
44 const OPTIONS& aOptions )
45{
46 if( !aProject || aFormat == PCB_IO_MGR::FILE_TYPE_NONE )
47 return nullptr;
48
49 // TODO(JE) need to factor out for MDI
51
52 BOARD* loaded = nullptr;
53
54 if( aOptions.plugin_configurator || aOptions.reporter )
55 {
57
58 if( !pi )
59 return nullptr;
60
61 if( aOptions.plugin_configurator )
62 aOptions.plugin_configurator( *pi );
63
64 if( aOptions.reporter )
65 pi->SetReporter( aOptions.reporter );
66
67 pi->SetProgressReporter( aOptions.progress_reporter );
68 loaded = pi->LoadBoard( aFileName, nullptr, aOptions.properties, aProject );
69 }
70 else
71 {
72 loaded = PCB_IO_MGR::Load( aFormat, aFileName, nullptr, aOptions.properties,
73 aProject, aOptions.progress_reporter );
74 }
75
76 std::unique_ptr<BOARD> board( loaded );
77
78 if( !board )
79 return nullptr;
80
81 if( aOptions.initialize_after_load )
82 initializeLoadedBoard( board.get(), aFileName, aProject, aOptions );
83
84 return board;
85}
86
87
88std::unique_ptr<BOARD> BOARD_LOADER::Load( const wxString& aFileName,
90 PROJECT* aProject )
91{
92 return Load( aFileName, aFormat, aProject, OPTIONS{} );
93}
94
95
96void BOARD_LOADER::initializeLoadedBoard( BOARD* aBoard, const wxString& aFileName,
97 PROJECT* aProject, const OPTIONS& aOptions )
98{
99 if( !aBoard || !aProject )
100 return;
101
103 resolver.SetProject( aProject );
104 resolver.SetProgramBase( PgmOrNull() );
105
106 wxString filename = resolver.ResolvePath( BASE_SCREEN::m_DrawingSheetFileName,
107 aProject->GetProjectPath(),
108 { aBoard->GetEmbeddedFiles() } );
109
110 wxString msg;
111
112 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename, &msg ) )
113 {
114 if( aOptions.drawing_sheet_error_callback )
116 }
117
119
120 layerEnum.Choices().Clear();
121 layerEnum.Undefined( UNDEFINED_LAYER );
122
123 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
124 {
125 layerEnum.Map( layer, LSET::Name( layer ) );
126 layerEnum.Map( layer, aBoard->GetLayerName( layer ) );
127 }
128
129 aBoard->SetProject( aProject );
130
132 bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard, &bds );
133
134 try
135 {
136 wxFileName rules = aFileName;
137 rules.SetExt( FILEEXT::DesignRulesFileExtension );
138 bds.m_DRCEngine->InitEngine( rules );
139 }
140 catch( ... )
141 {
142 // Only matters if user tries to run DRC later; will be reported at that time
143 }
144
145 for( PCB_MARKER* marker : aBoard->ResolveDRCExclusions( true ) )
146 aBoard->Add( marker );
147
148 aBoard->BuildConnectivity();
149 aBoard->BuildListOfNets();
150 aBoard->SynchronizeNetsAndNetClasses( true );
151 aBoard->UpdateUserUnits( aBoard, nullptr );
152}
153
154
155std::unique_ptr<BOARD> BOARD_LOADER::CreateEmptyBoard( PROJECT* aProject )
156{
157 std::unique_ptr<BOARD> brd = std::make_unique<BOARD>();
158 brd->SetProject( aProject );
159 return brd;
160}
161
162
163bool BOARD_LOADER::SaveBoard( wxString& aFileName, BOARD* aBoard, PCB_IO_MGR::PCB_FILE_T aFormat )
164{
165 aBoard->BuildConnectivity();
166 aBoard->SynchronizeNetsAndNetClasses( false );
167
168 try
169 {
170 PCB_IO_MGR::Save( aFormat, aFileName, aBoard, nullptr );
171 }
172 catch( const IO_ERROR& ioe )
173 {
174 wxLogError( _( "Cannot save board '%s': %s" ), aFileName, ioe.What() );
175 return false;
176 }
177 catch( const std::exception& e )
178 {
179 // Rethrow so std::bad_alloc and similar aren't silently turned into a false return.
180 wxLogError( _( "Unexpected error saving board '%s': %s" ), aFileName,
181 wxString::FromUTF8( e.what() ) );
182 throw;
183 }
184
185 return true;
186}
187
188
189bool BOARD_LOADER::SaveBoard( wxString& aFileName, BOARD* aBoard )
190{
191 return SaveBoard( aFileName, aBoard, PCB_IO_MGR::KICAD_SEXP );
192}
BASE_SCREEN class implementation.
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition base_screen.h:85
Container for design settings for a BOARD object.
std::shared_ptr< DRC_ENGINE > m_DRCEngine
static std::unique_ptr< BOARD > CreateEmptyBoard(PROJECT *aProject)
static std::unique_ptr< BOARD > Load(const wxString &aFileName, PCB_IO_MGR::PCB_FILE_T aFormat, PROJECT *aProject, const OPTIONS &aOptions)
static void initializeLoadedBoard(BOARD *aBoard, const wxString &aFileName, PROJECT *aProject, const OPTIONS &aOptions)
static bool SaveBoard(wxString &aFileName, BOARD *aBoard, PCB_IO_MGR::PCB_FILE_T aFormat)
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition board.cpp:1247
void BuildListOfNets()
Definition board.h:967
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition board.cpp:1706
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition board.cpp:203
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition board.cpp:2912
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition board.cpp:213
std::vector< PCB_MARKER * > ResolveDRCExclusions(bool aCreateMarkers)
Rebuild DRC markers from the serialized data in BOARD_DESIGN_SETTINGS.
Definition board.cpp:403
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition board.cpp:745
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1101
void InitEngine(const wxFileName &aRulePath)
Initialize the DRC engine.
static DS_DATA_MODEL & GetTheInstance()
Return the instance of DS_DATA_MODEL used in the application.
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:727
static ENUM_MAP< T > & Instance()
Definition property.h:721
ENUM_MAP & Undefined(T aValue)
Definition property.h:734
wxPGChoices & Choices()
Definition property.h:770
Provide an extensible class to resolve 3D model paths.
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()
static const LSET & AllLayersMask()
Definition lset.cpp:641
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition lset.cpp:188
static BOARD * Load(PCB_FILE_T aFileType, const wxString &aFileName, BOARD *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Find the requested #PLUGIN and if found, calls the #PLUGIN::LoadBoard() function on it using the argu...
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
Definition pcb_io_mgr.h:56
@ KICAD_SEXP
S-expression Pcbnew file format.
Definition pcb_io_mgr.h:58
static PCB_IO * FindPlugin(PCB_FILE_T aFileType)
Return a #PLUGIN which the caller can use to import, export, save, or load design documents.
static void Save(PCB_FILE_T aFileType, const wxString &aFileName, BOARD *aBoard, const std::map< std::string, UTF8 > *aProperties=nullptr)
Write either a full aBoard to a storage file in a format that this implementation knows about,...
wxString m_BoardDrawingSheetFile
PcbNew params.
Container for project specific data.
Definition project.h:66
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:187
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
#define _(s)
static FILENAME_RESOLVER * resolver
static const std::string DesignRulesFileExtension
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
Definition io_mgr.h:33
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ UNDEFINED_LAYER
Definition layer_ids.h:61
PGM_BASE * PgmOrNull()
Return a reference that can be nullptr when running a shared lib from a script, not from a kicad app.
see class PGM_BASE
std::function< void(const wxString &, const wxString &)> drawing_sheet_error_callback
std::function< void(PCB_IO &)> plugin_configurator
const std::map< std::string, UTF8 > * properties
PROGRESS_REPORTER * progress_reporter
Definition of file extensions used in Kicad.