From ff992f4a64f2a336f66637b4a69b8e3160201e4d Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Thu, 18 Oct 2018 10:35:59 +0100 Subject: [PATCH] Keep track of which nets are currently in use. Fixes: lp:1798006 * https://bugs.launchpad.net/kicad/+bug/1798006 --- common/widgets/net_selector.cpp | 11 ++++++----- pcbnew/board_netlist_updater.cpp | 17 +++++++++++++---- pcbnew/class_board.cpp | 17 +++++++++++++---- pcbnew/dialogs/panel_setup_netclasses.cpp | 22 ++++------------------ pcbnew/netinfo.h | 8 ++++++++ pcbnew/netinfo_item.cpp | 5 ++++- 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/common/widgets/net_selector.cpp b/common/widgets/net_selector.cpp index fab22c78e9..01ed0fedc9 100644 --- a/common/widgets/net_selector.cpp +++ b/common/widgets/net_selector.cpp @@ -236,14 +236,15 @@ protected: for( NETINFO_ITEM* netinfo : *m_netinfoList ) { - if( netinfo->GetNet() == 0 ) - continue; // we'll insert NO_NET after sorting - - if( filter.IsEmpty() || wxString( netinfo->GetNetname() ).MakeLower().Matches( filter ) ) - netNames.push_back( netinfo->GetNetname() ); + if( netinfo->GetNet() > 0 && netinfo->IsCurrent() ) + { + if( filter.IsEmpty() || wxString( netinfo->GetNetname() ).MakeLower().Matches( filter ) ) + netNames.push_back( netinfo->GetNetname() ); + } } std::sort( netNames.begin(), netNames.end() ); + // Special handling for if( filter.IsEmpty() || wxString( NO_NET ).MakeLower().Matches( filter ) ) netNames.insert( netNames.begin(), NO_NET ); diff --git a/pcbnew/board_netlist_updater.cpp b/pcbnew/board_netlist_updater.cpp index 8e09426133..36fcddda3d 100644 --- a/pcbnew/board_netlist_updater.cpp +++ b/pcbnew/board_netlist_updater.cpp @@ -306,10 +306,14 @@ bool BOARD_NETLIST_UPDATER::updateComponentPadConnections( MODULE* aPcbComponent } else // New footprint pad has a net. { - if( net.GetNetName() != pad->GetNetname() ) + const wxString& netName = net.GetNetName(); + NETINFO_ITEM* netinfo = m_board->FindNet( netName ); + + if( netinfo && !m_isDryRun ) + netinfo->SetIsCurrent( true ); + + if( pad->GetNetname() != netName ) { - const wxString& netName = net.GetNetName(); - NETINFO_ITEM* netinfo = m_board->FindNet( netName ); if( netinfo == nullptr ) { @@ -326,9 +330,9 @@ bool BOARD_NETLIST_UPDATER::updateComponentPadConnections( MODULE* aPcbComponent changed = true; netinfo = new NETINFO_ITEM( m_board, netName ); m_commit.Add( netinfo ); - m_addedNets[netName] = netinfo; } + m_addedNets[netName] = netinfo; msg.Printf( _( "Add net %s." ), netName ); m_reporter->Report( msg, REPORTER::RPT_ACTION ); } @@ -626,6 +630,11 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist ) if( !m_isDryRun ) { m_board->SetStatus( 0 ); + + // Mark all nets (except ) as stale; we'll update those to current that + // we find in the netlist + for( NETINFO_ITEM* net : m_board->GetNetInfo() ) + net->SetIsCurrent( net->GetNet() == 0 ); } for( unsigned i = 0; i < aNetlist.GetCount(); i++ ) diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index db6dceec1b..3f53789e86 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -2484,19 +2484,23 @@ void BOARD::updateComponentPadConnections( NETLIST& aNetlist, MODULE* footprint, } else // Footprint pad has a net. { - if( net.GetNetName() != pad->GetNetname() ) + const wxString& netName = net.GetNetName(); + NETINFO_ITEM* netinfo = FindNet( netName ); + + if( netinfo && !aNetlist.IsDryRun() ) + netinfo->SetIsCurrent( true ); + + if( pad->GetNetname() != netName ) { msg.Printf( _( "Changing footprint %s pad %s net from %s to %s." ), footprint->GetReference(), pad->GetName(), pad->GetNetname(), - net.GetNetName() ); + netName ); aReporter.Report( msg, REPORTER::RPT_ACTION ); if( !aNetlist.IsDryRun() ) { - NETINFO_ITEM* netinfo = FindNet( net.GetNetName() ); - if( netinfo == NULL ) { // It is a new net, we have to add it @@ -2556,6 +2560,11 @@ void BOARD::ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets, m_Status_Pcb = 0; + // Mark all nets (except ) as stale; we'll update those to current that + // we find in the netlist + for( NETINFO_ITEM* net : m_NetInfo ) + net->SetIsCurrent( net->GetNet() == 0 ); + for( i = 0; i < aNetlist.GetCount(); i++ ) { COMPONENT* component = aNetlist.GetComponent( i ); diff --git a/pcbnew/dialogs/panel_setup_netclasses.cpp b/pcbnew/dialogs/panel_setup_netclasses.cpp index ceebe05c51..4fbdaa5066 100644 --- a/pcbnew/dialogs/panel_setup_netclasses.cpp +++ b/pcbnew/dialogs/panel_setup_netclasses.cpp @@ -146,30 +146,16 @@ bool PANEL_SETUP_NETCLASSES::TransferDataToWindow() for( NETCLASSES::iterator i = netclasses.begin(); i != netclasses.end(); ++i, ++row ) netclassToGridRow( m_Frame->GetUserUnits(), m_netclassGrid, row, i->second ); - // Reassure that all nets have net classes assigned + // ensure that all nets have net classes assigned m_Pcb->BuildListOfNets(); if( m_membershipGrid->GetNumberRows() ) m_membershipGrid->DeleteRows( 0, m_membershipGrid->GetNumberRows() ); - // Initialize list of nets for Default Net Class - for( NETCLASS::iterator name = netclass->begin(); name != netclass->end(); ++name ) + for( NETINFO_ITEM* net : m_Pcb->GetNetInfo() ) { - if( name->IsEmpty() ) - // @TODO go fix m_Pcb->SynchronizeNetsAndNetClasses() so that the netcode==0 - // is not present in the BOARD::m_NetClasses - continue; - else - addNet( *name, netclass->GetName() ); - } - - // Initialize list of nets for others (custom) Net Classes - for( NETCLASSES::const_iterator nc = netclasses.begin(); nc != netclasses.end(); ++nc ) - { - netclass = nc->second; - - for( NETCLASS::const_iterator name = netclass->begin(); name != netclass->end(); ++name ) - addNet( *name, netclass->GetName() ); + if( net->GetNet() > 0 && net->IsCurrent() ) + addNet( net->GetNetname(), net->GetNetClass()->GetName() ); } return true; diff --git a/pcbnew/netinfo.h b/pcbnew/netinfo.h index 5ba9a18807..48bc83d26d 100644 --- a/pcbnew/netinfo.h +++ b/pcbnew/netinfo.h @@ -74,6 +74,10 @@ private: int m_NetCode; ///< A number equivalent to the net name. ///< Used for fast comparisons in ratsnest and DRC computations. + bool m_isCurrent; ///< Indicates the net is currently in use. We still store those + ///< that are not during a session for undo/redo and to keep + ///< netclass membership information. + wxString m_Netname; ///< Full net name like /mysheet/mysubsheet/vout used by Eeschema wxString m_ShortNetname; ///< short net name, like vout from /mysheet/mysubsheet/vout @@ -240,6 +244,10 @@ public: */ const wxString& GetShortNetname() const { return m_ShortNetname; } + bool IsCurrent() const { return m_isCurrent; } + + void SetIsCurrent( bool isCurrent ) { m_isCurrent = isCurrent; } + /** * Function GetMsgPanelInfo * returns the information about the #NETINFO_ITEM in \a aList to display in the diff --git a/pcbnew/netinfo_item.cpp b/pcbnew/netinfo_item.cpp index 8cedf499ec..db8e27efd2 100644 --- a/pcbnew/netinfo_item.cpp +++ b/pcbnew/netinfo_item.cpp @@ -50,7 +50,10 @@ NETINFO_ITEM::NETINFO_ITEM( BOARD* aParent, const wxString& aNetName, int aNetCode ) : BOARD_ITEM( aParent, PCB_NETINFO_T ), - m_NetCode( aNetCode ), m_Netname( aNetName ), m_ShortNetname( m_Netname.AfterLast( '/' ) ) + m_NetCode( aNetCode ), + m_isCurrent( true ), + m_Netname( aNetName ), + m_ShortNetname( m_Netname.AfterLast( '/' ) ) { m_parent = aParent;