From 5fefc74da4a00de1d99cc16e3faa26be0b375f47 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 27 Sep 2013 19:58:58 +0200 Subject: [PATCH] Eeschema: fix isssues in net names selection for not named nets (i.e. nets without labels) --- eeschema/class_netlist_object.cpp | 10 +++-- eeschema/class_netlist_object.h | 6 +++ eeschema/netlist.cpp | 61 +++++++++++++++++++++---------- eeschema/sch_component.cpp | 9 +++++ eeschema/sch_component.h | 7 ++++ 5 files changed, 70 insertions(+), 23 deletions(-) diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp index cd0282009f..572a090cc9 100644 --- a/eeschema/class_netlist_object.cpp +++ b/eeschema/class_netlist_object.cpp @@ -347,12 +347,14 @@ wxString NETLIST_OBJECT::GetShortNetName() const if( m_netNameCandidate->m_Type == NET_PIN ) { - if( m_Link ) + SCH_COMPONENT* link = (SCH_COMPONENT*)m_netNameCandidate->m_Link; + if( link ) // Should be always true { netName = wxT("Net-<"); - netName << ( (SCH_COMPONENT*) m_Link )->GetRef( &m_SheetList ); - netName << wxT("-Pad") << LIB_PIN::ReturnPinStringNum( m_PinNum ); - netName << wxT(">"); + netName << link->GetRef( &m_netNameCandidate->m_SheetList ); + netName << wxT("-Pad") + << LIB_PIN::ReturnPinStringNum( m_netNameCandidate->m_PinNum ) + << wxT(">"); } } else diff --git a/eeschema/class_netlist_object.h b/eeschema/class_netlist_object.h index 9d01e7769f..0c6b57a0f4 100644 --- a/eeschema/class_netlist_object.h +++ b/eeschema/class_netlist_object.h @@ -164,6 +164,12 @@ public: */ void SetNetNameCandidate( NETLIST_OBJECT* aCandidate ); + /** + * @return true if an item has already a net name candidate + * and false if not ( m_netNameCandidate == NULL ) + */ + bool HasNetNameCandidate() { return m_netNameCandidate != NULL; } + /** * Function GetPinNum * returns a pin number in wxString form. Pin numbers are not always diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index 7a90b39e83..35c217b4ba 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -467,26 +467,40 @@ void NETLIST_OBJECT_LIST::findBestNetNameForEachNet() // (to avoid net names changes when the net is not modified, // even if components are moved or deleted and undelete or replaced, as long // the reference is kept) - netcode = 0; + + // Build the list of items with no net names + NETLIST_OBJECT_LIST list; + for( unsigned ii = 0; ii < size(); ii++ ) + { + item = GetItem( ii ); + if( !item->HasNetNameCandidate() ) + list.push_back( item ); + } + + if( list.size() == 0 ) + return; + idxstart = 0; candidate = NULL; - item = NULL; - for( unsigned ii = 0; ii <= size(); ii++ ) - { - if( ii == size() ) // last item already found - netcode = -2; - else - item = GetItem( ii ); + netcode = list.GetItemNet( 0 ); - if( netcode != item->GetNet() ) // End of net found + for( unsigned ii = 0; ii <= list.size(); ii++ ) + { + if( ii < list.size() ) + item = list.GetItem( ii ); + + if( netcode != item->GetNet() || ii >= list.size() ) // End of net found { if( candidate ) { for (unsigned jj = idxstart; jj < ii; jj++ ) - GetItem( jj )->SetNetNameCandidate( candidate ); + { + NETLIST_OBJECT* obj = list.GetItem( jj ); + obj->SetNetNameCandidate( candidate ); + } } - if( netcode == -2 ) + if( ii >= list.size() ) break; netcode = item->GetNet(); @@ -494,17 +508,26 @@ void NETLIST_OBJECT_LIST::findBestNetNameForEachNet() idxstart = ii; } - if( item->m_Type == NET_PIN && item->GetShortNetName().IsEmpty() ) + // Search all pins having no net name candidate yet, i.e. on nets + // having no labels + if( item->m_Type == NET_PIN ) { - // A candidate is found: select the better between the previous - // and this one - item->SetNetNameCandidate( item ); // Needed to calculate GetShortNetName - if( candidate == NULL ) - candidate = item; - else + // A candidate is found, however components which are not in + // netlist are not candidate because some have their reference + // is changed each time the netlist is built (power components) + // and anyway they are not a good candidate + SCH_COMPONENT* link = (SCH_COMPONENT*)item->m_Link; + if( link->IsInNetlist() ) { - if( item->GetShortNetName().Cmp( candidate->GetShortNetName() ) < 0 ) + // select the better between the previous and this one + item->SetNetNameCandidate( item ); // Needed to calculate GetShortNetName + if( candidate == NULL ) candidate = item; + else + { + if( item->GetShortNetName().Cmp( candidate->GetShortNetName() ) < 0 ) + candidate = item; + } } } } diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index 34eed00ce4..0136f605d9 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -1888,6 +1888,15 @@ bool SCH_COMPONENT::doIsConnected( const wxPoint& aPosition ) const return false; } +/* return true if the component is in netlist + * which means this is not a power component, or something + * like a component reference starting by # + */ +bool SCH_COMPONENT::IsInNetlist() const +{ + SCH_FIELD* rf = GetField( REFERENCE ); + return ! rf->GetText().StartsWith("#"); +} void SCH_COMPONENT::Plot( PLOTTER* aPlotter ) { diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h index 63cd1562ac..5e52ad2406 100644 --- a/eeschema/sch_component.h +++ b/eeschema/sch_component.h @@ -365,6 +365,13 @@ public: bool IsConnectable() const { return true; } + /** + * @return true if the component is in netlist + * which means this is not a power component, or something + * like a component reference starting by # + */ + bool IsInNetlist() const; + void GetConnectionPoints( vector< wxPoint >& aPoints ) const; SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,