Try harder to remove stale pins from connectivity

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16846
This commit is contained in:
Jon Evans 2024-02-10 23:26:25 -05:00
parent 24cf0c0c62
commit 4eba781013
3 changed files with 40 additions and 0 deletions

View File

@ -734,6 +734,14 @@ std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> CONNECTION_GRAPH::ExtractAffected
}
alg::delete_matching( m_items, item );
if( item->Type() == SCH_SYMBOL_T )
{
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
for( SCH_PIN* pin : symbol->GetPins( &sg->m_sheet ) )
alg::delete_matching( m_items, pin );
}
}
removeSubgraphs( subgraphs );
@ -742,6 +750,24 @@ std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> CONNECTION_GRAPH::ExtractAffected
}
void CONNECTION_GRAPH::RemoveItem( SCH_ITEM* aItem )
{
auto it = m_item_to_subgraph_map.find( aItem );
if( it == m_item_to_subgraph_map.end() )
return;
CONNECTION_SUBGRAPH* subgraph = it->second;
while(subgraph->m_absorbed_by )
subgraph = subgraph->m_absorbed_by;
subgraph->RemoveItem( aItem );
alg::delete_matching( m_items, aItem );
m_item_to_subgraph_map.erase( it );
}
void CONNECTION_GRAPH::removeSubgraphs( std::set<CONNECTION_SUBGRAPH*>& aSubgraphs )
{
std::sort( m_driver_subgraphs.begin(), m_driver_subgraphs.end() );
@ -906,6 +932,9 @@ void CONNECTION_GRAPH::updateItemConnectivity( const SCH_SHEET_PATH& aSheet,
for( SCH_ITEM* item : aItemList )
{
if( item->Type() == SCH_PIN_T )
std::cout << "conn updateItemConnectivity " << item << std::endl;
std::vector<VECTOR2I> points = item->GetConnectionPoints();
item->ConnectedItems( aSheet ).clear();

View File

@ -452,6 +452,8 @@ public:
*/
void Merge( CONNECTION_GRAPH& aGraph );
void RemoveItem( SCH_ITEM* aItem );
private:
/**
* Update the graphical connectivity between items (i.e. where they touch)

View File

@ -33,6 +33,7 @@
#include <view/view.h>
#include <sch_commit.h>
#include <connection_graph.h>
#include <functional>
@ -533,6 +534,14 @@ void SCH_COMMIT::Revert()
{
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
symbol->UpdatePins();
CONNECTION_GRAPH* graph = schematic->ConnectionGraph();
SCH_SYMBOL* symbolCopy = static_cast<SCH_SYMBOL*>( copy );
graph->RemoveItem( symbolCopy );
for( SCH_PIN* pin : symbolCopy->GetPins() )
graph->RemoveItem( pin );
}
item->SetConnectivityDirty();