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 The 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
74 m_trackWidthFilter( aParent, nullptr, m_trackWidthFilterCtrl, m_trackWidthFilterUnits ),
75 m_viaSizeFilter( aParent, nullptr, m_viaSizeFilterCtrl, m_viaSizeFilterUnits )
76{
77 m_parent = aParent;
79
81
87
93
94 if( g_setToSpecifiedValues == true )
95 m_setToSpecifiedValues->SetValue( true );
96 else
97 m_setToDesignRuleValues->SetValue( true );
98
99 SetupStandardButtons( { { wxID_OK, _( "Apply and Close" ) },
100 { wxID_CANCEL, _( "Close" ) } } );
101
102 m_netFilter->Connect( FILTERED_ITEM_SELECTED,
104 nullptr, this );
105
107 this );
108
110}
111
112
114{
115 g_modifyTracks = m_tracks->GetValue();
116 g_modifyVias = m_vias->GetValue();
118 g_netclassFilter = m_netclassFilter->GetStringSelection();
119 g_filterByNet = m_netFilterOpt->GetValue();
121 g_filterByLayer = m_layerFilterOpt->GetValue();
129
130 m_netFilter->Disconnect( FILTERED_ITEM_SELECTED,
132 nullptr, this );
133
134 m_parent->Unbind( EDA_EVT_UNITS_CHANGED,
136}
137
138
140{
141 int trackSel = m_trackWidthCtrl->GetSelection();
142 int viaSel = m_viaSizesCtrl->GetSelection();
143
148
149 m_trackWidthCtrl->SetSelection( trackSel );
150 m_viaSizesCtrl->SetSelection( viaSel );
151
152 aEvent.Skip();
153}
154
155
157{
158 // Populate the net filter list with net names
161
162 if( !m_brd->GetHighLightNetCodes().empty() )
164
165 // Populate the netclass filter list with netclass names
166 wxArrayString netclassNames;
167 std::shared_ptr<NET_SETTINGS>& settings = m_brd->GetDesignSettings().m_NetSettings;
168
169 netclassNames.push_back( settings->GetDefaultNetclass()->GetName() );
170
171 for( const auto& [name, netclass] : settings->GetNetclasses() )
172 netclassNames.push_back( name );
173
174 m_netclassFilter->Set( netclassNames );
176
177 // Populate the layer filter list
183}
184
185
187{
189 m_selection = selTool->GetSelection();
191
192 m_tracks->SetValue( g_modifyTracks );
193 m_vias->SetValue( g_modifyVias );
194
195 if( g_filterByNetclass && m_netclassFilter->SetStringSelection( g_netclassFilter ) )
196 {
197 m_netclassFilterOpt->SetValue( true );
198 }
199 else if( item )
200 {
201 m_netclassFilter->SetStringSelection( item->GetNet()->GetNetClass()->GetName() );
202 }
203
204 if( g_filterByNet && m_brd->FindNet( g_netFilter ) != nullptr )
205 {
207 m_netFilterOpt->SetValue( true );
208 }
209 else if( item )
210 {
212 }
213
215 {
216 m_layerFilterOpt->SetValue( true );
217 }
218 else if( item )
219 {
220 if( item->Type() == PCB_ZONE_T ) // a zone can be on more than one layer
221 m_layerFilter->SetLayerSelection( static_cast<ZONE*>(item)->GetFirstLayer() );
222 else
224 }
225
227 {
228 m_filterByTrackWidth->SetValue( true );
230 }
231
233 {
234 m_filterByViaSize->SetValue( true );
236 }
237
238 m_trackWidthCtrl->SetSelection( (int) m_trackWidthCtrl->GetCount() - 1 );
239 m_viaSizesCtrl->SetSelection( (int) m_viaSizesCtrl->GetCount() - 1 );
240 m_annularRingsCtrl->SetSelection( (int) m_annularRingsCtrl->GetCount() - 1 );
241 m_layerCtrl->SetStringSelection( INDETERMINATE_ACTION );
242
244
245 wxCommandEvent dummy;
247
248 return true;
249}
250
251
253{
254 // Enable the items in the use specified values section
255 bool enable = m_setToSpecifiedValues->GetValue();
256
257 m_trackWidthLabel->Enable( enable );
258 m_trackWidthCtrl->Enable( enable );
259 m_viaSizeLabel->Enable( enable );
260 m_viaSizesCtrl->Enable( enable );
261 m_annularRingsLabel->Enable( enable );
262 m_annularRingsCtrl->Enable( enable );
263 m_layerLabel->Enable( enable );
264 m_layerCtrl->Enable( enable );
265}
266
267
269 PCB_TRACK* aItem )
270{
272 bool isTrack = aItem->Type() == PCB_TRACE_T;
273 bool isArc = aItem->Type() == PCB_ARC_T;
274 bool isVia = aItem->Type() == PCB_VIA_T;
275
276 if( m_setToSpecifiedValues->GetValue() )
277 {
278 if( ( isArc || isTrack ) && m_trackWidthCtrl->GetStringSelection() != INDETERMINATE_ACTION )
279 {
280 unsigned int prevTrackWidthIndex = brdSettings.GetTrackWidthIndex();
281 int trackWidthIndex = m_trackWidthCtrl->GetSelection();
282
283 if( trackWidthIndex >= 0 )
284 brdSettings.SetTrackWidthIndex( static_cast<unsigned>( trackWidthIndex + 1 ) );
285
286 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
287
288 brdSettings.SetTrackWidthIndex( prevTrackWidthIndex );
289 }
290
291 if( isVia && m_viaSizesCtrl->GetStringSelection() != INDETERMINATE_ACTION )
292 {
293 unsigned int prevViaSizeIndex = brdSettings.GetViaSizeIndex();
294 int viaSizeIndex = m_viaSizesCtrl->GetSelection();
295
296 if( viaSizeIndex >= 0 )
297 brdSettings.SetViaSizeIndex( static_cast<unsigned>( viaSizeIndex + 1 ) );
298
299 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
300
301 brdSettings.SetViaSizeIndex( prevViaSizeIndex );
302 }
303
304 if( isVia && m_annularRingsCtrl->GetStringSelection() != INDETERMINATE_ACTION )
305 {
306 PCB_VIA* v = static_cast<PCB_VIA*>( aItem );
307
308 switch( m_annularRingsCtrl->GetSelection() )
309 {
310 case 0:
313 break;
314 case 1:
317 break;
318 case 2:
321 break;
322 default:
323 break;
324 }
325 }
326
327 if( ( isArc || isTrack ) && m_layerCtrl->GetLayerSelection() != UNDEFINED_LAYER )
328 {
329 if( aUndoList->FindItem( aItem ) < 0 )
330 {
331 ITEM_PICKER picker( nullptr, aItem, UNDO_REDO::CHANGED );
332 picker.SetLink( aItem->Clone() );
333 aUndoList->PushItem( picker );
334 }
335
337 m_parent->GetBoard()->GetConnectivity()->Update( aItem );
338 }
339 }
340 else
341 {
342 m_parent->SetTrackSegmentWidth( aItem, aUndoList, true );
343 }
344
345 m_items_changed.push_back( aItem );
346}
347
348
350{
351 if( m_selectedItemsFilter->GetValue() )
352 {
353 if( !aItem->IsSelected() )
354 {
355 PCB_GROUP* group = aItem->GetParentGroup();
356
357 while( group && !group->IsSelected() )
358 group = group->GetParentGroup();
359
360 if( !group )
361 return;
362 }
363 }
364
365 if( m_netFilterOpt->GetValue() && m_netFilter->GetSelectedNetcode() >= 0 )
366 {
367 if( aItem->GetNetCode() != m_netFilter->GetSelectedNetcode() )
368 return;
369 }
370
371 if( m_netclassFilterOpt->GetValue() && !m_netclassFilter->GetStringSelection().IsEmpty() )
372 {
373 wxString filterNetclass = m_netclassFilter->GetStringSelection();
374 NETCLASS* netclass = aItem->GetEffectiveNetClass();
375
376 if( !netclass->ContainsNetclassWithName( filterNetclass ) )
377 return;
378 }
379
381 {
382 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
383 return;
384 }
385
386 if( aItem->Type() == PCB_VIA_T )
387 {
388 if( m_filterByViaSize->GetValue() && aItem->GetWidth() != m_viaSizeFilter.GetValue() )
389 return;
390 }
391 else
392 {
393 if( m_filterByTrackWidth->GetValue() && aItem->GetWidth() != m_trackWidthFilter.GetValue() )
394 return;
395 }
396
397 processItem( aUndoList, aItem );
398}
399
400
402{
403 PICKED_ITEMS_LIST itemsListPicker;
404 wxBusyCursor dummy;
405
406 // Examine segments
407 for( PCB_TRACK* track : m_brd->Tracks() )
408 {
409 if( m_tracks->GetValue() && track->Type() == PCB_TRACE_T )
410 visitItem( &itemsListPicker, track );
411 else if ( m_tracks->GetValue() && track->Type() == PCB_ARC_T )
412 visitItem( &itemsListPicker, track );
413 else if ( m_vias->GetValue() && track->Type() == PCB_VIA_T )
414 visitItem( &itemsListPicker, track );
415 }
416
417 if( itemsListPicker.GetCount() > 0 )
418 {
419 m_parent->SaveCopyInUndoList( itemsListPicker, UNDO_REDO::CHANGED );
420
421 for( PCB_TRACK* track : m_brd->Tracks() )
422 m_parent->GetCanvas()->GetView()->Update( track );
423 }
424
426
427 if( m_items_changed.size() )
428 {
431 }
432
433 return true;
434}
const char * name
Definition: DXF_plotter.cpp:59
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:239
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:290
const NETINFO_LIST & GetNetInfo() const
Definition: board.h:879
const std::set< int > & GetHighLightNetCodes() const
Definition: board.h:540
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
Definition: board.cpp:1964
const TRACKS & Tracks() const
Definition: board.h:334
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:937
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:2750
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:483
Class DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS_BASE.
void visitItem(PICKED_ITEMS_LIST *aUndoList, PCB_TRACK *aItem)
void onActionButtonChange(wxCommandEvent &event) override
void processItem(PICKED_ITEMS_LIST *aUndoList, PCB_TRACK *aItem)
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...
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
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:575
A collection of nets and the parameters used to route or test these nets.
Definition: netclass.h:45
bool ContainsNetclassWithName(const wxString &netclass) const
Determines if the given netclass name is a constituent of this (maybe aggregate) netclass.
Definition: netclass.cpp:276
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
Definition: netclass.cpp:314
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
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:458
static wxString g_netclassFilter
static bool g_filterByNetclass
static int g_layerFilter
static bool g_filterByLayer
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:710
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