KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_import_netlist.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 (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <project.h>
25#include <kiface_base.h>
26#include <confirm.h>
27#include <pcb_edit_frame.h>
28#include <pcbnew_settings.h>
29#include <reporter.h>
30#include <bitmaps.h>
31#include <tool/tool_manager.h>
32#include <tools/pcb_actions.h>
38#include <project/project_file.h> // LAST_PATH_TYPE
41#include <wx/filedlg.h>
42
43
45{
46 wxString netlistName = GetLastPath( LAST_PATH_NETLIST );
47
48 DIALOG_IMPORT_NETLIST dlg( this, netlistName );
49
50 dlg.ShowModal();
51
52 SetLastPath( LAST_PATH_NETLIST, netlistName );
53}
54
56
57
59 wxString& aNetlistFullFilename )
60 : DIALOG_IMPORT_NETLIST_BASE( aParent ),
61 m_parent( aParent ),
62 m_netlistPath( aNetlistFullFilename ),
63 m_initialized( false ),
64 m_runDragCommand( false )
65{
67 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
68
69 auto cfg = m_parent->GetPcbNewSettings();
70
71 m_cbUpdateFootprints->SetValue( cfg->m_NetlistDialog.update_footprints );
72 m_cbDeleteShortingTracks->SetValue( cfg->m_NetlistDialog.delete_shorting_tracks );
73 m_cbDeleteExtraFootprints->SetValue( cfg->m_NetlistDialog.delete_extra_footprints );
74
75 m_matchByTimestamp->SetSelection( m_matchByUUID ? 0 : 1 );
76
77 m_MessageWindow->SetLabel( _("Changes To Be Applied") );
78 m_MessageWindow->SetVisibleSeverities( cfg->m_NetlistDialog.report_filter );
79 m_MessageWindow->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
80
81 SetupStandardButtons( { { wxID_OK, _( "Load and Test Netlist" ) },
82 { wxID_CANCEL, _( "Close" ) },
83 { wxID_APPLY, _( "Update PCB" ) } } );
84
86
87 m_initialized = true;
88}
89
91{
92 m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
93
94 PCBNEW_SETTINGS* cfg = nullptr;
95
96 try
97 {
99 }
100 catch( const std::runtime_error& e )
101 {
102 wxFAIL_MSG( e.what() );
103 }
104
105 if( cfg )
106 {
111 }
112
113 if( m_runDragCommand )
114 {
116 controls->SetCursorPosition( controls->GetMousePosition() );
118 }
119}
120
121
123{
124 wxString dirPath = wxFileName( Prj().GetProjectFullName() ).GetPath();
125
126 wxString filename = m_parent->GetLastPath( LAST_PATH_NETLIST );
127
128 if( !filename.IsEmpty() )
129 {
130 wxFileName fn = filename;
131 dirPath = fn.GetPath();
132 filename = fn.GetFullName();
133 }
134
135 wxFileDialog FilesDialog( this, _( "Import Netlist" ), dirPath, filename,
137 wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
138
139 if( FilesDialog.ShowModal() != wxID_OK )
140 return;
141
142 m_NetlistFilenameCtrl->SetValue( FilesDialog.GetPath() );
143 onFilenameChanged( false );
144}
145
146
147
148void DIALOG_IMPORT_NETLIST::onImportNetlist( wxCommandEvent& event )
149{
150 onFilenameChanged( true );
151}
152
153
154void DIALOG_IMPORT_NETLIST::onUpdatePCB( wxCommandEvent& event )
155{
156 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
157
158 if( !fn.IsOk() )
159 {
160 wxMessageBox( _( "Please choose a valid netlist file." ) );
161 return;
162 }
163
164 if( !fn.FileExists() )
165 {
166 wxMessageBox( _( "The netlist file does not exist." ) );
167 return;
168 }
169
170 m_MessageWindow->SetLabel( _( "Changes Applied to PCB" ) );
171 loadNetlist( false );
172
173 m_sdbSizerCancel->SetDefault();
174 m_sdbSizerCancel->SetFocus();
175}
176
177
179{
180 event.Skip();
181}
182
183
185{
186 if( m_initialized )
187 {
188 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
189
190 if( fn.IsOk() )
191 {
192 if( fn.FileExists() )
193 {
195
196 if( aLoadNetlist )
197 loadNetlist( true );
198 }
199 else
200 {
202 REPORTER& reporter = m_MessageWindow->Reporter();
203 reporter.Report( _( "The netlist file does not exist." ), RPT_SEVERITY_ERROR );
204 }
205 }
206 }
207}
208
209
210void DIALOG_IMPORT_NETLIST::OnMatchChanged( wxCommandEvent& event )
211{
212 if( m_initialized )
213 loadNetlist( true );
214}
215
216
217void DIALOG_IMPORT_NETLIST::OnOptionChanged( wxCommandEvent& event )
218{
219 if( m_initialized )
220 loadNetlist( true );
221}
222
223
225{
226 wxString netlistFileName = m_NetlistFilenameCtrl->GetValue();
227 wxFileName fn = netlistFileName;
228
229 if( !fn.IsOk() || !fn.FileExists() )
230 return;
231
233 REPORTER& reporter = m_MessageWindow->Reporter();
234
235 wxBusyCursor busy;
236
237 wxString msg;
238 msg.Printf( _( "Reading netlist file '%s'.\n" ), netlistFileName );
239 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
240
241 if( m_matchByTimestamp->GetSelection() == 1 )
242 msg = _( "Using reference designators to match symbols and footprints.\n" );
243 else
244 msg = _( "Using tstamps (unique IDs) to match symbols and footprints.\n" );
245
246 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
247 m_MessageWindow->SetLazyUpdate( true ); // Use lazy update to speed the creation of the report
248 // (the window is not updated for each message)
249 m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
250
252
253 netlist.SetFindByTimeStamp( m_matchByUUID );
254 netlist.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
255
256 if( !m_parent->ReadNetlistFromFile( netlistFileName, netlist, reporter ) )
257 return;
258
260 updater.SetReporter ( &reporter );
261 updater.SetIsDryRun( aDryRun );
264 updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
265 updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
266 updater.UpdateNetlist( netlist );
267
268 // The creation of the report was made without window update: the full page must be displayed
269 m_MessageWindow->Flush( true );
270
271 if( aDryRun )
272 return;
273
275}
276
277
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
Update the BOARD with a new netlist.
void SetReporter(REPORTER *aReporter)
Enable dry run mode (just report, no changes to PCB).
bool UpdateNetlist(NETLIST &aNetlist)
Update the board's components according to the new netlist.
void SetIsDryRun(bool aEnabled)
void SetDeleteUnusedFootprints(bool aEnabled)
void SetOverrideLocks(bool aOverride)
void SetReplaceFootprints(bool aEnabled)
void SetLookupByTimestamp(bool aEnabled)
Class DIALOG_IMPORT_NETLIST_BASE.
WX_HTML_REPORT_PANEL * m_MessageWindow
void onFilenameChanged(bool aLoadNetlist)
void onUpdatePCB(wxCommandEvent &event) override
void loadNetlist(bool aDryRun)
void onImportNetlist(wxCommandEvent &event) override
void OnFilenameKillFocus(wxFocusEvent &event) override
void OnOptionChanged(wxCommandEvent &event) override
void OnMatchChanged(wxCommandEvent &event) override
void onBrowseNetlistFiles(wxCommandEvent &event) override
DIALOG_IMPORT_NETLIST(PCB_EDIT_FRAME *aParent, wxString &aNetlistFullFilename)
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
virtual void SetCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true, bool aTriggeredByArrows=false, long aArrowCommand=0)=0
Move cursor to the requested position expressed in world coordinates.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition: pcb_netlist.h:223
DIALOG_NETLIST m_NetlistDialog
static TOOL_ACTION move
move or drag an item
Definition: pcb_actions.h:120
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
BOARD * GetBoard() const
The main frame for Pcbnew.
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.
bool ReadNetlistFromFile(const wxString &aFilename, NETLIST &aNetlist, REPORTER &aReporter)
Read a netlist from a file into a NETLIST object.
Definition: netlist.cpp:51
wxString GetLastPath(LAST_PATH_TYPE aType)
Get the last path for a particular type.
void OnNetlistChanged(BOARD_NETLIST_UPDATER &aUpdater, bool *aRunDragCommand)
Called after netlist is updated.
Definition: netlist.cpp:85
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:71
virtual REPORTER & ReportHead(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the beginning of the list for objects that support ordering.
Definition: reporter.h:108
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
void SetBitmap(const wxBitmapBundle &aBmp)
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:145
void Clear()
return the number of messages matching the given severity mask.
void SetLazyUpdate(bool aLazyUpdate)
Forces updating the HTML page, after the report is built in lazy mode If aSort = true,...
void SetLabel(const wxString &aLabel) override
Sets the lazy update.
void SetFileName(const wxString &aReportFileName)
void SetVisibleSeverities(int aSeverities)
void Flush(bool aSort=false)
Set the visible severity filter.
This file is part of the common library.
#define _(s)
static wxString NetlistFileWildcard()
@ LAST_PATH_NETLIST
Definition: project_file.h:49
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
Definition of file extensions used in Kicad.