KiCad PCB EDA Suite
pcbnew/dialogs/dialog_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>
37 #include <project/project_file.h> // LAST_PATH_TYPE
38 
39 #include <dialog_netlist.h>
40 
41 #include <wx_html_report_panel.h>
42 #include <wx/filedlg.h>
43 
44 
46 {
47  wxString netlistName = GetLastPath( LAST_PATH_NETLIST );
48 
49  DIALOG_NETLIST_IMPORT dlg( this, netlistName );
50 
51  dlg.ShowModal();
52 
53  SetLastPath( LAST_PATH_NETLIST, netlistName );
54 }
55 
57 
58 
59 DIALOG_NETLIST_IMPORT::DIALOG_NETLIST_IMPORT( PCB_EDIT_FRAME* aParent, wxString& aNetlistFullFilename )
60  : DIALOG_NETLIST_IMPORT_BASE( aParent ),
61  m_parent( aParent ),
62  m_netlistPath( aNetlistFullFilename ),
63  m_initialized( false ),
64  m_runDragCommand( false )
65 {
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  m_sdbSizerApply->SetLabel( _( "Update PCB" ) );
82  m_sdbSizerCancel->SetLabel( _( "Close" ) );
83  m_sdbSizerOK->SetLabel( _( "Load and Test Netlist" ) );
84  m_buttonsSizer->Layout();
85 
86  m_sdbSizerOK->SetDefault();
88 
89  m_initialized = true;
90 }
91 
93 {
94  m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
95 
97 
102 
103  if( m_runDragCommand )
104  {
106  controls->SetCursorPosition( controls->GetMousePosition() );
108  }
109 }
110 
111 
112 void DIALOG_NETLIST_IMPORT::onBrowseNetlistFiles( wxCommandEvent& event )
113 {
114  wxString dirPath = wxFileName( Prj().GetProjectFullName() ).GetPath();
115 
116  wxString filename = m_parent->GetLastPath( LAST_PATH_NETLIST );
117 
118  if( !filename.IsEmpty() )
119  {
120  wxFileName fn = filename;
121  dirPath = fn.GetPath();
122  filename = fn.GetFullName();
123  }
124 
125  wxFileDialog FilesDialog( this, _( "Select Netlist" ), dirPath, filename,
126  NetlistFileWildcard(), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
127 
128  if( FilesDialog.ShowModal() != wxID_OK )
129  return;
130 
131  m_NetlistFilenameCtrl->SetValue( FilesDialog.GetPath() );
132  onFilenameChanged( false );
133 }
134 
135 
136 void DIALOG_NETLIST_IMPORT::onImportNetlist( wxCommandEvent& event )
137 {
138  onFilenameChanged( true );
139 }
140 
141 
142 void DIALOG_NETLIST_IMPORT::onUpdatePCB( wxCommandEvent& event )
143 {
144  wxFileName fn = m_NetlistFilenameCtrl->GetValue();
145 
146  if( !fn.IsOk() )
147  {
148  wxMessageBox( _( "Please choose a valid netlist file." ) );
149  return;
150  }
151 
152  if( !fn.FileExists() )
153  {
154  wxMessageBox( _( "The netlist file does not exist." ) );
155  return;
156  }
157 
158  m_MessageWindow->SetLabel( _( "Changes Applied to PCB" ) );
159  loadNetlist( false );
160 
161  m_sdbSizerCancel->SetDefault();
162  m_sdbSizerCancel->SetFocus();
163 }
164 
165 
167 {
168  event.Skip();
169 }
170 
171 
173 {
174  if( m_initialized )
175  {
176  wxFileName fn = m_NetlistFilenameCtrl->GetValue();
177 
178  if( fn.IsOk() )
179  {
180  if( fn.FileExists() )
181  {
182  m_netlistPath = m_NetlistFilenameCtrl->GetValue();
183 
184  if( aLoadNetlist )
185  loadNetlist( true );
186  }
187  else
188  {
190  REPORTER& reporter = m_MessageWindow->Reporter();
191  reporter.Report( _( "The netlist file does not exist." ), RPT_SEVERITY_ERROR );
192  }
193  }
194  }
195 }
196 
197 
198 void DIALOG_NETLIST_IMPORT::OnMatchChanged( wxCommandEvent& event )
199 {
200  if( m_initialized )
201  loadNetlist( true );
202 }
203 
204 
205 void DIALOG_NETLIST_IMPORT::OnOptionChanged( wxCommandEvent& event )
206 {
207  if( m_initialized )
208  loadNetlist( true );
209 }
210 
211 
213 {
214  wxString netlistFileName = m_NetlistFilenameCtrl->GetValue();
215  wxFileName fn = netlistFileName;
216 
217  if( !fn.IsOk() || !fn.FileExists() )
218  return;
219 
221  REPORTER& reporter = m_MessageWindow->Reporter();
222 
223  wxBusyCursor busy;
224 
225  wxString msg;
226  msg.Printf( _( "Reading netlist file '%s'.\n" ), netlistFileName );
227  reporter.ReportHead( msg, RPT_SEVERITY_INFO );
228 
229  if( m_matchByTimestamp->GetSelection() == 1 )
230  msg = _( "Using reference designators to match symbols and footprints.\n" );
231  else
232  msg = _( "Using tstamps (unique IDs) to match symbols and footprints.\n" );
233 
234  reporter.ReportHead( msg, RPT_SEVERITY_INFO );
235  m_MessageWindow->SetLazyUpdate( true ); // Use lazy update to speed the creation of the report
236  // (the window is not updated for each message)
237  m_matchByUUID = m_matchByTimestamp->GetSelection() == 0;
238 
240 
241  netlist.SetFindByTimeStamp( m_matchByUUID );
242  netlist.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
243 
244  if( !m_parent->ReadNetlistFromFile( netlistFileName, netlist, reporter ) )
245  return;
246 
248  updater.SetReporter ( &reporter );
249  updater.SetIsDryRun( aDryRun );
250  updater.SetLookupByTimestamp( m_matchByUUID );
251  updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue());
252  updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
253  updater.UpdateNetlist( netlist );
254 
255  // The creation of the report was made without window update: the full page must be displayed
256  m_MessageWindow->Flush( true );
257 
258  if( aDryRun )
259  return;
260 
262 }
263 
264 
void SetVisibleSeverities(int aSeverities)
static bool m_matchByUUID
void SetLazyUpdate(bool aLazyUpdate)
Forces updating the HTML page, after the report is built in lazy mode If aSort = true,...
void onImportNetlist(wxCommandEvent &event) override
static TOOL_ACTION move
move or drag an item
Definition: pcb_actions.h:92
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
This file is part of the common library.
Update the BOARD with a new netlist.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
bool ReadNetlistFromFile(const wxString &aFilename, NETLIST &aNetlist, REPORTER &aReporter)
Read a netlist from a file into a NETLIST object.
Definition: netlist.cpp:55
void Flush(bool aSort=false)
Set the visible severity filter.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
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.
void SetReporter(REPORTER *aReporter)
Enable dry run mode (just report, no changes to PCB).
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:70
void OnNetlistChanged(BOARD_NETLIST_UPDATER &aUpdater, bool *aRunDragCommand)
Called after netlist is updated.
Definition: netlist.cpp:89
DIALOG_NETLIST_IMPORT(PCB_EDIT_FRAME *aParent, wxString &aNetlistFullFilename)
Class DIALOG_NETLIST_IMPORT_BASE.
void onUpdatePCB(wxCommandEvent &event) override
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
void OnMatchChanged(wxCommandEvent &event) override
wxString GetLastPath(LAST_PATH_TYPE aType)
Get the last path for a particular type.
void OnFilenameKillFocus(wxFocusEvent &event) override
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition: pcb_netlist.h:206
DIALOG_NETLIST m_NetlistDialog
wxString NetlistFileWildcard()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Definition of file extensions used in Kicad.
An interface for classes handling user events controlling the view behavior such as zooming,...
#define _(s)
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:105
PCB_EDIT_FRAME * m_parent
void OnOptionChanged(wxCommandEvent &event) override
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
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void Clear()
return the number of messages matching the given severity mask.
The main frame for Pcbnew.
PCBNEW_SETTINGS * GetPcbNewSettings() const
void onFilenameChanged(bool aLoadNetlist)
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
BOARD * GetBoard() const
void SetFileName(const wxString &aReportFileName)
void SetLabel(const wxString &aLabel) override
Sets the lazy update.
void onBrowseNetlistFiles(wxCommandEvent &event) override
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.