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 wxString g_netclassFilter;
57static wxString g_netFilter;
58
59
62 m_trackWidthFilter( aParent, nullptr, m_trackWidthFilterCtrl, m_trackWidthFilterUnits ),
63 m_viaSizeFilter( aParent, nullptr, m_viaSizeFilterCtrl, m_viaSizeFilterUnits )
64{
65 m_parent = aParent;
67
69
75
81
82 SetupStandardButtons( { { wxID_OK, _( "Apply and Close" ) },
83 { wxID_CANCEL, _( "Close" ) } } );
84
85 m_netFilter->Connect( FILTERED_ITEM_SELECTED,
87 nullptr, this );
88
89 m_parent->Bind( EDA_EVT_UNITS_CHANGED, &DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::onUnitsChanged, this );
90
92}
93
94
96{
97 g_netclassFilter = m_netclassFilter->GetStringSelection();
99
100 m_netFilter->Disconnect( FILTERED_ITEM_SELECTED,
102 nullptr, this );
103
104 m_parent->Unbind( EDA_EVT_UNITS_CHANGED, &DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::onUnitsChanged, this );
105}
106
107
109{
110 int trackSel = m_trackWidthCtrl->GetSelection();
111 int viaSel = m_viaSizesCtrl->GetSelection();
112
117
118 m_trackWidthCtrl->SetSelection( trackSel );
119 m_viaSizesCtrl->SetSelection( viaSel );
120
121 aEvent.Skip();
122}
123
124
126{
127 // Populate the net filter list with net names
129
130 if( !m_brd->GetHighLightNetCodes().empty() )
132
133 // Populate the netclass filter list with netclass names
134 wxArrayString netclassNames;
135 std::shared_ptr<NET_SETTINGS>& settings = m_brd->GetDesignSettings().m_NetSettings;
136
137 netclassNames.push_back( settings->GetDefaultNetclass()->GetName() );
138
139 for( const auto& [name, netclass] : settings->GetNetclasses() )
140 netclassNames.push_back( name );
141
142 m_netclassFilter->Set( netclassNames );
144
145 // Populate the layer filter list
151}
152
153
155{
156 m_netclassFilter->SetStringSelection( g_netclassFilter );
157
158 if( m_brd->FindNet( g_netFilter ) != nullptr )
160
161 m_trackWidthCtrl->SetSelection( (int) m_trackWidthCtrl->GetCount() - 1 );
162 m_viaSizesCtrl->SetSelection( (int) m_viaSizesCtrl->GetCount() - 1 );
163 m_annularRingsCtrl->SetSelection( (int) m_annularRingsCtrl->GetCount() - 1 );
164 m_layerCtrl->SetStringSelection( INDETERMINATE_ACTION );
165
166 wxCommandEvent dummy;
168
169 return true;
170}
171
172
174{
175 // Enable the items in the use specified values section
176 bool enable = m_setToSpecifiedValues->GetValue();
177
178 m_trackWidthLabel->Enable( enable );
179 m_trackWidthCtrl->Enable( enable );
180 m_viaSizeLabel->Enable( enable );
181 m_viaSizesCtrl->Enable( enable );
182 m_annularRingsLabel->Enable( enable );
183 m_annularRingsCtrl->Enable( enable );
184 m_layerLabel->Enable( enable );
185 m_layerCtrl->Enable( enable );
186}
187
188
190{
192 bool isTrack = aItem->Type() == PCB_TRACE_T;
193 bool isArc = aItem->Type() == PCB_ARC_T;
194 bool isVia = aItem->Type() == PCB_VIA_T;
195
196 if( m_setToSpecifiedValues->GetValue() )
197 {
198 if( ( isArc || isTrack ) && m_trackWidthCtrl->GetStringSelection() != INDETERMINATE_ACTION )
199 {
200 unsigned int prevTrackWidthIndex = brdSettings.GetTrackWidthIndex();
201 int trackWidthIndex = m_trackWidthCtrl->GetSelection();
202
203 if( trackWidthIndex >= 0 )
204 brdSettings.SetTrackWidthIndex( static_cast<unsigned>( trackWidthIndex + 1 ) );
205
206 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
207
208 brdSettings.SetTrackWidthIndex( prevTrackWidthIndex );
209 }
210
211 if( isVia && m_viaSizesCtrl->GetStringSelection() != INDETERMINATE_ACTION )
212 {
213 unsigned int prevViaSizeIndex = brdSettings.GetViaSizeIndex();
214 int viaSizeIndex = m_viaSizesCtrl->GetSelection();
215
216 if( viaSizeIndex >= 0 )
217 brdSettings.SetViaSizeIndex( static_cast<unsigned>( viaSizeIndex + 1 ) );
218
219 m_parent->SetTrackSegmentWidth( aItem, aUndoList, false );
220
221 brdSettings.SetViaSizeIndex( prevViaSizeIndex );
222 }
223
224 if( isVia && m_annularRingsCtrl->GetStringSelection() != INDETERMINATE_ACTION )
225 {
226 PCB_VIA* v = static_cast<PCB_VIA*>( aItem );
227
228 switch( m_annularRingsCtrl->GetSelection() )
229 {
230 case 0:
233 break;
234 case 1:
237 break;
238 case 2:
241 break;
242 case 3:
245 break;
246 default:
247 break;
248 }
249 }
250
251 if( ( isArc || isTrack ) && m_layerCtrl->GetLayerSelection() != UNDEFINED_LAYER )
252 {
253 if( aUndoList->FindItem( aItem ) < 0 )
254 {
255 ITEM_PICKER picker( nullptr, aItem, UNDO_REDO::CHANGED );
256 picker.SetLink( aItem->Clone() );
257 aUndoList->PushItem( picker );
258 }
259
261 m_parent->GetBoard()->GetConnectivity()->Update( aItem );
262 }
263 }
264 else
265 {
266 m_parent->SetTrackSegmentWidth( aItem, aUndoList, true );
267 }
268
269 m_items_changed.push_back( aItem );
270}
271
272
274{
275 if( m_selectedItemsFilter->GetValue() )
276 {
277 if( !aItem->IsSelected() )
278 {
279 EDA_GROUP* group = aItem->GetParentGroup();
280
281 while( group && !group->AsEdaItem()->IsSelected() )
282 group = group->AsEdaItem()->GetParentGroup();
283
284 if( !group )
285 return;
286 }
287 }
288
289 if( m_netFilterOpt->GetValue() && m_netFilter->GetSelectedNetcode() >= 0 )
290 {
291 if( aItem->GetNetCode() != m_netFilter->GetSelectedNetcode() )
292 return;
293 }
294
295 if( m_netclassFilterOpt->GetValue() && !m_netclassFilter->GetStringSelection().IsEmpty() )
296 {
297 wxString filterNetclass = m_netclassFilter->GetStringSelection();
298 NETCLASS* netclass = aItem->GetEffectiveNetClass();
299
300 if( !netclass->ContainsNetclassWithName( filterNetclass ) )
301 return;
302 }
303
305 {
306 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
307 return;
308 }
309
310 if( aItem->Type() == PCB_VIA_T )
311 {
312 if( m_filterByViaSize->GetValue() && aItem->GetWidth() != m_viaSizeFilter.GetValue() )
313 return;
314 }
315 else
316 {
317 if( m_filterByTrackWidth->GetValue() && aItem->GetWidth() != m_trackWidthFilter.GetValue() )
318 return;
319 }
320
321 processItem( aUndoList, aItem );
322}
323
324
326{
327 PICKED_ITEMS_LIST itemsListPicker;
328 wxBusyCursor dummy;
329
330 // Examine segments
331 for( PCB_TRACK* track : m_brd->Tracks() )
332 {
333 if( m_tracks->GetValue() && track->Type() == PCB_TRACE_T )
334 visitItem( &itemsListPicker, track );
335 else if ( m_tracks->GetValue() && track->Type() == PCB_ARC_T )
336 visitItem( &itemsListPicker, track );
337 else if ( m_vias->GetValue() && track->Type() == PCB_VIA_T )
338 visitItem( &itemsListPicker, track );
339 }
340
341 if( itemsListPicker.GetCount() > 0 )
342 {
343 m_parent->SaveCopyInUndoList( itemsListPicker, UNDO_REDO::CHANGED );
344
345 for( PCB_TRACK* track : m_brd->Tracks() )
346 m_parent->GetCanvas()->GetView()->Update( track );
347 }
348
350
351 if( m_items_changed.size() )
352 {
355 }
356
357 return true;
358}
const char * name
Definition: DXF_plotter.cpp:62
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this 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:232
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:280
const NETINFO_LIST & GetNetInfo() const
Definition: board.h:934
const std::set< int > & GetHighLightNetCodes() const
Definition: board.h:579
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
Definition: board.cpp:2099
const TRACKS & Tracks() const
Definition: board.h:356
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:1024
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:2812
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:522
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.
A set of EDA_ITEMs (i.e., without duplicates).
Definition: eda_group.h:46
virtual EDA_GROUP * GetParentGroup() const
Definition: eda_item.h:116
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:110
bool IsSelected() const
Definition: eda_item.h:127
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:610
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:278
void SetNetInfo(const NETINFO_LIST *aNetInfoList)
int GetSelectedNetcode()
void SetSelectedNetcode(int aNetcode)
void SetSelectedNet(const wxString &aNetname)
wxString GetSelectedNetname()
void SetUnconnectedLayerMode(UNCONNECTED_LAYER_MODE aMode)
Definition: padstack.h:315
void SaveCopyInUndoList(EDA_ITEM *aItemToCopy, UNDO_REDO aTypeCommand) override
Create a new entry in undo list of commands.
Definition: undo_redo.cpp:164
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).
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void SetUndefinedLayerName(const wxString &aName)
void SetNotAllowedLayerSet(const LSET &aMask)
virtual EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_track.cpp:69
virtual int GetWidth() const
Definition: pcb_track.h:146
const PADSTACK & Padstack() const
Definition: pcb_track.h:459
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
virtual long long int GetValue()
Return the current value in Internal Units.
static wxString g_netclassFilter
static wxString g_netclassFilter
static wxString g_netFilter
#define _(s)
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:744
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_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