Schematic reference object improvements and doxygen comment warning fixes.

* More schematic reference list object refactoring.
* Initial encapsultation of schematic reference object.
* Improve schematic reference object doxygen comments.
* Remove redundant library component lookup when generating net list.
* Fix doxygen waring in LIB_PIN object.
This commit is contained in:
Wayne Stambaugh 2011-01-05 14:16:55 -05:00
parent 9618c3a5f5
commit 938cb8843b
7 changed files with 305 additions and 362 deletions

View File

@ -43,18 +43,6 @@
static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
bool aUseSheetNum, int aSheetIntervalId );
/**
* Search in the sorted list of components, for a given component an other
* component with the same reference and a given part unit. Mainly used to
* manage multiple parts per package components in aComponentsList.
* @param aObjet = index in aComponentsList for the given SCH_REFERENCE
* item to test
* @param Unit = the given unit number to search
* @param aComponentsList = list of items to examine
* @return index in aComponentsList if found or -1 if not found
*/
static int ExistUnit( int aObjet, int aUnit, SCH_REFERENCE_LIST& aComponentList );
/**
* Function DeleteAnnotation
* Remove current component annotations
@ -105,12 +93,11 @@ void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly )
* for each sheet annotation starts from sheet number * 100
* ( the first sheet uses 100 to 199, the second 200 to 299 ... )
*/
void SCH_EDIT_FRAME::AnnotateComponents(
bool aAnnotateSchematic,
int aSortOption,
int aAlgoOption,
bool aResetAnnotation,
bool aRepairsTimestamps )
void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
int aSortOption,
int aAlgoOption,
bool aResetAnnotation,
bool aRepairsTimestamps )
{
SCH_REFERENCE_LIST references;
@ -158,22 +145,23 @@ void SCH_EDIT_FRAME::AnnotateComponents(
/* Break full components reference in name (prefix) and number:
* example: IC1 become IC, and 1 */
references.SplitReferences( );
references.SplitReferences();
switch( aSortOption )
{
default:
case 0:
references.SortCmpByXCoordinate();
references.SortByXCoordinate();
break;
case 1:
references.SortCmpByYCoordinate();
references.SortByYCoordinate();
break;
}
bool useSheetNum = false;
int idStep = 100;
switch( aAlgoOption )
{
default:
@ -198,74 +186,15 @@ void SCH_EDIT_FRAME::AnnotateComponents(
CheckAnnotate( NULL, !aAnnotateSchematic );
OnModify();
// Update on screen refences, that can be modified by previous calculations:
// Update on screen references, that can be modified by previous calculations:
m_CurrentSheet->UpdateAllScreenReferences();
SetSheetNumberAndCount();
DrawPanel->Refresh( true );
}
#ifdef USE_OLD_ALGO
/** helper function
* Search the last used (greatest) reference number in the component list
* for the prefix reference given by Objet
* The component list must be sorted.
*
* @param aObjet = reference item ( aComponentsList[aObjet].m_TextRef is
* the search pattern)
* @param aComponentsList = list of items
* @param aMinValue = min value for the current search
*/
static int GetLastNumberInReference( int aObjet,SCH_REFERENCE_LIST& aComponentsList,
int aMinValue )
{
int lastNumber = aMinValue;
for( unsigned ii = 0; ii < aComponentsList.GetCount(); ii++ )
{
// search only for the current reference prefix:
if( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) != 0 )
continue;
// update max value for the current reference prefix
if( lastNumber < aComponentsList[ii].m_NumRef )
lastNumber = aComponentsList[ii].m_NumRef;
}
return lastNumber;
}
#else
/**
* helper function BuildRefIdInUseList
* creates the list of reference numbers in use for a given reference prefix.
* This list is read by CreateFirstFreeRefId to fing not yet used reference Id.
* @see CreateFirstFreeRefId
* @param aObjet = the current component index to use for reference prefix filtering.
* @param aComponentsList = the full list of components
* @param aIdList = the buffer to fill
* @param aMinRefId = the min id value to store. all values < aMinRefId are ignored
*/
static void BuildRefIdInUseList( int aObjet,SCH_REFERENCE_LIST& aComponentsList,
std::vector<int>& aIdList, int aMinRefId )
{
aIdList.clear();
for( unsigned ii = 0; ii < aComponentsList.GetCount(); ii++ )
{
if( ( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) == 0 )
&& ( aComponentsList[ii].m_NumRef >= aMinRefId ) )
aIdList.push_back( aComponentsList[ii].m_NumRef );
}
sort( aIdList.begin(), aIdList.end() );
// Ensure each reference Id appears only once
// If there are multiple parts per package the same Id will be stored for each part.
std::vector<int>::iterator new_end = unique( aIdList.begin(), aIdList.end() );
if( new_end != aIdList.end() )
aIdList.erase(new_end, aIdList.end() );
}
#ifndef USE_OLD_ALGO
/**
* helper function CreateFirstFreeRefId
* Search for a free ref Id inside a list of reference numbers in use.
@ -279,13 +208,14 @@ static void BuildRefIdInUseList( int aObjet,SCH_REFERENCE_LIST& aComponentsList
* @return a free (not yet used) Id
* and this new id is added in list
*/
static int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue )
static int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue )
{
int expectedId = aFirstValue;
// We search for expectedId a value >= aFirstValue.
// We search for expected Id a value >= aFirstValue.
// Skip existing Id < aFirstValue
unsigned ii = 0;
for( ; ii < aIdList.size(); ii++ )
{
if( expectedId <= aIdList[ii] )
@ -294,7 +224,7 @@ static int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue )
// Ids are sorted by increasing value, from aFirstValue
// So we search from aFirstValue the first not used value, i.e. the first hole in list.
for(; ii < aIdList.size(); ii++ )
for(; ii < aIdList.size(); ii++ )
{
if( expectedId != aIdList[ii] ) // This id is not yet used.
{
@ -302,6 +232,7 @@ static int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue )
aIdList.insert(aIdList.begin() + ii, expectedId);
return expectedId;
}
expectedId++;
}
@ -329,17 +260,8 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
int LastReferenceNumber = 0;
int NumberOfUnits, Unit;
/* Components with an invisible reference (power...) always are
* re-annotated. So set their .m_IsNew member to true
*/
for( unsigned ii = 0; ii < aComponentsList.GetCount(); ii++ )
{
if( aComponentsList[ii].GetRefStr()[0] == '#' )
{
aComponentsList[ii].m_IsNew = true;
aComponentsList[ii].m_NumRef = 0;
}
}
/* Components with an invisible reference (power...) always are re-annotated. */
aComponentsList.ResetHiddenReferences();
/* calculate index of the first component with the same reference prefix
* than the current component. All components having the same reference
@ -351,47 +273,56 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
/* calculate the last used number for this reference prefix: */
#ifdef USE_OLD_ALGO
int minRefId = 0;
// when using sheet number, ensure ref number >= sheet number* aSheetIntervalId
if( aUseSheetNum )
minRefId = aComponentsList[first].m_SheetNum * aSheetIntervalId;
LastReferenceNumber = GetLastNumberInReference( first, aComponentsList, minRefId );
LastReferenceNumber = aComponentsList.GetLastReference( first, minRefId );
#else
int minRefId = 1;
// when using sheet number, ensure ref number >= sheet number* aSheetIntervalId
if( aUseSheetNum )
minRefId = aComponentsList[first].m_SheetNum * aSheetIntervalId + 1;
// This is the list of all Id already in use for a given reference prefix.
// Will be refilled for each new reference prefix.
std::vector<int>idList;
BuildRefIdInUseList( first, aComponentsList, idList, minRefId );
aComponentsList.GetRefsInUse( first, idList, minRefId );
#endif
for( unsigned ii = 0; ii < aComponentsList.GetCount(); ii++ )
{
if( aComponentsList[ii].m_Flag )
continue;
if( ( aComponentsList[first].CompareRef( aComponentsList[ii] ) != 0 ) ||
( aUseSheetNum && ( aComponentsList[first].m_SheetNum != aComponentsList[ii].m_SheetNum ) )
)
if( ( aComponentsList[first].CompareRef( aComponentsList[ii] ) != 0 )
|| ( aUseSheetNum
&& ( aComponentsList[first].m_SheetNum != aComponentsList[ii].m_SheetNum ) ) )
{
/* New reference found: we need a new ref number for this
* reference */
/* New reference found: we need a new ref number for this reference */
first = ii;
#ifdef USE_OLD_ALGO
minRefId = 0;
// when using sheet number, ensure ref number >= sheet number* aSheetIntervalId
if( aUseSheetNum )
minRefId = aComponentsList[ii].m_SheetNum * aSheetIntervalId;
LastReferenceNumber = GetLastNumberInReference( ii, aComponentsList, minRefId);
LastReferenceNumber = aComponentsList.GetLastReference( ii, minRefId );
#else
minRefId = 1;
// when using sheet number, ensure ref number >= sheet number* aSheetIntervalId
if( aUseSheetNum )
minRefId = aComponentsList[ii].m_SheetNum * aSheetIntervalId + 1;
BuildRefIdInUseList( first, aComponentsList, idList, minRefId );
aComponentsList.GetRefsInUse( first, idList, minRefId );
#endif
}
/* Annotation of one part per package components (trivial case)*/
if( aComponentsList[ii].m_Entry->GetPartCount() <= 1 )
// Annotation of one part per package components (trivial case).
if( aComponentsList[ii].GetLibComponent()->GetPartCount() <= 1 )
{
if( aComponentsList[ii].m_IsNew )
{
@ -409,9 +340,8 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
continue;
}
/* Annotation of multi-part components ( n parts per package )
* (complex case) */
NumberOfUnits = aComponentsList[ii].m_Entry->GetPartCount();
/* Annotation of multi-part components ( n parts per package ) (complex case) */
NumberOfUnits = aComponentsList[ii].GetLibComponent()->GetPartCount();
if( aComponentsList[ii].m_IsNew )
{
@ -424,6 +354,7 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
if( !aComponentsList[ii].IsPartsLocked() )
aComponentsList[ii].m_Unit = 1;
aComponentsList[ii].m_Flag = 1;
}
@ -436,14 +367,12 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
if( aComponentsList[ii].m_Unit == Unit )
continue;
int found = ExistUnit( ii, Unit, aComponentsList );
int found = aComponentsList.FindUnit( ii, Unit );
if( found >= 0 )
continue; /* this unit exists for this reference (unit
* already annotated) */
continue; /* this unit exists for this reference (unit already annotated) */
/* Search a component to annotate ( same prefix, same value,
* not annotated) */
/* Search a component to annotate ( same prefix, same value, not annotated) */
for( unsigned jj = ii + 1; jj < aComponentsList.GetCount(); jj++ )
{
if( aComponentsList[jj].m_Flag ) // already tested
@ -458,8 +387,7 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
if( !aComponentsList[jj].m_IsNew )
continue;
/* Component without reference number found, annotate it
* if possible */
/* Component without reference number found, annotate it if possible */
if( !aComponentsList[jj].IsPartsLocked()
|| ( aComponentsList[jj].m_Unit == Unit ) )
{
@ -475,42 +403,6 @@ static void ComputeReferenceNumber( SCH_REFERENCE_LIST& aComponentsList,
}
/*
* Search in the sorted list of components, for a given component an other
* component with the same reference and a given part unit. Mainly used to
* manage multiple parts per package components in aComponentsList.
*/
static int ExistUnit( int aObjet, int Unit, SCH_REFERENCE_LIST& aComponentsList )
{
int NumRef;
NumRef = aComponentsList[aObjet].m_NumRef;
for( unsigned ii = 0; ii < aComponentsList.GetCount(); ii++ )
{
if( aObjet == (int) ii )
// Do not compare with itself !
continue;
if( aComponentsList[ii].m_IsNew )
// Not already with an updated reference
continue;
if( aComponentsList[ii].m_NumRef != NumRef )
// Not the same reference number (like 35 in R35)
continue;
if( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) != 0 )
// Not the same reference prefix
continue;
if( aComponentsList[ii].m_Unit == Unit )
{
// A part with the same reference and the given unit is found
return ii;
}
}
return -1;
}
/**
* Function CheckAnnotate
* Check errors relatives to annotation:
@ -542,13 +434,13 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
else
GetSheet()->GetComponents( ComponentsList );
ComponentsList.SortComponentsByRefAndValue();
ComponentsList.SortByRefAndValue();
/* Break full components reference in name (prefix) and number: example:
* IC1 become IC, and 1 */
ComponentsList.SplitReferences();
/* count not yet annotated items or annottaion error*/
/* count not yet annotated items or annotation error*/
for( unsigned ii = 0; ii < ComponentsList.GetCount(); ii++ )
{
msg.Empty();
@ -581,7 +473,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
// Annotate error if unit selected does not exist ( i.e. > number of parts )
// Can happen if a component has changed in a lib, after a previous annotation
if( MAX( ComponentsList[ii].m_Entry->GetPartCount(), 1 ) < ComponentsList[ii].m_Unit )
if( MAX( ComponentsList[ii].GetLibComponent()->GetPartCount(), 1 ) < ComponentsList[ii].m_Unit )
{
if( ComponentsList[ii].m_NumRef >= 0 )
Buff << ComponentsList[ii].m_NumRef;
@ -594,7 +486,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
Buff.Printf( _( " unit %d and no more than %d parts" ),
ComponentsList[ii].m_Unit,
ComponentsList[ii].m_Entry->GetPartCount() );
ComponentsList[ii].GetLibComponent()->GetPartCount() );
msg << Buff;
if( aMessageList )
@ -651,8 +543,8 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
/* Test error if units are different but number of parts per package
* too high (ex U3 ( 1 part) and we find U3B this is an error) */
if( ComponentsList[ii].m_Entry->GetPartCount()
!= ComponentsList[ii + 1].m_Entry->GetPartCount() )
if( ComponentsList[ii].GetLibComponent()->GetPartCount()
!= ComponentsList[ii + 1].GetLibComponent()->GetPartCount() )
{
if( ComponentsList[ii].m_NumRef >= 0 )
Buff << ComponentsList[ii].m_NumRef;
@ -676,8 +568,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
error++;
}
/* Error if values are different between units, for the same
* reference */
/* Error if values are different between units, for the same reference */
int next = ii + 1;
if( ComponentsList[ii].CompareValue( ComponentsList[next] ) != 0 )
@ -723,7 +614,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
for( int ii = 0; ( ii < imax ) && ( error < 4 ); ii++ )
{
if( ( ComponentsList[ii].m_TimeStamp != ComponentsList[ii + 1].m_TimeStamp )
|| ( ComponentsList[ii].m_SheetPath != ComponentsList[ii + 1].m_SheetPath ) )
|| ( ComponentsList[ii].GetSheetPath() != ComponentsList[ii + 1].GetSheetPath() ) )
continue;
/* Same time stamp found. */
@ -731,7 +622,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
wxString full_path;
full_path.Printf( wxT( "%s%8.8X" ),
GetChars( ComponentsList[ii].m_SheetPath.Path() ),
GetChars( ComponentsList[ii].GetSheetPath().Path() ),
ComponentsList[ii].m_TimeStamp );
cmpref = ComponentsList[ii].GetRef();

View File

@ -43,16 +43,8 @@
/* sort function to annotate items from their position.
* Components are sorted
* by reference
* if same reference: by sheet
* if same sheet, by X pos
* if same X pos, by Y pos
* if same Y pos, by time stamp
*/
bool SCH_REFERENCE_LIST::sortBy_X_Position( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
bool SCH_REFERENCE_LIST::sortByXPosition( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
int ii = item1.CompareRef( item2 );
@ -69,16 +61,8 @@ bool SCH_REFERENCE_LIST::sortBy_X_Position( const SCH_REFERENCE& item1,
}
/* sort function to annotate items by their position.
* Components are sorted
* by reference
* if same reference: by sheet
* if same sheet, by Y pos
* if same Y pos, by X pos
* if same X pos, by time stamp
*/
bool SCH_REFERENCE_LIST::sortBy_Y_Position( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
bool SCH_REFERENCE_LIST::sortByYPosition( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
int ii = item1.CompareRef( item2 );
@ -94,16 +78,9 @@ bool SCH_REFERENCE_LIST::sortBy_Y_Position( const SCH_REFERENCE& item1,
return ii < 0;
}
/*
* sort function to annotate items by value
* Components are sorted
* by reference
* if same reference: by value
* if same value: by unit number
* if same unit number, by sheet
* if same sheet, by position X, and Y
*/
bool SCH_REFERENCE_LIST::sortByRefAndValue( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
bool SCH_REFERENCE_LIST::sortByRefAndValue( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
int ii = item1.CompareRef( item2 );
if( ii == 0 )
@ -122,13 +99,9 @@ bool SCH_REFERENCE_LIST::sortByRefAndValue( const SCH_REFERENCE& item1, const SC
return ii < 0;
}
/* sort function for for list by values
* components are sorted
* by value
* if same value: by reference
* if same reference: by unit number
*/
bool SCH_REFERENCE_LIST::sortComponentsByValueOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
int ii;
const wxString* Text1, * Text2;
@ -150,16 +123,9 @@ bool SCH_REFERENCE_LIST::sortComponentsByValueOnly( const SCH_REFERENCE& item1,
return ii < 0;
}
/**
* Function sortComponentsByReferenceOnly
* compare function for sorting in BOM creation.
* components are sorted
* by reference
* if same reference: by value
* if same value: by unit number
*/
bool SCH_REFERENCE_LIST::sortComponentsByReferenceOnly( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
bool SCH_REFERENCE_LIST::sortByReferenceOnly( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
int ii;
const wxString* Text1, * Text2;
@ -182,12 +148,8 @@ bool SCH_REFERENCE_LIST::sortComponentsByReferenceOnly( const SCH_REFERENCE& ite
}
/*****************************************************************************
* qsort function to annotate items by value
* Components are sorted by time stamp
*****************************************************************************/
bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
const SCH_REFERENCE& item2 )
{
int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath );
@ -198,10 +160,32 @@ bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
}
int SCH_REFERENCE_LIST::FindUnit( size_t aIndex, int aUnit )
{
int NumRef;
NumRef = componentFlatList[aIndex].m_NumRef;
for( size_t ii = 0; ii < componentFlatList.size(); ii++ )
{
if( ( aIndex == ii )
|| ( componentFlatList[ii].m_IsNew )
|| ( componentFlatList[ii].m_NumRef != NumRef )
|| ( componentFlatList[aIndex].CompareRef( componentFlatList[ii] ) != 0 ) )
continue;
if( componentFlatList[ii].m_Unit == aUnit )
return (int) ii;
}
return -1;
}
/* Remove sub components from the list, when multiples parts per package are
* found in this list
*/
void SCH_REFERENCE_LIST::RemoveSubComponentsFromList( )
void SCH_REFERENCE_LIST::RemoveSubComponentsFromList()
{
SCH_COMPONENT* libItem;
wxString oldName;
@ -209,7 +193,8 @@ void SCH_REFERENCE_LIST::RemoveSubComponentsFromList( )
// The component list **MUST** be sorted by reference and by unit number
// in order to find all parts of a component
SortComponentsByReferenceOnly();
SortByReferenceOnly();
for( unsigned ii = 0; ii < componentFlatList.size(); ii++ )
{
libItem = componentFlatList[ii].m_RootCmp;
@ -220,18 +205,72 @@ void SCH_REFERENCE_LIST::RemoveSubComponentsFromList( )
if( !oldName.IsEmpty() )
{
if( oldName == currName ) // currName is a subpart of oldName:
// remove it
if( oldName == currName ) // currName is a subpart of oldName: remove it
{
componentFlatList.erase( componentFlatList.begin() + ii );
ii--;
}
}
oldName = currName;
}
}
void SCH_REFERENCE_LIST::ResetHiddenReferences()
{
for( unsigned ii = 0; ii < componentFlatList.size(); ii++ )
{
if( componentFlatList[ii].GetRefStr()[0] == '#' )
{
componentFlatList[ii].m_IsNew = true;
componentFlatList[ii].m_NumRef = 0;
}
}
}
void SCH_REFERENCE_LIST::GetRefsInUse( int aIndex, std::vector< int >& aIdList, int aMinRefId )
{
aIdList.clear();
for( unsigned ii = 0; ii < componentFlatList.size(); ii++ )
{
if( ( componentFlatList[aIndex].CompareRef( componentFlatList[ii] ) == 0 )
&& ( componentFlatList[ii].m_NumRef >= aMinRefId ) )
aIdList.push_back( componentFlatList[ii].m_NumRef );
}
sort( aIdList.begin(), aIdList.end() );
// Ensure each reference number appears only once. If there are components with
// multiple parts per package the same number will be stored for each part.
std::vector< int >::iterator it = unique( aIdList.begin(), aIdList.end() );
// Using the C++ unique algorithm only moves the duplicate entries to the end of
// of the array. This removes the duplicate entries from the array.
aIdList.resize( it - aIdList.begin() );
}
int SCH_REFERENCE_LIST::GetLastReference( int aIndex, int aMinValue )
{
int lastNumber = aMinValue;
for( unsigned ii = 0; ii < componentFlatList.size(); ii++ )
{
// search only for the current reference prefix:
if( componentFlatList[aIndex].CompareRef( componentFlatList[ii] ) != 0 )
continue;
// update max value for the current reference prefix
if( lastNumber < componentFlatList[ii].m_NumRef )
lastNumber = componentFlatList[ii].m_NumRef;
}
return lastNumber;
}
SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_COMPONENT* aLibComponent,
SCH_SHEET_PATH& aSheetPath )

View File

@ -408,7 +408,7 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName, bool aInc
cmplist.RemoveSubComponentsFromList();
// sort component list by value
cmplist.SortComponentsByValueOnly( );
cmplist.SortByValueOnly( );
PrintComponentsListByPart( f, cmplist,aIncludeSubComponents );
fclose( f );
@ -440,7 +440,7 @@ void DIALOG_BUILD_BOM::CreateExportList( const wxString& aFullFileName,
sheetList.GetComponents( cmplist, false );
// sort component list
cmplist.SortComponentsByReferenceOnly( );
cmplist.SortByReferenceOnly( );
if( !aIncludeSubComponents )
cmplist.RemoveSubComponentsFromList();
@ -489,7 +489,7 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName,
fprintf( f, "%s >> Creation date: %s\n", CONV_TO_UTF8( Title ), Line );
// sort component list
cmplist.SortComponentsByReferenceOnly();
cmplist.SortByReferenceOnly();
if( !aIncludeSubComponents )
cmplist.RemoveSubComponentsFromList();
@ -499,7 +499,7 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName,
if( m_ListCmpbyValItems->GetValue() )
{
cmplist.SortComponentsByValueOnly();
cmplist.SortByValueOnly();
PrintComponentsListByVal( f, cmplist, aIncludeSubComponents );
}
}
@ -632,7 +632,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
// Print list of items
for( unsigned ii = 0; ii < aList.GetCount(); ii++ )
{
EDA_ITEM* item = aList[ii].m_RootCmp;
EDA_ITEM* item = aList[ii].GetComponent();
if( item == NULL )
continue;
@ -680,7 +680,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
if( aIncludeSubComponents )
{
msg = aList[ii].m_SheetPath.PathHumanReadable();
msg = aList[ii].GetSheetPath().PathHumanReadable();
BASE_SCREEN * screen = (BASE_SCREEN*) comp->GetParent();
if( screen )
@ -747,10 +747,10 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* f, SCH_REFERENCE_LIST& aL
for( unsigned ii = 0; ii < aList.GetCount(); ii++ )
{
currCmp = (SCH_COMPONENT*) aList[ii].m_RootCmp;
currCmp = aList[ii].GetComponent();
if( ii < aList.GetCount() -1 )
nextCmp = aList[ii+1].m_RootCmp;
nextCmp = aList[ii+1].GetComponent();
else
nextCmp = NULL;
@ -882,7 +882,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f,
for( unsigned ii = 0; ii < aList.GetCount(); ii++ )
{
schItem = aList[ii].m_RootCmp;
schItem = aList[ii].GetComponent();
if( schItem == NULL )
continue;
@ -918,7 +918,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f,
BASE_SCREEN * screen = (BASE_SCREEN*) DrawLibItem->GetParent();
if( screen )
{
msg = aList[ii].m_SheetPath.PathHumanReadable();
msg = aList[ii].GetSheetPath().PathHumanReadable();
fprintf( f, " (Sheet %s)", CONV_TO_UTF8( msg ) );
msg = m_Parent->GetXYSheetReferences( screen, DrawLibItem->m_Pos );
fprintf( f, " (loc %s)", CONV_TO_UTF8( msg ) );

View File

@ -1841,34 +1841,18 @@ wxArrayString LIB_PIN::GetElectricalTypeNames( void )
}
/**
* Get a list of pin electrical type icons.
* @return List of valid pin electrical type bitmaps symbols in .xpm format
* for menus and dialogs .
*/
const char*** LIB_PIN::GetElectricalTypeSymbols( void )
{
return s_icons_Pins_Electrical_Type;
}
/**
* Get a list of pin orientation icons.
*
* @return List of valid pin orientation bitmaps symbols in .xpm format
* for menus and dialogs .
*/
const char*** LIB_PIN::GetOrientationSymbols()
{
return s_icons_Pins_Orientations;
}
/**
* Get a list of pin styles bitmaps for menus and dialogs.
*
* @return List of valid pin electrical type bitmaps symbols in .xpm format.
*/
const char*** LIB_PIN::GetStyleSymbols()
{
return s_icons_Pins_Shapes;

View File

@ -361,7 +361,7 @@ public:
static wxArrayString GetOrientationNames();
/**
* Get a list of pin orientation bitmaps for menus and dialogs..
* Get a list of pin orientation bitmaps for menus and dialogs.
*
* @return List of valid pin orientation bitmaps symbols in .xpm format
*/

View File

@ -1370,16 +1370,13 @@ bool EXPORT_HELP::WriteNetListPCBNEW( SCH_EDIT_FRAME* frame, FILE* f, bool with_
// Get the Component FootprintFilter and put the component in
// cmpList if filter is present
LIB_COMPONENT* entry =
CMP_LIBRARY::FindLibraryComponent( comp->GetLibName() );
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( comp->GetLibName() );
if( entry )
{
if( entry->GetFootPrints().GetCount() != 0 ) // Put in list
{
cmpList.push_back( SCH_REFERENCE() );
cmpList.back().m_RootCmp = comp;
cmpList.back().SetRef( comp->GetRef( path ) );
cmpList.push_back( SCH_REFERENCE( comp, entry, *path ) );
}
}
@ -1442,11 +1439,10 @@ bool EXPORT_HELP::WriteNetListPCBNEW( SCH_EDIT_FRAME* frame, FILE* f, bool with_
wxString ref;
ret |= fprintf( f, "{ Allowed footprints by component:\n" );
for( unsigned ii = 0; ii < cmpList.size(); ii++ )
{
SCH_COMPONENT* comp = cmpList[ii].m_RootCmp;
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( comp->GetLibName() );
LIB_COMPONENT* entry = cmpList[ii].GetLibComponent();
ref = cmpList[ii].GetRef();

View File

@ -39,6 +39,7 @@
class SCH_COMPONENT;
class SCH_REFERENC_LIST;
#define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
@ -61,16 +62,17 @@ class SCH_REFERENCE
private:
/// Component reference prefix, without number (for IC1, this is IC) )
std::string m_Ref; // it's private, use the accessors please
SCH_COMPONENT* m_RootCmp; ///< The component associated the reference object.
LIB_COMPONENT* m_Entry; ///< The source component from a library.
wxPoint m_CmpPos; ///< The physical position of the component in schematic
///< used to annotate by X or Y position
SCH_SHEET_PATH m_SheetPath; ///< The sheet path for this reference.
friend class SCH_REFERENCE_LIST;
public:
SCH_COMPONENT* m_RootCmp; // the component in schematic
LIB_COMPONENT* m_Entry; // the source component in library
int m_Unit; /* Selected part (For multi parts per
* package) depending on sheet path */
wxPoint m_CmpPos; // The physical position of the component in schematic
// used to annotate by Y ou Y position
SCH_SHEET_PATH m_SheetPath; /* the sheet path for this component */
* package) depending on sheet path */
int m_SheetNum; // the sheet num for this component
unsigned long m_TimeStamp; /* unique identification number
* depending on sheet path */
@ -100,6 +102,12 @@ public:
SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_COMPONENT* aLibComponent,
SCH_SHEET_PATH& aSheetPath );
SCH_COMPONENT* GetComponent() const { return m_RootCmp; }
LIB_COMPONENT* GetLibComponent() const { return m_Entry; }
SCH_SHEET_PATH GetSheetPath() const { return m_SheetPath; }
/**
* Function Annotate
* updates the annotation of the component according the the current object state.
@ -119,11 +127,11 @@ public:
thereby making it easy to change that strategy.
*/
void SetRef( const wxString& aReference )
{
m_Ref = CONV_TO_UTF8( aReference );
}
wxString GetRef() const
{
return CONV_FROM_UTF8( m_Ref.c_str() );
@ -137,32 +145,30 @@ public:
return m_Ref.c_str();
}
int CompareValue( const SCH_REFERENCE& item ) const
{
return m_Value->CmpNoCase( *item.m_Value );
}
int CompareRef( const SCH_REFERENCE& item ) const
{
return m_Ref.compare( item.m_Ref );
}
bool IsPartsLocked()
{
return m_Entry->UnitsLocked();
}
};
/* object used in annotation to handle a list of components in schematic
* because in a complex hierarchy, a component is used more than once,
* and its reference is depending on the sheet path
* for the same component, we must create a flat list of components
* used in nelist generation, BOM generation and annotation
*/
/**
* Class SCH_REFERENCE_LIST
* is used create a flattened list of components because in a complex hierarchy, a component
* can used more than once and its reference designator is dependent on the sheet path for the
* same component. This flattened list is used for netlist generation, BOM generation, and
* schematic annotation.
*/
class SCH_REFERENCE_LIST
{
private:
@ -193,20 +199,19 @@ public:
* Function GetItem
* @return the aIdx item
*/
SCH_REFERENCE& GetItem(int aIdx)
SCH_REFERENCE& GetItem( int aIdx )
{
return componentFlatList[aIdx];
}
/**
* Function AddItem
* Add a OBJ_CMP_TO_LIST object in aComponentsList for each component found
* in sheet
* adds a SCH_REFERENCE object to the list of references.
* @param aItem - a SCH_REFERENCE item to add
*/
void AddItem( SCH_REFERENCE& aItem )
{
componentFlatList.push_back( aItem);
componentFlatList.push_back( aItem );
}
/**
@ -215,19 +220,18 @@ public:
* found in this list.
* Useful to create BOM, when a component must appear only once
*/
void RemoveSubComponentsFromList( );
void RemoveSubComponentsFromList();
/* Sort functions:
* Sort functions are used to sort components for annotatioon or BOM generation.
* Sort functions are used to sort components for annotation or BOM generation.
* Because sorting depend on we want to do, there are many sort functions.
* Note:
* When creating BOM, components are fully annotated.
* references are somethink like U3, U5 or R4, R8
* references are something like U3, U5 or R4, R8
* When annotating, some or all components are not annotated,
* i.e. ref is only U or R, with no number.
*/
/**
* Function SplitReferences
* attempts to split all reference designators into a name (U) and number (1). If the
@ -244,10 +248,9 @@ public:
/**
* function UpdateAnnotation
* Update the reference components for the schematic project (or the current sheet)
* Note: this function does not calculate the reference numbers
* stored in m_NumRef
* So, it must be called after calcultaion of new reference numbers
* Updates the reference components for the schematic project (or the current sheet)
* Note: this function does not calculate the reference numbers stored in m_NumRef
* So, it must be called after calculation of new reference numbers
* @see SCH_REFERENCE::Annotate()
*/
void UpdateAnnotation()
@ -260,23 +263,41 @@ public:
}
/**
* Function SortCmpByXCoordinate
* sort the flat list by X coordinates.
* The list is always sorted first by ref and sheet
* Function sortByXCoordinate
* sorts the list of references by X position.
* <p>
* Components are sorted as follows:
* <ul>
* <li>Numeric value of reference designator.</li>
* <li>Sheet number.</li>
* <li>X coordinate position.</li>
* <li>Y coordinate position.</li>
* <li>Time stamp.</li>
* </ul>
* </p>
*/
void SortCmpByXCoordinate()
void SortByXCoordinate()
{
sort( componentFlatList.begin(), componentFlatList.end(), sortBy_X_Position );
sort( componentFlatList.begin(), componentFlatList.end(), sortByXPosition );
}
/**
* Function SortCmpByYCoordinate
* sort the flat list by Y coordinates.
* The list is always sorted first by ref and sheet
* Function sortByYCoordinate
* sorts the list of references by Y position.
* <p>
* Components are sorted as follows:
* <ul>
* <li>Numeric value of reference designator.</li>
* <li>Sheet number.</li>
* <li>Y coordinate position.</li>
* <li>X coordinate position.</li>
* <li>Time stamp.</li>
* </ul>
* </p>
*/
void SortCmpByYCoordinate()
void SortByYCoordinate()
{
sort( componentFlatList.begin(), componentFlatList.end(), sortBy_Y_Position );
sort( componentFlatList.begin(), componentFlatList.end(), sortByYPosition );
}
/**
@ -290,103 +311,115 @@ public:
}
/**
* Function SortComponentsByValue
* sort the flat list by Value.
* Values are sorted by numeric values, not by alpahbetic order
* The list is always sorted first by ref
* Function SortByRefAndValue
* sorts the list of references by value.
* <p>
* Components are sorted in the following order:
* <ul>
* <li>Numeric value of reference designator.</li>
* <li>Value of component.</li>
* <li>Unit number when component has multiple parts.</li>
* <li>Sheet number.</li>
* <li>X coordinate position.</li>
* <li>Y coordinate position.</li>
* </ul>
* </p>
*/
void SortComponentsByRefAndValue()
void SortByRefAndValue()
{
sort( componentFlatList.begin(), componentFlatList.end(), sortByRefAndValue );
}
/**
* Function SortComponentsByReferenceOnly
* sort the flat list by references
* For BOM, sorted by reference
* Function SortByReferenceOnly
* sorts the list of references by reference.
* <p>
* Components are sorted in the following order:
* <ul>
* <li>Numeric value of reference designator.</li>
* <li>Unit number when component has multiple parts.</li>
* </ul>
* </p>
*/
void SortComponentsByReferenceOnly()
void SortByReferenceOnly()
{
sort( componentFlatList.begin(), componentFlatList.end(), sortComponentsByReferenceOnly );
sort( componentFlatList.begin(), componentFlatList.end(), sortByReferenceOnly );
}
/**
* Function SortComponentsByValueOnly
* sort the flat list by references
* For BOM, sorted by values
* Function SortByValueOnly
* sort the list of references by value.
* <p>
* Components are sorted in the following order:
* <ul>
* <li>Value of component.</li>
* <li>Numeric value of reference designator.</li>
* <li>Unit number when component has multiple parts.</li>
* </ul>
* </p>
*/
void SortComponentsByValueOnly()
void SortByValueOnly()
{
sort( componentFlatList.begin(), componentFlatList.end(), sortComponentsByValueOnly );
sort( componentFlatList.begin(), componentFlatList.end(), sortByValueOnly );
}
/**
* Function GetUnit
* searches the sorted list of components for a another component with the same
* reference and a given part unit. Use this method to manage components with
* multiple parts per package.
* @param aIndex = index in aComponentsList for of given SCH_REFERENCE item to test.
* @param aUnit = the given unit number to search
* @return index in aComponentsList if found or -1 if not found
*/
int FindUnit( size_t aIndex, int aUnit );
/**
* Function ResetHiddenReferences
* clears the annotation for all references that have an invisible reference designator.
* Invisible reference designators always have # as the first letter.
*/
void ResetHiddenReferences();
/**
* Function GetRefsInUse
* adds all the reference designator numbers greater than \a aMinRefId to \a aIdList
* skipping the reference at \a aIndex.
* @param aIndex = the current component index to use for reference prefix filtering.
* @param aIdList = the buffer to fill
* @param aMinRefId = the min id value to store. all values < aMinRefId are ignored
*/
void GetRefsInUse( int aIndex, std::vector< int >& aIdList, int aMinRefId );
/**
* Function GetLastReference
* returns the last used (greatest) reference number in the reference list
* for the prefix reference given by \a aIndex. The component list must be
* sorted.
*
* @param aIndex The index of the reference item used for the search pattern.
* @param aMinValue The minimum value for the current search.
*/
int GetLastReference( int aIndex, int aMinValue );
private:
/* sort functions used to sort componentFlatList
*/
/**
* Function sortByRefAndValue
* sort function to annotate items by value
* Components are sorted
* by reference (when used, referenc is only U ot R, with no number)
* if same reference: by value
* if same value: by unit number
* if same unit number, by sheet
* if same sheet, by position X, and Y
* @param item1, item2 = SCH_REFERENCE items to compare
*/
static bool sortByRefAndValue( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
/**
* Function sortBy_X_Position
* sort function to annotate items from their position.
* Components are sorted
* by reference (when used, referenc is only U ot R, with no number)
* if same reference: by sheet
* if same sheet, by X pos
* if same X pos, by Y pos
* if same Y pos, by time stamp
* @param item1, item2 = SCH_REFERENCE items to compare
*/
static bool sortBy_X_Position( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
/**
* Function sortBy_Y_Position
* sort function to annotate items from their position.
* Components are sorted
* by reference (when used, referenc is only U ot R, with no number)
* if same reference: by sheet
* if same sheet, by Y pos
* if same Y pos, by X pos
* if same X pos, by time stamp
* @param item1, item2 = SCH_REFERENCE items to compare
*/
static bool sortBy_Y_Position( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
static bool sortByXPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
static bool sortByYPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
static bool sortByTimeStamp( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
/**
* Function sortComponentsByValueOnly
* compare function for sorting in BOM creation.
* components are sorted
* by value
* if same value: by reference
* if same reference: by unit number
* @param item1, item2 = SCH_REFERENCE items to compare
*/
static bool sortByValueOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
static bool sortComponentsByValueOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
/**
* Function sortComponentsByReferenceOnly
* compare function for sorting in BOM creation.
* components are sorted
* by reference
* if same reference: by value (happens only for multi parts per package)
* if same value: by unit number
* @param item1, item2 = SCH_REFERENCE items to compare
*/
static bool sortComponentsByReferenceOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
static bool sortByReferenceOnly( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 );
};
/**
* helper Class LABEL_OBJECT
* is used in build BOM to handle the list of labels in schematic