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-2024 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;
69static bool g_setToSpecifiedValues = true;
70
71
73{
74public:
77
78protected:
79 void onActionButtonChange( wxCommandEvent& event ) override;
80
81 void OnNetclassFilterSelect( wxCommandEvent& event ) override
82 {
83 m_netclassFilterOpt->SetValue( true );
84 }
85 void OnLayerFilterSelect( wxCommandEvent& event ) override
86 {
87 m_layerFilterOpt->SetValue( true );
88 }
89 void OnTrackWidthText( wxCommandEvent& aEvent ) override
90 {
91 m_filterByTrackWidth->SetValue( true );
92 }
93 void OnViaSizeText( wxCommandEvent& aEvent ) override
94 {
95 m_filterByViaSize->SetValue( true );
96 }
97
98 void onUnitsChanged( wxCommandEvent& aEvent );
99
100private:
101 void visitItem( PICKED_ITEMS_LIST* aUndoList, PCB_TRACK* aItem );
102 void processItem( PICKED_ITEMS_LIST* aUndoList, PCB_TRACK* aItem );
103
104 bool TransferDataToWindow() override;
105 bool TransferDataFromWindow() override;
106
107 void OnNetFilterSelect( wxCommandEvent& event )
108 {
109 m_netFilterOpt->SetValue( true );
110 }
111
112 void buildFilterLists();
113
114private:
118
121
122 std::vector<BOARD_ITEM*> m_items_changed; // a list of modified items
123};
124
125
128 m_trackWidthFilter( aParent, nullptr, m_trackWidthFilterCtrl, m_trackWidthFilterUnits ),
129 m_viaSizeFilter( aParent, nullptr, m_viaSizeFilterCtrl, m_viaSizeFilterUnits )
130{
131 m_parent = aParent;
133
135
141
147
150
151 if( g_setToSpecifiedValues == true )
152 m_setToSpecifiedValues->SetValue( true );
153 else
154 m_setToDesignRuleValues->SetValue( true );
155
156 SetupStandardButtons( { { wxID_OK, _( "Apply and Close" ) },
157 { wxID_CANCEL, _( "Close" ) } } );
158
159 m_netFilter->Connect( FILTERED_ITEM_SELECTED,
161 nullptr, this );
162
164 this );
165
167}
168
169
171{
172 g_modifyTracks = m_tracks->GetValue();
173 g_modifyVias = m_vias->GetValue();
175 g_netclassFilter = m_netclassFilter->GetStringSelection();
176 g_filterByNet = m_netFilterOpt->GetValue();
178 g_filterByLayer = m_layerFilterOpt->GetValue();
186
187 m_netFilter->Disconnect( FILTERED_ITEM_SELECTED,
189 nullptr, this );
190
191 m_parent->Unbind( EDA_EVT_UNITS_CHANGED,
193}
194
195
197{
198 int trackSel = m_trackWidthCtrl->GetSelection();
199 int viaSel = m_viaSizesCtrl->GetSelection();
200
205
206 m_trackWidthCtrl->SetSelection( trackSel );
207 m_viaSizesCtrl->SetSelection( viaSel );
208
209 aEvent.Skip();
210}
211
212
214{
215 // Populate the net filter list with net names
218
219 if( !m_brd->GetHighLightNetCodes().empty() )
221
222 // Populate the netclass filter list with netclass names
223 wxArrayString netclassNames;
224 std::shared_ptr<NET_SETTINGS>& settings = m_brd->GetDesignSettings().m_NetSettings;
225
226 netclassNames.push_back( settings->GetDefaultNetclass()->GetName() );
227
228 for( const auto& [name, netclass] : settings->GetNetclasses() )
229 netclassNames.push_back( name );
230
231 m_netclassFilter->Set( netclassNames );
233
234 // Populate the layer filter list
240}
241
242
244{
246 m_selection = selTool->GetSelection();
248
249 m_tracks->SetValue( g_modifyTracks );
250 m_vias->SetValue( g_modifyVias );
251
252 if( g_filterByNetclass && m_netclassFilter->SetStringSelection( g_netclassFilter ) )
253 {
254 m_netclassFilterOpt->SetValue( true );
255 }
256 else if( item )
257 {
258 m_netclassFilter->SetStringSelection(
260 }
261
262 if( g_filterByNet && m_brd->FindNet( g_netFilter ) != nullptr )
263 {
265 m_netFilterOpt->SetValue( true );
266 }
267 else if( item )
268 {
270 }
271
273 {
274 m_layerFilterOpt->SetValue( true );
275 }
276 else if( item )
277 {
278 if( item->Type() == PCB_ZONE_T ) // a zone can be on more than one layer
279 m_layerFilter->SetLayerSelection( static_cast<ZONE*>(item)->GetFirstLayer() );
280 else
282 }
283
285 {
286 m_filterByTrackWidth->SetValue( true );
288 }
289
291 {
292 m_filterByViaSize->SetValue( true );
294 }
295
296 m_trackWidthCtrl->SetSelection( (int) m_trackWidthCtrl->GetCount() - 1 );
297 m_viaSizesCtrl->SetSelection( (int) m_viaSizesCtrl->GetCount() - 1 );
298 m_annularRingsCtrl->SetSelection( (int) m_annularRingsCtrl->GetCount() - 1 );
299 m_layerCtrl->SetStringSelection( INDETERMINATE_ACTION );
300
302
303 wxCommandEvent dummy;
305
306 return true;
307}
308
309
311{
312 // Enable the items in the use specified values section
313 bool enable = m_setToSpecifiedValues->GetValue();
314
315 m_trackWidthLabel->Enable( enable );
316 m_trackWidthCtrl->Enable( enable );
317 m_viaSizeLabel->Enable( enable );
318 m_viaSizesCtrl->Enable( enable );
319 m_annularRingsLabel->Enable( enable );
320 m_annularRingsCtrl->Enable( enable );
321 m_layerLabel->Enable( enable );
322 m_layerCtrl->Enable( enable );
323}
324
325
327 PCB_TRACK* aItem )
328{
330 bool isTrack = aItem->Type() == PCB_TRACE_T;
331 bool isArc = aItem->Type() == PCB_ARC_T;
332 bool isVia = aItem->Type() == PCB_VIA_T;
333
334 if( m_setToSpecifiedValues->GetValue() )
335 {
336 if( ( isArc || isTrack ) && m_trackWidthCtrl->GetStringSelection() != INDETERMINATE_ACTION )
337 {
338 unsigned int prevTrackWidthIndex = brdSettings.GetTrackWidthIndex();
339 int trackWidthIndex = m_trackWidthCtrl->GetSelection();
340
341 if( trackWidthIndex >= 0 )
342 brdSettings.SetTrackWidthIndex( static_cast<unsigned>( trackWidthIndex + 1 ) );
343
344 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
345
346 brdSettings.SetTrackWidthIndex( prevTrackWidthIndex );
347 }
348
349 if( isVia && m_viaSizesCtrl->GetStringSelection() != INDETERMINATE_ACTION )
350 {
351 unsigned int prevViaSizeIndex = brdSettings.GetViaSizeIndex();
352 int viaSizeIndex = m_viaSizesCtrl->GetSelection();
353
354 if( viaSizeIndex >= 0 )
355 brdSettings.SetViaSizeIndex( static_cast<unsigned>( viaSizeIndex + 1 ) );
356
357 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
358
359 brdSettings.SetViaSizeIndex( prevViaSizeIndex );
360 }
361
362 if( isVia && m_annularRingsCtrl->GetStringSelection() != INDETERMINATE_ACTION )
363 {
364 PCB_VIA* v = static_cast<PCB_VIA*>( aItem );
365
366 switch( m_annularRingsCtrl->GetSelection() )
367 {
368 case 0:
371 break;
372 case 1:
375 break;
376 case 2:
379 break;
380 default:
381 break;
382 }
383 }
384
385 if( ( isArc || isTrack ) && m_layerCtrl->GetLayerSelection() != UNDEFINED_LAYER )
386 {
387 if( aUndoList->FindItem( aItem ) < 0 )
388 {
389 ITEM_PICKER picker( nullptr, aItem, UNDO_REDO::CHANGED );
390 picker.SetLink( aItem->Clone() );
391 aUndoList->PushItem( picker );
392 }
393
395 m_parent->GetBoard()->GetConnectivity()->Update( aItem );
396 }
397 }
398 else
399 {
400 m_parent->SetTrackSegmentWidth( aItem, aUndoList, true );
401 }
402
403 m_items_changed.push_back( aItem );
404}
405
406
408{
409 if( m_selectedItemsFilter->GetValue() )
410 {
411 if( !aItem->IsSelected() )
412 {
413 PCB_GROUP* group = aItem->GetParentGroup();
414
415 while( group && !group->IsSelected() )
416 group = group->GetParentGroup();
417
418 if( !group )
419 return;
420 }
421 }
422
423 if( m_netFilterOpt->GetValue() && m_netFilter->GetSelectedNetcode() >= 0 )
424 {
425 if( aItem->GetNetCode() != m_netFilter->GetSelectedNetcode() )
426 return;
427 }
428
429 if( m_netclassFilterOpt->GetValue() && !m_netclassFilter->GetStringSelection().IsEmpty() )
430 {
431 wxString filterNetclass = m_netclassFilter->GetStringSelection();
432 NETCLASS* netclass = aItem->GetEffectiveNetClass();
433
434 if( !netclass->ContainsNetclassWithName( filterNetclass ) )
435 return;
436 }
437
439 {
440 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
441 return;
442 }
443
444 if( aItem->Type() == PCB_VIA_T )
445 {
446 if( m_filterByViaSize->GetValue() && aItem->GetWidth() != m_viaSizeFilter.GetValue() )
447 return;
448 }
449 else
450 {
451 if( m_filterByTrackWidth->GetValue() && aItem->GetWidth() != m_trackWidthFilter.GetValue() )
452 return;
453 }
454
455 processItem( aUndoList, aItem );
456}
457
458
460{
461 PICKED_ITEMS_LIST itemsListPicker;
462 wxBusyCursor dummy;
463
464 // Examine segments
465 for( PCB_TRACK* track : m_brd->Tracks() )
466 {
467 if( m_tracks->GetValue() && track->Type() == PCB_TRACE_T )
468 visitItem( &itemsListPicker, track );
469 else if ( m_tracks->GetValue() && track->Type() == PCB_ARC_T )
470 visitItem( &itemsListPicker, track );
471 else if ( m_vias->GetValue() && track->Type() == PCB_VIA_T )
472 visitItem( &itemsListPicker, track );
473 }
474
475 if( itemsListPicker.GetCount() > 0 )
476 {
477 m_parent->SaveCopyInUndoList( itemsListPicker, UNDO_REDO::CHANGED );
478
479 for( PCB_TRACK* track : m_brd->Tracks() )
480 m_parent->GetCanvas()->GetView()->Update( track );
481 }
482
484
485 if( m_items_changed.size() )
486 {
489 }
490
491 return true;
492}
493
494
496{
497 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
498 DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS dlg( editFrame );
499
500 dlg.ShowQuasiModal(); // QuasiModal required for NET_SELECTOR
501 return 0;
502}
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:237
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:90
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:288
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
const NETINFO_LIST & GetNetInfo() const
Definition: board.h:871
const std::set< int > & GetHighLightNetCodes() const
Definition: board.h:532
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
Definition: board.cpp:1921
int GetCopperLayerCount() const
Definition: board.cpp:741
const TRACKS & Tracks() const
Definition: board.h:329
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:895
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:2699
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:475
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:687
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:307
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:68
virtual int GetWidth() const
Definition: pcb_track.h:116
const PADSTACK & Padstack() const
Definition: pcb_track.h:412
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:129
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:453
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 bool g_setToSpecifiedValues
static wxString g_netFilter
static bool g_modifyVias
static bool g_modifyTracks
static bool g_filterByTrackWidth
static bool g_filterByLayer
#define _(s)
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:810
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