Eeschema: fix isssues in net names selection for not named nets (i.e. nets without labels)

This commit is contained in:
jean-pierre charras 2013-09-27 19:58:58 +02:00
parent f2e5da63e3
commit 1ae681454a
5 changed files with 70 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}
}
}
}

View File

@ -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 )
{

View File

@ -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,