|
|
|
@ -17,9 +17,8 @@ |
|
|
|
#include "netlist.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* Local Functions*/ |
|
|
|
static int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList, |
|
|
|
DrawSheetPath* sheet ); |
|
|
|
SCH_SHEET_PATH* sheet ); |
|
|
|
static void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ); |
|
|
|
static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ); |
|
|
|
static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ); |
|
|
|
@ -30,19 +29,17 @@ static int ExistUnit( int aObjet, int aUnit, |
|
|
|
static int ReplaceDuplicatedTimeStamps(); |
|
|
|
|
|
|
|
|
|
|
|
/******************************************************/ |
|
|
|
void WinEDA_SchematicFrame::UpdateSheetNumberAndDate() |
|
|
|
/******************************************************/ |
|
|
|
|
|
|
|
/* Set a sheet number, the sheet count for sheets in the whole schematic
|
|
|
|
* and update the date in all screens |
|
|
|
*/ |
|
|
|
void WinEDA_SchematicFrame::UpdateSheetNumberAndDate() |
|
|
|
{ |
|
|
|
wxString date = GenDate(); |
|
|
|
EDA_ScreenList s_list; |
|
|
|
|
|
|
|
// Set the date
|
|
|
|
for( SCH_SCREEN* screen = s_list.GetFirst(); screen != NULL; screen = s_list.GetNext() ) |
|
|
|
for( SCH_SCREEN* screen = s_list.GetFirst(); screen != NULL; |
|
|
|
screen = s_list.GetNext() ) |
|
|
|
screen->m_Date = date; |
|
|
|
|
|
|
|
// Set sheet counts
|
|
|
|
@ -61,12 +58,13 @@ void WinEDA_SchematicFrame::UpdateSheetNumberAndDate() |
|
|
|
void ReAnnotatePowerSymbolsOnly( void ) |
|
|
|
{ |
|
|
|
/* Build the whole sheet list in hierarchy (sheet, not screen) */ |
|
|
|
EDA_SheetList SheetList; |
|
|
|
SCH_SHEET_LIST SheetList; |
|
|
|
|
|
|
|
DrawSheetPath* sheet; |
|
|
|
int CmpNumber = 1; |
|
|
|
SCH_SHEET_PATH* sheet; |
|
|
|
int CmpNumber = 1; |
|
|
|
|
|
|
|
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) |
|
|
|
for( sheet = SheetList.GetFirst(); sheet != NULL; |
|
|
|
sheet = SheetList.GetNext() ) |
|
|
|
{ |
|
|
|
EDA_BaseStruct* DrawList = sheet->LastDrawList(); |
|
|
|
for( ; DrawList != NULL; DrawList = DrawList->Next() ) |
|
|
|
@ -105,7 +103,8 @@ void ReAnnotatePowerSymbolsOnly( void ) |
|
|
|
* if same X pos, by Y pos |
|
|
|
* if same Y pos, by time stamp |
|
|
|
*/ |
|
|
|
static bool AnnotateBy_X_Position( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
static bool AnnotateBy_X_Position( const OBJ_CMP_TO_LIST& item1, |
|
|
|
const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
{ |
|
|
|
int ii = item1.CompareRef( item2 ); |
|
|
|
|
|
|
|
@ -130,7 +129,8 @@ static bool AnnotateBy_X_Position( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_T |
|
|
|
* if same Y pos, by X pos |
|
|
|
* if same X pos, by time stamp |
|
|
|
*/ |
|
|
|
static bool AnnotateBy_Y_Position( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
static bool AnnotateBy_Y_Position( const OBJ_CMP_TO_LIST& item1, |
|
|
|
const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
{ |
|
|
|
int ii = item1.CompareRef( item2 ); |
|
|
|
|
|
|
|
@ -148,15 +148,16 @@ static bool AnnotateBy_Y_Position( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_T |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* qsort 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 time stamp |
|
|
|
*****************************************************************************/ |
|
|
|
static bool AnnotateByValue( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
* qsort 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 time stamp |
|
|
|
*****************************************************************************/ |
|
|
|
static bool AnnotateByValue( const OBJ_CMP_TO_LIST& item1, |
|
|
|
const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
{ |
|
|
|
int ii = item1.CompareRef( item2 ); |
|
|
|
|
|
|
|
@ -178,10 +179,11 @@ static bool AnnotateByValue( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* qsort function to annotate items by value |
|
|
|
* Components are sorted by time stamp |
|
|
|
*****************************************************************************/ |
|
|
|
static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
* qsort function to annotate items by value |
|
|
|
* Components are sorted by time stamp |
|
|
|
*****************************************************************************/ |
|
|
|
static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1, |
|
|
|
const OBJ_CMP_TO_LIST& item2 ) |
|
|
|
{ |
|
|
|
int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath ); |
|
|
|
|
|
|
|
@ -192,15 +194,14 @@ static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1, const OBJ_CMP_TO_LIST |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************/ |
|
|
|
void WinEDA_SchematicFrame::DeleteAnnotation( bool aCurrentSheetOnly, bool aRedraw ) |
|
|
|
/**************************************************************************************/ |
|
|
|
|
|
|
|
/** Function DeleteAnnotation
|
|
|
|
* Remove current component annotations |
|
|
|
* @param aCurrentSheetOnly : if false: remove all annotations, else remove annotation relative to the current sheet only |
|
|
|
* @param aCurrentSheetOnly : if false: remove all annotations, else remove |
|
|
|
* annotation relative to the current sheet only |
|
|
|
* @param aRedraw : true to refresh display |
|
|
|
*/ |
|
|
|
void WinEDA_SchematicFrame::DeleteAnnotation( bool aCurrentSheetOnly, |
|
|
|
bool aRedraw ) |
|
|
|
{ |
|
|
|
SCH_ITEM* strct; |
|
|
|
SCH_SCREEN* screen; |
|
|
|
@ -242,22 +243,26 @@ void WinEDA_SchematicFrame::DeleteAnnotation( bool aCurrentSheetOnly, bool aRedr |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* AnnotateComponents: |
|
|
|
* |
|
|
|
* Compute the annotation of the components for the whole project, or the |
|
|
|
* current sheet only. All the components or the new ones only will be |
|
|
|
* annotated. |
|
|
|
* @param parent = Schematic frame |
|
|
|
* @param annotateSchematic : true = entire schematic annotation, false = current scheet only |
|
|
|
* @param sortOption : 0 = annotate by sorting X position, |
|
|
|
* 1 = annotate by sorting Y position, |
|
|
|
* 2 = annotate by sorting value |
|
|
|
* @param resetAnnotation : true = remove previous annotation false = anotate new components only |
|
|
|
* @param repairsTimestamps : true = test for duplicate times stamps and replace duplicated |
|
|
|
* Note: this option could change previous annotation, because time stamps are used to handle annotation |
|
|
|
* mainly in complex hierarchies. |
|
|
|
*****************************************************************************/ |
|
|
|
/**
|
|
|
|
* AnnotateComponents: |
|
|
|
* |
|
|
|
* Compute the annotation of the components for the whole project, or the |
|
|
|
* current sheet only. All the components or the new ones only will be |
|
|
|
* annotated. |
|
|
|
* @param parent = Schematic frame |
|
|
|
* @param annotateSchematic : true = entire schematic annotation, |
|
|
|
* false = current sheet only |
|
|
|
* @param sortOption : 0 = annotate by sorting X position, |
|
|
|
* 1 = annotate by sorting Y position, |
|
|
|
* 2 = annotate by sorting value |
|
|
|
* @param resetAnnotation : true = remove previous annotation |
|
|
|
* false = annotate new components only |
|
|
|
* @param repairsTimestamps : true = test for duplicate times stamps and |
|
|
|
* replace duplicated |
|
|
|
* Note: this option could change previous annotation, because time |
|
|
|
* stamps are used to handle annotation mainly in complex |
|
|
|
* hierarchies. |
|
|
|
*/ |
|
|
|
void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
bool annotateSchematic, |
|
|
|
int sortOption, |
|
|
|
@ -268,15 +273,17 @@ void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
|
|
|
|
wxBusyCursor dummy; |
|
|
|
|
|
|
|
// Test and replace duplicte time stamps
|
|
|
|
// duplicate can happen with old schematics, or schematic conversions or manual editions of files ...
|
|
|
|
// Test and replace duplicate time stamps
|
|
|
|
// duplicate can happen with old schematics, or schematic conversions or
|
|
|
|
// manual editions of files ...
|
|
|
|
if( repairsTimestamps ) |
|
|
|
{ |
|
|
|
int ireplacecount = ReplaceDuplicatedTimeStamps(); |
|
|
|
if( ireplacecount ) |
|
|
|
{ |
|
|
|
wxString msg; |
|
|
|
msg.Printf( _( "%d Duplicate Time stamps replaced" ), ireplacecount ); |
|
|
|
msg.Printf( _( "%d duplicate time stamps replaced." ), |
|
|
|
ireplacecount ); |
|
|
|
DisplayInfoMessage( NULL, msg, 2 ); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -287,7 +294,7 @@ void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
parent->DeleteAnnotation( !annotateSchematic, false ); |
|
|
|
|
|
|
|
/* Build the sheet list */ |
|
|
|
EDA_SheetList SheetList; |
|
|
|
SCH_SHEET_LIST SheetList; |
|
|
|
|
|
|
|
/* Update the sheet number, sheet count and date */ |
|
|
|
parent->UpdateSheetNumberAndDate(); |
|
|
|
@ -295,7 +302,7 @@ void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
/* Build component list */ |
|
|
|
if( annotateSchematic ) |
|
|
|
{ |
|
|
|
DrawSheetPath* sheet; |
|
|
|
SCH_SHEET_PATH* sheet; |
|
|
|
for( sheet = SheetList.GetFirst(); |
|
|
|
sheet != NULL; |
|
|
|
sheet = SheetList.GetNext() ) |
|
|
|
@ -312,11 +319,13 @@ void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
switch( sortOption ) |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
sort( ComponentsList.begin(), ComponentsList.end(), AnnotateBy_X_Position ); |
|
|
|
sort( ComponentsList.begin(), ComponentsList.end(), |
|
|
|
AnnotateBy_X_Position ); |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: |
|
|
|
sort( ComponentsList.begin(), ComponentsList.end(), AnnotateBy_Y_Position ); |
|
|
|
sort( ComponentsList.begin(), ComponentsList.end(), |
|
|
|
AnnotateBy_Y_Position ); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: |
|
|
|
@ -334,16 +343,14 @@ void AnnotateComponents( WinEDA_SchematicFrame* parent, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************************************/ |
|
|
|
int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList, |
|
|
|
DrawSheetPath* aSheet ) |
|
|
|
/********************************************************************************************************/ |
|
|
|
|
|
|
|
/** function AddComponentsInSheetToList()
|
|
|
|
* Add a OBJ_CMP_TO_LIST object in aComponentsList for each component found in sheet |
|
|
|
* Add a OBJ_CMP_TO_LIST object in aComponentsList for each component found |
|
|
|
* in sheet |
|
|
|
* @param aComponentsList = a std::vector list to fill |
|
|
|
* @param the DrawSheetPath sheet to analyse |
|
|
|
* @param the SCH_SHEET_PATH sheet to analyze |
|
|
|
*/ |
|
|
|
int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList, |
|
|
|
SCH_SHEET_PATH* aSheet ) |
|
|
|
{ |
|
|
|
int NbrCmp = 0; |
|
|
|
EDA_BaseStruct* DrawList = aSheet->LastDrawList(); |
|
|
|
@ -372,7 +379,8 @@ int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList, |
|
|
|
if( DrawLibItem->GetRef( aSheet ).IsEmpty() ) |
|
|
|
DrawLibItem->SetRef( aSheet, wxT( "DefRef?" ) ); |
|
|
|
|
|
|
|
strncpy( new_object.m_Reference, CONV_TO_UTF8( DrawLibItem->GetRef( aSheet ) ), 32 ); |
|
|
|
strncpy( new_object.m_Reference, |
|
|
|
CONV_TO_UTF8( DrawLibItem->GetRef( aSheet ) ), 32 ); |
|
|
|
|
|
|
|
new_object.m_NumRef = -1; |
|
|
|
|
|
|
|
@ -390,10 +398,10 @@ int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Update the reference component for the schematic project (or the current |
|
|
|
* sheet) |
|
|
|
*****************************************************************************/ |
|
|
|
/*
|
|
|
|
* Update the reference component for the schematic project (or the current |
|
|
|
* sheet) |
|
|
|
*/ |
|
|
|
static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
{ |
|
|
|
/* update the reference numbers */ |
|
|
|
@ -407,7 +415,8 @@ static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList |
|
|
|
else |
|
|
|
sprintf( Text + strlen( Text ), "%d", aComponentsList[ii].m_NumRef ); |
|
|
|
|
|
|
|
component->SetRef( &(aComponentsList[ii].m_SheetPath), CONV_FROM_UTF8( Text ) ); |
|
|
|
component->SetRef( &(aComponentsList[ii].m_SheetPath), |
|
|
|
CONV_FROM_UTF8( Text ) ); |
|
|
|
component->m_Multi = aComponentsList[ii].m_Unit; |
|
|
|
component->SetUnitSelection( &(aComponentsList[ii].m_SheetPath), |
|
|
|
aComponentsList[ii].m_Unit ); |
|
|
|
@ -415,15 +424,15 @@ static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Split component reference designators into a name (prefix) and number. |
|
|
|
* Example: IC1 becomes IC and 1 in the .m_NumRef member. |
|
|
|
* For multi part per package components not already annotated, set .m_Unit |
|
|
|
* to a max value (0x7FFFFFFF). |
|
|
|
* |
|
|
|
* @param aComponentsList = list of component |
|
|
|
* @param NbOfCmp = item count in the list |
|
|
|
*****************************************************************************/ |
|
|
|
/**
|
|
|
|
* Split component reference designators into a name (prefix) and number. |
|
|
|
* Example: IC1 becomes IC and 1 in the .m_NumRef member. |
|
|
|
* For multi part per package components not already annotated, set .m_Unit |
|
|
|
* to a max value (0x7FFFFFFF). |
|
|
|
* |
|
|
|
* @param aComponentsList = list of component |
|
|
|
* @param NbOfCmp = item count in the list |
|
|
|
*/ |
|
|
|
void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
{ |
|
|
|
char* Text; |
|
|
|
@ -466,16 +475,16 @@ void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Compute the reference number for components without reference number |
|
|
|
* Compute .m_NumRef member |
|
|
|
*****************************************************************************/ |
|
|
|
/*
|
|
|
|
* Compute the reference number for components without reference number |
|
|
|
* Compute .m_NumRef member |
|
|
|
*/ |
|
|
|
static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
{ |
|
|
|
int LastReferenceNumber, NumberOfUnits, Unit; |
|
|
|
|
|
|
|
/* Components with an invisible reference (power...) always are re-annotated.
|
|
|
|
* So set theirs .m_IsNew member to true |
|
|
|
/* Components with an invisible reference (power...) always are
|
|
|
|
* re-annotated. So set their .m_IsNew member to true |
|
|
|
*/ |
|
|
|
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ ) |
|
|
|
{ |
|
|
|
@ -486,9 +495,10 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* calculate index of the first component with the same reference prefix than the current component.
|
|
|
|
* all of component having the same reference prefix will receive a reference number with consecutives values: |
|
|
|
* IC .. will be set to IC4, IC4, IC5 ... |
|
|
|
/* calculate index of the first component with the same reference prefix
|
|
|
|
* than the current component. All components having the same reference |
|
|
|
* prefix will receive a reference number with consecutive values: |
|
|
|
* IC .. will be set to IC4, IC4, IC5 ... |
|
|
|
*/ |
|
|
|
unsigned first = 0; |
|
|
|
/* calculate the last used number for this reference prefix: */ |
|
|
|
@ -498,8 +508,10 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi |
|
|
|
if( aComponentsList[ii].m_Flag ) |
|
|
|
continue; |
|
|
|
|
|
|
|
if( aComponentsList[first].CompareRef( aComponentsList[ii] ) != 0 ) /* New reference found: we need a new ref number for this reference */ |
|
|
|
if( aComponentsList[first].CompareRef( aComponentsList[ii] ) != 0 ) |
|
|
|
{ |
|
|
|
/* New reference found: we need a new ref number for this
|
|
|
|
* reference */ |
|
|
|
first = ii; |
|
|
|
LastReferenceNumber = GetLastReferenceNumber( ii, aComponentsList ); |
|
|
|
} |
|
|
|
@ -533,7 +545,8 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi |
|
|
|
} |
|
|
|
|
|
|
|
/* search for others units of this component.
|
|
|
|
* we search for others parts that have the same value and the same reference prefix (ref without ref number) |
|
|
|
* we search for others parts that have the same value and the same |
|
|
|
* reference prefix (ref without ref number) |
|
|
|
*/ |
|
|
|
for( Unit = 1; Unit <= NumberOfUnits; Unit++ ) |
|
|
|
{ |
|
|
|
@ -541,23 +554,27 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi |
|
|
|
continue; |
|
|
|
int found = ExistUnit( ii, Unit, aComponentsList ); |
|
|
|
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.size(); jj++ ) |
|
|
|
{ |
|
|
|
if( aComponentsList[jj].m_Flag ) // already tested
|
|
|
|
continue; |
|
|
|
|
|
|
|
if( aComponentsList[ii].CompareRef( aComponentsList[jj] ) != 0 ) // references are different
|
|
|
|
if( aComponentsList[ii].CompareRef( aComponentsList[jj] ) != 0 ) |
|
|
|
continue; |
|
|
|
if( aComponentsList[jj].CompareValue( aComponentsList[ii] ) != 0 ) |
|
|
|
continue; // values are different
|
|
|
|
continue; |
|
|
|
if( !aComponentsList[jj].m_IsNew ) |
|
|
|
continue; |
|
|
|
|
|
|
|
/* Component without reference number found, annotate it if possible */ |
|
|
|
if( !aComponentsList[jj].IsPartsLocked() || (aComponentsList[jj].m_Unit == Unit) ) |
|
|
|
/* Component without reference number found, annotate it
|
|
|
|
* if possible */ |
|
|
|
if( !aComponentsList[jj].IsPartsLocked() |
|
|
|
|| ( aComponentsList[jj].m_Unit == Unit ) ) |
|
|
|
{ |
|
|
|
aComponentsList[jj].m_NumRef = aComponentsList[ii].m_NumRef; |
|
|
|
aComponentsList[jj].m_Unit = Unit; |
|
|
|
@ -571,21 +588,23 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* 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 |
|
|
|
*****************************************************************************/ |
|
|
|
int GetLastReferenceNumber( int aObjet, std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
/**
|
|
|
|
* 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 |
|
|
|
*/ |
|
|
|
int GetLastReferenceNumber( int aObjet, |
|
|
|
std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
{ |
|
|
|
int LastNumber = 0; |
|
|
|
|
|
|
|
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ ) |
|
|
|
{ |
|
|
|
/* Nouveau Identificateur */ |
|
|
|
/* New identifier. */ |
|
|
|
if( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) != 0 ) |
|
|
|
continue; |
|
|
|
if( LastNumber < aComponentsList[ii].m_NumRef ) |
|
|
|
@ -596,15 +615,16 @@ int GetLastReferenceNumber( int aObjet, std::vector <OBJ_CMP_TO_LIST>& aComponen |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Search in the sorted list of components, for a given componen,t an other component |
|
|
|
* with the same reference and a given part unit. |
|
|
|
* Mainly used to manage multiple parts per package components |
|
|
|
* @param aObjet = index in aComponentsList for the given OBJ_CMP_TO_LIST 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 |
|
|
|
*****************************************************************************/ |
|
|
|
/**
|
|
|
|
* 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. |
|
|
|
* @param aObjet = index in aComponentsList for the given OBJ_CMP_TO_LIST |
|
|
|
* 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 Unit, |
|
|
|
std::vector <OBJ_CMP_TO_LIST>& aComponentsList ) |
|
|
|
{ |
|
|
|
@ -613,16 +633,21 @@ static int ExistUnit( int aObjet, int Unit, |
|
|
|
NumRef = aComponentsList[aObjet].m_NumRef; |
|
|
|
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ ) |
|
|
|
{ |
|
|
|
if( aObjet == (int) ii ) // Do not compare with itself !
|
|
|
|
if( aObjet == (int) ii ) |
|
|
|
// Do not compare with itself !
|
|
|
|
continue; |
|
|
|
if( aComponentsList[ii].m_IsNew ) // Not already with an updated reference
|
|
|
|
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)
|
|
|
|
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
|
|
|
|
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
|
|
|
|
if( aComponentsList[ii].m_Unit == Unit ) |
|
|
|
{ |
|
|
|
// A part with the same reference and the given unit is found
|
|
|
|
return ii; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -631,10 +656,6 @@ static int ExistUnit( int aObjet, int Unit, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************************/ |
|
|
|
int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly ) |
|
|
|
/***************************************************************************************/ |
|
|
|
|
|
|
|
/**
|
|
|
|
* Function CheckAnnotate |
|
|
|
* Check errors relatives to annotation: |
|
|
|
@ -643,26 +664,30 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
* for multiple parts per package components : |
|
|
|
* part number > number of parts |
|
|
|
* different values between parts |
|
|
|
* @return errors count |
|
|
|
* @param aMessageList = a wxArrayString to store messages. If NULL, they are displayed in a wxMessageBox |
|
|
|
* @param aMessageList = a wxArrayString to store messages. If NULL, they |
|
|
|
* are displayed in a wxMessageBox |
|
|
|
* @param aOneSheetOnly : true = search is made only in the current sheet |
|
|
|
* false = search in whole hierarchy (usual search). |
|
|
|
* false = search in whole hierarchy (usual search). |
|
|
|
* @return errors count |
|
|
|
*/ |
|
|
|
int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, |
|
|
|
bool aOneSheetOnly ) |
|
|
|
{ |
|
|
|
int error; |
|
|
|
wxString Buff; |
|
|
|
wxString msg, cmpref; |
|
|
|
int error; |
|
|
|
wxString Buff; |
|
|
|
wxString msg, cmpref; |
|
|
|
|
|
|
|
/* build the screen list */ |
|
|
|
EDA_SheetList SheetList; |
|
|
|
SCH_SHEET_LIST SheetList; |
|
|
|
|
|
|
|
std::vector <OBJ_CMP_TO_LIST> ComponentsList; |
|
|
|
|
|
|
|
/* Build the list of components */ |
|
|
|
if( !aOneSheetOnly ) |
|
|
|
{ |
|
|
|
DrawSheetPath* sheet; |
|
|
|
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) |
|
|
|
SCH_SHEET_PATH* sheet; |
|
|
|
for( sheet = SheetList.GetFirst(); sheet != NULL; |
|
|
|
sheet = SheetList.GetNext() ) |
|
|
|
AddComponentsInSheetToList( ComponentsList, sheet ); |
|
|
|
} |
|
|
|
else |
|
|
|
@ -693,23 +718,28 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
msg.Printf( _( "item not annotated: %s%s" ), |
|
|
|
cmpref.GetData(), Buff.GetData() ); |
|
|
|
|
|
|
|
if( (ComponentsList[ii].m_Unit > 0) && (ComponentsList[ii].m_Unit < 0x7FFFFFFF) ) |
|
|
|
if( ( ComponentsList[ii].m_Unit > 0 ) |
|
|
|
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) ) |
|
|
|
{ |
|
|
|
Buff.Printf( _( "( unit %d)" ), ComponentsList[ii].m_Unit ); |
|
|
|
msg << Buff; |
|
|
|
} |
|
|
|
|
|
|
|
if( aMessageList ) |
|
|
|
{ |
|
|
|
aMessageList->Add( msg + wxT( "\n" ) ); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
DisplayError( NULL, msg ); |
|
|
|
} |
|
|
|
error++; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
// Annotate error
|
|
|
|
if( MAX( ComponentsList[ii].m_Entry->GetPartCount(), 1 ) < ComponentsList[ii].m_Unit ) |
|
|
|
if( MAX( ComponentsList[ii].m_Entry->GetPartCount(), 1 ) |
|
|
|
< ComponentsList[ii].m_Unit ) |
|
|
|
{ |
|
|
|
if( ComponentsList[ii].m_NumRef >= 0 ) |
|
|
|
Buff << ComponentsList[ii].m_NumRef; |
|
|
|
@ -721,7 +751,8 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
Buff.GetData() ); |
|
|
|
|
|
|
|
Buff.Printf( _( " unit %d and no more than %d parts" ), |
|
|
|
ComponentsList[ii].m_Unit, ComponentsList[ii].m_Entry->GetPartCount() ); |
|
|
|
ComponentsList[ii].m_Unit, |
|
|
|
ComponentsList[ii].m_Entry->GetPartCount() ); |
|
|
|
msg << Buff; |
|
|
|
if( aMessageList ) |
|
|
|
{ |
|
|
|
@ -743,7 +774,7 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
msg.Empty(); |
|
|
|
Buff.Empty(); |
|
|
|
|
|
|
|
if( (ComponentsList[ii].CompareRef( ComponentsList[ii + 1] ) != 0) |
|
|
|
if( ( ComponentsList[ii].CompareRef( ComponentsList[ii + 1] ) != 0 ) |
|
|
|
|| ( ComponentsList[ii].m_NumRef != ComponentsList[ii + 1].m_NumRef ) ) |
|
|
|
continue; |
|
|
|
|
|
|
|
@ -760,7 +791,8 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
msg.Printf( _( "Multiple item %s%s" ), |
|
|
|
cmpref.GetData(), Buff.GetData() ); |
|
|
|
|
|
|
|
if( (ComponentsList[ii].m_Unit > 0) && (ComponentsList[ii].m_Unit < 0x7FFFFFFF) ) |
|
|
|
if( ( ComponentsList[ii].m_Unit > 0 ) |
|
|
|
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) ) |
|
|
|
{ |
|
|
|
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit ); |
|
|
|
msg << Buff; |
|
|
|
@ -776,8 +808,9 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
} |
|
|
|
|
|
|
|
/* Test error if units are different but number of parts per package
|
|
|
|
* too hight (ex U3 ( 1 part) and we find U3B this is an error) */ |
|
|
|
if( ComponentsList[ii].m_Entry->GetPartCount() != ComponentsList[ii + 1].m_Entry->GetPartCount() ) |
|
|
|
* 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].m_NumRef >= 0 ) |
|
|
|
Buff << ComponentsList[ii].m_NumRef; |
|
|
|
@ -788,7 +821,8 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
msg.Printf( _( "Multiple item %s%s" ), |
|
|
|
cmpref.GetData(), Buff.GetData() ); |
|
|
|
|
|
|
|
if( (ComponentsList[ii].m_Unit > 0) && (ComponentsList[ii].m_Unit < 0x7FFFFFFF) ) |
|
|
|
if( ( ComponentsList[ii].m_Unit > 0 ) |
|
|
|
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) ) |
|
|
|
{ |
|
|
|
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit ); |
|
|
|
msg << Buff; |
|
|
|
@ -799,11 +833,14 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
aMessageList->Add( msg + wxT( "\n" )); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
DisplayError( NULL, msg ); |
|
|
|
} |
|
|
|
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 ) |
|
|
|
{ |
|
|
|
@ -812,40 +849,47 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
nextcmpref = CONV_FROM_UTF8( ComponentsList[next].m_Reference ); |
|
|
|
#if defined(KICAD_GOST)
|
|
|
|
msg.Printf( _( "Diff values for %s%d.%c (%s) and %s%d.%c (%s)" ), |
|
|
|
cmpref.GetData(), |
|
|
|
ComponentsList[ii].m_NumRef, |
|
|
|
ComponentsList[ii].m_Unit + '1' - 1, |
|
|
|
ComponentsList[ii].m_Value->GetData(), nextcmpref.GetData(), |
|
|
|
ComponentsList[next].m_NumRef, |
|
|
|
ComponentsList[next].m_Unit + '1' - 1, |
|
|
|
ComponentsList[next].m_Value->GetData() ); |
|
|
|
cmpref.GetData(), |
|
|
|
ComponentsList[ii].m_NumRef, |
|
|
|
ComponentsList[ii].m_Unit + '1' - 1, |
|
|
|
ComponentsList[ii].m_Value->GetData(), |
|
|
|
nextcmpref.GetData(), |
|
|
|
ComponentsList[next].m_NumRef, |
|
|
|
ComponentsList[next].m_Unit + '1' - 1, |
|
|
|
ComponentsList[next].m_Value->GetData() ); |
|
|
|
#else
|
|
|
|
msg.Printf( _( "Diff values for %s%d%c (%s) and %s%d%c (%s)" ), |
|
|
|
cmpref.GetData(), |
|
|
|
ComponentsList[ii].m_NumRef, |
|
|
|
ComponentsList[ii].m_Unit + 'A' - 1, |
|
|
|
ComponentsList[ii].m_Value->GetData(), nextcmpref.GetData(), |
|
|
|
ComponentsList[next].m_NumRef, |
|
|
|
ComponentsList[next].m_Unit + 'A' - 1, |
|
|
|
ComponentsList[next].m_Value->GetData() ); |
|
|
|
cmpref.GetData(), |
|
|
|
ComponentsList[ii].m_NumRef, |
|
|
|
ComponentsList[ii].m_Unit + 'A' - 1, |
|
|
|
ComponentsList[ii].m_Value->GetData(), |
|
|
|
nextcmpref.GetData(), |
|
|
|
ComponentsList[next].m_NumRef, |
|
|
|
ComponentsList[next].m_Unit + 'A' - 1, |
|
|
|
ComponentsList[next].m_Value->GetData() ); |
|
|
|
#endif
|
|
|
|
|
|
|
|
if( aMessageList ) |
|
|
|
{ |
|
|
|
aMessageList->Add( msg + wxT( "\n" )); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
DisplayError( NULL, msg ); |
|
|
|
} |
|
|
|
|
|
|
|
error++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// count the duplicated time stamps
|
|
|
|
sort( ComponentsList.begin(), ComponentsList.end(), SortByTimeStamp ); |
|
|
|
for( int ii = 0; (ii < imax) && (error < 4); ii++ ) |
|
|
|
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 ) ) |
|
|
|
if( (ComponentsList[ii].m_TimeStamp |
|
|
|
!= ComponentsList[ii + 1].m_TimeStamp) |
|
|
|
|| ( ComponentsList[ii].m_SheetPath |
|
|
|
!= ComponentsList[ii + 1].m_SheetPath ) ) |
|
|
|
continue; |
|
|
|
|
|
|
|
/* Same time stamp found. */ |
|
|
|
@ -862,10 +906,13 @@ int WinEDA_SchematicFrame::CheckAnnotate( wxArrayString* aMessageList, bool aOne |
|
|
|
nextcmpref.GetData(), ComponentsList[ii + 1].m_NumRef ); |
|
|
|
if( aMessageList ) |
|
|
|
{ |
|
|
|
aMessageList->Add( msg + wxT( "\n" )); |
|
|
|
} |
|
|
|
aMessageList->Add( msg + wxT( "\n" )); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
DisplayError( NULL, msg ); |
|
|
|
} |
|
|
|
|
|
|
|
error++; |
|
|
|
} |
|
|
|
|
|
|
|
@ -896,7 +943,8 @@ static bool SortItemByTimeStamp( const SCH_ITEM* item1, const SCH_ITEM* item2 ) |
|
|
|
|
|
|
|
|
|
|
|
/** Function ReplaceDuplicatedTimeStamps
|
|
|
|
* Search for duplicate time stamps in the whole hierarchy, and replace duplicae by new time stamps |
|
|
|
* Search for duplicate time stamps in the whole hierarchy, and replace |
|
|
|
* duplicate by new time stamps |
|
|
|
*/ |
|
|
|
int ReplaceDuplicatedTimeStamps() |
|
|
|
{ |
|
|
|
@ -904,19 +952,22 @@ int ReplaceDuplicatedTimeStamps() |
|
|
|
EDA_ScreenList ScreenList; |
|
|
|
|
|
|
|
/* Build the list of items with time stamps (components and sheets)
|
|
|
|
* note: if all items have a different time stamp, this ensure also different paths in complex hierarchy |
|
|
|
* this is the reason we have differant time stamps for components AND sheets |
|
|
|
* note: if all items have a different time stamp, this ensure also |
|
|
|
* different paths in complex hierarchy |
|
|
|
* this is the reason we have different time stamps for components AND |
|
|
|
* sheets |
|
|
|
*/ |
|
|
|
std::vector <SCH_ITEM*> itemlist; |
|
|
|
SCH_SCREEN* screen; |
|
|
|
SCH_ITEM* item; |
|
|
|
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) |
|
|
|
for( screen = ScreenList.GetFirst(); screen != NULL; |
|
|
|
screen = ScreenList.GetNext() ) |
|
|
|
{ |
|
|
|
item = screen->EEDrawList; |
|
|
|
while( item ) |
|
|
|
{ |
|
|
|
if( (item->Type() == DRAW_SHEET_STRUCT_TYPE) |
|
|
|
|| (item->Type() == TYPE_SCH_COMPONENT) ) |
|
|
|
if( ( item->Type() == DRAW_SHEET_STRUCT_TYPE ) |
|
|
|
|| ( item->Type() == TYPE_SCH_COMPONENT ) ) |
|
|
|
itemlist.push_back( item ); |
|
|
|
|
|
|
|
item = item->Next(); |
|
|
|
@ -924,7 +975,6 @@ int ReplaceDuplicatedTimeStamps() |
|
|
|
} |
|
|
|
|
|
|
|
// Test and replace duplicated time stamps
|
|
|
|
|
|
|
|
int imax = itemlist.size() - 1; |
|
|
|
int errcount = 0; |
|
|
|
sort( itemlist.begin(), itemlist.end(), SortItemByTimeStamp ); |
|
|
|
@ -936,12 +986,15 @@ int ReplaceDuplicatedTimeStamps() |
|
|
|
{ |
|
|
|
errcount++; |
|
|
|
|
|
|
|
// for a component, update its Time stamp and its paths (m_PathsAndReferences field)
|
|
|
|
// for a component, update its Time stamp and its paths
|
|
|
|
// (m_PathsAndReferences field)
|
|
|
|
if( item->Type() == TYPE_SCH_COMPONENT ) |
|
|
|
( (SCH_COMPONENT*) item )->SetTimeStamp( GetTimeStamp() ); |
|
|
|
|
|
|
|
// for a sheet, update only its time stamp (annotation of its components will be lost)
|
|
|
|
// TODO: see how to change sheet paths for its cmp list (can be possible in most cases)
|
|
|
|
// for a sheet, update only its time stamp (annotation of its
|
|
|
|
// components will be lost)
|
|
|
|
// @todo: see how to change sheet paths for its cmp list (can
|
|
|
|
// be possible in most cases)
|
|
|
|
else |
|
|
|
item->m_TimeStamp = GetTimeStamp(); |
|
|
|
} |
|
|
|
|