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-2022 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( KiBitmap( 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
95
100
101 if( m_runDragCommand )
102 {
104 controls->SetCursorPosition( controls->GetMousePosition() );
106 }
107}
108
109
111{
112 wxString dirPath = wxFileName( Prj().GetProjectFullName() ).GetPath();
113
114 wxString filename = m_parent->GetLastPath( LAST_PATH_NETLIST );
115
116 if( !filename.IsEmpty() )
117 {
118 wxFileName fn = filename;
119 dirPath = fn.GetPath();
120 filename = fn.GetFullName();
121 }
122
123 wxFileDialog FilesDialog( this, _( "Select Netlist" ), dirPath, filename,
124 NetlistFileWildcard(), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
125
126 if( FilesDialog.ShowModal() != wxID_OK )
127 return;
128
129 m_NetlistFilenameCtrl->SetValue( FilesDialog.GetPath() );
130 onFilenameChanged( false );
131}
132
133
134
135void DIALOG_IMPORT_NETLIST::onImportNetlist( wxCommandEvent& event )
136{
137 onFilenameChanged( true );
138}
139
140
141void DIALOG_IMPORT_NETLIST::onUpdatePCB( wxCommandEvent& event )
142{
143 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
144
145 if( !fn.IsOk() )
146 {
147 wxMessageBox( _( "Please choose a valid netlist file." ) );
148 return;
149 }
150
151 if( !fn.FileExists() )
152 {
153 wxMessageBox( _( "The netlist file does not exist." ) );
154 return;
155 }
156
157 m_MessageWindow->SetLabel( _( "Changes Applied to PCB" ) );
158 loadNetlist( false );
159
160 m_sdbSizerCancel->SetDefault();
161 m_sdbSizerCancel->SetFocus();
162}
163
164
166{
167 event.Skip();
168}
169
170
172{
173 if( m_initialized )
174 {
175 wxFileName fn = m_NetlistFilenameCtrl->GetValue();
176
177 if( fn.IsOk() )
178 {
179 if( fn.FileExists() )
180 {
182
183 if( aLoadNetlist )
184 loadNetlist( true );
185 }
186 else
187 {
189 REPORTER& reporter = m_MessageWindow->Reporter();
190 reporter.Report( _( "The netlist file does not exist." ), RPT_SEVERITY_ERROR );
191 }
192 }
193 }
194}
195
196
197void DIALOG_IMPORT_NETLIST::OnMatchChanged( wxCommandEvent& event )
198{
199 if( m_initialized )
200 loadNetlist( true );
201}
202
203
204void DIALOG_IMPORT_NETLIST::OnOptionChanged( wxCommandEvent& event )
205{
206 if( m_initialized )
207 loadNetlist( true );
208}
209
210
212{
213 wxString netlistFileName = m_NetlistFilenameCtrl->GetValue();
214 wxFileName fn = netlistFileName;
215
216 if( !fn.IsOk() || !fn.FileExists() )
217 return;
218
220 REPORTER& reporter = m_MessageWindow->Reporter();
221
222 wxBusyCursor busy;
223
224 wxString msg;
225 msg.Printf( _( "Reading netlist file '%s'.\n" ), netlistFileName );
226 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
227
228 if( m_matchByTimestamp->GetSelection() == 1 )
229 msg = _( "Using reference designators to match symbols and footprints.\n" );
230 else
231 msg = _( "Using tstamps (unique IDs) to match symbols and footprints.\n" );
232
233 reporter.ReportHead( msg, RPT_SEVERITY_INFO );
234 m_MessageWindow->SetLazyUpdate( true ); // Use lazy update to speed the creation of the report
235 // (the window is not updated for each message)
236 m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
237
239
240 netlist.SetFindByTimeStamp( m_matchByUUID );
241 netlist.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
242
243 if( !m_parent->ReadNetlistFromFile( netlistFileName, netlist, reporter ) )
244 return;
245
247 updater.SetReporter ( &reporter );
248 updater.SetIsDryRun( aDryRun );
251 updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
252 updater.UpdateNetlist( netlist );
253
254 // The creation of the report was made without window update: the full page must be displayed
255 m_MessageWindow->Flush( true );
256
257 if( aDryRun )
258 return;
259
261}
262
263
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:106
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 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:119
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:50
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:84
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)
wxString NetlistFileWildcard()
@ LAST_PATH_NETLIST
Definition: project_file.h:49
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
Definition of file extensions used in Kicad.