KiCad PCB EDA Suite
BOARD_COMMIT Class Reference

#include <board_commit.h>

Inheritance diagram for BOARD_COMMIT:
COMMIT

Public Member Functions

 BOARD_COMMIT (TOOL_MANAGER *aToolMgr)
 
 BOARD_COMMIT (EDA_DRAW_FRAME *aFrame)
 
 BOARD_COMMIT (PCB_TOOL_BASE *aTool)
 
virtual ~BOARD_COMMIT ()
 
BOARDGetBoard () const
 
virtual void Push (const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
 Revert the commit by restoring the modified items state. More...
 
virtual void Revert () override
 
COMMITStage (EDA_ITEM *aItem, CHANGE_TYPE aChangeType) override
 
COMMITStage (std::vector< EDA_ITEM * > &container, CHANGE_TYPE aChangeType) override
 
COMMITStage (const PICKED_ITEMS_LIST &aItems, UNDO_REDO aModFlag=UNDO_REDO::UNSPECIFIED) override
 Execute the changes. More...
 
COMMITAdd (EDA_ITEM *aItem)
 Notify observers that aItem has been added. More...
 
COMMITAdded (EDA_ITEM *aItem)
 Remove a new item from the model. More...
 
COMMITRemove (EDA_ITEM *aItem)
 Notify observers that aItem has been removed. More...
 
COMMITRemoved (EDA_ITEM *aItem)
 Modify a given item in the model. More...
 
COMMITModify (EDA_ITEM *aItem)
 Create an undo entry for an item that has been already modified. More...
 
COMMITModified (EDA_ITEM *aItem, EDA_ITEM *aCopy)
 
template<class Range >
COMMITStageItems (const Range &aRange, CHANGE_TYPE aChangeType)
 Add a change of the item aItem of type aChangeType to the change list. More...
 
bool Empty () const
 Returns status of an item. More...
 
int GetStatus (EDA_ITEM *aItem)
 

Protected Member Functions

void clear ()
 
COMMITcreateModified (EDA_ITEM *aItem, EDA_ITEM *aCopy, int aExtraFlags=0)
 
virtual void makeEntry (EDA_ITEM *aItem, CHANGE_TYPE aType, EDA_ITEM *aCopy=nullptr)
 
COMMIT_LINEfindEntry (EDA_ITEM *aItem)
 Search for an entry describing change for a particular item. More...
 
CHANGE_TYPE convert (UNDO_REDO aType) const
 

Protected Attributes

std::set< EDA_ITEM * > m_changedItems
 
std::vector< COMMIT_LINEm_changes
 

Private Member Functions

EDA_ITEMparentObject (EDA_ITEM *aItem) const override
 
EDA_ITEMmakeImage (EDA_ITEM *aItem) const override
 
void dirtyIntersectingZones (BOARD_ITEM *item, int aChangeType)
 

Private Attributes

TOOL_MANAGERm_toolMgr
 
bool m_isFootprintEditor
 
bool m_isBoardEditor
 

Detailed Description

Definition at line 45 of file board_commit.h.

Constructor & Destructor Documentation

◆ BOARD_COMMIT() [1/3]

BOARD_COMMIT::BOARD_COMMIT ( TOOL_MANAGER aToolMgr)

Definition at line 42 of file board_commit.cpp.

42 :
43 m_toolMgr( aToolMgr ),
44 m_isFootprintEditor( false ),
45 m_isBoardEditor( false )
46{
47}
bool m_isBoardEditor
Definition: board_commit.h:75
TOOL_MANAGER * m_toolMgr
Definition: board_commit.h:73
bool m_isFootprintEditor
Definition: board_commit.h:74

◆ BOARD_COMMIT() [2/3]

BOARD_COMMIT::BOARD_COMMIT ( EDA_DRAW_FRAME aFrame)

Definition at line 58 of file board_commit.cpp.

59{
60 m_toolMgr = aFrame->GetToolManager();
63}
bool IsType(FRAME_T aType) const
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
@ FRAME_PCB_EDITOR
Definition: frame_type.h:40
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:41

References FRAME_FOOTPRINT_EDITOR, FRAME_PCB_EDITOR, TOOLS_HOLDER::GetToolManager(), EDA_BASE_FRAME::IsType(), m_isBoardEditor, m_isFootprintEditor, and m_toolMgr.

◆ BOARD_COMMIT() [3/3]

BOARD_COMMIT::BOARD_COMMIT ( PCB_TOOL_BASE aTool)

Definition at line 50 of file board_commit.cpp.

51{
52 m_toolMgr = aTool->GetManager();
55}
bool IsFootprintEditor() const
bool IsBoardEditor() const
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:144

References TOOL_BASE::GetManager(), PCB_TOOL_BASE::IsBoardEditor(), PCB_TOOL_BASE::IsFootprintEditor(), m_isBoardEditor, m_isFootprintEditor, and m_toolMgr.

◆ ~BOARD_COMMIT()

BOARD_COMMIT::~BOARD_COMMIT ( )
virtual

Definition at line 66 of file board_commit.cpp.

67{
68}

Member Function Documentation

◆ Add()

◆ Added()

COMMIT & COMMIT::Added ( EDA_ITEM aItem)
inlineinherited

Remove a new item from the model.

Definition at line 84 of file commit.h.

References CHT_ADD, CHT_DONE, and COMMIT::Stage().

Referenced by TEARDROP_MANAGER::addTeardropsOnTracks(), PCB_EDIT_FRAME::RunActionPlugin(), and TEARDROP_MANAGER::SetTeardrops().

◆ clear()

void COMMIT::clear ( )
inlineprotectedinherited

Definition at line 156 of file commit.h.

157 {
158 m_changedItems.clear();
159 m_changes.clear();
160 }
std::set< EDA_ITEM * > m_changedItems
Definition: commit.h:179
std::vector< COMMIT_LINE > m_changes
Definition: commit.h:180

References COMMIT::m_changedItems, and COMMIT::m_changes.

Referenced by Push(), and Revert().

◆ convert()

CHANGE_TYPE COMMIT::convert ( UNDO_REDO  aType) const
protectedinherited

Definition at line 184 of file commit.cpp.

185{
186 switch( aType )
187 {
189 return CHT_ADD;
190
192 return CHT_REMOVE;
193
194 default:
195 assert( false );
196 // Can't fall through if the assert fires, so quiet our warning
197#ifdef NDEBUG
199#endif
200
202 return CHT_MODIFY;
203 }
204}
@ CHT_MODIFY
Definition: commit.h:42
@ CHT_REMOVE
Definition: commit.h:41
@ CHT_ADD
Definition: commit.h:40
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83

References CHANGED, CHT_ADD, CHT_MODIFY, CHT_REMOVE, DELETED, KI_FALLTHROUGH, and NEWITEM.

Referenced by COMMIT::Stage().

◆ createModified()

COMMIT & COMMIT::createModified ( EDA_ITEM aItem,
EDA_ITEM aCopy,
int  aExtraFlags = 0 
)
protectedinherited

Definition at line 131 of file commit.cpp.

132{
133 EDA_ITEM* parent = parentObject( aItem );
134 auto entryIt = m_changedItems.find( parent );
135
136 if( entryIt != m_changedItems.end() )
137 {
138 delete aCopy;
139 return *this; // item has been already modified once
140 }
141
142 makeEntry( parent, CHT_MODIFY | aExtraFlags, aCopy );
143
144 return *this;
145}
virtual void makeEntry(EDA_ITEM *aItem, CHANGE_TYPE aType, EDA_ITEM *aCopy=nullptr)
Definition: commit.cpp:148
virtual EDA_ITEM * parentObject(EDA_ITEM *aItem) const =0
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85

References CHT_MODIFY, COMMIT::m_changedItems, COMMIT::makeEntry(), and COMMIT::parentObject().

Referenced by COMMIT::Modified(), and COMMIT::Stage().

◆ dirtyIntersectingZones()

void BOARD_COMMIT::dirtyIntersectingZones ( BOARD_ITEM item,
int  aChangeType 
)
private

Definition at line 141 of file board_commit.cpp.

142{
143 wxCHECK( item, /* void */ );
144
146
147 if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
148 zoneFillerTool->DirtyZone( static_cast<ZONE*>( item ) );
149
150 if( item->Type() == PCB_FOOTPRINT_T )
151 {
152 static_cast<FOOTPRINT*>( item )->RunOnChildren(
153 [&]( BOARD_ITEM* child )
154 {
155 if( aChangeType != CHT_MODIFY || ( child->GetFlags() & IS_MODIFIED_CHILD ) )
156 dirtyIntersectingZones( child, aChangeType );
157
159 } );
160 }
161 else if( item->Type() == PCB_GROUP_T )
162 {
163 static_cast<PCB_GROUP*>( item )->RunOnChildren(
164 [&]( BOARD_ITEM* child )
165 {
166 dirtyIntersectingZones( child, aChangeType );
168 } );
169 }
170 else
171 {
172 BOARD* board = static_cast<BOARD*>( m_toolMgr->GetModel() );
173 BOX2I bbox = item->GetBoundingBox();
174 LSET layers = item->GetLayerSet();
175
176 if( layers.test( Edge_Cuts ) || layers.test( Margin ) )
177 layers = LSET::PhysicalLayersMask();
178 else
179 layers &= LSET::AllCuMask();
180
181 if( layers.any() )
182 {
183 for( ZONE* zone : board->Zones() )
184 {
185 if( zone->GetIsRuleArea() )
186 continue;
187
188 if( ( zone->GetLayerSet() & layers ).any()
189 && zone->GetBoundingBox().Intersects( bbox ) )
190 {
191 zoneFillerTool->DirtyZone( zone );
192 }
193 }
194 }
195
197 }
198}
void dirtyIntersectingZones(BOARD_ITEM *item, int aChangeType)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:70
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:197
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:269
ZONES & Zones()
Definition: board.h:317
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
Definition: eda_item.cpp:74
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:141
EDA_ITEM_FLAGS GetFlags() const
Definition: eda_item.h:142
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:532
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:773
static LSET PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
Definition: lset.cpp:870
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:51
EDA_ITEM * GetModel() const
Definition: tool_manager.h:292
Handle actions specific to filling copper zones.
void DirtyZone(ZONE *aZone)
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
#define IS_MODIFIED_CHILD
when a child is promoted to its parent for a COMMIT, this flag indicates the modified child
@ Edge_Cuts
Definition: layer_ids.h:113
@ Margin
Definition: layer_ids.h:114
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:115
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:112
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ PCB_FP_ZONE_T
class ZONE, managed by a footprint
Definition: typeinfo.h:100

References LSET::AllCuMask(), CHT_MODIFY, EDA_ITEM::ClearFlags(), dirtyIntersectingZones(), ZONE_FILLER_TOOL::DirtyZone(), Edge_Cuts, EDA_ITEM::GetBoundingBox(), EDA_ITEM::GetFlags(), BOARD_ITEM::GetLayerSet(), TOOL_MANAGER::GetModel(), TOOL_MANAGER::GetTool(), IS_MODIFIED_CHILD, m_toolMgr, Margin, PCB_FOOTPRINT_T, PCB_FP_ZONE_T, PCB_GROUP_T, PCB_ZONE_T, LSET::PhysicalLayersMask(), EDA_ITEM::Type(), and BOARD::Zones().

Referenced by dirtyIntersectingZones(), and Push().

◆ Empty()

bool COMMIT::Empty ( ) const
inlineinherited

Returns status of an item.

Definition at line 139 of file commit.h.

References COMMIT::m_changes.

Referenced by DIALOG_CLEANUP_GRAPHICS::doCleanup(), DIALOG_CLEANUP_TRACKS_AND_VIAS::doCleanup(), and Push().

◆ findEntry()

COMMIT::COMMIT_LINE * COMMIT::findEntry ( EDA_ITEM aItem)
protectedinherited

Search for an entry describing change for a particular item.

Returns
null if there is no related entry.

Definition at line 172 of file commit.cpp.

173{
174 for( COMMIT_LINE& change : m_changes )
175 {
176 if( change.m_item == aItem )
177 return &change;
178 }
179
180 return nullptr;
181}

References COMMIT::m_changes.

Referenced by COMMIT::GetStatus().

◆ GetBoard()

BOARD * BOARD_COMMIT::GetBoard ( ) const

Definition at line 71 of file board_commit.cpp.

72{
73 return static_cast<BOARD*>( m_toolMgr->GetModel() );
74}

References TOOL_MANAGER::GetModel(), and m_toolMgr.

Referenced by GRAPHICS_CLEANER::CleanupBoard().

◆ GetStatus()

int COMMIT::GetStatus ( EDA_ITEM aItem)
inherited

Definition at line 123 of file commit.cpp.

124{
125 COMMIT_LINE* entry = findEntry( parentObject( aItem ) );
126
127 return entry ? entry->m_type : 0;
128}
COMMIT_LINE * findEntry(EDA_ITEM *aItem)
Search for an entry describing change for a particular item.
Definition: commit.cpp:172

References COMMIT::findEntry(), COMMIT::COMMIT_LINE::m_type, and COMMIT::parentObject().

Referenced by BOARD_NETLIST_UPDATER::updateComponentPadConnections(), and BOARD_NETLIST_UPDATER::updateFootprintParameters().

◆ makeEntry()

void COMMIT::makeEntry ( EDA_ITEM aItem,
CHANGE_TYPE  aType,
EDA_ITEM aCopy = nullptr 
)
protectedvirtualinherited

Definition at line 148 of file commit.cpp.

149{
150 // Expect an item copy if it is going to be modified
151 wxASSERT( !!aCopy == ( ( aType & CHT_TYPE ) == CHT_MODIFY ) );
152
153 if( m_changedItems.find( aItem ) != m_changedItems.end() )
154 {
155 alg::delete_if( m_changes, [aItem]( const COMMIT_LINE& aEnt )
156 {
157 return aEnt.m_item == aItem;
158 } );
159 }
160
161 COMMIT_LINE ent;
162
163 ent.m_item = aItem;
164 ent.m_type = aType;
165 ent.m_copy = aCopy;
166
167 m_changedItems.insert( aItem );
168 m_changes.push_back( ent );
169}
@ CHT_TYPE
Flag to indicate the change is already applied, just notify observers (not compatible with CHT_MODIFY...
Definition: commit.h:43
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
Definition: kicad_algo.h:173

References CHT_MODIFY, CHT_TYPE, alg::delete_if(), COMMIT::m_changedItems, COMMIT::m_changes, COMMIT::COMMIT_LINE::m_copy, COMMIT::COMMIT_LINE::m_item, and COMMIT::COMMIT_LINE::m_type.

Referenced by COMMIT::createModified(), and COMMIT::Stage().

◆ makeImage()

EDA_ITEM * BOARD_COMMIT::makeImage ( EDA_ITEM aItem) const
overrideprivatevirtual

Implements COMMIT.

Definition at line 667 of file board_commit.cpp.

668{
669 BOARD_ITEM* clone = static_cast<BOARD_ITEM*>( aItem->Clone() );
670
671 clone->SetParentGroup( nullptr );
672 return clone;
673}
void SetParentGroup(PCB_GROUP *aGroup)
Definition: board_item.h:83
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
Definition: eda_item.cpp:82

References EDA_ITEM::Clone(), and BOARD_ITEM::SetParentGroup().

Referenced by Push().

◆ Modified()

COMMIT & COMMIT::Modified ( EDA_ITEM aItem,
EDA_ITEM aCopy 
)
inlineinherited

Definition at line 110 of file commit.h.

111 {
112 return createModified( aItem, aCopy );
113 }
COMMIT & createModified(EDA_ITEM *aItem, EDA_ITEM *aCopy, int aExtraFlags=0)
Definition: commit.cpp:131

References COMMIT::createModified().

Referenced by COMMIT::Stage(), BOARD_NETLIST_UPDATER::updateComponentPadConnections(), and BOARD_NETLIST_UPDATER::updateFootprintParameters().

◆ Modify()

COMMIT & COMMIT::Modify ( EDA_ITEM aItem)
inlineinherited

Create an undo entry for an item that has been already modified.

Requires a copy done before the modification.

Definition at line 103 of file commit.h.

References CHT_MODIFY, and COMMIT::Stage().

Referenced by PCB_POINT_EDITOR::addCorner(), AR_AUTOPLACER::AutoplaceFootprints(), doPushPadProperties(), DRAWING_TOOL::DrawVia(), PAD_TOOL::EnumeratePads(), PAD_TOOL::explodePad(), ZONE_FILLER::Fill(), ARRAY_CREATOR::Invoke(), TRACKS_CLEANER::mergeCollinearSegments(), mergeZones(), BOARD_EDITOR_CONTROL::modifyLockSelected(), FOOTPRINT_EDIT_FRAME::OnEditItemRequest(), PAD_TOOL::pastePadProperties(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem(), CN_CONNECTIVITY_ALGO::propagateConnections(), DIALOG_BOARD_REANNOTATE::ReannotateBoard(), PAD_TOOL::RecombinePad(), PCB_POINT_EDITOR::removeCorner(), GROUP_TOOL::RemoveFromGroup(), DRAWING_TOOL::SetAnchor(), BOARD_EDITOR_CONTROL::TrackWidthDec(), BOARD_EDITOR_CONTROL::TrackWidthInc(), DIALOG_DIMENSION_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_GROUP_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PROPERTIES::TransferDataFromWindow(), DIALOG_TARGET_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXTBOX_PROPERTIES::TransferDataFromWindow(), DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow(), BOARD_NETLIST_UPDATER::updateCopperZoneNets(), DIALOG_UNUSED_PAD_LAYERS::updatePadsAndVias(), PCB_PROPERTIES_PANEL::valueChanged(), BOARD_EDITOR_CONTROL::ViaSizeDec(), BOARD_EDITOR_CONTROL::ViaSizeInc(), ZONE_FILLER_TOOL::ZoneUnfill(), and ZONE_FILLER_TOOL::ZoneUnfillAll().

◆ parentObject()

EDA_ITEM * BOARD_COMMIT::parentObject ( EDA_ITEM aItem) const
overrideprivatevirtual

Implements COMMIT.

Definition at line 639 of file board_commit.cpp.

640{
641 switch( aItem->Type() )
642 {
643 case PCB_PAD_T:
644 case PCB_FP_SHAPE_T:
645 case PCB_FP_TEXT_T:
646 case PCB_FP_TEXTBOX_T:
652 case PCB_FP_ZONE_T:
653 return aItem->GetParent();
654
655 case PCB_ZONE_T:
656 wxASSERT( !dynamic_cast<FOOTPRINT*>( aItem->GetParent() ) );
657 return aItem;
658
659 default:
660 break;
661 }
662
663 return aItem;
664}
EDA_ITEM * GetParent() const
Definition: eda_item.h:99
@ PCB_FP_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:95
@ PCB_FP_SHAPE_T
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:94
@ PCB_FP_TEXTBOX_T
class FP_TEXTBOX, wrapped text in a footprint
Definition: typeinfo.h:93
@ PCB_FP_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:97
@ PCB_FP_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:99
@ PCB_FP_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:96
@ PCB_FP_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:98
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition: typeinfo.h:87
@ PCB_FP_TEXT_T
class FP_TEXT, text in a footprint
Definition: typeinfo.h:92

References EDA_ITEM::GetParent(), PCB_FP_DIM_ALIGNED_T, PCB_FP_DIM_CENTER_T, PCB_FP_DIM_LEADER_T, PCB_FP_DIM_ORTHOGONAL_T, PCB_FP_DIM_RADIAL_T, PCB_FP_SHAPE_T, PCB_FP_TEXT_T, PCB_FP_TEXTBOX_T, PCB_FP_ZONE_T, PCB_PAD_T, PCB_ZONE_T, and EDA_ITEM::Type().

◆ Push()

void BOARD_COMMIT::Push ( const wxString &  aMessage = wxT("A commit"),
int  aFlags = 0 
)
overridevirtual

Revert the commit by restoring the modified items state.

Implements COMMIT.

Definition at line 201 of file board_commit.cpp.

202{
203 // Objects potentially interested in changes:
204 PICKED_ITEMS_LIST undoList;
205 KIGFX::VIEW* view = m_toolMgr->GetView();
206 BOARD* board = static_cast<BOARD*>( m_toolMgr->GetModel() );
207 PCB_BASE_FRAME* frame = dynamic_cast<PCB_BASE_FRAME*>( m_toolMgr->GetToolHolder() );
208 std::set<EDA_ITEM*> savedModules;
210 bool itemsDeselected = false;
211 bool solderMaskDirty = false;
212 bool autofillZones = false;
213 bool selectedModified = false;
214
215 if( Empty() )
216 return;
217
218 std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->GetConnectivity();
219
220 // Note:
221 // frame == nullptr happens in QA tests
222 // in this case m_isBoardEditor and m_isFootprintEditor are set to false
223 // But we also test frame == nullptr mainly to make Coverity happy
224
225 std::vector<BOARD_ITEM*> bulkAddedItems;
226 std::vector<BOARD_ITEM*> bulkRemovedItems;
227 std::vector<BOARD_ITEM*> itemsChanged;
228
230 && !( aCommitFlags & ZONE_FILL_OP )
231 && ( frame && frame->GetPcbNewSettings()->m_AutoRefillZones ) )
232 {
233 autofillZones = true;
234
235 for( ZONE* zone : board->Zones() )
236 zone->CacheBoundingBox();
237 }
238
239 for( COMMIT_LINE& ent : m_changes )
240 {
241 int changeType = ent.m_type & CHT_TYPE;
242 int changeFlags = ent.m_type & CHT_FLAGS;
243 BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
244
245 wxASSERT( ent.m_item );
246
247 // Module items need to be saved in the undo buffer before modification
249 {
250 // Be sure that we are storing a footprint
251 if( ent.m_item->Type() != PCB_FOOTPRINT_T )
252 {
253 ent.m_item = ent.m_item->GetParent();
254 wxASSERT( ent.m_item );
255 }
256
257 // We have not saved the footprint yet, so let's create an entry
258 if( savedModules.count( ent.m_item ) == 0 )
259 {
260 if( !ent.m_copy )
261 {
262 wxASSERT( changeType != CHT_MODIFY ); // too late to make a copy..
263 ent.m_copy = makeImage( ent.m_item );
264 }
265
266 wxASSERT( ent.m_item->Type() == PCB_FOOTPRINT_T );
267 wxASSERT( ent.m_copy->Type() == PCB_FOOTPRINT_T );
268
269 if( !( aCommitFlags & SKIP_UNDO ) && frame )
270 {
271 ITEM_PICKER itemWrapper( nullptr, ent.m_item, UNDO_REDO::CHANGED );
272 itemWrapper.SetLink( ent.m_copy );
273 undoList.PushItem( itemWrapper );
274 frame->SaveCopyInUndoList( undoList, UNDO_REDO::CHANGED );
275 }
276
277 savedModules.insert( ent.m_item );
278 }
279 }
280
281 if( boardItem->Type() == PCB_VIA_T || boardItem->Type() == PCB_FOOTPRINT_T
282 || boardItem->IsOnLayer( F_Mask ) || boardItem->IsOnLayer( B_Mask ) )
283 {
284 solderMaskDirty = true;
285 }
286
287 if( boardItem->IsSelected() )
288 selectedModified = true;
289
290 // If we're the footprint editor, the boardItem will always be the containing footprint
291 if( m_isFootprintEditor && boardItem->Type() == PCB_FOOTPRINT_T )
292 {
293 static_cast<FOOTPRINT*>( boardItem )->RunOnChildren(
294 [&selectedModified]( BOARD_ITEM* aItem )
295 {
296 if( aItem->HasFlag( IS_MODIFIED_CHILD ) )
297 selectedModified = true;
298 } );
299 }
300
301 switch( changeType )
302 {
303 case CHT_ADD:
304 {
305 if( selTool && selTool->GetEnteredGroup() && !boardItem->GetParentGroup()
306 && PCB_GROUP::IsGroupableType( boardItem->Type() ) )
307 {
308 selTool->GetEnteredGroup()->AddItem( boardItem );
309 }
310
312 {
313 // footprints inside footprints are not supported yet
314 wxASSERT( boardItem->Type() != PCB_FOOTPRINT_T );
315
316 boardItem->SetParent( board->Footprints().front() );
317
318 if( !( changeFlags & CHT_DONE ) )
319 board->Footprints().front()->Add( boardItem );
320 }
321 else if( boardItem->Type() == PCB_PAD_T
322 || boardItem->Type() == PCB_FP_TEXT_T
323 || boardItem->Type() == PCB_FP_TEXTBOX_T
324 || boardItem->Type() == PCB_FP_SHAPE_T
325 || boardItem->Type() == PCB_FP_DIM_ALIGNED_T
326 || boardItem->Type() == PCB_FP_DIM_LEADER_T
327 || boardItem->Type() == PCB_FP_DIM_CENTER_T
328 || boardItem->Type() == PCB_FP_DIM_RADIAL_T
329 || boardItem->Type() == PCB_FP_DIM_ORTHOGONAL_T
330 || boardItem->Type() == PCB_FP_ZONE_T )
331 {
332 wxASSERT( boardItem->GetParent() &&
333 boardItem->GetParent()->Type() == PCB_FOOTPRINT_T );
334 }
335 else
336 {
337 if( !( aCommitFlags & SKIP_UNDO ) )
338 undoList.PushItem( ITEM_PICKER( nullptr, boardItem, UNDO_REDO::NEWITEM ) );
339
340 if( !( changeFlags & CHT_DONE ) )
341 {
342 board->Add( boardItem, ADD_MODE::BULK_INSERT ); // handles connectivity
343 bulkAddedItems.push_back( boardItem );
344 }
345 }
346
347 if( autofillZones && boardItem->Type() != PCB_MARKER_T )
348 dirtyIntersectingZones( boardItem, changeType );
349
350 if( view && boardItem->Type() != PCB_NETINFO_T )
351 view->Add( boardItem );
352
353 break;
354 }
355
356 case CHT_REMOVE:
357 {
358 PCB_GROUP* parentGroup = boardItem->GetParentGroup();
359
360 if( !m_isFootprintEditor && !( aCommitFlags & SKIP_UNDO ) )
361 undoList.PushItem( ITEM_PICKER( nullptr, boardItem, UNDO_REDO::DELETED ) );
362
363 if( boardItem->IsSelected() )
364 {
365 if( selTool )
366 selTool->RemoveItemFromSel( boardItem, true /* quiet mode */ );
367
368 itemsDeselected = true;
369 }
370
371 if( parentGroup && !( parentGroup->GetFlags() & STRUCT_DELETED ) )
372 parentGroup->RemoveItem( boardItem );
373
374 if( autofillZones )
375 dirtyIntersectingZones( boardItem, changeType );
376
377 switch( boardItem->Type() )
378 {
379 // Footprint items
380 case PCB_PAD_T:
381 case PCB_FP_SHAPE_T:
382 case PCB_FP_TEXT_T:
383 case PCB_FP_TEXTBOX_T:
389 case PCB_FP_ZONE_T:
390 // This level can only handle footprint children in the footprint editor as
391 // only in that case has the entire footprint (and all its children) already
392 // been saved for undo.
393 wxASSERT( m_isFootprintEditor );
394
395 if( boardItem->Type() == PCB_FP_TEXT_T )
396 {
397 FP_TEXT* text = static_cast<FP_TEXT*>( boardItem );
398
399 // don't allow deletion of Reference or Value
400 if( text->GetType() != FP_TEXT::TEXT_is_DIVERS )
401 break;
402 }
403
404 if( view )
405 view->Remove( boardItem );
406
407 if( !( changeFlags & CHT_DONE ) )
408 {
409 FOOTPRINT* footprint = static_cast<FOOTPRINT*>( boardItem->GetParent() );
410 wxASSERT( footprint && footprint->Type() == PCB_FOOTPRINT_T );
411 footprint->Delete( boardItem );
412 }
413
414 break;
415
416 // Board items
417 case PCB_SHAPE_T: // a shape (normally not on copper layers)
418 case PCB_BITMAP_T: // a bitmap on a user layer
419 case PCB_TEXT_T: // a text on a layer
420 case PCB_TEXTBOX_T: // a wrapped text on a layer
421 case PCB_TRACE_T: // a track segment (segment on a copper layer)
422 case PCB_ARC_T: // an arced track segment (segment on a copper layer)
423 case PCB_VIA_T: // a via (like track segment on a copper layer)
424 case PCB_DIM_ALIGNED_T: // a dimension (graphic item)
425 case PCB_DIM_CENTER_T:
426 case PCB_DIM_RADIAL_T:
428 case PCB_DIM_LEADER_T: // a leader dimension
429 case PCB_TARGET_T: // a target (graphic item)
430 case PCB_MARKER_T: // a marker used to show something
431 case PCB_ZONE_T:
432 if( view )
433 view->Remove( boardItem );
434
435 if( !( changeFlags & CHT_DONE ) )
436 {
437 board->Remove( boardItem, REMOVE_MODE::BULK );
438 bulkRemovedItems.push_back( boardItem );
439 }
440
441 break;
442
443 case PCB_FOOTPRINT_T:
444 {
445 // No support for nested footprints (yet)
446 wxASSERT( !m_isFootprintEditor );
447
448 FOOTPRINT* footprint = static_cast<FOOTPRINT*>( boardItem );
449
450 if( view )
451 view->Remove( footprint );
452
453 footprint->ClearFlags();
454
455 if( !( changeFlags & CHT_DONE ) )
456 {
457 board->Remove( footprint, REMOVE_MODE::BULK ); // handles connectivity
458 bulkRemovedItems.push_back( footprint );
459 }
460 }
461
462 break;
463
464 case PCB_GROUP_T:
465 if( view )
466 view->Remove( boardItem );
467
468 if( !( changeFlags & CHT_DONE ) )
469 {
471 board->GetFirstFootprint()->Remove( boardItem );
472 else
473 {
474 board->Remove( boardItem, REMOVE_MODE::BULK );
475 bulkRemovedItems.push_back( boardItem );
476 }
477 }
478
479 break;
480
481 // Metadata items
482 case PCB_NETINFO_T:
483 board->Remove( boardItem, REMOVE_MODE::BULK );
484 bulkRemovedItems.push_back( boardItem );
485 break;
486
487 default: // other types do not need to (or should not) be handled
488 wxASSERT( false );
489 break;
490 }
491
492 break;
493 }
494
495 case CHT_MODIFY:
496 {
497 if( !m_isFootprintEditor && !( aCommitFlags & SKIP_UNDO ) )
498 {
499 ITEM_PICKER itemWrapper( nullptr, boardItem, UNDO_REDO::CHANGED );
500 wxASSERT( ent.m_copy );
501 itemWrapper.SetLink( ent.m_copy );
502 undoList.PushItem( itemWrapper );
503 }
504
505 if( !( aCommitFlags & SKIP_CONNECTIVITY ) )
506 {
507 if( ent.m_copy )
508 connectivity->MarkItemNetAsDirty( static_cast<BOARD_ITEM*>( ent.m_copy ) );
509
510 connectivity->Update( boardItem );
511 }
512
513 if( autofillZones )
514 {
515 dirtyIntersectingZones( static_cast<BOARD_ITEM*>( ent.m_copy ), changeType ); // before
516 dirtyIntersectingZones( boardItem, changeType ); // after
517 }
518
519 if( view )
520 {
521 view->Update( boardItem );
522
524 {
525 static_cast<FOOTPRINT*>( boardItem )->RunOnChildren(
526 [&]( BOARD_ITEM* aChild )
527 {
528 view->Update( aChild );
529 });
530 }
531 }
532
533 itemsChanged.push_back( boardItem );
534
535 // if no undo entry is needed, the copy would create a memory leak
536 if( aCommitFlags & SKIP_UNDO )
537 delete ent.m_copy;
538
539 break;
540 }
541
542 default:
543 wxASSERT( false );
544 break;
545 }
546 }
547
548 if( bulkAddedItems.size() > 0 )
549 board->FinalizeBulkAdd( bulkAddedItems );
550
551 if( bulkRemovedItems.size() > 0 )
552 board->FinalizeBulkRemove( bulkRemovedItems );
553
554 if( itemsChanged.size() > 0 )
555 board->OnItemsChanged( itemsChanged );
556
557 if( m_isBoardEditor )
558 {
559 size_t num_changes = m_changes.size();
560
561 if( aCommitFlags & SKIP_CONNECTIVITY )
562 {
563 connectivity->ClearRatsnest();
564 connectivity->ClearLocalRatsnest();
565 }
566 else
567 {
568 connectivity->RecalculateRatsnest( this );
570 connectivity->ClearLocalRatsnest();
571
572 if( frame )
573 frame->GetCanvas()->RedrawRatsnest();
574 }
575
576 if( solderMaskDirty )
577 {
578 if( frame )
579 frame->HideSolderMask();
580 }
581
582 // Log undo items for any connectivity changes
583 for( size_t i = num_changes; i < m_changes.size(); ++i )
584 {
585 COMMIT_LINE& ent = m_changes[i];
586
587 wxASSERT( ( ent.m_type & CHT_TYPE ) == CHT_MODIFY );
588
589 BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
590
591 if( !( aCommitFlags & SKIP_UNDO ) )
592 {
593 ITEM_PICKER itemWrapper( nullptr, boardItem, UNDO_REDO::CHANGED );
594 wxASSERT( ent.m_copy );
595 itemWrapper.SetLink( ent.m_copy );
596 undoList.PushItem( itemWrapper );
597 }
598 else
599 {
600 delete ent.m_copy;
601 }
602
603 if( view )
604 view->Update( boardItem );
605 }
606 }
607
608 if( m_isBoardEditor && !( aCommitFlags & SKIP_UNDO ) && frame )
609 {
610 if( aCommitFlags & APPEND_UNDO )
612 else
613 frame->SaveCopyInUndoList( undoList, UNDO_REDO::UNSPECIFIED );
614 }
615
617
618 if( itemsDeselected )
620
621 if( autofillZones )
623
624 if( selectedModified )
626
627 if( frame )
628 {
629 if( !( aCommitFlags & SKIP_SET_DIRTY ) )
630 frame->OnModify();
631 else
633 }
634
635 clear();
636}
#define SKIP_CONNECTIVITY
Definition: board_commit.h:42
#define SKIP_SET_DIRTY
Definition: board_commit.h:41
#define APPEND_UNDO
Definition: board_commit.h:40
#define SKIP_UNDO
Definition: board_commit.h:39
#define ZONE_FILL_OP
Definition: board_commit.h:43
EDA_ITEM * makeImage(EDA_ITEM *aItem) const override
virtual void Delete(BOARD_ITEM *aItem)
Removes an item from the container and deletes it.
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:84
virtual bool IsOnLayer(PCB_LAYER_ID aLayer, bool aIncludeCourtyards=false) const
Test to see if this object is on the given layer.
Definition: board_item.h:257
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:175
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: board.cpp:772
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:403
FOOTPRINTS & Footprints()
Definition: board.h:311
void FinalizeBulkRemove(std::vector< BOARD_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
Definition: board.cpp:875
void FinalizeBulkAdd(std::vector< BOARD_ITEM * > &aNewItems)
Must be used if Add() is used using a BULK_x ADD_MODE to generate a change event for listeners.
Definition: board.cpp:869
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
Definition: board.cpp:274
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
Definition: board.cpp:881
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:2077
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:430
bool Empty() const
Returns status of an item.
Definition: commit.h:139
void clear()
Definition: commit.h:156
bool IsSelected() const
Definition: eda_item.h:106
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:100
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
Definition: eda_item.h:143
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:214
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:208
void Remove(BOARD_ITEM *aItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
Definition: footprint.cpp:628
@ TEXT_is_DIVERS
Definition: fp_text.h:51
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:316
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:349
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1591
DISPLAY_OPTIONS m_Display
static TOOL_ACTION zoneFillDirty
Definition: pcb_actions.h:345
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCBNEW_SETTINGS * GetPcbNewSettings() const
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void AppendCopyToUndoList(const PICKED_ITEMS_LIST &aItemsList, UNDO_REDO aTypeCommand)=0
As SaveCopyInUndoList, but appends the changes to the last undo item on the stack.
virtual void SaveCopyInUndoList(EDA_ITEM *aItemToCopy, UNDO_REDO aTypeCommand)=0
Create a new entry in undo list of commands.
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
static bool IsGroupableType(KICAD_T aType)
Check if the proposed type can be added to a group.
Definition: pcb_group.cpp:43
bool RemoveItem(BOARD_ITEM *aItem)
Remove item from group.
Definition: pcb_group.cpp:95
bool AddItem(BOARD_ITEM *aItem)
Add item to group.
Definition: pcb_group.cpp:80
The selection tool: currently supports:
PCB_GROUP * GetEnteredGroup()
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 RemoveItemFromSel(const TOOL_EVENT &aEvent)
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
void PostEvent(const TOOL_EVENT &aEvent)
Put an event to the event queue to be processed at the end of event processing cycle.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:296
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:285
@ CHT_DONE
Definition: commit.h:47
@ CHT_FLAGS
Definition: commit.h:48
#define STRUCT_DELETED
flag indication structures to be erased
@ B_Mask
Definition: layer_ids.h:106
@ F_Mask
Definition: layer_ids.h:107
@ AS_GLOBAL
Global action (toolbar/main menu event, global shortcut)
Definition: tool_action.h:45
@ TA_MODEL_CHANGE
Definition: tool_event.h:116
@ TC_MESSAGE
Definition: tool_event.h:53
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:110
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:107
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:102
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:108
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:91
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:90
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition: typeinfo.h:104
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:111
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:106
@ PCB_BITMAP_T
class PCB_BITMAP, bitmap on a layer
Definition: typeinfo.h:89
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition: typeinfo.h:103
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
Definition: typeinfo.h:114
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:101
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:109

References BOARD::Add(), KIGFX::VIEW::Add(), PCB_GROUP::AddItem(), APPEND_UNDO, PCB_BASE_FRAME::AppendCopyToUndoList(), AS_GLOBAL, B_Mask, BULK, BULK_INSERT, CHANGED, CHT_ADD, CHT_DONE, CHT_FLAGS, CHT_MODIFY, CHT_REMOVE, CHT_TYPE, COMMIT::clear(), EDA_ITEM::ClearFlags(), BOARD_ITEM_CONTAINER::Delete(), DELETED, dirtyIntersectingZones(), COMMIT::Empty(), F_Mask, BOARD::FinalizeBulkAdd(), BOARD::FinalizeBulkRemove(), BOARD::Footprints(), PCB_BASE_FRAME::GetCanvas(), BOARD::GetConnectivity(), PCB_SELECTION_TOOL::GetEnteredGroup(), BOARD::GetFirstFootprint(), EDA_ITEM::GetFlags(), TOOL_MANAGER::GetModel(), BOARD_ITEM::GetParent(), BOARD_ITEM::GetParentGroup(), PCB_BASE_FRAME::GetPcbNewSettings(), TOOL_MANAGER::GetTool(), TOOL_MANAGER::GetToolHolder(), TOOL_MANAGER::GetView(), EDA_ITEM::HasFlag(), PCB_BASE_FRAME::HideSolderMask(), IS_MODIFIED_CHILD, PCB_GROUP::IsGroupableType(), BOARD_ITEM::IsOnLayer(), EDA_ITEM::IsSelected(), PCBNEW_SETTINGS::m_AutoRefillZones, COMMIT::m_changes, COMMIT::COMMIT_LINE::m_copy, PCBNEW_SETTINGS::m_Display, m_isBoardEditor, m_isFootprintEditor, COMMIT::COMMIT_LINE::m_item, PCBNEW_SETTINGS::DISPLAY_OPTIONS::m_Live3DRefresh, m_toolMgr, COMMIT::COMMIT_LINE::m_type, makeImage(), NEWITEM, BOARD::OnItemsChanged(), PCB_BASE_FRAME::OnModify(), PCB_ARC_T, PCB_BITMAP_T, PCB_DIM_ALIGNED_T, PCB_DIM_CENTER_T, PCB_DIM_LEADER_T, PCB_DIM_ORTHOGONAL_T, PCB_DIM_RADIAL_T, PCB_FOOTPRINT_T, PCB_FP_DIM_ALIGNED_T, PCB_FP_DIM_CENTER_T, PCB_FP_DIM_LEADER_T, PCB_FP_DIM_ORTHOGONAL_T, PCB_FP_DIM_RADIAL_T, PCB_FP_SHAPE_T, PCB_FP_TEXT_T, PCB_FP_TEXTBOX_T, PCB_FP_ZONE_T, PCB_GROUP_T, PCB_MARKER_T, PCB_NETINFO_T, PCB_PAD_T, PCB_SHAPE_T, PCB_TARGET_T, PCB_TEXT_T, PCB_TEXTBOX_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_T, TOOL_MANAGER::PostEvent(), TOOL_MANAGER::ProcessEvent(), PICKED_ITEMS_LIST::PushItem(), PCB_DRAW_PANEL_GAL::RedrawRatsnest(), BOARD::Remove(), FOOTPRINT::Remove(), KIGFX::VIEW::Remove(), PCB_GROUP::RemoveItem(), SELECTION_TOOL::RemoveItemFromSel(), TOOL_MANAGER::RunAction(), PCB_BASE_FRAME::SaveCopyInUndoList(), EVENTS::SelectedItemsModified, ITEM_PICKER::SetLink(), EDA_ITEM::SetParent(), SKIP_CONNECTIVITY, SKIP_SET_DIRTY, SKIP_UNDO, STRUCT_DELETED, TA_MODEL_CHANGE, TC_MESSAGE, text, FP_TEXT::TEXT_is_DIVERS, EDA_ITEM::Type(), EVENTS::UnselectedEvent, UNSPECIFIED, KIGFX::VIEW::Update(), PCB_BASE_FRAME::Update3DView(), BOARD::UpdateRatsnestExclusions(), ZONE_FILL_OP, PCB_ACTIONS::zoneFillDirty, and BOARD::Zones().

Referenced by PCB_POINT_EDITOR::addCorner(), FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), AUTOPLACE_TOOL::autoplace(), ZONE_FILLER_TOOL::CheckAllZones(), ZONE_CREATE_HELPER::commitZone(), MICROWAVE_TOOL::createInductorBetween(), CONVERT_TOOL::CreatePolys(), ALIGN_DISTRIBUTE_TOOL::DistributeHorizontally(), ALIGN_DISTRIBUTE_TOOL::DistributeVertically(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), DIALOG_CLEANUP_GRAPHICS::doCleanup(), DIALOG_CLEANUP_TRACKS_AND_VIAS::doCleanup(), DIALOG_GLOBAL_DELETION::DoGlobalDeletions(), PCB_TOOL_BASE::doInteractiveItemPlacement(), DRAWING_TOOL::DrawArc(), DRAWING_TOOL::DrawBoardCharacteristics(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::DrawLine(), DRAWING_TOOL::DrawRectangle(), DRAWING_TOOL::drawShape(), DRAWING_TOOL::DrawSpecificationStackup(), PCB_EDIT_FRAME::Edit_Zone_Params(), PAD_TOOL::EditPad(), PAD_TOOL::EnumeratePads(), PAD_TOOL::explodePad(), ZONE_FILLER_TOOL::FillAllZones(), KI_TEST::FillZones(), DRAWING_TOOL::InteractivePlaceWithPreview(), ARRAY_CREATOR::Invoke(), BOARD_EDITOR_CONTROL::modifyLockSelected(), FOOTPRINT_EDIT_FRAME::OnEditItemRequest(), DIALOG_EXCHANGE_FOOTPRINTS::OnOKClicked(), PCB_POINT_EDITOR::OnSelectionChange(), PCB_EDIT_FRAME::OpenProjectFiles(), PAD_TOOL::pastePadProperties(), ZONE_CREATE_HELPER::performZoneCutout(), BOARD_EDITOR_CONTROL::PlaceFootprint(), DRAWING_TOOL::PlaceImportedGraphics(), DRAWING_TOOL::PlaceText(), PAD_TOOL::pushPadSettings(), DIALOG_BOARD_REANNOTATE::ReannotateBoard(), PCB_POINT_EDITOR::removeCorner(), GROUP_TOOL::RemoveFromGroup(), TEARDROP_MANAGER::RemoveTeardrops(), PCB_EDIT_FRAME::ResolveDRCExclusions(), PCB_EDIT_FRAME::RunActionPlugin(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), DRAWING_TOOL::SetAnchor(), TEARDROP_MANAGER::SetTeardrops(), BOARD_EDITOR_CONTROL::TrackWidthDec(), BOARD_EDITOR_CONTROL::TrackWidthInc(), DIALOG_DIMENSION_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_GROUP_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PROPERTIES::TransferDataFromWindow(), DIALOG_TARGET_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXTBOX_PROPERTIES::TransferDataFromWindow(), BOARD_NETLIST_UPDATER::UpdateNetlist(), PCB_PROPERTIES_PANEL::valueChanged(), BOARD_EDITOR_CONTROL::ViaSizeDec(), BOARD_EDITOR_CONTROL::ViaSizeInc(), BOARD_EDITOR_CONTROL::ZoneDuplicate(), ZONE_FILLER_TOOL::ZoneFill(), ZONE_FILLER_TOOL::ZoneFillDirty(), BOARD_EDITOR_CONTROL::ZoneMerge(), ZONE_FILLER_TOOL::ZoneUnfill(), and ZONE_FILLER_TOOL::ZoneUnfillAll().

◆ Remove()

◆ Removed()

COMMIT & COMMIT::Removed ( EDA_ITEM aItem)
inlineinherited

◆ Revert()

void BOARD_COMMIT::Revert ( )
overridevirtual

Implements COMMIT.

Definition at line 676 of file board_commit.cpp.

677{
678 PICKED_ITEMS_LIST undoList;
679 KIGFX::VIEW* view = m_toolMgr->GetView();
680 BOARD* board = (BOARD*) m_toolMgr->GetModel();
681 std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->GetConnectivity();
682
683 board->IncrementTimeStamp(); // clear caches
684
685 std::vector<BOARD_ITEM*> bulkAddedItems;
686 std::vector<BOARD_ITEM*> bulkRemovedItems;
687 std::vector<BOARD_ITEM*> itemsChanged;
688
689 for( auto it = m_changes.rbegin(); it != m_changes.rend(); ++it )
690 {
691 COMMIT_LINE& ent = *it;
692 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( ent.m_item );
693 BOARD_ITEM* copy = static_cast<BOARD_ITEM*>( ent.m_copy );
694 int changeType = ent.m_type & CHT_TYPE;
695 int changeFlags = ent.m_type & CHT_FLAGS;
696
697 switch( changeType )
698 {
699 case CHT_ADD:
700 if( !( changeFlags & CHT_DONE ) )
701 break;
702
703 view->Remove( item );
704 connectivity->Remove( item );
705 board->Remove( item, REMOVE_MODE::BULK );
706 bulkRemovedItems.push_back( item );
707 break;
708
709 case CHT_REMOVE:
710 if( !( changeFlags & CHT_DONE ) )
711 break;
712
713 view->Add( item );
714 connectivity->Add( item );
715 board->Add( item, ADD_MODE::INSERT );
716 bulkAddedItems.push_back( item );
717 break;
718
719 case CHT_MODIFY:
720 {
721 view->Remove( item );
722 connectivity->Remove( item );
723
724 item->SwapItemData( copy );
725
726 if( item->Type() == PCB_GROUP_T )
727 {
728 PCB_GROUP* group = static_cast<PCB_GROUP*>( item );
729
730 group->RunOnChildren( [&]( BOARD_ITEM* child )
731 {
732 child->SetParentGroup( group );
733 } );
734 }
735
736 view->Add( item );
737 connectivity->Add( item );
738 board->OnItemChanged( item );
739 itemsChanged.push_back( item );
740
741 delete copy;
742 break;
743 }
744
745 default:
746 wxASSERT( false );
747 break;
748 }
749 }
750
751 if( bulkAddedItems.size() > 0 )
752 board->FinalizeBulkAdd( bulkAddedItems );
753
754 if( bulkRemovedItems.size() > 0 )
755 board->FinalizeBulkRemove( bulkRemovedItems );
756
757 if( itemsChanged.size() > 0 )
758 board->OnItemsChanged( itemsChanged );
759
760 if ( !m_isFootprintEditor )
761 {
762 connectivity->RecalculateRatsnest();
764 }
765
767 selTool->RebuildSelection();
768
769 clear();
770}
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
Definition: board_item.cpp:166
void OnItemChanged(BOARD_ITEM *aItem)
Notify the board and its listeners that an item on the board has been modified in some way.
Definition: board.cpp:2071
void IncrementTimeStamp()
Definition: board.cpp:234
void RebuildSelection()
Rebuild the selection from the EDA_ITEMs' selection flags.

References BOARD::Add(), KIGFX::VIEW::Add(), BULK, CHT_ADD, CHT_DONE, CHT_FLAGS, CHT_MODIFY, CHT_REMOVE, CHT_TYPE, COMMIT::clear(), copy, BOARD::FinalizeBulkAdd(), BOARD::FinalizeBulkRemove(), BOARD::GetConnectivity(), TOOL_MANAGER::GetModel(), TOOL_MANAGER::GetTool(), TOOL_MANAGER::GetView(), group, BOARD::IncrementTimeStamp(), INSERT, COMMIT::m_changes, COMMIT::COMMIT_LINE::m_copy, m_isFootprintEditor, COMMIT::COMMIT_LINE::m_item, m_toolMgr, COMMIT::COMMIT_LINE::m_type, BOARD::OnItemChanged(), BOARD::OnItemsChanged(), PCB_GROUP_T, PCB_SELECTION_TOOL::RebuildSelection(), BOARD::Remove(), KIGFX::VIEW::Remove(), BOARD_ITEM::SetParentGroup(), BOARD_ITEM::SwapItemData(), EDA_ITEM::Type(), and BOARD::UpdateRatsnestExclusions().

Referenced by AUTOPLACE_TOOL::autoplace(), ZONE_FILLER_TOOL::CheckAllZones(), PAD_TOOL::EnumeratePads(), ZONE_FILLER_TOOL::FillAllZones(), mergeZones(), PCB_POINT_EDITOR::OnSelectionChange(), BOARD_EDITOR_CONTROL::PlaceFootprint(), ZONE_FILLER_TOOL::ZoneFill(), and ZONE_FILLER_TOOL::ZoneFillDirty().

◆ Stage() [1/3]

COMMIT & BOARD_COMMIT::Stage ( const PICKED_ITEMS_LIST aItems,
UNDO_REDO  aModFlag = UNDO_REDO::UNSPECIFIED 
)
overridevirtual

Execute the changes.

Reimplemented from COMMIT.

Definition at line 135 of file board_commit.cpp.

136{
137 return COMMIT::Stage( aItems, aModFlag );
138}
virtual COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType)
Definition: commit.cpp:48

References COMMIT::Stage().

◆ Stage() [2/3]

COMMIT & BOARD_COMMIT::Stage ( EDA_ITEM aItem,
CHANGE_TYPE  aChangeType 
)
overridevirtual

Reimplemented from COMMIT.

Definition at line 77 of file board_commit.cpp.

78{
79 wxCHECK( aItem, *this );
80
82
83 // If aItem belongs a footprint, the full footprint will be saved because undo/redo does
84 // not handle "sub items" modifications. This has implications for auto-zone-refill, so
85 // we need to store a bit more information.
86 if( aChangeType == CHT_MODIFY )
87 {
88 if( aItem->Type() == PCB_FOOTPRINT_T )
89 {
90 static_cast<FOOTPRINT*>( aItem )->RunOnChildren(
91 [&]( BOARD_ITEM* child )
92 {
94 } );
95 }
96 else if( aItem->GetParent() && aItem->GetParent()->Type() == PCB_FOOTPRINT_T )
97 {
98 if( aItem->Type() == PCB_GROUP_T )
99 {
100 static_cast<PCB_GROUP*>( aItem )->RunOnChildren(
101 [&]( BOARD_ITEM* child )
102 {
103 child->SetFlags( IS_MODIFIED_CHILD );
104 } );
105 }
106 else
107 {
108 aItem->SetFlags( IS_MODIFIED_CHILD );
109 }
110
111 aItem = aItem->GetParent();
112 }
113 else if( aItem->Type() == PCB_GROUP_T )
114 {
115 // Many operations on group (move, rotate, etc.) are applied directly to their
116 // children, so it's the children that must be staged.
117 static_cast<PCB_GROUP*>( aItem )->RunOnChildren(
118 [&]( BOARD_ITEM* child )
119 {
120 COMMIT::Stage( child, aChangeType );
121 } );
122 }
123 }
124
125 return COMMIT::Stage( aItem, aChangeType );
126}
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:139

References CHT_MODIFY, EDA_ITEM::ClearFlags(), EDA_ITEM::GetParent(), IS_MODIFIED_CHILD, PCB_FOOTPRINT_T, PCB_GROUP_T, EDA_ITEM::SetFlags(), COMMIT::Stage(), and EDA_ITEM::Type().

Referenced by ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersVertically(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsVertically(), and PCB_EDIT_FRAME::Edit_Zone_Params().

◆ Stage() [3/3]

COMMIT & BOARD_COMMIT::Stage ( std::vector< EDA_ITEM * > &  container,
CHANGE_TYPE  aChangeType 
)
overridevirtual

Reimplemented from COMMIT.

Definition at line 129 of file board_commit.cpp.

130{
131 return COMMIT::Stage( container, aChangeType );
132}

References COMMIT::Stage().

◆ StageItems()

template<class Range >
COMMIT & COMMIT::StageItems ( const Range &  aRange,
CHANGE_TYPE  aChangeType 
)
inlineinherited

Add a change of the item aItem of type aChangeType to the change list.

Definition at line 117 of file commit.h.

References COMMIT::Stage().

Referenced by PCB_POINT_EDITOR::OnSelectionChange().

Member Data Documentation

◆ m_changedItems

std::set<EDA_ITEM*> COMMIT::m_changedItems
protectedinherited

Definition at line 179 of file commit.h.

Referenced by COMMIT::clear(), COMMIT::createModified(), COMMIT::makeEntry(), and COMMIT::Stage().

◆ m_changes

std::vector<COMMIT_LINE> COMMIT::m_changes
protectedinherited

◆ m_isBoardEditor

bool BOARD_COMMIT::m_isBoardEditor
private

Definition at line 75 of file board_commit.h.

Referenced by BOARD_COMMIT(), and Push().

◆ m_isFootprintEditor

bool BOARD_COMMIT::m_isFootprintEditor
private

Definition at line 74 of file board_commit.h.

Referenced by BOARD_COMMIT(), Push(), and Revert().

◆ m_toolMgr

TOOL_MANAGER* BOARD_COMMIT::m_toolMgr
private

Definition at line 73 of file board_commit.h.

Referenced by BOARD_COMMIT(), dirtyIntersectingZones(), GetBoard(), Push(), and Revert().


The documentation for this class was generated from the following files: