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:
parent
9618c3a5f5
commit
938cb8843b
|
@ -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();
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 ) );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue