48#include <unordered_set>
50using namespace std::placeholders;
123 Stage( member, aChangeType, aScreen, aRecurse );
165 parentGroup->RemoveItem( aItem );
176 std::vector<BOX2I>& aStaleRuleAreas )
178 wxCHECK( aChangedItem, );
181 aStaleZones->push_back(
static_cast<ZONE*
>( aChangedItem ) );
193 if( !
static_cast<ZONE*
>( aChangedItem )->GetZoneName().IsEmpty() )
194 aStaleRuleAreas.push_back( damageBBox );
204 if( damageLayers.any() )
208 if( zone->GetIsRuleArea() )
211 if( ( zone->GetLayerSet() & damageLayers ).any() && zone->GetBoundingBox().Intersects( damageBBox ) )
212 aStaleZones->push_back( zone );
229 bool itemsDeselected =
false;
230 bool selectedModified =
false;
232 std::unordered_set<EDA_ITEM*> removedItems;
235 bool solderMaskDirty =
false;
236 bool autofillZones =
false;
237 bool updateBoardBoundingBox =
false;
238 std::vector<BOARD_ITEM*> staleTeardropPadsAndVias;
239 std::set<PCB_TRACK*> staleTeardropTracks;
240 std::vector<BOARD_ITEM*> dirtyCopper;
241 std::set<BOARD_ITEM*> dirtyCopperSeen;
242 std::vector<ZONE*> staleZonesStorage;
243 std::vector<ZONE*>* staleZones =
nullptr;
244 std::vector<BOX2I> staleRuleAreas;
249 bool containsDrillMap =
false;
250 bool containsDrillChart =
false;
254 if( !entry.m_item || !entry.m_item->IsBOARD_ITEM() )
276 std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->
GetConnectivity();
283 std::vector<BOARD_ITEM*> bulkAddedItems;
284 std::vector<BOARD_ITEM*> bulkRemovedItems;
285 std::vector<BOARD_ITEM*> itemsChanged;
290 autofillZones =
true;
291 staleZones = &staleZonesStorage;
294 zone->CacheBoundingBox();
299 if( !entry.m_item || !entry.m_item->IsBOARD_ITEM() )
308 if( entry.m_copy && entry.m_copy->IsBOARD_ITEM() )
309 preEditItem =
static_cast<BOARD_ITEM*
>( entry.m_copy );
317 solderMaskDirty =
true;
323 updateBoardBoundingBox =
true;
345 && dirtyCopperSeen.insert( aItem ).second )
347 dirtyCopper.push_back( aItem );
351 collectCopper( boardItem );
356 if( entry.m_copy && entry.m_copy->IsBOARD_ITEM() )
360 collectCopper(
copy );
367 staleTeardropPadsAndVias.push_back(
pad );
371 staleTeardropPadsAndVias.push_back( boardItem );
377 staleTeardropTracks.insert( track );
379 std::vector<PAD*> connectedPads;
380 std::vector<PCB_VIA*> connectedVias;
382 connectivity->GetConnectedPadsAndVias( track, &connectedPads, &connectedVias );
384 for(
PAD*
pad : connectedPads )
385 staleTeardropPadsAndVias.push_back(
pad );
388 staleTeardropPadsAndVias.push_back(
via );
394 selectedModified =
true;
398 if( !staleTeardropPadsAndVias.empty() || !staleTeardropTracks.empty() || !dirtyCopper.empty() )
399 teardropMgr.
RemoveTeardrops( *
this, &staleTeardropPadsAndVias, &staleTeardropTracks, &dirtyCopper );
401 auto updateComponentClasses =
419 if( !entry.m_item || !entry.m_item->IsBOARD_ITEM() )
423 int changeType = entry.m_type &
CHT_TYPE;
424 int changeFlags = entry.m_type &
CHT_FLAGS;
430 enteredGroup->AddItem( boardItem );
441 parentFP->Add( boardItem );
446 bulkAddedItems.push_back( boardItem );
454 view->
Add( boardItem );
456 updateComponentClasses( boardItem );
467 ITEM_PICKER itemWrapper(
nullptr, boardItem, status );
468 itemWrapper.
SetLink( entry.m_copy );
469 entry.m_copy =
nullptr;
478 itemsDeselected =
true;
481 removedItems.insert( boardItem );
489 switch( boardItem->
Type() )
492 static_cast<PCB_FIELD*
>( boardItem )->SetVisible(
false );
495 view->
Update( boardItem );
524 view->
Remove( boardItem );
532 parentFP->Remove( boardItem );
533 connectivity->Remove( boardItem );
534 itemsChanged.push_back( parentFP );
539 parentFP->Remove( boardItem );
540 connectivity->Remove( boardItem );
541 itemsChanged.push_back( parentFP );
546 bulkRemovedItems.push_back( boardItem );
554 view->
Remove( boardItem );
560 bulkRemovedItems.push_back( boardItem );
574 parentFP->Remove( boardItem );
575 itemsChanged.push_back( parentFP );
580 parentFP->Remove( boardItem );
581 itemsChanged.push_back( parentFP );
586 bulkRemovedItems.push_back( boardItem );
595 bulkRemovedItems.push_back( boardItem );
617 itemWrapper.
SetLink( entry.m_copy );
618 entry.m_copy =
nullptr;
624 connectivity->MarkItemNetAsDirty( boardItemCopy );
625 connectivity->Update( boardItem );
634 updateComponentClasses( boardItem );
637 view->
Update( boardItem );
639 itemsChanged.push_back( boardItem );
650 entry.m_copy =
nullptr;
665 if( selTool && !removedItems.empty() )
669 for(
EDA_ITEM* ancestor = selectedItem; ancestor; ancestor = ancestor->
GetParent() )
671 if( removedItems.count( ancestor ) )
674 itemsDeselected =
true;
690 connectivity->ClearRatsnest();
691 connectivity->ClearLocalRatsnest();
695 connectivity->RecalculateRatsnest(
this );
697 connectivity->ClearLocalRatsnest();
705 if( solderMaskDirty )
711 if( updateBoardBoundingBox )
722 view->
Add( outline );
732 || cfg->m_Display.m_PadClearance ) )
739 if( !staleTeardropPadsAndVias.empty() || !staleTeardropTracks.empty() )
741 teardropMgr.
UpdateTeardrops( *
this, &staleTeardropPadsAndVias, &staleTeardropTracks );
744 connectivity->RecalculateRatsnest(
this );
748 for(
size_t i = originalCount; i <
m_entries.size(); ++i )
760 wxCHECK2( boardItem,
continue );
765 itemWrapper.
SetLink( boardItemCopy );
776 view->
Add( boardItem );
778 view->
Remove( boardItem );
780 view->
Update( boardItem );
785 if( bulkAddedItems.size() > 0 || bulkRemovedItems.size() > 0 || itemsChanged.size() > 0 )
790 if( containsDrillChart && selTool )
806 if( itemsDeselected )
813 for(
ZONE* zone : *staleZones )
824 if( selectedModified )
836 if( !itemsDeselected && !autofillZones && !selectedModified )
838 std::vector<MSG_PANEL_ITEM> msg_list;
844 if( containsDrillMap && frame )
896 std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->
GetConnectivity();
900 auto updateComponentClasses =
910 std::vector<BOARD_ITEM*> bulkAddedItems;
911 std::vector<BOARD_ITEM*> bulkRemovedItems;
912 std::vector<BOARD_ITEM*> itemsChanged;
913 std::vector<BOARD_ITEM*> itemsToDelete;
914 bool containsDrillMap =
false;
916 for(
int ii = aCheckpoint; ii < (int)
m_entries.size(); ++ii )
938 view->
Remove( boardItem );
940 connectivity->Remove( boardItem );
946 parentFP->Remove( boardItem );
947 itemsChanged.push_back( parentFP );
952 parentFP->Remove( boardItem );
953 itemsChanged.push_back( parentFP );
958 bulkRemovedItems.push_back( boardItem );
967 itemsToDelete.push_back( boardItem );
977 view->
Add( boardItem );
984 connectivity->Add( boardItem );
985 itemsChanged.push_back( parentFP );
991 connectivity->Add( boardItem );
992 itemsChanged.push_back( parentFP );
997 bulkAddedItems.push_back( boardItem );
1000 updateComponentClasses( boardItem );
1007 view->
Remove( boardItem );
1009 connectivity->Remove( boardItem );
1016 view->
Add( boardItem );
1018 connectivity->Add( boardItem );
1019 itemsChanged.push_back( boardItem );
1021 updateComponentClasses( boardItem );
1040 if( bulkAddedItems.size() > 0 || bulkRemovedItems.size() > 0 || itemsChanged.size() > 0 )
1046 connectivity->Remove( item );
1054 connectivity->RecalculateRatsnest();
1060 selTool->RebuildSelection();
1065 if( containsDrillMap )
1084 if( entry.m_item && entry.m_item->IsBOARD_ITEM() && entry.m_item->m_Uuid == aID )
1085 return entry.m_item;
static bool isNoGeometryItem(const BOARD_ITEM *aItem)
#define SKIP_CONNECTIVITY
#define SKIP_ENTERED_GROUP
Handles how to draw a screen (a board, a schematic ...)
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
bool RemoveOrDiscard(BOARD_ITEM *aItem)
Remove aItem, or free it if it was added earlier in this commit and never reached the board.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE) override
Add a change of the item aItem of type aChangeType to the change list.
virtual EDA_ITEM * ResolveItem(KIID &aID) override
Search for an item in this commit that matches the provided KIID.
void Revert() override
Revert the commit by restoring the modified items state.
static EDA_ITEM * MakeImage(EDA_ITEM *aItem)
EDA_ITEM * undoLevelItem(EDA_ITEM *aItem) const override
void RevertToCheckpoint(int aCheckpoint) override
EDA_ITEM * makeImage(EDA_ITEM *aItem) const override
void propagateDamage(BOARD_ITEM *aItem, std::vector< ZONE * > *aStaleZones, std::vector< BOX2I > &aStaleRuleAreas)
BOARD_COMMIT(EDA_DRAW_FRAME *aFrame)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
bool IsGroupableType() const
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const
Invoke a function on all children.
Information pertinent to a Pcbnew printed circuit board.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
PCB_BOARD_OUTLINE * BoardOutline()
void UpdateBoardOutline()
const ZONES & Zones() const
void OnItemsCompositeUpdate(std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aChangedItems)
Notify the board and its listeners that items on the board have been modified in a composite operatio...
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
void IncrementTimeStamp()
void OnRatsnestChanged()
Notify the board and its listeners that the ratsnest has been recomputed.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
COMPONENT_CLASS_MANAGER & GetComponentClassManager()
Gets the component class manager.
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
std::set< std::pair< EDA_ITEM *, BASE_SCREEN * > > m_deletedItems
void Unstage(EDA_ITEM *aItem, BASE_SCREEN *aScreen)
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT_LINE * findEntry(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Search for an entry describing change for a particular item.
virtual void makeEntry(EDA_ITEM *aItem, CHANGE_TYPE aType, EDA_ITEM *aCopy=nullptr, BASE_SCREEN *aScreen=nullptr)
std::vector< COMMIT_LINE > m_entries
void dropEntriesAfter(int aCheckpoint)
void clear()
Should be called in Push() & Revert() methods.
virtual COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Add a change of the item aItem of type aChangeType to the change list.
void InvalidateComponentClasses()
Invalidates any caches component classes and recomputes caches if required.
void RebuildRequiredCaches(FOOTPRINT *aFootprint=nullptr) const
Rebuilds any caches that may be required by custom assignment rules.
bool IsType(FRAME_T aType) const
The base class for create windows for drawing purpose.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
A set of EDA_ITEMs (i.e., without duplicates).
void RemoveItem(EDA_ITEM *aItem)
Remove item from group.
virtual EDA_ITEM * AsEdaItem()=0
A base class for most all the KiCad significant classes used in schematics and boards.
virtual void ClearEditFlags()
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
virtual EDA_GROUP * GetParentGroup() const
KICAD_T Type() const
Returns the type of object.
EDA_ITEM * GetParent() const
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
EDA_ITEM_FLAGS GetFlags() const
static const TOOL_EVENT SelectedItemsModified
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
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...
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
void UpdateCollidingItems(const std::vector< BOX2I > &aStaleAreas, std::initializer_list< KICAD_T > aTypes)
Sets the KIGFX::REPAINT on all items matching aTypes which intersect aStaleAreas.
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
bool IsBOARD_ITEM() const
virtual wxString GetClass() const =0
Return the class name.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const LSET & PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
DISPLAY_OPTIONS m_Display
static TOOL_ACTION rehatchShapes
static TOOL_ACTION zoneFillDirty
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 ...
virtual void SaveCopyInUndoList(EDA_ITEM *aItemToCopy, UNDO_REDO aTypeCommand)
Create a new entry in undo list of commands.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void RefreshDrillSymbols(int aUpdateFlags)
Refresh cached drill symbols in frames that render drill maps.
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
virtual void AppendCopyToUndoList(const PICKED_ITEMS_LIST &aItemsList, UNDO_REDO aTypeCommand)
As SaveCopyInUndoList, but appends the changes to the last undo item on the stack.
void RedrawRatsnest()
Force refresh of the ratsnest visual representation.
A set of BOARD_ITEMs (i.e., without duplicates).
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
void SetDescription(const wxString &aDescription)
const std::deque< EDA_ITEM * > GetItems() const
TEARDROP_MANAGER manage and build teardrop areas A teardrop area is a polygonal area (a copper ZONE) ...
void UpdateTeardrops(BOARD_COMMIT &aCommit, const std::vector< BOARD_ITEM * > *dirtyPadsAndVias, const std::set< PCB_TRACK * > *dirtyTracks, bool aForceFullUpdate=false)
Update teardrops on a list of items.
void RemoveTeardrops(BOARD_COMMIT &aCommit, std::vector< BOARD_ITEM * > *dirtyPadsAndVias, std::set< PCB_TRACK * > *dirtyTracks, const std::vector< BOARD_ITEM * > *dirtyCopper=nullptr)
Remove teardrops on dirty pads, vias or tracks, and any whose neighbouring copper moved,...
Handle a list of polygons defining a copper zone.
CHANGE_TYPE
Types of changes.
@ CHT_DONE
Flag to indicate the change is already applied.
#define STRUCT_DELETED
flag indication structures to be erased
#define UR_TRANSIENT
indicates the item is owned by the undo/redo stack
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
@ REPAINT
Item needs to be redrawn.
@ GEOMETRY
Position or shape has changed.
@ LAYERS
Layers have changed.
void RefreshDrillMapOutlines(const BOARD &aBoard, KIGFX::VIEW *aView)
Repaint every drill map after an Edge.Cuts edit.
Class to handle a set of BOARD_ITEMs.
T * GetAppSettings(const char *aFilename)
EDA_ITEM * m_copy
Optional copy of the item.
CHANGE_TYPE m_type
Modification type.
EDA_ITEM * m_item
Main item that is added/deleted/modified.
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
@ PCB_CONSTRAINT_T
a geometric constraint between board items
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DRILL_MAP_T
class PCB_DRILL_MAP, drill symbols drawn at the holes
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_3D_BODY_T
class PCB_3D_BODY, a 3D body (extruded or model) on a footprint
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_GRID_ITEM_T
a subgrid placed on a board
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
@ PCB_DRILL_CHART_T
class PCB_DRILL_CHART, a live drill chart derived from PCB_TABLE
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...