KiCad PCB EDA Suite
Loading...
Searching...
No Matches
global_edit_tool.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) 2019-2024 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
25#include <footprint.h>
26#include <pcb_track.h>
27#include <tool/tool_manager.h>
28#include <tools/pcb_actions.h>
29#include <tools/edit_tool.h>
38
39
41 PCB_TOOL_BASE( "pcbnew.GlobalEdit" ),
42 m_selectionTool( nullptr )
43{
44}
45
46
48{
49 if( aReason != RUN )
50 m_commit = std::make_unique<BOARD_COMMIT>( this );
51}
52
53
55{
56 // Find the selection tool, so they can cooperate
58
59 return true;
60}
61
62
64{
65 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
67 FOOTPRINT* footprint = nullptr;
68 bool updateMode = false;
69 bool currentMode = false;
70
71 if( aEvent.HasPosition() )
73
74 if( !selection.Empty() )
76
78 {
79 updateMode = true;
80 currentMode = true;
81 }
82 else if( aEvent.IsAction( &PCB_ACTIONS::updateFootprints ) )
83 {
84 updateMode = true;
85 currentMode = selection.CountType( PCB_FOOTPRINT_T ) > 0;
86 }
87 else if( aEvent.IsAction( &PCB_ACTIONS::changeFootprint ) )
88 {
89 updateMode = false;
90 currentMode = true;
91 }
92 else if( aEvent.IsAction( &PCB_ACTIONS::changeFootprints ) )
93 {
94 updateMode = false;
95 currentMode = selection.CountType( PCB_FOOTPRINT_T ) > 0;
96 }
97 else
98 {
99 wxFAIL_MSG( wxT( "ExchangeFootprints: unexpected action" ) );
100 }
101
102 DIALOG_EXCHANGE_FOOTPRINTS dialog( editFrame, footprint, updateMode, currentMode );
103 dialog.ShowQuasiModal();
104
105 return 0;
106}
107
108
110 std::map<PCB_LAYER_ID, PCB_LAYER_ID>& aLayerMap )
111{
112 LSET originalLayers = aItem->GetLayerSet();
113 LSET newLayers;
114
115 for( PCB_LAYER_ID original : originalLayers.Seq() )
116 {
117 if( aLayerMap.count( original ) )
118 newLayers.set( aLayerMap[ original ] );
119 else
120 newLayers.set( original );
121 }
122
123 if( originalLayers.Seq() != newLayers.Seq() )
124 {
125 m_commit->Modify( aItem );
126 aItem->SetLayerSet( newLayers );
127 frame()->GetCanvas()->GetView()->Update( aItem, KIGFX::GEOMETRY );
128 return true;
129 }
130
131 return false;
132}
133
134
136{
137 std::map<PCB_LAYER_ID, PCB_LAYER_ID> layerMap;
138
139 DIALOG_SWAP_LAYERS dlg( frame(), layerMap );
140
141 if( dlg.ShowModal() != wxID_OK )
142 return 0;
143
144 bool hasChanges = false;
145
146 // Change tracks.
147 for( PCB_TRACK* segm : frame()->GetBoard()->Tracks() )
148 {
149 if( segm->Type() == PCB_VIA_T )
150 {
151 PCB_VIA* via = static_cast<PCB_VIA*>( segm );
152 PCB_LAYER_ID top_layer, bottom_layer;
153
154 if( via->GetViaType() == VIATYPE::THROUGH )
155 continue;
156
157 via->LayerPair( &top_layer, &bottom_layer );
158
159 if( layerMap[bottom_layer] != bottom_layer || layerMap[top_layer] != top_layer )
160 {
161 m_commit->Modify( via );
162 via->SetLayerPair( layerMap[top_layer], layerMap[bottom_layer] );
163 frame()->GetCanvas()->GetView()->Update( via, KIGFX::GEOMETRY );
164 hasChanges = true;
165 }
166 }
167 else
168 {
169 hasChanges |= swapBoardItem( segm, layerMap );
170 }
171 }
172
173 for( BOARD_ITEM* zone : frame()->GetBoard()->Zones() )
174 hasChanges |= swapBoardItem( zone, layerMap );
175
176 for( BOARD_ITEM* drawing : frame()->GetBoard()->Drawings() )
177 hasChanges |= swapBoardItem( drawing, layerMap );
178
179 if( hasChanges )
180 {
181 frame()->OnModify();
182 m_commit->Push( _( "Swap Layers" ) );
183 frame()->GetCanvas()->Refresh();
184 }
185
186 return 0;
187}
188
189
191{
192 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
193 DIALOG_CLEANUP_TRACKS_AND_VIAS dlg( editFrame );
194
195 dlg.ShowModal();
196 return 0;
197}
198
199
201{
202 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
203 DIALOG_CLEANUP_GRAPHICS dlg( editFrame, false );
204
205 dlg.ShowModal();
206 return 0;
207}
208
209
211{
212 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
214 []( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector, PCB_SELECTION_TOOL* sTool )
215 {
216 sTool->FilterCollectorForHierarchy( aCollector, true );
217 } );
218 DIALOG_UNUSED_PAD_LAYERS dlg( editFrame, selection, *m_commit );
219
220 dlg.ShowModal();
221
222 return 0;
223}
224
226{
227 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
228 BOARD_COMMIT commit( editFrame );
229 BOARD* board = editFrame->GetBoard();
230
231 for( ZONE* zone : board->Zones() )
232 commit.Modify( zone );
233
235 DIALOG_ZONE_MANAGER dlg( editFrame, &zoneInfo );
236
237 int dialogResult = dlg.ShowQuasiModal();
238
239 if( dialogResult == wxID_OK && ZONE_MANAGER_PREFERENCE::GetRepourOnClose() )
240 dialogResult = ZONE_MANAGER_REPOUR;
241
242 if( dialogResult == wxID_CANCEL )
243 return 0;
244
245 // Ensure all zones are deselected before make any change in view, to avoid
246 // dangling pointers in EDIT_POINT
248 selTool->ClearSelection();
249
250 wxBusyCursor dummy;
251
252 // Undraw old zone outlines
253 for( ZONE* zone : board->Zones() )
254 editFrame->GetCanvas()->GetView()->Update( zone );
255
256
258 commit.Push( _( "Modify zones properties with zone manager" ), SKIP_CONNECTIVITY );
259 editFrame->OnModify();
260
261 //rebuildConnectivity
263
264 if( TOOL_MANAGER* manger = GetManager() )
265 {
266 manger->PostEvent( EVENTS::ConnectivityChangedEvent );
267 }
268
269 editFrame->GetCanvas()->RedrawRatsnest();
270
271 if( dialogResult == ZONE_MANAGER_REPOUR )
272 {
273 if( TOOL_MANAGER* manger = GetManager() )
274 {
275 manger->PostAction( PCB_ACTIONS::zoneFillAll );
276 }
277 }
278
279 return 0;
280}
281
282
283
285{
290
292
301}
302
303
#define SKIP_CONNECTIVITY
Definition: board_commit.h:42
BASE_SET & set(size_t pos)
Definition: base_set.h:115
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
void SetDefaultZoneSettings(const ZONE_SETTINGS &aSettings)
ZONE_SETTINGS & GetDefaultZoneSettings()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
virtual void SetLayerSet(const LSET &aLayers)
Definition: board_item.h:265
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:257
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
const ZONES & Zones() const
Definition: board.h:335
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition: board.cpp:187
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:895
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
int ShowQuasiModal()
int ShowModal() override
static void FootprintFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector, PCB_SELECTION_TOOL *sTool)
A selection filter which prunes the selection to contain only items of type #PCB_MODULE_T.
Definition: edit_tool.cpp:3080
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
Definition: actions.h:296
Used when the right click button is pressed, or when the select tool is in effect.
Definition: collectors.h:202
int ZonesManager(const TOOL_EVENT &aEvent)
int EditTracksAndVias(const TOOL_EVENT &aEvent)
int CleanupGraphics(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
bool swapBoardItem(BOARD_ITEM *aItem, std::map< PCB_LAYER_ID, PCB_LAYER_ID > &aLayerMap)
Set up handlers for various events.
int ExchangeFootprints(const TOOL_EVENT &aEvent)
Invoke the dialog used to update or exchange the footprint definitions used for footprints.
std::unique_ptr< BOARD_COMMIT > m_commit
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int GlobalDeletions(const TOOL_EVENT &aEvent)
int CleanupTracksAndVias(const TOOL_EVENT &aEvent)
int SwapLayers(const TOOL_EVENT &aEvent)
int EditTeardrops(const TOOL_EVENT &aEvent)
PCB_SELECTION_TOOL * m_selectionTool
int RemoveUnusedPads(const TOOL_EVENT &aEvent)
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
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:36
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:410
static TOOL_ACTION editTracksAndVias
Definition: pcb_actions.h:422
static TOOL_ACTION swapLayers
Definition: pcb_actions.h:432
static TOOL_ACTION zonesManager
Definition: pcb_actions.h:457
static TOOL_ACTION zoneFillAll
Definition: pcb_actions.h:408
static TOOL_ACTION updateFootprint
Definition: pcb_actions.h:428
static TOOL_ACTION cleanupTracksAndVias
Definition: pcb_actions.h:426
static TOOL_ACTION editTextAndGraphics
Definition: pcb_actions.h:423
static TOOL_ACTION globalDeletions
Definition: pcb_actions.h:425
static TOOL_ACTION updateFootprints
Definition: pcb_actions.h:429
static TOOL_ACTION removeUnusedPads
Definition: pcb_actions.h:433
static TOOL_ACTION changeFootprints
Definition: pcb_actions.h:431
static TOOL_ACTION changeFootprint
Definition: pcb_actions.h:430
static TOOL_ACTION editTeardrops
Definition: pcb_actions.h:424
static TOOL_ACTION cleanupGraphics
Definition: pcb_actions.h:427
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.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
The main frame for Pcbnew.
void OnModify() override
Must be called after a board change to set the modified flag.
The selection tool: currently supports:
PCB_SELECTION & RequestSelection(CLIENT_SELECTION_FILTER aClientFilter, bool aConfirmLockedItems=false)
Return the current selection, filtered according to aClientFilter.
void FilterCollectorForHierarchy(GENERAL_COLLECTOR &aCollector, bool aMultiselect) const
In general we don't want to select both a parent and any of it's children.
int ClearSelection(const TOOL_EVENT &aEvent)
PCB_SELECTION & GetSelection()
T * frame() const
BOARD * board() const
const PCB_SELECTION & selection() const
FOOTPRINT * footprint() const
T * FirstOfKind() const
Definition: selection.h:188
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:110
size_t CountType(KICAD_T aType) const
Definition: selection.cpp:157
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:146
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:218
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
@ RUN
Tool is invoked after being inactive.
Definition: tool_base.h:79
Generic, UI-independent tool event.
Definition: tool_event.h:167
bool HasPosition() const
Definition: tool_event.h:256
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:82
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
Master controller class:
Definition: tool_manager.h:62
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:78
Handle a list of polygons defining a copper zone.
Definition: zone.h:73
#define _(s)
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:54
BOARD * GetBoard()
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_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
#define ZONE_MANAGER_REPOUR
Definition: zones.h:44