Store items changed by connectivity algorithm in undo list
Fixes: lp:1828442
* https://bugs.launchpad.net/kicad/+bug/1828442
(cherry picked from commit fb80ee5a0e
)
This commit is contained in:
parent
b9898e2bb0
commit
52a9e68093
|
@ -256,20 +256,49 @@ void BOARD_COMMIT::Push( const wxString& aMessage, bool aCreateUndoEntry, bool a
|
||||||
if( itemsToDeselect.size() > 0 )
|
if( itemsToDeselect.size() > 0 )
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::unselectItems, true, &itemsToDeselect );
|
m_toolMgr->RunAction( PCB_ACTIONS::unselectItems, true, &itemsToDeselect );
|
||||||
|
|
||||||
|
if ( !m_editModules )
|
||||||
|
{
|
||||||
|
size_t num_changes = m_changes.size();
|
||||||
|
|
||||||
|
auto panel = static_cast<PCB_DRAW_PANEL_GAL*>( frame->GetGalCanvas() );
|
||||||
|
connectivity->RecalculateRatsnest( this );
|
||||||
|
connectivity->ClearDynamicRatsnest();
|
||||||
|
panel->RedrawRatsnest();
|
||||||
|
|
||||||
|
if( m_changes.size() > num_changes )
|
||||||
|
{
|
||||||
|
for( size_t i = num_changes; i < m_changes.size(); ++i )
|
||||||
|
{
|
||||||
|
COMMIT_LINE& ent = m_changes[i];
|
||||||
|
|
||||||
|
// This should only be modifications from the connectivity algo
|
||||||
|
wxASSERT( ( ent.m_type & CHT_TYPE ) == CHT_MODIFY );
|
||||||
|
|
||||||
|
auto boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
|
||||||
|
|
||||||
|
if( aCreateUndoEntry )
|
||||||
|
{
|
||||||
|
ITEM_PICKER itemWrapper( boardItem, UR_CHANGED );
|
||||||
|
wxASSERT( ent.m_copy );
|
||||||
|
itemWrapper.SetLink( ent.m_copy );
|
||||||
|
undoList.PushItem( itemWrapper );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete ent.m_copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
view->Update( boardItem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( !m_editModules && aCreateUndoEntry )
|
if( !m_editModules && aCreateUndoEntry )
|
||||||
frame->SaveCopyInUndoList( undoList, UR_UNSPECIFIED );
|
frame->SaveCopyInUndoList( undoList, UR_UNSPECIFIED );
|
||||||
|
|
||||||
if( TOOL_MANAGER* toolMgr = frame->GetToolManager() )
|
if( TOOL_MANAGER* toolMgr = frame->GetToolManager() )
|
||||||
toolMgr->PostEvent( { TC_MESSAGE, TA_MODEL_CHANGE, AS_GLOBAL } );
|
toolMgr->PostEvent( { TC_MESSAGE, TA_MODEL_CHANGE, AS_GLOBAL } );
|
||||||
|
|
||||||
if ( !m_editModules )
|
|
||||||
{
|
|
||||||
auto panel = static_cast<PCB_DRAW_PANEL_GAL*>( frame->GetGalCanvas() );
|
|
||||||
connectivity->RecalculateRatsnest();
|
|
||||||
connectivity->ClearDynamicRatsnest();
|
|
||||||
panel->RedrawRatsnest();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aSetDirtyBit )
|
if( aSetDirtyBit )
|
||||||
frame->OnModify();
|
frame->OnModify();
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <connectivity/connectivity_algo.h>
|
#include <connectivity/connectivity_algo.h>
|
||||||
#include <widgets/progress_reporter.h>
|
#include <widgets/progress_reporter.h>
|
||||||
#include <geometry/geometry_utils.h>
|
#include <geometry/geometry_utils.h>
|
||||||
|
#include <board_commit.h>
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
@ -444,7 +445,7 @@ void CN_CONNECTIVITY_ALGO::Build( const std::vector<BOARD_ITEM*>& aItems )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CN_CONNECTIVITY_ALGO::propagateConnections()
|
void CN_CONNECTIVITY_ALGO::propagateConnections( BOARD_COMMIT* aCommit )
|
||||||
{
|
{
|
||||||
for( const auto& cluster : m_connClusters )
|
for( const auto& cluster : m_connClusters )
|
||||||
{
|
{
|
||||||
|
@ -471,6 +472,9 @@ void CN_CONNECTIVITY_ALGO::propagateConnections()
|
||||||
MarkNetAsDirty( item->Parent()->GetNetCode() );
|
MarkNetAsDirty( item->Parent()->GetNetCode() );
|
||||||
MarkNetAsDirty( cluster->OriginNet() );
|
MarkNetAsDirty( cluster->OriginNet() );
|
||||||
|
|
||||||
|
if( aCommit )
|
||||||
|
aCommit->Modify( item->Parent() );
|
||||||
|
|
||||||
item->Parent()->SetNetCode( cluster->OriginNet() );
|
item->Parent()->SetNetCode( cluster->OriginNet() );
|
||||||
n_changed++;
|
n_changed++;
|
||||||
}
|
}
|
||||||
|
@ -491,10 +495,10 @@ void CN_CONNECTIVITY_ALGO::propagateConnections()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CN_CONNECTIVITY_ALGO::PropagateNets()
|
void CN_CONNECTIVITY_ALGO::PropagateNets( BOARD_COMMIT* aCommit )
|
||||||
{
|
{
|
||||||
m_connClusters = SearchClusters( CSM_PROPAGATE );
|
m_connClusters = SearchClusters( CSM_PROPAGATE );
|
||||||
propagateConnections();
|
propagateConnections( aCommit );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,8 @@ private:
|
||||||
void searchConnections();
|
void searchConnections();
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
void propagateConnections();
|
|
||||||
|
void propagateConnections( BOARD_COMMIT* aCommit = nullptr );
|
||||||
|
|
||||||
template <class Container, class BItem>
|
template <class Container, class BItem>
|
||||||
void add( Container& c, BItem brditem )
|
void add( Container& c, BItem brditem )
|
||||||
|
@ -223,7 +224,12 @@ public:
|
||||||
const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode, const KICAD_T aTypes[], int aSingleNet );
|
const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode, const KICAD_T aTypes[], int aSingleNet );
|
||||||
const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode );
|
const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode );
|
||||||
|
|
||||||
void PropagateNets();
|
/**
|
||||||
|
* Propagates nets from pads to other items in clusters
|
||||||
|
* @param aCommit is used to store undo information for items modified by the call
|
||||||
|
*/
|
||||||
|
void PropagateNets( BOARD_COMMIT* aCommit = nullptr );
|
||||||
|
|
||||||
void FindIsolatedCopperIslands( ZONE_CONTAINER* aZone, std::vector<int>& aIslands );
|
void FindIsolatedCopperIslands( ZONE_CONTAINER* aZone, std::vector<int>& aIslands );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -147,9 +147,9 @@ void CONNECTIVITY_DATA::addRatsnestCluster( const std::shared_ptr<CN_CLUSTER>& a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CONNECTIVITY_DATA::RecalculateRatsnest()
|
void CONNECTIVITY_DATA::RecalculateRatsnest( BOARD_COMMIT* aCommit )
|
||||||
{
|
{
|
||||||
m_connAlgo->PropagateNets();
|
m_connAlgo->PropagateNets( aCommit );
|
||||||
|
|
||||||
int lastNet = m_connAlgo->NetCount();
|
int lastNet = m_connAlgo->NetCount();
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ class CN_CLUSTER;
|
||||||
class CN_CONNECTIVITY_ALGO;
|
class CN_CONNECTIVITY_ALGO;
|
||||||
class CN_EDGE;
|
class CN_EDGE;
|
||||||
class BOARD;
|
class BOARD;
|
||||||
|
class BOARD_COMMIT;
|
||||||
class BOARD_CONNECTED_ITEM;
|
class BOARD_CONNECTED_ITEM;
|
||||||
class BOARD_ITEM;
|
class BOARD_ITEM;
|
||||||
class ZONE_CONTAINER;
|
class ZONE_CONTAINER;
|
||||||
|
@ -157,8 +158,9 @@ public:
|
||||||
/**
|
/**
|
||||||
* Function RecalculateRatsnest()
|
* Function RecalculateRatsnest()
|
||||||
* Updates the ratsnest for the board.
|
* Updates the ratsnest for the board.
|
||||||
|
* @param aCommit is used to save the undo state of items modified by this call
|
||||||
*/
|
*/
|
||||||
void RecalculateRatsnest();
|
void RecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetUnconnectedCount()
|
* Function GetUnconnectedCount()
|
||||||
|
|
Loading…
Reference in New Issue