KiCad PCB EDA Suite
Loading...
Searching...
No Matches
schematic_undo_redo.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) 2004 Jean-Pierre Charras, [email protected]
5 * Copyright (C) 2004-2024 KiCad Developers, see change_log.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 <ee_actions.h>
26#include <sch_edit_frame.h>
27#include <tool/tool_manager.h>
28#include <schematic.h>
29#include <sch_bus_entry.h>
30#include <sch_commit.h>
31#include <sch_junction.h>
32#include <sch_line.h>
33#include <sch_bitmap.h>
34#include <sch_sheet_pin.h>
35#include <sch_table.h>
38#include <tool/actions.h>
39#include <wx/log.h>
40
41
42/* Functions to undo and redo edit commands.
43 *
44 * m_UndoList and m_RedoList handle a std::vector of PICKED_ITEMS_LIST
45 * Each PICKED_ITEMS_LIST handle a std::vector of pickers (class ITEM_PICKER),
46 * that store the list of schematic items that are concerned by the command to
47 * undo or redo and is created for each command to undo (handle also a command
48 * to redo). each picker has a pointer pointing to an item to undo or redo (in
49 * fact: deleted, added or modified), and has a pointer to a copy of this item,
50 * when this item has been modified (the old values of parameters are
51 * therefore saved)
52 *
53 * there are 3 cases:
54 * - delete item(s) command
55 * - change item(s) command
56 * - add item(s) command
57 * and 2 cases for block:
58 * - move list of items
59 * - mirror (Y) list of items
60 *
61 * Undo command
62 * - delete item(s) command:
63 * => deleted items are moved in undo list
64 *
65 * - change item(s) command
66 * => A copy of item(s) is made (a DrawPickedStruct list of wrappers)
67 * the .m_Link member of each wrapper points the modified item.
68 * the .m_Item member of each wrapper points the old copy of this item.
69 *
70 * - add item(s) command
71 * =>A list of item(s) is made. The .m_Item member of each wrapper points
72 * the new item.
73 *
74 * Redo command
75 * - delete item(s) old command:
76 * => deleted items are moved into m_tree
77 *
78 * - change item(s) command
79 * => the copy of item(s) is moved in Undo list
80 *
81 * - add item(s) command
82 * => The list of item(s) is used to create a deleted list in undo
83 * list(same as a delete command)
84 *
85 * Some block operations that change items can be undone without memorized
86 * items, just the coordinates of the transform: move list of items (undo/
87 * redo is made by moving with the opposite move vector) mirror (Y) and flip
88 * list of items (undo/redo is made by mirror or flip items) so they are
89 * handled specifically.
90 *
91 * A problem is the hierarchical sheet handling.
92 * the data associated (sub-hierarchy, undo/redo list) is deleted only
93 * when the sheet is really deleted (i.e. when deleted from undo or redo list)
94 * This is handled by its destructor.
95 */
96
97
98/* Used if undo / redo command:
99 * swap data between Item and its copy, pointed by its picked item link member
100 * swapped data is data modified by editing, so not all values are swapped
101 */
102
104 UNDO_REDO aCommandType, bool aAppend,
105 bool aDirtyConnectivity )
106{
107 PICKED_ITEMS_LIST* commandToUndo = nullptr;
108
109 wxCHECK( aItem, /* void */ );
110
111 if( aDirtyConnectivity )
112 {
113 if( !aItem->IsConnectivityDirty() && aItem->Connection()
114 && ( aItem->Connection()->Name() == m_highlightedConn
115 || aItem->Connection()->HasDriverChanged() ) )
116 {
118 }
119
120 aItem->SetConnectivityDirty();
121 }
122
124
125 // If the last stack was empty, use that one instead of creating a new stack
126 if( lastUndo )
127 {
128 if( aAppend || !lastUndo->GetCount() )
129 commandToUndo = lastUndo;
130 else
131 PushCommandToUndoList( lastUndo );
132 }
133
134 if( !commandToUndo )
135 {
136 commandToUndo = new PICKED_ITEMS_LIST();
137 }
138
139 ITEM_PICKER itemWrapper( aScreen, aItem, aCommandType );
140 itemWrapper.SetFlags( aItem->GetFlags() );
141
142 switch( aCommandType )
143 {
144 case UNDO_REDO::CHANGED: /* Create a copy of item */
145 itemWrapper.SetLink( aItem->Duplicate( true ) );
146 commandToUndo->PushItem( itemWrapper );
147 break;
148
149 case UNDO_REDO::NEWITEM:
150 case UNDO_REDO::DELETED:
151 commandToUndo->PushItem( itemWrapper );
152 break;
153
154 default:
155 wxFAIL_MSG( wxString::Format( wxT( "SaveCopyInUndoList() error (unknown code %X)" ),
156 aCommandType ) );
157 break;
158 }
159
160 if( commandToUndo->GetCount() )
161 {
162 /* Save the copy in undo list */
163 PushCommandToUndoList( commandToUndo );
164
165 /* Clear redo list, because after new save there is no redo to do */
167 }
168 else
169 {
170 delete commandToUndo;
171 }
172}
173
174
176 UNDO_REDO aTypeCommand, bool aAppend,
177 bool aDirtyConnectivity )
178{
179 PICKED_ITEMS_LIST* commandToUndo = nullptr;
180
181 if( !aItemsList.GetCount() )
182 return;
183
185
186 // If the last stack was empty, use that one instead of creating a new stack
187 if( lastUndo )
188 {
189 if( aAppend || !lastUndo->GetCount() )
190 commandToUndo = lastUndo;
191 else
192 PushCommandToUndoList( lastUndo );
193 }
194
195 if( !commandToUndo )
196 {
197 commandToUndo = new PICKED_ITEMS_LIST();
198 commandToUndo->SetDescription( aItemsList.GetDescription() );
199 }
200
201 // Copy picker list:
202 if( !commandToUndo->GetCount() )
203 commandToUndo->CopyList( aItemsList );
204 else
205 {
206 // Unless we are appending, in which case, get the picker items
207 for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ )
208 commandToUndo->PushItem( aItemsList.GetItemWrapper( ii) );
209 }
210
211 // Verify list, and creates data if needed
212 for( unsigned ii = 0; ii < commandToUndo->GetCount(); ii++ )
213 {
214 SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( commandToUndo->GetPickedItem( ii ) );
215
216 // Common items implemented in EDA_DRAW_FRAME will not be SCH_ITEMs.
217 if( !sch_item )
218 continue;
219
220 UNDO_REDO command = commandToUndo->GetPickedItemStatus( ii );
221
222 if( command == UNDO_REDO::UNSPECIFIED )
223 {
224 command = aTypeCommand;
225 commandToUndo->SetPickedItemStatus( command, ii );
226 }
227
228 switch( command )
229 {
230 case UNDO_REDO::CHANGED:
231
232 /* If needed, create a copy of item, and put in undo list
233 * in the picker, as link
234 * If this link is not null, the copy is already done
235 */
236 if( commandToUndo->GetPickedItemLink( ii ) == nullptr )
237 commandToUndo->SetPickedItemLink( sch_item->Duplicate( true ), ii );
238
239 wxASSERT( commandToUndo->GetPickedItemLink( ii ) );
240 break;
241
242 case UNDO_REDO::NEWITEM:
243 case UNDO_REDO::DELETED:
244 case UNDO_REDO::PAGESETTINGS:
245 break;
246
247 default:
248 wxFAIL_MSG( wxString::Format( wxT( "Unknown undo/redo command %d" ), command ) );
249 break;
250 }
251 }
252
253 if( commandToUndo->GetCount() )
254 {
255 /* Save the copy in undo list */
256 PushCommandToUndoList( commandToUndo );
257
258 /* Clear redo list, because after new save there is no redo to do */
260 }
261 else // Should not occur
262 {
263 delete commandToUndo;
264 }
265}
266
267
269{
270 std::vector<SCH_ITEM*> bulkAddedItems;
271 std::vector<SCH_ITEM*> bulkRemovedItems;
272 std::vector<SCH_ITEM*> bulkChangedItems;
273 std::set<SCH_TABLE*> changedTables;
274 bool dirtyConnectivity = false;
275 bool rebuildHierarchyNavigator = false;
276 SCH_CLEANUP_FLAGS connectivityCleanUp = NO_CLEANUP;
277 SCH_SHEET_LIST sheets;
278
279 // Undo in the reverse order of list creation: (this can allow stacked changes like the
280 // same item can be changed and deleted in the same complex command).
281 // After hitting 0, subtracting 1 will roll the value over to its max representation
282 for( unsigned ii = aList->GetCount() - 1; ii < std::numeric_limits<unsigned>::max(); ii-- )
283 {
284 UNDO_REDO status = aList->GetPickedItemStatus( ii );
285 EDA_ITEM* eda_item = aList->GetPickedItem( ii );
286 SCH_SCREEN* screen = dynamic_cast<SCH_SCREEN*>( aList->GetScreenForItem( ii ) );
287
288 wxCHECK( screen, /* void */ );
289
290 eda_item->SetFlags( aList->GetPickerFlags( ii ) );
291 eda_item->ClearEditFlags();
292 eda_item->ClearTempFlags();
293
294 SCH_ITEM* schItem = dynamic_cast<SCH_ITEM*>( eda_item );
295
296 // Set connectable object connectivity status.
297 auto updateConnectivityFlag = [&, this]()
298 {
299 if( schItem )
300 {
301 if( schItem->IsConnectable() )
302 {
303 schItem->SetConnectivityDirty();
304
305 if( schItem->Type() == SCH_SYMBOL_T )
306 {
307 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( schItem );
308
309 wxCHECK( symbol, /* void */ );
310
311 for( SCH_PIN* pin : symbol->GetPins() )
312 pin->SetConnectivityDirty();
313 }
314 else if( schItem->Type() == SCH_SHEET_T )
315 {
316 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( schItem );
317
318 wxCHECK( sheet, /* void */ );
319
320 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
321 pin->SetConnectivityDirty();
322 }
323
325 dirtyConnectivity = true;
326
327 // Do a local clean up if there are any connectable objects in the commit.
328 if( connectivityCleanUp == NO_CLEANUP )
329 connectivityCleanUp = LOCAL_CLEANUP;
330
331 // Do a full rebauild of the connectivity if there is a sheet in the commit.
332 if( schItem->Type() == SCH_SHEET_T )
333 connectivityCleanUp = GLOBAL_CLEANUP;
334 }
335 else if( schItem->Type() == SCH_RULE_AREA_T )
336 {
337 dirtyConnectivity = true;
338 }
339 }
340 };
341
342 if( status == UNDO_REDO::NEWITEM )
343 {
344 updateConnectivityFlag();
345
346 // If we are removing the current sheet, get out first
347 if( eda_item->Type() == SCH_SHEET_T )
348 {
349 rebuildHierarchyNavigator = true;
350
351 if( static_cast<SCH_SHEET*>( eda_item )->GetScreen() == GetScreen() )
353 }
354
355 RemoveFromScreen( eda_item, screen );
356 aList->SetPickedItemStatus( UNDO_REDO::DELETED, ii );
357
358 bulkRemovedItems.emplace_back( schItem );
359 }
360 else if( status == UNDO_REDO::DELETED )
361 {
362 if( eda_item->Type() == SCH_SHEET_T )
363 rebuildHierarchyNavigator = true;
364
365 updateConnectivityFlag();
366
367 // deleted items are re-inserted on undo
368 AddToScreen( eda_item, screen );
369 aList->SetPickedItemStatus( UNDO_REDO::NEWITEM, ii );
370
371 bulkAddedItems.emplace_back( schItem );
372 }
373 else if( status == UNDO_REDO::PAGESETTINGS )
374 {
375 // Lazy eval of sheet list; this is expensive even when unsorted
376 if( sheets.empty() )
378
379 SCH_SHEET_PATH undoSheet = sheets.FindSheetForScreen( screen );
380
381 if( GetCurrentSheet() != undoSheet )
382 {
383 SetCurrentSheet( undoSheet );
385 }
386
387 // swap current settings with stored settings
388 DS_PROXY_UNDO_ITEM alt_item( this );
389 DS_PROXY_UNDO_ITEM* item = static_cast<DS_PROXY_UNDO_ITEM*>( eda_item );
390 item->Restore( this );
391 *item = std::move( alt_item );
392 }
393 else if( schItem )
394 {
395 SCH_ITEM* itemCopy = dynamic_cast<SCH_ITEM*>( aList->GetPickedItemLink( ii ) );
396
397 wxCHECK2( itemCopy, continue );
398
399 if( schItem->HasConnectivityChanges( itemCopy, &GetCurrentSheet() ) )
400 updateConnectivityFlag();
401
402 // The root sheet is a pseudo object that owns the root screen object but is not on
403 // the root screen so do not attempt to remove it from the screen it owns.
404 if( schItem != &Schematic().Root() )
405 RemoveFromScreen( schItem, screen );
406
407 switch( status )
408 {
409 case UNDO_REDO::CHANGED:
410 if( schItem->Type() == SCH_SHEET_T )
411 {
412 const SCH_SHEET* origSheet = static_cast<const SCH_SHEET*>( schItem );
413 const SCH_SHEET* copySheet = static_cast<const SCH_SHEET*>( itemCopy );
414
415 wxCHECK2( origSheet && copySheet, continue );
416
417 if( ( origSheet->GetName() != copySheet->GetName() )
418 || ( origSheet->GetFileName() != copySheet->GetFileName() ) )
419 {
420 rebuildHierarchyNavigator = true;
421 }
422 }
423
424 schItem->SwapData( itemCopy );
425 bulkChangedItems.emplace_back( schItem );
426
427 // Special cases for items which have instance data
428 if( schItem->GetParent() && schItem->GetParent()->Type() == SCH_SYMBOL_T
429 && schItem->Type() == SCH_FIELD_T )
430 {
431 SCH_FIELD* field = static_cast<SCH_FIELD*>( schItem );
432 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( schItem->GetParent() );
433
434 if( field->GetId() == REFERENCE_FIELD )
435 {
436 // Lazy eval of sheet list; this is expensive even when unsorted
437 if( sheets.empty() )
439
440 SCH_SHEET_PATH sheet = sheets.FindSheetForScreen( screen );
441 symbol->SetRef( &sheet, field->GetText() );
442 }
443
444 bulkChangedItems.emplace_back( symbol );
445 }
446
447 break;
448
449 default:
450 wxFAIL_MSG( wxString::Format( wxT( "Unknown undo/redo command %d" ),
451 aList->GetPickedItemStatus( ii ) ) );
452 break;
453 }
454
455 if( schItem->Type() == SCH_SYMBOL_T )
456 {
457 SCH_SYMBOL* sym = static_cast<SCH_SYMBOL*>( schItem );
458 sym->UpdatePins();
459 }
460
461 if( schItem != &Schematic().Root() )
462 AddToScreen( schItem, screen );
463 }
464 }
465
467
468 // Notify our listeners
469 if( bulkAddedItems.size() > 0 )
470 Schematic().OnItemsAdded( bulkAddedItems );
471
472 if( bulkRemovedItems.size() > 0 )
473 Schematic().OnItemsRemoved( bulkRemovedItems );
474
475 if( bulkChangedItems.size() > 0 )
476 Schematic().OnItemsChanged( bulkChangedItems );
477
478 if( dirtyConnectivity )
479 {
480 wxLogTrace( wxS( "CONN_PROFILE" ),
481 wxS( "Undo/redo %s clean up connectivity rebuild." ),
482 ( connectivityCleanUp == LOCAL_CLEANUP ) ? wxS( "local" ) : wxS( "global" ) );
483
484 SCH_COMMIT localCommit( m_toolManager );
485
486 RecalculateConnections( &localCommit, connectivityCleanUp );
487
488 // Update the hierarchy navigator when there are sheet changes.
489 if( connectivityCleanUp == GLOBAL_CLEANUP )
490 {
492
493 if( rebuildHierarchyNavigator )
495 }
496 }
497}
498
499
501{
503
504 // Skip empty frames
505 while( undo && !undo->GetCount() )
506 {
507 delete undo;
509 }
510
511 if( undo )
512 {
514 undo->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
515 {
516 delete aItem;
517 } );
518
519 delete undo;
520
521 m_toolManager->GetTool<EE_SELECTION_TOOL>()->RebuildSelection();
522 }
523
524 GetCanvas()->Refresh();
525}
526
527
529{
530 if( aItemCount == 0 )
531 return;
532
533 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
534
535 if( aItemCount < 0 )
536 {
537 list.ClearCommandList();
538 }
539 else
540 {
541 for( int ii = 0; ii < aItemCount; ii++ )
542 {
543 if( list.m_CommandsList.size() == 0 )
544 break;
545
546 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
547 list.m_CommandsList.erase( list.m_CommandsList.begin() );
548
549 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
550 {
551 delete aItem;
552 } );
553 delete curr_cmd; // Delete command
554 }
555 }
556}
557
558
void Restore(EDA_DRAW_FRAME *aFrame, KIGFX::VIEW *aView=nullptr)
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
UNDO_REDO_CONTAINER m_undoList
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
UNDO_REDO_CONTAINER m_redoList
virtual PICKED_ITEMS_LIST * PopCommandFromUndoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:88
virtual void ClearEditFlags()
Definition: eda_item.h:140
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:126
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
EDA_ITEM * GetParent() const
Definition: eda_item.h:102
EDA_ITEM_FLAGS GetFlags() const
Definition: eda_item.h:129
virtual void ClearTempFlags()
Definition: eda_item.h:152
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
static TOOL_ACTION leaveSheet
Definition: ee_actions.h:219
void SetLink(EDA_ITEM *aItem)
void SetFlags(EDA_ITEM_FLAGS aFlags)
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition: sch_view.cpp:179
A holder to handle information on schematic or board items.
bool SetPickedItemStatus(UNDO_REDO aStatus, unsigned aIdx)
Set the type of undo/redo operation for a given picked item.
EDA_ITEM_FLAGS GetPickerFlags(unsigned aIdx) const
Return the value of the picker flag.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
void SetDescription(const wxString &aDescription)
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
ITEM_PICKER GetItemWrapper(unsigned int aIdx) const
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
wxString GetDescription() const
unsigned GetCount() const
void CopyList(const PICKED_ITEMS_LIST &aSource)
Copy all data from aSource to the list.
bool SetPickedItemLink(EDA_ITEM *aLink, unsigned aIdx)
Set the link associated to a given picked item.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
BASE_SCREEN * GetScreenForItem(unsigned int aIdx) const
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
void OnItemsAdded(std::vector< SCH_ITEM * > &aNewItems)
Must be used if Add() is used using a BULK_x ADD_MODE to generate a change event for listeners.
Definition: schematic.cpp:754
void OnItemsRemoved(std::vector< SCH_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
Definition: schematic.cpp:760
SCH_SHEET_LIST BuildUnorderedSheetList() const
Definition: schematic.h:100
SCH_SHEET & Root() const
Definition: schematic.h:112
void OnItemsChanged(std::vector< SCH_ITEM * > &aItems)
Notify the schematic and its listeners that an item on the schematic has been modified in some way.
Definition: schematic.cpp:766
void AddToScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen=nullptr)
Add an item to the screen (and view) aScreen is the screen the item is located on,...
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void RemoveFromScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen)
Remove an item from the screen (and view) aScreen is the screen the item is located on,...
bool HasDriverChanged() const
wxString Name(bool aIgnoreSheet=false) const
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void RollbackSchematicFromUndo()
Perform an undo of the last edit WITHOUT logging a corresponding redo.
bool m_highlightedConnChanged
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true)
Update the hierarchy navigation tree and history.
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend, bool aDirtyConnectivity=true)
Create a copy of the current schematic item, and put it in the undo list.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
SCHEMATIC * m_schematic
The currently loaded schematic.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
void DisplayCurrentSheet()
Draw the current sheet on the display.
void PutDataInPreviousState(PICKED_ITEMS_LIST *aList)
Restore an undo or redo command to put data pointed by aList in the previous state.
wxString m_highlightedConn
The highlighted net or bus or empty string.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:51
int GetId() const
Definition: sch_field.h:133
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:166
virtual bool IsConnectable() const
Definition: sch_item.h:449
virtual void SwapData(SCH_ITEM *aItem)
Swap the internal data structures aItem with the schematic item.
Definition: sch_item.cpp:343
void SetConnectivityDirty(bool aDirty=true)
Definition: sch_item.h:512
bool IsConnectivityDirty() const
Definition: sch_item.h:510
virtual bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const
Check if aItem has connectivity changes against this object.
Definition: sch_item.h:529
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition: sch_item.cpp:216
SCH_ITEM * Duplicate(bool doClone=false) const
Routine to create a new copy of given item.
Definition: sch_item.cpp:126
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
SCH_SHEET_PATH FindSheetForScreen(const SCH_SCREEN *aScreen)
Return the first SCH_SHEET_PATH object (not necessarily the only one) using a particular screen.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet_pin.h:66
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:57
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:306
wxString GetName() const
Definition: sch_sheet.h:107
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:181
Schematic symbol object.
Definition: sch_symbol.h:105
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
Definition: sch_symbol.cpp:264
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
Definition: sch_symbol.cpp:690
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
A holder to handle a list of undo (or redo) commands.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
SCH_CLEANUP_FLAGS
@ LOCAL_CLEANUP
@ NO_CLEANUP
@ GLOBAL_CLEANUP
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
@ SCH_SYMBOL_T
Definition: typeinfo.h:172
@ SCH_FIELD_T
Definition: typeinfo.h:150
@ SCH_SHEET_T
Definition: typeinfo.h:174
@ SCH_RULE_AREA_T
Definition: typeinfo.h:170
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...