|
|
|
@ -285,17 +285,54 @@ bool SCH_COMPONENT::Resolve( PART_LIBS* aLibs ) |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// Helper sort function, used in SCH_COMPONENT::ResolveAll, to sort
|
|
|
|
// sch component by lib_id
|
|
|
|
static bool sort_by_libid( const SCH_COMPONENT* ref, SCH_COMPONENT* cmp ) |
|
|
|
{ |
|
|
|
return ref->GetLibId() < cmp->GetLibId(); |
|
|
|
} |
|
|
|
|
|
|
|
void SCH_COMPONENT::ResolveAll( |
|
|
|
const SCH_COLLECTOR& aComponents, PART_LIBS* aLibs ) |
|
|
|
{ |
|
|
|
// Usually, many components use the same part lib.
|
|
|
|
// to avoid too long calculation time the list of components is grouped
|
|
|
|
// and once the lib part is found for one member of a group, it is also
|
|
|
|
// set for all other members of this group
|
|
|
|
std::vector<SCH_COMPONENT*> cmp_list; |
|
|
|
|
|
|
|
// build the cmp list.
|
|
|
|
for( int i = 0; i < aComponents.GetCount(); ++i ) |
|
|
|
{ |
|
|
|
SCH_COMPONENT* cmp = dynamic_cast<SCH_COMPONENT*>( aComponents[i] ); |
|
|
|
wxASSERT( cmp ); |
|
|
|
|
|
|
|
if( cmp ) // cmp == NULL should not occur.
|
|
|
|
cmp->Resolve( aLibs ); |
|
|
|
cmp_list.push_back( cmp ); |
|
|
|
} |
|
|
|
|
|
|
|
// sort it by lib part. Cmp will be grouped by same lib part.
|
|
|
|
std::sort( cmp_list.begin(), cmp_list.end(), sort_by_libid ); |
|
|
|
|
|
|
|
LIB_ID curr_libid; |
|
|
|
|
|
|
|
for( unsigned ii = 0; ii < cmp_list.size (); ++ii ) |
|
|
|
{ |
|
|
|
SCH_COMPONENT* cmp = cmp_list[ii]; |
|
|
|
curr_libid = cmp->m_lib_id; |
|
|
|
cmp->Resolve( aLibs ); |
|
|
|
|
|
|
|
// Propagate the m_part pointer to other members using the same lib_id
|
|
|
|
for( unsigned jj = ii+1; jj < cmp_list.size (); ++jj ) |
|
|
|
{ |
|
|
|
SCH_COMPONENT* next_cmp = cmp_list[jj]; |
|
|
|
|
|
|
|
if( curr_libid != next_cmp->m_lib_id ) |
|
|
|
break; |
|
|
|
|
|
|
|
next_cmp->m_part = cmp->m_part; |
|
|
|
ii = jj; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|