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 <pcb_marker.h>
30#include <pgm_base.h>
31#include <project.h>
33#include <properties/property.h>
34#include <reporter.h>
36#include <wx/image.h>
37
38
39std::unique_ptr<BOARD> BOARD_LOADER::Load( const wxString& aFileName,
41 PROJECT* aProject,
42 const OPTIONS& aOptions )
43{
44 if( !aProject || aFormat == PCB_IO_MGR::FILE_TYPE_NONE )
45 return nullptr;
46
47 // TODO(JE) need to factor out for MDI
49
50 BOARD* loaded = nullptr;
51
52 if( aOptions.plugin_configurator || aOptions.reporter )
53 {
55
56 if( !pi )
57 return nullptr;
58
59 if( aOptions.plugin_configurator )
60 aOptions.plugin_configurator( *pi );
61
62 if( aOptions.reporter )
63 pi->SetReporter( aOptions.reporter );
64
65 pi->SetProgressReporter( aOptions.progress_reporter );
66 loaded = pi->LoadBoard( aFileName, nullptr, aOptions.properties, aProject );
67 }
68 else
69 {
70 loaded = PCB_IO_MGR::Load( aFormat, aFileName, nullptr, aOptions.properties,
71 aProject, aOptions.progress_reporter );
72 }
73
74 std::unique_ptr<BOARD> board( loaded );
75
76 if( !board )
77 return nullptr;
78
79 if( aOptions.initialize_after_load )
80 initializeLoadedBoard( board.get(), aFileName, aProject, aOptions );
81
82 return board;
83}
84
85
86std::unique_ptr<BOARD> BOARD_LOADER::Load( const wxString& aFileName,
88 PROJECT* aProject )
89{
90 return Load( aFileName, aFormat, aProject, OPTIONS{} );
91}
92
93
94void BOARD_LOADER::initializeLoadedBoard( BOARD* aBoard, const wxString& aFileName,
95 PROJECT* aProject, const OPTIONS& aOptions )
96{
97 if( !aBoard || !aProject )
98 return;
99
101 resolver.SetProject( aProject );
102 resolver.SetProgramBase( PgmOrNull() );
103
104 wxString filename = resolver.ResolvePath( BASE_SCREEN::m_DrawingSheetFileName,
105 aProject->GetProjectPath(),
106 { aBoard->GetEmbeddedFiles() } );
107
108 wxString msg;
109
110 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename, &msg ) )
111 {
112 if( aOptions.drawing_sheet_error_callback )
114 }
115
117
118 layerEnum.Choices().Clear();
119 layerEnum.Undefined( UNDEFINED_LAYER );
120
121 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
122 {
123 layerEnum.Map( layer, LSET::Name( layer ) );
124 layerEnum.Map( layer, aBoard->GetLayerName( layer ) );
125 }
126
127 aBoard->SetProject( aProject );
128
130 bds.m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard, &bds );
131
132 try
133 {
134 wxFileName rules = aFileName;
135 rules.SetExt( FILEEXT::DesignRulesFileExtension );
136 bds.m_DRCEngine->InitEngine( rules );
137 }
138 catch( ... )
139 {
140 // Only matters if user tries to run DRC later; will be reported at that time
141 }
142
143 for( PCB_MARKER* marker : aBoard->ResolveDRCExclusions( true ) )
144 aBoard->Add( marker );
145
146 aBoard->BuildConnectivity();
147 aBoard->BuildListOfNets();
148 aBoard->SynchronizeNetsAndNetClasses( true );
149 aBoard->UpdateUserUnits( aBoard, nullptr );
150}
151
152
153std::unique_ptr<BOARD> BOARD_LOADER::CreateEmptyBoard( PROJECT* aProject )
154{
155 std::unique_ptr<BOARD> brd = std::make_unique<BOARD>();
156 brd->SetProject( aProject );
157 return brd;
158}
159
160
161bool BOARD_LOADER::SaveBoard( wxString& aFileName, BOARD* aBoard, PCB_IO_MGR::PCB_FILE_T aFormat )
162{
163 aBoard->BuildConnectivity();
164 aBoard->SynchronizeNetsAndNetClasses( false );
165
166 try
167 {
168 PCB_IO_MGR::Save( aFormat, aFileName, aBoard, nullptr );
169 }
170 catch( ... )
171 {
172 return false;
173 }
174
175 return true;
176}
177
178
179bool BOARD_LOADER::SaveBoard( wxString& aFileName, BOARD* aBoard )
180{
181 return SaveBoard( aFileName, aBoard, PCB_IO_MGR::KICAD_SEXP );
182}
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:1237
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:1696
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:195
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition board.cpp:2887
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition board.cpp:205
std::vector< PCB_MARKER * > ResolveDRCExclusions(bool aCreateMarkers)
Rebuild DRC markers from the serialized data in BOARD_DESIGN_SETTINGS.
Definition board.cpp:395
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition board.cpp:737
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1091
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.
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:177
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
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.