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 The 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 <view/view_controls.h>
42#include <wx/filedlg.h>
43#include <wx/msgdlg.h>
44
45
47{
48 wxString netlistName = GetLastPath( LAST_PATH_NETLIST );
49
50 DIALOG_IMPORT_NETLIST dlg( this, netlistName );
51
52 dlg.ShowModal();
53
54 SetLastPath( LAST_PATH_NETLIST, netlistName );
55}
56
58
59
61 wxString& aNetlistFullFilename )
62 : DIALOG_IMPORT_NETLIST_BASE( aParent ),
63 m_parent( aParent ),
64 m_netlistPath( aNetlistFullFilename ),
65 m_initialized( false ),
66 m_runDragCommand( false )
67{
69 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
70
71 auto cfg = m_parent->GetPcbNewSettings();
72
73 m_cbUpdateFootprints->SetValue( cfg->m_NetlistDialog.update_footprints );
74 m_cbDeleteShortingTracks->SetValue( cfg->m_NetlistDialog.delete_shorting_tracks );
75 m_cbDeleteExtraFootprints->SetValue( cfg->m_NetlistDialog.delete_extra_footprints );
76
77 m_matchByTimestamp->SetSelection( m_matchByUUID ? 0 : 1 );
78
79 m_MessageWindow->SetLabel( _("Changes to Be Applied") );
80 m_MessageWindow->SetVisibleSeverities( cfg->m_NetlistDialog.report_filter );
81 m_MessageWindow->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
82
83 SetupStandardButtons( { { wxID_OK, _( "Load and Test Netlist" ) },
84 { wxID_CANCEL, _( "Close" ) },
85 { wxID_APPLY, _( "Update PCB" ) } } );
86
88
89 m_initialized = true;
90}
91
93{
94 m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
95
96 PCBNEW_SETTINGS* cfg = nullptr;
97
98 try
99 {
101 }
102 catch( const std::runtime_error& e )
103 {
104 wxFAIL_MSG( e.what() );
105 }
106
107 if( cfg )
108 {
113 }
114
115 if( m_runDragCommand )
116 {
118 controls->SetCursorPosition( controls->GetMousePosition() );
120 }
121}
122
123
125{
126 wxString dirPath = wxFileName( Prj().GetProjectFullName() ).GetPath();
127
128 wxString filename = m_parent->GetLastPath( LAST_PATH_NETLIST );
129
130 if( !filename.IsEmpty() )
131 {
132 wxFileName fn = filename;
133 dirPath = fn.GetPath();
134 filename = fn.GetFullName();
135 }
136
137 wxFileDialog FilesDialog( this, _( "Import Netlist" ), dirPath, filename,
139 wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
140
141 if( FilesDialog.ShowModal() != wxID_OK )
142 return;
143
144 m_NetlistFilenameCtrl->SetValue( FilesDialog.GetPath() );
145 onFilenameChanged( false );
146}
147
148
149
150void DIALOG_IMPORT_NETLIST::onImportNetlist( wxCommandEvent& event )
151{
152 onFilenameChanged( true );
153}
154
155
156void DIALOG_IMPORT_NETLIST::onUpdatePCB( wxCommandEvent& event )
157{
158 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
159
160 if( !fn.IsOk() )
161 {
162 wxMessageBox( _( "Please choose a valid netlist file." ) );
163 return;
164 }
165
166 if( !fn.FileExists() )
167 {
168 wxMessageBox( _( "The netlist file does not exist." ) );
169 return;
170 }
171
172 m_MessageWindow->SetLabel( _( "Changes Applied to PCB" ) );
173 loadNetlist( false );
174
175 m_sdbSizerCancel->SetDefault();
176 m_sdbSizerCancel->SetFocus();
177}
178
179
181{
182 event.Skip();
183}
184
185
187{
188 if( m_initialized )
189 {
190 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
191
192 if( fn.IsOk() )
193 {
194 if( fn.FileExists() )
195 {
197
198 if( aLoadNetlist )
199 loadNetlist( true );
200 }
201 else
202 {
204 REPORTER& reporter = m_MessageWindow->Reporter();
205 reporter.Report( _( "The netlist file does not exist." ), RPT_SEVERITY_ERROR );
206 }
207 }
208 }
209}
210
211
212void DIALOG_IMPORT_NETLIST::OnMatchChanged( wxCommandEvent& event )
213{
214 if( m_initialized )
215 loadNetlist( true );
216}
217
218
219void DIALOG_IMPORT_NETLIST::OnOptionChanged( wxCommandEvent& event )
220{
221 if( m_initialized )
222 loadNetlist( true );
223}
224
225
227{
228 wxString netlistFileName = m_NetlistFilenameCtrl->GetValue();
229 wxFileName fn = netlistFileName;
230
231 if( !fn.IsOk() || !fn.FileExists() )
232 return;
233
235 REPORTER& reporter = m_MessageWindow->Reporter();
236
237 wxBusyCursor busy;
238
239 wxString msg;
240 msg.Printf( _( "Reading netlist file '%s'.\n" ), netlistFileName );
241 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
242
243 if( m_matchByTimestamp->GetSelection() == 1 )
244 msg = _( "Using reference designators to match symbols and footprints.\n" );
245 else
246 msg = _( "Using tstamps (unique IDs) to match symbols and footprints.\n" );
247
248 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
249 m_MessageWindow->SetLazyUpdate( true ); // Use lazy update to speed the creation of the report
250 // (the window is not updated for each message)
251 m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
252
254
255 netlist.SetFindByTimeStamp( m_matchByUUID );
256 netlist.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
257
258 if( !m_parent->ReadNetlistFromFile( netlistFileName, netlist, reporter ) )
259 return;
260
262 updater.SetReporter ( &reporter );
263 updater.SetIsDryRun( aDryRun );
266 updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
267 updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
268 updater.UpdateNetlist( netlist );
269
270 // The creation of the report was made without window update: the full page must be displayed
271 m_MessageWindow->Flush( true );
272
273 if( aDryRun )
274 return;
275
277}
278
279
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...
int ShowModal() override
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:241
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:53
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:87
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:72
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:109
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:150
void Clear()
Clears the report panel.
void SetLazyUpdate(bool aLazyUpdate)
Set the lazy update.
void SetLabel(const wxString &aLabel) override
Set the frame label.
void SetFileName(const wxString &aReportFileName)
Set the report full file name to the string.
void SetVisibleSeverities(int aSeverities)
Set the visible severity filter.
void Flush(bool aSort=false)
Force updating the HTML page, after the report is built in lazy mode If aSort = true,...
REPORTER & Reporter()
Return the reporter object that reports to this panel.
This file is part of the common library.
#define _(s)
static wxString NetlistFileWildcard()
@ LAST_PATH_NETLIST
Definition: project_file.h:50
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
Definition of file extensions used in Kicad.