KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_global_edit_tracks_and_vias.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) 2009-2016 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr
5 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <algorithm>
26
27#include <pcb_edit_frame.h>
28#include <widgets/unit_binder.h>
29#include <board.h>
31#include <pcb_track.h>
32#include <pcb_group.h>
35#include <tool/tool_manager.h>
39
40
41// Columns of netclasses grid
42enum {
49 GRID_DIFF_PAIR_WIDTH, // not currently included in grid
50 GRID_DIFF_PAIR_GAP, // not currently included in grid
51 GRID_DIFF_PAIR_VIA_GAP // not currently included in grid
52};
53
54
55// Globals to remember control settings during a session
56static bool g_modifyTracks = true;
57static bool g_modifyVias = true;
59static wxString g_netclassFilter;
60static bool g_filterByNet;
61static wxString g_netFilter;
62static bool g_filterByLayer;
63static int g_layerFilter;
64static bool g_filterByTrackWidth = false;
65static int g_trackWidthFilter = 0;
66static bool g_filterByViaSize = false;
67static int g_viaSizeFilter = 0;
68static bool g_filterSelected = false;
69
70
72{
73public:
76
77protected:
78 void onActionButtonChange( wxCommandEvent& event ) override;
79
80 void OnNetclassFilterSelect( wxCommandEvent& event ) override
81 {
82 m_netclassFilterOpt->SetValue( true );
83 }
84 void OnLayerFilterSelect( wxCommandEvent& event ) override
85 {
86 m_layerFilterOpt->SetValue( true );
87 }
88 void OnTrackWidthText( wxCommandEvent& aEvent ) override
89 {
90 m_filterByTrackWidth->SetValue( true );
91 }
92 void OnViaSizeText( wxCommandEvent& aEvent ) override
93 {
94 m_filterByViaSize->SetValue( true );
95 }
96
97 void onUnitsChanged( wxCommandEvent& aEvent );
98
99private:
100 void visitItem( PICKED_ITEMS_LIST* aUndoList, PCB_TRACK* aItem );
101 void processItem( PICKED_ITEMS_LIST* aUndoList, PCB_TRACK* aItem );
102
103 bool TransferDataToWindow() override;
104 bool TransferDataFromWindow() override;
105
106 void OnNetFilterSelect( wxCommandEvent& event )
107 {
108 m_netFilterOpt->SetValue( true );
109 }
110
111 void buildFilterLists();
112
113private:
117
120
121 std::vector<BOARD_ITEM*> m_items_changed; // a list of modified items
122};
123
124
127 m_trackWidthFilter( aParent, nullptr, m_trackWidthFilterCtrl, m_trackWidthFilterUnits ),
128 m_viaSizeFilter( aParent, nullptr, m_viaSizeFilterCtrl, m_viaSizeFilterUnits )
129{
130 m_parent = aParent;
132
134
140
146
149
151
152 m_netFilter->Connect( NET_SELECTED,
154 nullptr, this );
155
157 this );
158
160}
161
162
164{
165 g_modifyTracks = m_tracks->GetValue();
166 g_modifyVias = m_vias->GetValue();
168 g_netclassFilter = m_netclassFilter->GetStringSelection();
169 g_filterByNet = m_netFilterOpt->GetValue();
171 g_filterByLayer = m_layerFilterOpt->GetValue();
178
179 m_netFilter->Disconnect( NET_SELECTED,
181 nullptr, this );
182
183 m_parent->Unbind( EDA_EVT_UNITS_CHANGED,
185}
186
187
189{
190 int trackSel = m_trackWidthCtrl->GetSelection();
191 int viaSel = m_viaSizesCtrl->GetSelection();
192
197
198 m_trackWidthCtrl->SetSelection( trackSel );
199 m_viaSizesCtrl->SetSelection( viaSel );
200
201 aEvent.Skip();
202}
203
204
206{
207 // Populate the net filter list with net names
210
211 if( !m_brd->GetHighLightNetCodes().empty() )
213
214 // Populate the netclass filter list with netclass names
215 wxArrayString netclassNames;
216 std::shared_ptr<NET_SETTINGS>& settings = m_brd->GetDesignSettings().m_NetSettings;
217
218 netclassNames.push_back( settings->GetDefaultNetclass()->GetName() );
219
220 for( const auto& [name, netclass] : settings->GetNetclasses() )
221 netclassNames.push_back( name );
222
223 m_netclassFilter->Set( netclassNames );
225
226 // Populate the layer filter list
232}
233
234
236{
238 m_selection = selTool->GetSelection();
240
241 m_tracks->SetValue( g_modifyTracks );
242 m_vias->SetValue( g_modifyVias );
243
244 if( g_filterByNetclass && m_netclassFilter->SetStringSelection( g_netclassFilter ) )
245 {
246 m_netclassFilterOpt->SetValue( true );
247 }
248 else if( item )
249 {
250 m_netclassFilter->SetStringSelection(
252 }
253
254 if( g_filterByNet && m_brd->FindNet( g_netFilter ) != nullptr )
255 {
257 m_netFilterOpt->SetValue( true );
258 }
259 else if( item )
260 {
262 }
263
265 {
266 m_layerFilterOpt->SetValue( true );
267 }
268 else if( item )
269 {
270 if( item->Type() == PCB_ZONE_T ) // a zone can be on more than one layer
271 m_layerFilter->SetLayerSelection( static_cast<ZONE*>(item)->GetFirstLayer() );
272 else
274 }
275
277 {
278 m_filterByTrackWidth->SetValue( true );
280 }
281
283 {
284 m_filterByViaSize->SetValue( true );
286 }
287
288 m_trackWidthCtrl->SetSelection( (int) m_trackWidthCtrl->GetCount() - 1 );
289 m_viaSizesCtrl->SetSelection( (int) m_viaSizesCtrl->GetCount() - 1 );
290 m_annularRingsCtrl->SetSelection( (int) m_annularRingsCtrl->GetCount() - 1 );
291 m_layerCtrl->SetStringSelection( INDETERMINATE_ACTION );
292
294
295 wxCommandEvent dummy;
297
298 return true;
299}
300
301
303{
304 // Enable the items in the use specified values section
305 bool enable = m_setToSpecifiedValues->GetValue();
306
307 m_trackWidthLabel->Enable( enable );
308 m_trackWidthCtrl->Enable( enable );
309 m_viaSizeLabel->Enable( enable );
310 m_viaSizesCtrl->Enable( enable );
311 m_annularRingsLabel->Enable( enable );
312 m_annularRingsCtrl->Enable( enable );
313 m_layerLabel->Enable( enable );
314 m_layerCtrl->Enable( enable );
315}
316
317
319 PCB_TRACK* aItem )
320{
322 bool isTrack = aItem->Type() == PCB_TRACE_T;
323 bool isArc = aItem->Type() == PCB_ARC_T;
324 bool isVia = aItem->Type() == PCB_VIA_T;
325
326 if( m_setToSpecifiedValues->GetValue() )
327 {
328 if( ( isArc || isTrack ) && m_trackWidthCtrl->GetStringSelection() != INDETERMINATE_ACTION )
329 {
330 unsigned int prevTrackWidthIndex = brdSettings.GetTrackWidthIndex();
331 int trackWidthIndex = m_trackWidthCtrl->GetSelection();
332
333 if( trackWidthIndex >= 0 )
334 brdSettings.SetTrackWidthIndex( static_cast<unsigned>( trackWidthIndex + 1 ) );
335
336 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
337
338 brdSettings.SetTrackWidthIndex( prevTrackWidthIndex );
339 }
340
341 if( isVia && m_viaSizesCtrl->GetStringSelection() != INDETERMINATE_ACTION )
342 {
343 unsigned int prevViaSizeIndex = brdSettings.GetViaSizeIndex();
344 int viaSizeIndex = m_viaSizesCtrl->GetSelection();
345
346 if( viaSizeIndex >= 0 )
347 brdSettings.SetViaSizeIndex( static_cast<unsigned>( viaSizeIndex + 1 ) );
348
349 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
350
351 brdSettings.SetViaSizeIndex( prevViaSizeIndex );
352 }
353
354 if( isVia && m_annularRingsCtrl->GetStringSelection() != INDETERMINATE_ACTION )
355 {
356 PCB_VIA* v = static_cast<PCB_VIA*>( aItem );
357
358 switch( m_annularRingsCtrl->GetSelection() )
359 {
360 case 0:
363 break;
364 case 1:
367 break;
368 case 2:
371 break;
372 default:
373 break;
374 }
375 }
376
377 if( ( isArc || isTrack ) && m_layerCtrl->GetLayerSelection() != UNDEFINED_LAYER )
378 {
379 if( aUndoList->FindItem( aItem ) < 0 )
380 {
381 ITEM_PICKER picker( nullptr, aItem, UNDO_REDO::CHANGED );
382 picker.SetLink( aItem->Clone() );
383 aUndoList->PushItem( picker );
384 }
385
387 m_parent->GetBoard()->GetConnectivity()->Update( aItem );
388 }
389 }
390 else
391 {
392 m_parent->SetTrackSegmentWidth( aItem, aUndoList, true );
393 }
394
395 m_items_changed.push_back( aItem );
396}
397
398
400{
401 if( m_selectedItemsFilter->GetValue() )
402 {
403 if( !aItem->IsSelected() )
404 {
405 PCB_GROUP* group = aItem->GetParentGroup();
406
407 while( group && !group->IsSelected() )
408 group = group->GetParentGroup();
409
410 if( !group )
411 return;
412 }
413 }
414
415 if( m_netFilterOpt->GetValue() && m_netFilter->GetSelectedNetcode() >= 0 )
416 {
417 if( aItem->GetNetCode() != m_netFilter->GetSelectedNetcode() )
418 return;
419 }
420
421 if( m_netclassFilterOpt->GetValue() && !m_netclassFilter->GetStringSelection().IsEmpty() )
422 {
423 wxString filterNetclass = m_netclassFilter->GetStringSelection();
424 NETCLASS* netclass = aItem->GetEffectiveNetClass();
425
426 if( !netclass->ContainsNetclassWithName( filterNetclass ) )
427 return;
428 }
429
431 {
432 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
433 return;
434 }
435
436 if( aItem->Type() == PCB_VIA_T )
437 {
438 if( m_filterByViaSize->GetValue() && aItem->GetWidth() != m_viaSizeFilter.GetValue() )
439 return;
440 }
441 else
442 {
443 if( m_filterByTrackWidth->GetValue() && aItem->GetWidth() != m_trackWidthFilter.GetValue() )
444 return;
445 }
446
447 processItem( aUndoList, aItem );
448}
449
450
452{
453 PICKED_ITEMS_LIST itemsListPicker;
454 wxBusyCursor dummy;
455
456 // Examine segments
457 for( PCB_TRACK* track : m_brd->Tracks() )
458 {
459 if( m_tracks->GetValue() && track->Type() == PCB_TRACE_T )
460 visitItem( &itemsListPicker, track );
461 else if ( m_tracks->GetValue() && track->Type() == PCB_ARC_T )
462 visitItem( &itemsListPicker, track );
463 else if ( m_vias->GetValue() && track->Type() == PCB_VIA_T )
464 visitItem( &itemsListPicker, track );
465 }
466
467 if( itemsListPicker.GetCount() > 0 )
468 {
469 m_parent->SaveCopyInUndoList( itemsListPicker, UNDO_REDO::CHANGED );
470
471 for( PCB_TRACK* track : m_brd->Tracks() )
472 m_parent->GetCanvas()->GetView()->Update( track );
473 }
474
476
477 if( m_items_changed.size() )
478 {
481 }
482
483 return true;
484}
485
486
488{
489 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
490 DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS dlg( editFrame );
491
492 dlg.ShowQuasiModal(); // QuasiModal required for NET_SELECTOR
493 return 0;
494}
495
const char * name
Definition: DXF_plotter.cpp:57
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this item.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
Container for design settings for a BOARD object.
std::shared_ptr< NET_SETTINGS > m_NetSettings
const wxString & GetCurrentNetClassName() const
void SetTrackWidthIndex(unsigned aIndex)
Set the current track width list index to aIndex.
void SetViaSizeIndex(unsigned aIndex)
Set the current via size list index to aIndex.
unsigned GetTrackWidthIndex() const
unsigned GetViaSizeIndex() const
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:240
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:93
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:276
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:289
const NETINFO_LIST & GetNetInfo() const
Definition: board.h:864
const std::set< int > & GetHighLightNetCodes() const
Definition: board.h:531
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
Definition: board.cpp:1903
int GetCopperLayerCount() const
Definition: board.cpp:736
const TRACKS & Tracks() const
Definition: board.h:328
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:877
void OnItemsChanged(std::vector< BOARD_ITEM * > &aItems)
Notify the board and its listeners that an item on the board has been modified in some way.
Definition: board.cpp:2681
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:474
Class DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS_BASE.
void OnTrackWidthText(wxCommandEvent &aEvent) override
void OnLayerFilterSelect(wxCommandEvent &event) override
void visitItem(PICKED_ITEMS_LIST *aUndoList, PCB_TRACK *aItem)
void OnViaSizeText(wxCommandEvent &aEvent) override
void OnNetclassFilterSelect(wxCommandEvent &event) override
void onActionButtonChange(wxCommandEvent &event) override
void processItem(PICKED_ITEMS_LIST *aUndoList, PCB_TRACK *aItem)
void SetupStandardButtons(std::map< int, wxString > aLabels={})
int ShowQuasiModal()
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void ForceRefresh()
Force a redraw.
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
bool IsSelected() const
Definition: eda_item.h:110
int EditTracksAndVias(const TOOL_EVENT &aEvent)
void SetLink(EDA_ITEM *aItem)
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: pcb_view.cpp:91
int SetLayerSelection(int layer)
bool SetLayersHotkeys(bool value)
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:753
A collection of nets and the parameters used to route or test these nets.
Definition: netclass.h:44
bool ContainsNetclassWithName(const wxString &netclass) const
Determines if the given netclass name is a constituent of this (maybe aggregate) netclass.
Definition: netclass.cpp:141
const wxString GetVariableSubstitutionName() const
Gets the name of this (maybe aggregate) netclass in a format for label variable substitutions.
Definition: netclass.cpp:179
NETCLASS * GetNetClass()
Definition: netinfo.h:101
void SetNetInfo(const NETINFO_LIST *aNetInfoList)
void SetBoard(BOARD *aBoard)
int GetSelectedNetcode()
void SetSelectedNetcode(int aNetcode)
void SetSelectedNet(const wxString &aNetname)
wxString GetSelectedNetname()
void SetUnconnectedLayerMode(UNCONNECTED_LAYER_MODE aMode)
Definition: padstack.h:273
void SaveCopyInUndoList(EDA_ITEM *aItemToCopy, UNDO_REDO aTypeCommand) override
Create a new entry in undo list of commands.
Definition: undo_redo.cpp:163
virtual PCB_LAYER_ID GetActiveLayer() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
BOARD * GetBoard() const
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
The main frame for Pcbnew.
void OnModify() override
Must be called after a board change to set the modified flag.
void UpdateTrackWidthSelectBox(wxChoice *aTrackWidthSelectBox, bool aShowNetclass, bool aShowEdit)
void UpdateViaSizeSelectBox(wxChoice *aViaSizeSelectBox, bool aShowNetclass, bool aShowEdit)
void SetTrackSegmentWidth(PCB_TRACK *aItem, PICKED_ITEMS_LIST *aItemsListPicker, bool aUseDesignRules)
Modify one track segment width or one via diameter (using DRC control).
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:52
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void SetNotAllowedLayerSet(LSET aMask)
void SetUndefinedLayerName(const wxString &aName)
The selection tool: currently supports:
PCB_SELECTION & GetSelection()
virtual EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_track.cpp:63
virtual int GetWidth() const
Definition: pcb_track.h:116
const PADSTACK & Padstack() const
Definition: pcb_track.h:380
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
int FindItem(const EDA_ITEM *aItem) const
unsigned GetCount() const
EDA_ITEM * Front() const
Definition: selection.h:172
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
Generic, UI-independent tool event.
Definition: tool_event.h:167
int GetIntValue()
Definition: unit_binder.h:127
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
Handle a list of polygons defining a copper zone.
Definition: zone.h:73
PCB_LAYER_ID GetFirstLayer() const
Definition: zone.cpp:251
static bool g_filterByNet
static wxString g_netclassFilter
static bool g_filterByNetclass
static int g_layerFilter
static int g_trackWidthFilter
static bool g_filterSelected
static int g_viaSizeFilter
static bool g_filterByViaSize
static wxString g_netFilter
static bool g_modifyVias
static bool g_modifyTracks
static bool g_filterByTrackWidth
static bool g_filterByLayer
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:875
Class to handle a set of BOARD_ITEMs.
std::vector< FAB_LAYER_COLOR > dummy
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:97
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:107
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition: typeinfo.h:98
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
#define INDETERMINATE_ACTION
Definition: ui_common.h:47