EESchema code refactoring and other minor fixes.
This commit is contained in:
parent
dbb2dd7127
commit
d0105f1ba6
|
@ -4,6 +4,19 @@ KiCad ChangeLog 2010
|
||||||
Please add newer entries at the top, list the date and your name with
|
Please add newer entries at the top, list the date and your name with
|
||||||
email address.
|
email address.
|
||||||
|
|
||||||
|
2010-dec-31 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
|
================================================================================
|
||||||
|
++all
|
||||||
|
* Exclude boost header include path from Doxygen files.
|
||||||
|
* Coding guide line and doxygen warning fixes.
|
||||||
|
++EESchema
|
||||||
|
* Rename OBJ_CMP_TO_LIST to SCH_REFERENCE.
|
||||||
|
* Move code related to SCH_REFERENCE into the object where it belongs in hope
|
||||||
|
that some day the object members can be made private instead of public.
|
||||||
|
* Add GetComponent method to sheet path and sheet path list objects.
|
||||||
|
* Move screen list code into screen list object.
|
||||||
|
|
||||||
|
|
||||||
2010-Dec-28 UPDATE Dick Hollenbeck <dick@softplc.com>
|
2010-Dec-28 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
================================================================================
|
================================================================================
|
||||||
++richio:
|
++richio:
|
||||||
|
|
2
Doxyfile
2
Doxyfile
|
@ -88,7 +88,7 @@ INPUT_ENCODING = UTF-8
|
||||||
FILE_PATTERNS = *.h \
|
FILE_PATTERNS = *.h \
|
||||||
*.cpp
|
*.cpp
|
||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
EXCLUDE =
|
EXCLUDE = include\boost
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS =
|
||||||
|
|
|
@ -13,91 +13,18 @@
|
||||||
#include "class_sch_screen.h"
|
#include "class_sch_screen.h"
|
||||||
#include "wxEeschemaStruct.h"
|
#include "wxEeschemaStruct.h"
|
||||||
|
|
||||||
|
#include "netlist.h"
|
||||||
#include "class_library.h"
|
#include "class_library.h"
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
#include "sch_component.h"
|
#include "sch_component.h"
|
||||||
#include "netlist.h"
|
|
||||||
#include "lib_pin.h"
|
#include "lib_pin.h"
|
||||||
|
|
||||||
|
|
||||||
static int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList,
|
static void BreakReference( std::vector< SCH_REFERENCE >& aComponentsList );
|
||||||
SCH_SHEET_PATH* sheet );
|
static void ReAnnotateComponents( std::vector< SCH_REFERENCE >& aComponentsList );
|
||||||
static void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList );
|
static void ComputeReferenceNumber( std::vector< SCH_REFERENCE >& aComponentsList );
|
||||||
static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList );
|
int GetLastReferenceNumber( int aObjet, std::vector< SCH_REFERENCE >& aComponentsList );
|
||||||
static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsList );
|
static int ExistUnit( int aObjet, int aUnit, std::vector< SCH_REFERENCE >& aComponentList );
|
||||||
int GetLastReferenceNumber( int aObjet,
|
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aComponentsList );
|
|
||||||
static int ExistUnit( int aObjet, int aUnit,
|
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aComponentsList );
|
|
||||||
static int ReplaceDuplicatedTimeStamps();
|
|
||||||
|
|
||||||
|
|
||||||
/* Set a sheet number, the sheet count for sheets in the whole schematic
|
|
||||||
* and update the date in all screens
|
|
||||||
*/
|
|
||||||
void SCH_EDIT_FRAME::UpdateSheetNumberAndDate()
|
|
||||||
{
|
|
||||||
wxString date = GenDate();
|
|
||||||
SCH_SCREENS s_list;
|
|
||||||
|
|
||||||
// Set the date
|
|
||||||
for( SCH_SCREEN* screen = s_list.GetFirst(); screen != NULL;
|
|
||||||
screen = s_list.GetNext() )
|
|
||||||
screen->m_Date = date;
|
|
||||||
|
|
||||||
// Set sheet counts
|
|
||||||
SetSheetNumberAndCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Used to annotate the power symbols, before testing erc or computing
|
|
||||||
* netlist when a component reannotation is not necessary
|
|
||||||
*
|
|
||||||
* In order to avoid conflicts the reference number starts with a 0. A
|
|
||||||
* PWR with id 12 is named PWR12 in global annotation and PWR012 by the
|
|
||||||
* Power annotation.
|
|
||||||
****************************************************************************/
|
|
||||||
void ReAnnotatePowerSymbolsOnly( void )
|
|
||||||
{
|
|
||||||
/* Build the whole sheet list in hierarchy (sheet, not screen) */
|
|
||||||
SCH_SHEET_LIST SheetList;
|
|
||||||
|
|
||||||
SCH_SHEET_PATH* sheet;
|
|
||||||
int CmpNumber = 1;
|
|
||||||
|
|
||||||
for( sheet = SheetList.GetFirst(); sheet != NULL;
|
|
||||||
sheet = SheetList.GetNext() )
|
|
||||||
{
|
|
||||||
EDA_ITEM* DrawList = sheet->LastDrawList();
|
|
||||||
|
|
||||||
for( ; DrawList != NULL; DrawList = DrawList->Next() )
|
|
||||||
{
|
|
||||||
if( DrawList->Type() != SCH_COMPONENT_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
SCH_COMPONENT* DrawLibItem = (SCH_COMPONENT*) DrawList;
|
|
||||||
LIB_COMPONENT* Entry =
|
|
||||||
CMP_LIBRARY::FindLibraryComponent( DrawLibItem->GetLibName() );
|
|
||||||
|
|
||||||
if( ( Entry == NULL ) || !Entry->IsPower() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
//DrawLibItem->ClearAnnotation(sheet); this clears all annotation :(
|
|
||||||
wxString refstr = DrawLibItem->GetPrefix();
|
|
||||||
|
|
||||||
//str will be "C?" or so after the ClearAnnotation call.
|
|
||||||
while( refstr.Last() == '?' )
|
|
||||||
refstr.RemoveLast();
|
|
||||||
|
|
||||||
if( !refstr.StartsWith( wxT( "#" ) ) )
|
|
||||||
refstr = wxT( "#" ) + refstr;
|
|
||||||
refstr << wxT( "0" ) << CmpNumber;
|
|
||||||
DrawLibItem->SetRef( sheet, refstr );
|
|
||||||
CmpNumber++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* sort function to annotate items by their position.
|
/* sort function to annotate items by their position.
|
||||||
|
@ -108,8 +35,7 @@ void ReAnnotatePowerSymbolsOnly( void )
|
||||||
* if same X pos, by Y pos
|
* if same X pos, by Y pos
|
||||||
* if same Y pos, by time stamp
|
* if same Y pos, by time stamp
|
||||||
*/
|
*/
|
||||||
static bool AnnotateBy_X_Position( const OBJ_CMP_TO_LIST& item1,
|
static bool SortByXPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
|
||||||
const OBJ_CMP_TO_LIST& item2 )
|
|
||||||
{
|
{
|
||||||
int ii = item1.CompareRef( item2 );
|
int ii = item1.CompareRef( item2 );
|
||||||
|
|
||||||
|
@ -134,8 +60,7 @@ static bool AnnotateBy_X_Position( const OBJ_CMP_TO_LIST& item1,
|
||||||
* if same Y pos, by X pos
|
* if same Y pos, by X pos
|
||||||
* if same X pos, by time stamp
|
* if same X pos, by time stamp
|
||||||
*/
|
*/
|
||||||
static bool AnnotateBy_Y_Position( const OBJ_CMP_TO_LIST& item1,
|
static bool SortByYPosition( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
|
||||||
const OBJ_CMP_TO_LIST& item2 )
|
|
||||||
{
|
{
|
||||||
int ii = item1.CompareRef( item2 );
|
int ii = item1.CompareRef( item2 );
|
||||||
|
|
||||||
|
@ -161,8 +86,7 @@ static bool AnnotateBy_Y_Position( const OBJ_CMP_TO_LIST& item1,
|
||||||
* if same unit number, by sheet
|
* if same unit number, by sheet
|
||||||
* if same sheet, by time stamp
|
* if same sheet, by time stamp
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static bool AnnotateByValue( const OBJ_CMP_TO_LIST& item1,
|
static bool SortByValue( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
|
||||||
const OBJ_CMP_TO_LIST& item2 )
|
|
||||||
{
|
{
|
||||||
int ii = item1.CompareRef( item2 );
|
int ii = item1.CompareRef( item2 );
|
||||||
|
|
||||||
|
@ -187,8 +111,7 @@ static bool AnnotateByValue( const OBJ_CMP_TO_LIST& item1,
|
||||||
* qsort function to annotate items by value
|
* qsort function to annotate items by value
|
||||||
* Components are sorted by time stamp
|
* Components are sorted by time stamp
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1,
|
static bool SortByTimeStamp( const SCH_REFERENCE& item1, const SCH_REFERENCE& item2 )
|
||||||
const OBJ_CMP_TO_LIST& item2 )
|
|
||||||
{
|
{
|
||||||
int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath );
|
int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath );
|
||||||
|
|
||||||
|
@ -208,41 +131,19 @@ static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1,
|
||||||
*/
|
*/
|
||||||
void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly, bool aRedraw )
|
void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly, bool aRedraw )
|
||||||
{
|
{
|
||||||
SCH_ITEM* strct;
|
|
||||||
SCH_SCREEN* screen;
|
|
||||||
SCH_SCREENS ScreenList;
|
|
||||||
|
|
||||||
screen = ScreenList.GetFirst();
|
|
||||||
|
|
||||||
if( aCurrentSheetOnly )
|
if( aCurrentSheetOnly )
|
||||||
screen = GetScreen();
|
|
||||||
|
|
||||||
if( screen == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
while( screen )
|
|
||||||
{
|
{
|
||||||
strct = screen->GetDrawItems();
|
SCH_SCREEN* screen = GetScreen();
|
||||||
|
wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) );
|
||||||
for( ; strct; strct = strct->Next() )
|
screen->ClearAnnotation( m_CurrentSheet );
|
||||||
{
|
}
|
||||||
if( strct->Type() == SCH_COMPONENT_T )
|
else
|
||||||
{
|
{
|
||||||
if( aCurrentSheetOnly )
|
SCH_SCREENS ScreenList;
|
||||||
( (SCH_COMPONENT*) strct )->ClearAnnotation( m_CurrentSheet );
|
ScreenList.ClearAnnotation();
|
||||||
else
|
|
||||||
( (SCH_COMPONENT*) strct )->ClearAnnotation( NULL );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OnModify( );
|
|
||||||
if( aCurrentSheetOnly )
|
|
||||||
break;
|
|
||||||
screen = ScreenList.GetNext();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the references for the sheet that is currently being displayed.
|
||||||
//update the References
|
|
||||||
m_CurrentSheet->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
|
|
||||||
if( aRedraw )
|
if( aRedraw )
|
||||||
|
@ -276,240 +177,113 @@ void AnnotateComponents( SCH_EDIT_FRAME* parent,
|
||||||
bool resetAnnotation,
|
bool resetAnnotation,
|
||||||
bool repairsTimestamps )
|
bool repairsTimestamps )
|
||||||
{
|
{
|
||||||
std::vector <OBJ_CMP_TO_LIST> ComponentsList;
|
std::vector< SCH_REFERENCE > references;
|
||||||
|
|
||||||
wxBusyCursor dummy;
|
wxBusyCursor dummy;
|
||||||
|
|
||||||
// Test and replace duplicate time stamps
|
SCH_SCREENS screens;
|
||||||
// duplicate can happen with old schematics, or schematic conversions or
|
|
||||||
// manual editions of files ...
|
/* Build the sheet list */
|
||||||
|
SCH_SHEET_LIST sheets;
|
||||||
|
|
||||||
|
// Test for and replace duplicate time stamps in components and sheets. Duplicate
|
||||||
|
// time stamps can happen with old schematics, schematic conversions, or manual
|
||||||
|
// editing of files.
|
||||||
if( repairsTimestamps )
|
if( repairsTimestamps )
|
||||||
{
|
{
|
||||||
int ireplacecount = ReplaceDuplicatedTimeStamps();
|
int count = screens.ReplaceDuplicateTimeStamps();
|
||||||
if( ireplacecount )
|
|
||||||
|
if( count )
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
msg.Printf( _( "%d duplicate time stamps replaced." ),
|
msg.Printf( _( "%d duplicate time stamps were found and replaced." ), count );
|
||||||
ireplacecount );
|
|
||||||
DisplayInfoMessage( NULL, msg, 2 );
|
DisplayInfoMessage( NULL, msg, 2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If it is an annotation for all the components, reset previous
|
// If it is an annotation for all the components, reset previous annotation.
|
||||||
* annotation: */
|
|
||||||
if( resetAnnotation )
|
if( resetAnnotation )
|
||||||
parent->DeleteAnnotation( !annotateSchematic, false );
|
parent->DeleteAnnotation( !annotateSchematic, false );
|
||||||
|
|
||||||
/* Build the sheet list */
|
// Update the screen date.
|
||||||
SCH_SHEET_LIST SheetList;
|
screens.SetDate( GenDate() );
|
||||||
|
|
||||||
/* Update the sheet number, sheet count and date */
|
// Set sheet number and total sheet counts.
|
||||||
parent->UpdateSheetNumberAndDate();
|
parent->SetSheetNumberAndCount();
|
||||||
|
|
||||||
/* Build component list */
|
/* Build component list */
|
||||||
if( annotateSchematic )
|
if( annotateSchematic )
|
||||||
{
|
{
|
||||||
SCH_SHEET_PATH* sheet;
|
sheets.GetComponents( references );
|
||||||
for( sheet = SheetList.GetFirst();
|
|
||||||
sheet != NULL;
|
|
||||||
sheet = SheetList.GetNext() )
|
|
||||||
AddComponentsInSheetToList( ComponentsList, sheet );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
AddComponentsInSheetToList( ComponentsList, parent->GetSheet() );
|
{
|
||||||
|
parent->GetSheet()->GetComponents( references );
|
||||||
|
}
|
||||||
|
|
||||||
/* Break full components reference in name (prefix) and number:
|
/* Break full components reference in name (prefix) and number:
|
||||||
* example: IC1 become IC, and 1 */
|
* example: IC1 become IC, and 1 */
|
||||||
BreakReference( ComponentsList );
|
BreakReference( references );
|
||||||
|
|
||||||
switch( sortOption )
|
switch( sortOption )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
sort( ComponentsList.begin(), ComponentsList.end(),
|
sort( references.begin(), references.end(), SortByXPosition );
|
||||||
AnnotateBy_X_Position );
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
sort( ComponentsList.begin(), ComponentsList.end(),
|
sort( references.begin(), references.end(), SortByYPosition );
|
||||||
AnnotateBy_Y_Position );
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
sort( ComponentsList.begin(), ComponentsList.end(), AnnotateByValue );
|
sort( references.begin(), references.end(), SortByValue );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recalculate reference numbers */
|
/* Recalculate reference numbers */
|
||||||
ComputeReferenceNumber( ComponentsList );
|
ComputeReferenceNumber( references );
|
||||||
ReAnnotateComponents( ComponentsList );
|
ReAnnotateComponents( references );
|
||||||
|
|
||||||
/* Final control (just in case ... )*/
|
/* Final control (just in case ... )*/
|
||||||
parent->CheckAnnotate( NULL, !annotateSchematic );
|
parent->CheckAnnotate( NULL, !annotateSchematic );
|
||||||
parent->OnModify( );
|
parent->OnModify();
|
||||||
parent->DrawPanel->Refresh( true );
|
parent->DrawPanel->Refresh( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function AddComponentsInSheetToList
|
|
||||||
* Add a OBJ_CMP_TO_LIST object in aComponentsList for each component found
|
|
||||||
* in sheet
|
|
||||||
* @param aComponentsList = a std::vector list to fill
|
|
||||||
* @param aSheet - The SCH_SHEET_PATH sheet to analyze
|
|
||||||
*/
|
|
||||||
int AddComponentsInSheetToList( std::vector <OBJ_CMP_TO_LIST>& aComponentsList,
|
|
||||||
SCH_SHEET_PATH* aSheet )
|
|
||||||
{
|
|
||||||
int NbrCmp = 0;
|
|
||||||
EDA_ITEM* DrawList = aSheet->LastDrawList();
|
|
||||||
SCH_COMPONENT* DrawLibItem;
|
|
||||||
LIB_COMPONENT* Entry;
|
|
||||||
|
|
||||||
for( ; DrawList != NULL; DrawList = DrawList->Next() )
|
|
||||||
{
|
|
||||||
if( DrawList->Type() == SCH_COMPONENT_T )
|
|
||||||
{
|
|
||||||
DrawLibItem = (SCH_COMPONENT*) DrawList;
|
|
||||||
Entry = CMP_LIBRARY::FindLibraryComponent( DrawLibItem->GetLibName() );
|
|
||||||
|
|
||||||
if( Entry == NULL )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
OBJ_CMP_TO_LIST new_object;
|
|
||||||
new_object.m_RootCmp = DrawLibItem;
|
|
||||||
new_object.m_Entry = Entry;
|
|
||||||
new_object.m_Unit = DrawLibItem->GetUnitSelection( aSheet );
|
|
||||||
new_object.m_SheetPath = *aSheet;
|
|
||||||
new_object.m_IsNew = false;
|
|
||||||
new_object.m_Flag = 0;
|
|
||||||
new_object.m_TimeStamp = DrawLibItem->m_TimeStamp;
|
|
||||||
|
|
||||||
if( DrawLibItem->GetRef( aSheet ).IsEmpty() )
|
|
||||||
DrawLibItem->SetRef( aSheet, wxT( "DefRef?" ) );
|
|
||||||
|
|
||||||
new_object.SetRef( DrawLibItem->GetRef( aSheet ) );
|
|
||||||
|
|
||||||
new_object.m_NumRef = -1;
|
|
||||||
|
|
||||||
if( DrawLibItem->GetField( VALUE )->m_Text.IsEmpty() )
|
|
||||||
DrawLibItem->GetField( VALUE )->m_Text = wxT( "~" );
|
|
||||||
|
|
||||||
new_object.m_Value = &DrawLibItem->GetField( VALUE )->m_Text;
|
|
||||||
|
|
||||||
aComponentsList.push_back( new_object );
|
|
||||||
NbrCmp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NbrCmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the reference component for the schematic project (or the current
|
* Update the reference component for the schematic project (or the current sheet)
|
||||||
* sheet)
|
|
||||||
*/
|
*/
|
||||||
static void ReAnnotateComponents( std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
static void ReAnnotateComponents( std::vector< SCH_REFERENCE >& aComponentList )
|
||||||
{
|
{
|
||||||
/* update the reference numbers */
|
/* update the reference numbers */
|
||||||
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ )
|
for( unsigned ii = 0; ii < aComponentList.size(); ii++ )
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
char* Text = aComponentsList[ii].m_Reference;
|
char* Text = aComponentList[ii].m_Reference;
|
||||||
SCH_COMPONENT* component = aComponentsList[ii].m_RootCmp;
|
SCH_COMPONENT* component = aComponentList[ii].m_RootCmp;
|
||||||
|
|
||||||
if( aComponentsList[ii].m_NumRef < 0 )
|
if( aComponentList[ii].m_NumRef < 0 )
|
||||||
strcat( Text, "?" );
|
strcat( Text, "?" );
|
||||||
else
|
else
|
||||||
sprintf( Text + strlen( Text ), "%d", aComponentsList[ii].m_NumRef );
|
sprintf( Text + strlen( Text ), "%d", aComponentList[ii].m_NumRef );
|
||||||
|
|
||||||
component->SetRef( &(aComponentsList[ii].m_SheetPath), CONV_FROM_UTF8( Text ) );
|
component->SetRef( &(aComponentList[ii].m_SheetPath), CONV_FROM_UTF8( Text ) );
|
||||||
|
|
||||||
|
component->SetUnit( aComponentList[ii].m_Unit );
|
||||||
|
component->SetUnitSelection( &aComponentList[ii].m_SheetPath,
|
||||||
|
aComponentList[ii].m_Unit );
|
||||||
#else
|
#else
|
||||||
|
aComponentList[ii].Annotate();
|
||||||
wxString ref = aComponentsList[ii].GetRef();
|
|
||||||
SCH_COMPONENT* component = aComponentsList[ii].m_RootCmp;
|
|
||||||
|
|
||||||
if( aComponentsList[ii].m_NumRef < 0 )
|
|
||||||
ref += wxChar( '?' );
|
|
||||||
else
|
|
||||||
ref << aComponentsList[ii].m_NumRef;
|
|
||||||
|
|
||||||
aComponentsList[ii].SetRef( ref );
|
|
||||||
|
|
||||||
component->SetRef( &aComponentsList[ii].m_SheetPath, ref );
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
component->SetUnit( aComponentsList[ii].m_Unit );
|
|
||||||
component->SetUnitSelection( &aComponentsList[ii].m_SheetPath,
|
|
||||||
aComponentsList[ii].m_Unit );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
void BreakReference( std::vector< SCH_REFERENCE >& 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
|
|
||||||
*/
|
|
||||||
void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
|
||||||
{
|
{
|
||||||
std::string refText; // construct once outside loop
|
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ )
|
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ )
|
||||||
{
|
aComponentsList[ii].Split();
|
||||||
aComponentsList[ii].m_NumRef = -1;
|
|
||||||
|
|
||||||
refText = aComponentsList[ii].GetRefStr();
|
|
||||||
|
|
||||||
int ll = refText.length() - 1;
|
|
||||||
|
|
||||||
if( refText[ll] == '?' )
|
|
||||||
{
|
|
||||||
aComponentsList[ii].m_IsNew = true;
|
|
||||||
|
|
||||||
if( !aComponentsList[ii].IsPartsLocked() )
|
|
||||||
aComponentsList[ii].m_Unit = 0x7FFFFFFF;
|
|
||||||
|
|
||||||
refText.erase(ll); // delete last char
|
|
||||||
|
|
||||||
aComponentsList[ii].SetRefStr( refText );
|
|
||||||
}
|
|
||||||
|
|
||||||
else if( isdigit( refText[ll] ) == 0 )
|
|
||||||
{
|
|
||||||
aComponentsList[ii].m_IsNew = true;
|
|
||||||
if( !aComponentsList[ii].IsPartsLocked() )
|
|
||||||
aComponentsList[ii].m_Unit = 0x7FFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while( ll >= 0 )
|
|
||||||
{
|
|
||||||
if( (refText[ll] <= ' ' ) || isdigit( refText[ll] ) )
|
|
||||||
ll--;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( isdigit( refText[ll + 1] ) )
|
|
||||||
{
|
|
||||||
// nul terminated C string into cp
|
|
||||||
const char* cp = refText.c_str() + ll + 1;
|
|
||||||
|
|
||||||
aComponentsList[ii].m_NumRef = atoi( cp );
|
|
||||||
}
|
|
||||||
|
|
||||||
refText.erase( ll+1 ); // delete from ll+1 to end
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
aComponentsList[ii].SetRefStr( refText );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -517,7 +291,7 @@ void BreakReference( std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
||||||
* Compute the reference number for components without reference number
|
* Compute the reference number for components without reference number
|
||||||
* Compute .m_NumRef member
|
* Compute .m_NumRef member
|
||||||
*/
|
*/
|
||||||
static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
static void ComputeReferenceNumber( std::vector< SCH_REFERENCE >& aComponentsList )
|
||||||
{
|
{
|
||||||
int LastReferenceNumber, NumberOfUnits, Unit;
|
int LastReferenceNumber, NumberOfUnits, Unit;
|
||||||
|
|
||||||
|
@ -562,6 +336,7 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi
|
||||||
LastReferenceNumber++;
|
LastReferenceNumber++;
|
||||||
aComponentsList[ii].m_NumRef = LastReferenceNumber;
|
aComponentsList[ii].m_NumRef = LastReferenceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
aComponentsList[ii].m_Unit = 1;
|
aComponentsList[ii].m_Unit = 1;
|
||||||
aComponentsList[ii].m_Flag = 1;
|
aComponentsList[ii].m_Flag = 1;
|
||||||
aComponentsList[ii].m_IsNew = false;
|
aComponentsList[ii].m_IsNew = false;
|
||||||
|
@ -590,7 +365,9 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi
|
||||||
{
|
{
|
||||||
if( aComponentsList[ii].m_Unit == Unit )
|
if( aComponentsList[ii].m_Unit == Unit )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int found = ExistUnit( ii, Unit, aComponentsList );
|
int found = ExistUnit( ii, Unit, aComponentsList );
|
||||||
|
|
||||||
if( found >= 0 )
|
if( found >= 0 )
|
||||||
continue; /* this unit exists for this reference (unit
|
continue; /* this unit exists for this reference (unit
|
||||||
* already annotated) */
|
* already annotated) */
|
||||||
|
@ -604,8 +381,10 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi
|
||||||
|
|
||||||
if( aComponentsList[ii].CompareRef( aComponentsList[jj] ) != 0 )
|
if( aComponentsList[ii].CompareRef( aComponentsList[jj] ) != 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( aComponentsList[jj].CompareValue( aComponentsList[ii] ) != 0 )
|
if( aComponentsList[jj].CompareValue( aComponentsList[ii] ) != 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( !aComponentsList[jj].m_IsNew )
|
if( !aComponentsList[jj].m_IsNew )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -635,8 +414,7 @@ static void ComputeReferenceNumber( std::vector <OBJ_CMP_TO_LIST>& aComponentsLi
|
||||||
* the search pattern)
|
* the search pattern)
|
||||||
* @param aComponentsList = list of items
|
* @param aComponentsList = list of items
|
||||||
*/
|
*/
|
||||||
int GetLastReferenceNumber( int aObjet,
|
int GetLastReferenceNumber( int aObjet, std::vector< SCH_REFERENCE >& aComponentsList )
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
|
||||||
{
|
{
|
||||||
int LastNumber = 0;
|
int LastNumber = 0;
|
||||||
|
|
||||||
|
@ -645,6 +423,7 @@ int GetLastReferenceNumber( int aObjet,
|
||||||
/* New identifier. */
|
/* New identifier. */
|
||||||
if( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) != 0 )
|
if( aComponentsList[aObjet].CompareRef( aComponentsList[ii] ) != 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( LastNumber < aComponentsList[ii].m_NumRef )
|
if( LastNumber < aComponentsList[ii].m_NumRef )
|
||||||
LastNumber = aComponentsList[ii].m_NumRef;
|
LastNumber = aComponentsList[ii].m_NumRef;
|
||||||
}
|
}
|
||||||
|
@ -657,18 +436,18 @@ int GetLastReferenceNumber( int aObjet,
|
||||||
* Search in the sorted list of components, for a given component an other
|
* 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
|
* component with the same reference and a given part unit. Mainly used to
|
||||||
* manage multiple parts per package components.
|
* manage multiple parts per package components.
|
||||||
* @param aObjet = index in aComponentsList for the given OBJ_CMP_TO_LIST
|
* @param aObjet = index in aComponentsList for the given SCH_REFERENCE
|
||||||
* item to test
|
* item to test
|
||||||
* @param Unit = the given unit number to search
|
* @param Unit = the given unit number to search
|
||||||
* @param aComponentsList = list of items to examine
|
* @param aComponentsList = list of items to examine
|
||||||
* @return index in aComponentsList if found or -1 if not found
|
* @return index in aComponentsList if found or -1 if not found
|
||||||
*/
|
*/
|
||||||
static int ExistUnit( int aObjet, int Unit,
|
static int ExistUnit( int aObjet, int Unit, std::vector< SCH_REFERENCE >& aComponentsList )
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aComponentsList )
|
|
||||||
{
|
{
|
||||||
int NumRef;
|
int NumRef;
|
||||||
|
|
||||||
NumRef = aComponentsList[aObjet].m_NumRef;
|
NumRef = aComponentsList[aObjet].m_NumRef;
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ )
|
for( unsigned ii = 0; ii < aComponentsList.size(); ii++ )
|
||||||
{
|
{
|
||||||
if( aObjet == (int) ii )
|
if( aObjet == (int) ii )
|
||||||
|
@ -717,20 +496,15 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
/* build the screen list */
|
/* build the screen list */
|
||||||
SCH_SHEET_LIST SheetList;
|
SCH_SHEET_LIST SheetList;
|
||||||
|
|
||||||
std::vector <OBJ_CMP_TO_LIST> ComponentsList;
|
std::vector< SCH_REFERENCE > ComponentsList;
|
||||||
|
|
||||||
/* Build the list of components */
|
/* Build the list of components */
|
||||||
if( !aOneSheetOnly )
|
if( !aOneSheetOnly )
|
||||||
{
|
SheetList.GetComponents( ComponentsList );
|
||||||
SCH_SHEET_PATH* sheet;
|
|
||||||
for( sheet = SheetList.GetFirst(); sheet != NULL;
|
|
||||||
sheet = SheetList.GetNext() )
|
|
||||||
AddComponentsInSheetToList( ComponentsList, sheet );
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
AddComponentsInSheetToList( ComponentsList, GetSheet() );
|
GetSheet()->GetComponents( ComponentsList );
|
||||||
|
|
||||||
sort( ComponentsList.begin(), ComponentsList.end(), AnnotateByValue );
|
sort( ComponentsList.begin(), ComponentsList.end(), SortByValue );
|
||||||
|
|
||||||
/* Break full components reference in name (prefix) and number: example:
|
/* Break full components reference in name (prefix) and number: example:
|
||||||
* IC1 become IC, and 1 */
|
* IC1 become IC, and 1 */
|
||||||
|
@ -739,6 +513,7 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
/* count not yet annotated items */
|
/* count not yet annotated items */
|
||||||
error = 0;
|
error = 0;
|
||||||
int imax = ComponentsList.size() - 1;
|
int imax = ComponentsList.size() - 1;
|
||||||
|
|
||||||
for( int ii = 0; ii < imax; ii++ )
|
for( int ii = 0; ii < imax; ii++ )
|
||||||
{
|
{
|
||||||
msg.Empty();
|
msg.Empty();
|
||||||
|
@ -752,31 +527,25 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
Buff = wxT( "?" );
|
Buff = wxT( "?" );
|
||||||
|
|
||||||
cmpref = ComponentsList[ii].GetRef();
|
cmpref = ComponentsList[ii].GetRef();
|
||||||
msg.Printf( _( "item not annotated: %s%s" ),
|
msg.Printf( _( "item not annotated: %s%s" ), GetChars( cmpref ), GetChars( Buff ) );
|
||||||
GetChars( cmpref ), GetChars( Buff ) );
|
|
||||||
|
|
||||||
if( ( ComponentsList[ii].m_Unit > 0 )
|
if( ( ComponentsList[ii].m_Unit > 0 ) && ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||||
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
|
||||||
{
|
{
|
||||||
Buff.Printf( _( "( unit %d)" ), ComponentsList[ii].m_Unit );
|
Buff.Printf( _( "( unit %d)" ), ComponentsList[ii].m_Unit );
|
||||||
msg << Buff;
|
msg << Buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ) );
|
aMessageList->Add( msg + wxT( "\n" ) );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
}
|
|
||||||
error++;
|
error++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Annotate error
|
// Annotate error
|
||||||
if( MAX( ComponentsList[ii].m_Entry->GetPartCount(), 1 )
|
if( MAX( ComponentsList[ii].m_Entry->GetPartCount(), 1 ) < ComponentsList[ii].m_Unit )
|
||||||
< ComponentsList[ii].m_Unit )
|
|
||||||
{
|
{
|
||||||
if( ComponentsList[ii].m_NumRef >= 0 )
|
if( ComponentsList[ii].m_NumRef >= 0 )
|
||||||
Buff << ComponentsList[ii].m_NumRef;
|
Buff << ComponentsList[ii].m_NumRef;
|
||||||
|
@ -785,19 +554,18 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
|
|
||||||
cmpref = ComponentsList[ii].GetRef();
|
cmpref = ComponentsList[ii].GetRef();
|
||||||
|
|
||||||
msg.Printf( _( "Error item %s%s" ), GetChars( cmpref ),
|
msg.Printf( _( "Error item %s%s" ), GetChars( cmpref ), GetChars( Buff ) );
|
||||||
GetChars( Buff ) );
|
|
||||||
|
|
||||||
Buff.Printf( _( " unit %d and no more than %d parts" ),
|
Buff.Printf( _( " unit %d and no more than %d parts" ),
|
||||||
ComponentsList[ii].m_Unit,
|
ComponentsList[ii].m_Unit,
|
||||||
ComponentsList[ii].m_Entry->GetPartCount() );
|
ComponentsList[ii].m_Entry->GetPartCount() );
|
||||||
msg << Buff;
|
msg << Buff;
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ));
|
aMessageList->Add( msg + wxT( "\n" ));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
|
|
||||||
error++;
|
error++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -827,21 +595,19 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
|
|
||||||
cmpref = ComponentsList[ii].GetRef();
|
cmpref = ComponentsList[ii].GetRef();
|
||||||
|
|
||||||
msg.Printf( _( "Multiple item %s%s" ),
|
msg.Printf( _( "Multiple item %s%s" ), GetChars( cmpref ), GetChars( Buff ) );
|
||||||
GetChars( cmpref ), GetChars( Buff ) );
|
|
||||||
|
|
||||||
if( ( ComponentsList[ii].m_Unit > 0 )
|
if( ( ComponentsList[ii].m_Unit > 0 )&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||||
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
|
||||||
{
|
{
|
||||||
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit );
|
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit );
|
||||||
msg << Buff;
|
msg << Buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ));
|
aMessageList->Add( msg + wxT( "\n" ));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
|
|
||||||
error++;
|
error++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -857,30 +623,26 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
Buff = wxT( "?" );
|
Buff = wxT( "?" );
|
||||||
|
|
||||||
cmpref = ComponentsList[ii].GetRef();
|
cmpref = ComponentsList[ii].GetRef();
|
||||||
msg.Printf( _( "Multiple item %s%s" ),
|
msg.Printf( _( "Multiple item %s%s" ), GetChars( cmpref ), GetChars( Buff ) );
|
||||||
GetChars( cmpref ), GetChars( Buff ) );
|
|
||||||
|
|
||||||
if( ( ComponentsList[ii].m_Unit > 0 )
|
if( ( ComponentsList[ii].m_Unit > 0 ) && ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
||||||
&& ( ComponentsList[ii].m_Unit < 0x7FFFFFFF ) )
|
|
||||||
{
|
{
|
||||||
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit );
|
Buff.Printf( _( " (unit %d)" ), ComponentsList[ii].m_Unit );
|
||||||
msg << Buff;
|
msg << Buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ));
|
aMessageList->Add( msg + wxT( "\n" ));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
}
|
|
||||||
error++;
|
error++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Error if values are different between units, for the same
|
/* Error if values are different between units, for the same
|
||||||
* reference */
|
* reference */
|
||||||
int next = ii + 1;
|
int next = ii + 1;
|
||||||
|
|
||||||
if( ComponentsList[ii].CompareValue( ComponentsList[next] ) != 0 )
|
if( ComponentsList[ii].CompareValue( ComponentsList[next] ) != 0 )
|
||||||
{
|
{
|
||||||
wxString nextcmpref = ComponentsList[next].GetRef();
|
wxString nextcmpref = ComponentsList[next].GetRef();
|
||||||
|
@ -910,13 +672,9 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ));
|
aMessageList->Add( msg + wxT( "\n" ));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
}
|
|
||||||
|
|
||||||
error++;
|
error++;
|
||||||
}
|
}
|
||||||
|
@ -924,12 +682,11 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
|
|
||||||
// count the duplicated time stamps
|
// count the duplicated time stamps
|
||||||
sort( ComponentsList.begin(), ComponentsList.end(), SortByTimeStamp );
|
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
|
if( ( ComponentsList[ii].m_TimeStamp != ComponentsList[ii + 1].m_TimeStamp )
|
||||||
!= ComponentsList[ii + 1].m_TimeStamp)
|
|| ( ComponentsList[ii].m_SheetPath != ComponentsList[ii + 1].m_SheetPath ) )
|
||||||
|| ( ComponentsList[ii].m_SheetPath
|
|
||||||
!= ComponentsList[ii + 1].m_SheetPath ) )
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Same time stamp found. */
|
/* Same time stamp found. */
|
||||||
|
@ -949,102 +706,12 @@ int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOn
|
||||||
GetChars( nextcmpref ), ComponentsList[ii + 1].m_NumRef );
|
GetChars( nextcmpref ), ComponentsList[ii + 1].m_NumRef );
|
||||||
|
|
||||||
if( aMessageList )
|
if( aMessageList )
|
||||||
{
|
|
||||||
aMessageList->Add( msg + wxT( "\n" ));
|
aMessageList->Add( msg + wxT( "\n" ));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DisplayError( NULL, msg );
|
DisplayError( NULL, msg );
|
||||||
}
|
|
||||||
|
|
||||||
error++;
|
error++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************
|
|
||||||
* function to sort sch_items by time stamp
|
|
||||||
************************************************/
|
|
||||||
static bool SortItemByTimeStamp( const SCH_ITEM* item1, const SCH_ITEM* item2 )
|
|
||||||
{
|
|
||||||
int ii = item1->m_TimeStamp - item2->m_TimeStamp;
|
|
||||||
|
|
||||||
/* if same time stamp, compare type, in order to have
|
|
||||||
* first : component
|
|
||||||
* after : sheet
|
|
||||||
* because this is the first item that have its time stamp changed
|
|
||||||
* and changing the time stamp of a sheet can loose annotation
|
|
||||||
*/
|
|
||||||
|
|
||||||
if( ii == 0 && ( item1->Type() != item2->Type() ) )
|
|
||||||
if( item1->Type() == SCH_SHEET_T )
|
|
||||||
ii = -1;
|
|
||||||
|
|
||||||
return ii < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ReplaceDuplicatedTimeStamps
|
|
||||||
* Search for duplicate time stamps in the whole hierarchy, and replace
|
|
||||||
* duplicate by new time stamps
|
|
||||||
*/
|
|
||||||
int ReplaceDuplicatedTimeStamps()
|
|
||||||
{
|
|
||||||
/* Build the whole screen list */
|
|
||||||
SCH_SCREENS 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 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() )
|
|
||||||
{
|
|
||||||
item = screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item )
|
|
||||||
{
|
|
||||||
if( ( item->Type() == SCH_SHEET_T )
|
|
||||||
|| ( item->Type() == SCH_COMPONENT_T ) )
|
|
||||||
itemlist.push_back( item );
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test and replace duplicated time stamps
|
|
||||||
int imax = itemlist.size() - 1;
|
|
||||||
int errcount = 0;
|
|
||||||
sort( itemlist.begin(), itemlist.end(), SortItemByTimeStamp );
|
|
||||||
for( int ii = 0; ii < imax; ii++ )
|
|
||||||
{
|
|
||||||
item = itemlist[ii];
|
|
||||||
SCH_ITEM* nextitem = itemlist[ii + 1];
|
|
||||||
if( item->m_TimeStamp == nextitem->m_TimeStamp )
|
|
||||||
{
|
|
||||||
errcount++;
|
|
||||||
|
|
||||||
// for a component, update its Time stamp and its paths
|
|
||||||
// (m_PathsAndReferences field)
|
|
||||||
if( item->Type() == SCH_COMPONENT_T )
|
|
||||||
( (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)
|
|
||||||
else
|
|
||||||
item->m_TimeStamp = GetTimeStamp();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return errcount;
|
|
||||||
}
|
|
||||||
|
|
|
@ -27,49 +27,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function BuildComponentsListFromSchematic
|
|
||||||
* creates the list of components found in the whole schematic.
|
|
||||||
*
|
|
||||||
* Goes through the 'sheets', not the screens, so that we account for
|
|
||||||
* multiple instances of a given screen.
|
|
||||||
*/
|
|
||||||
void BuildComponentsListFromSchematic( std::vector <OBJ_CMP_TO_LIST>& aList )
|
|
||||||
{
|
|
||||||
// Build the sheet list (which is not screen a screen list)
|
|
||||||
SCH_SHEET_LIST sheetList; // uses a global
|
|
||||||
|
|
||||||
for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() )
|
|
||||||
{
|
|
||||||
for( EDA_ITEM* schItem = path->LastDrawList(); schItem; schItem = schItem->Next() )
|
|
||||||
{
|
|
||||||
if( schItem->Type() != SCH_COMPONENT_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
SCH_COMPONENT* comp = (SCH_COMPONENT*) schItem;
|
|
||||||
|
|
||||||
comp->SetParent( path->LastScreen() );
|
|
||||||
|
|
||||||
OBJ_CMP_TO_LIST item;
|
|
||||||
|
|
||||||
item.m_RootCmp = comp;
|
|
||||||
item.m_SheetPath = *path;
|
|
||||||
item.m_Unit = comp->GetUnitSelection( path );
|
|
||||||
|
|
||||||
item.SetRef( comp->GetRef( path ) );
|
|
||||||
|
|
||||||
// skip pseudo components, which have a reference starting
|
|
||||||
// with #, mainly power symbols
|
|
||||||
if( item.GetRefStr()[0] == '#' )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Real component found, keep it
|
|
||||||
aList.push_back( item );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Fill aList with Glabel info
|
/* Fill aList with Glabel info
|
||||||
*/
|
*/
|
||||||
void GenListeGLabels( std::vector <LABEL_OBJECT>& aList )
|
void GenListeGLabels( std::vector <LABEL_OBJECT>& aList )
|
||||||
|
@ -125,7 +82,7 @@ void GenListeGLabels( std::vector <LABEL_OBJECT>& aList )
|
||||||
* if same value: by reference
|
* if same value: by reference
|
||||||
* if same reference: by unit number
|
* if same reference: by unit number
|
||||||
*/
|
*/
|
||||||
bool SortComponentsByValue( const OBJ_CMP_TO_LIST& obj1, const OBJ_CMP_TO_LIST& obj2 )
|
bool SortComponentsByValue( const SCH_REFERENCE& obj1, const SCH_REFERENCE& obj2 )
|
||||||
{
|
{
|
||||||
int ii;
|
int ii;
|
||||||
const wxString* Text1, * Text2;
|
const wxString* Text1, * Text2;
|
||||||
|
@ -154,7 +111,7 @@ bool SortComponentsByValue( const OBJ_CMP_TO_LIST& obj1, const OBJ_CMP_TO_LIST&
|
||||||
* if same reference: by value
|
* if same reference: by value
|
||||||
* if same value: by unit number
|
* if same value: by unit number
|
||||||
*/
|
*/
|
||||||
bool SortComponentsByReference( const OBJ_CMP_TO_LIST& obj1, const OBJ_CMP_TO_LIST& obj2 )
|
bool SortComponentsByReference( const SCH_REFERENCE& obj1, const SCH_REFERENCE& obj2 )
|
||||||
{
|
{
|
||||||
int ii;
|
int ii;
|
||||||
const wxString* Text1, * Text2;
|
const wxString* Text1, * Text2;
|
||||||
|
@ -242,7 +199,7 @@ bool SortLabelsBySheet( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 )
|
||||||
* found in this list
|
* found in this list
|
||||||
* The component list **MUST** be sorted by reference and by unit number
|
* The component list **MUST** be sorted by reference and by unit number
|
||||||
*/
|
*/
|
||||||
void DeleteSubCmp( std::vector <OBJ_CMP_TO_LIST>& aList )
|
void DeleteSubCmp( std::vector< SCH_REFERENCE >& aList )
|
||||||
{
|
{
|
||||||
SCH_COMPONENT* libItem;
|
SCH_COMPONENT* libItem;
|
||||||
wxString oldName;
|
wxString oldName;
|
||||||
|
@ -252,6 +209,7 @@ void DeleteSubCmp( std::vector <OBJ_CMP_TO_LIST>& aList )
|
||||||
for( unsigned ii = 0; ii < aList.size(); ii++ )
|
for( unsigned ii = 0; ii < aList.size(); ii++ )
|
||||||
{
|
{
|
||||||
libItem = aList[ii].m_RootCmp;
|
libItem = aList[ii].m_RootCmp;
|
||||||
|
|
||||||
if( libItem == NULL )
|
if( libItem == NULL )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -259,8 +217,7 @@ void DeleteSubCmp( std::vector <OBJ_CMP_TO_LIST>& aList )
|
||||||
|
|
||||||
if( !oldName.IsEmpty() )
|
if( !oldName.IsEmpty() )
|
||||||
{
|
{
|
||||||
if( oldName == currName ) // currName is a subpart of oldName:
|
if( oldName == currName ) // currName is a subpart of oldName: remove it
|
||||||
// remove it
|
|
||||||
{
|
{
|
||||||
aList.erase( aList.begin() + ii );
|
aList.erase( aList.begin() + ii );
|
||||||
ii--;
|
ii--;
|
||||||
|
|
|
@ -123,4 +123,8 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Buffer to build the list of items used in netlist and erc calculations
|
||||||
|
typedef std::vector <NETLIST_OBJECT*> NETLIST_OBJECT_LIST;
|
||||||
|
|
||||||
|
|
||||||
#endif // _CLASS_NETLIST_OBJECT_H_
|
#endif // _CLASS_NETLIST_OBJECT_H_
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Name: dialog_build_BOM.cpp
|
// Name: dialog_build_BOM.cpp
|
||||||
// Author: jean-pierre Charras
|
// Author: jean-pierre Charras
|
||||||
// Modified by:
|
// Modified by:
|
||||||
|
@ -222,11 +221,12 @@ void DIALOG_BUILD_BOM::SavePreferences()
|
||||||
s_ListBySheet = m_GenListLabelsbySheet->GetValue();
|
s_ListBySheet = m_GenListLabelsbySheet->GetValue();
|
||||||
s_BrowseCreatedList = m_GetListBrowser->GetValue();
|
s_BrowseCreatedList = m_GetListBrowser->GetValue();
|
||||||
|
|
||||||
// (aved in config ):
|
// (saved in config ):
|
||||||
|
|
||||||
// Determine current settings of both radiobutton groups
|
// Determine current settings of both radiobutton groups
|
||||||
s_OutputFormOpt = m_OutputFormCtrl->GetSelection();
|
s_OutputFormOpt = m_OutputFormCtrl->GetSelection();
|
||||||
s_OutputSeparatorOpt = m_OutputSeparatorCtrl->GetSelection();
|
s_OutputSeparatorOpt = m_OutputSeparatorCtrl->GetSelection();
|
||||||
|
|
||||||
if( s_OutputSeparatorOpt < 0 )
|
if( s_OutputSeparatorOpt < 0 )
|
||||||
s_OutputSeparatorOpt = 0;
|
s_OutputSeparatorOpt = 0;
|
||||||
|
|
||||||
|
@ -249,10 +249,12 @@ void DIALOG_BUILD_BOM::SavePreferences()
|
||||||
|
|
||||||
// Now save current settings of all "Fields to add" checkboxes
|
// Now save current settings of all "Fields to add" checkboxes
|
||||||
long addfields = 0;
|
long addfields = 0;
|
||||||
|
|
||||||
for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
|
for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
|
||||||
{
|
{
|
||||||
if( *s_AddFieldList[ii] )
|
if( *s_AddFieldList[ii] )
|
||||||
addfields |= bitmask;
|
addfields |= bitmask;
|
||||||
|
|
||||||
bitmask <<= 1;
|
bitmask <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,7 +321,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
|
||||||
GenereListeOfItems( m_ListFileName, aIncludeSubComponents );
|
GenereListeOfItems( m_ListFileName, aIncludeSubComponents );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // speadsheet
|
case 1: // spreadsheet
|
||||||
CreateExportList( m_ListFileName, aIncludeSubComponents );
|
CreateExportList( m_ListFileName, aIncludeSubComponents );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -390,9 +392,10 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName, bool aInc
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector <OBJ_CMP_TO_LIST> cmplist;
|
std::vector <SCH_REFERENCE> cmplist;
|
||||||
|
SCH_SHEET_LIST sheetList; // uses a global
|
||||||
|
|
||||||
BuildComponentsListFromSchematic( cmplist );
|
sheetList.GetComponents( cmplist, false );
|
||||||
|
|
||||||
// sort component list by ref and remove sub components
|
// sort component list by ref and remove sub components
|
||||||
if( !aIncludeSubComponents )
|
if( !aIncludeSubComponents )
|
||||||
|
@ -428,8 +431,10 @@ void DIALOG_BUILD_BOM::CreateExportList( const wxString& aFullFileName,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector <OBJ_CMP_TO_LIST> cmplist;
|
std::vector <SCH_REFERENCE> cmplist;
|
||||||
BuildComponentsListFromSchematic( cmplist );
|
SCH_SHEET_LIST sheetList; // uses a global
|
||||||
|
|
||||||
|
sheetList.GetComponents( cmplist, false );
|
||||||
|
|
||||||
// sort component list
|
// sort component list
|
||||||
sort( cmplist.begin(), cmplist.end(), SortComponentsByReference );
|
sort( cmplist.begin(), cmplist.end(), SortComponentsByReference );
|
||||||
|
@ -464,17 +469,19 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector <OBJ_CMP_TO_LIST> cmplist;
|
std::vector <SCH_REFERENCE> cmplist;
|
||||||
BuildComponentsListFromSchematic( cmplist );
|
SCH_SHEET_LIST sheetList; // uses a global
|
||||||
|
|
||||||
|
sheetList.GetComponents( cmplist, false );
|
||||||
|
|
||||||
itemCount = cmplist.size();
|
itemCount = cmplist.size();
|
||||||
|
|
||||||
if( itemCount )
|
if( itemCount )
|
||||||
{
|
{
|
||||||
// creates the list file
|
// creates the list file
|
||||||
DateAndTime( Line );
|
DateAndTime( Line );
|
||||||
|
|
||||||
wxString Title = wxGetApp().GetAppName() + wxT( " " ) +
|
wxString Title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
|
||||||
GetBuildVersion();
|
|
||||||
|
|
||||||
fprintf( f, "%s >> Creation date: %s\n", CONV_TO_UTF8( Title ), Line );
|
fprintf( f, "%s >> Creation date: %s\n", CONV_TO_UTF8( Title ), Line );
|
||||||
|
|
||||||
|
@ -569,11 +576,10 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem,
|
||||||
|
|
||||||
/* Print the B.O.M sorted by reference
|
/* Print the B.O.M sorted by reference
|
||||||
*/
|
*/
|
||||||
int DIALOG_BUILD_BOM::PrintComponentsListByRef(
|
int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
|
||||||
FILE* f,
|
std::vector <SCH_REFERENCE>& aList,
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aList,
|
bool CompactForm,
|
||||||
bool CompactForm,
|
bool aIncludeSubComponents )
|
||||||
bool aIncludeSubComponents )
|
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
||||||
|
@ -714,16 +720,14 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
|
||||||
* This is true for most designs but will produce an
|
* This is true for most designs but will produce an
|
||||||
* incorrect output if two or more parts with the same
|
* incorrect output if two or more parts with the same
|
||||||
* value have different footprints, tolerances, voltage
|
* value have different footprints, tolerances, voltage
|
||||||
* rating, etc. Also usefull if the following fields
|
* rating, etc. Also useful if the following fields
|
||||||
* are edited:
|
* are edited:
|
||||||
* FIELD1 - manufacture
|
* FIELD1 - manufacture
|
||||||
* FIELD2 - manufacture part number
|
* FIELD2 - manufacture part number
|
||||||
* FIELD3 - distributor part number
|
* FIELD3 - distributor part number
|
||||||
*/
|
*/
|
||||||
int DIALOG_BUILD_BOM::PrintComponentsListByPart(
|
int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* f, std::vector <SCH_REFERENCE>& aList,
|
||||||
FILE* f,
|
bool aIncludeSubComponents )
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aList,
|
|
||||||
bool aIncludeSubComponents)
|
|
||||||
{
|
{
|
||||||
int qty = 0;
|
int qty = 0;
|
||||||
wxString refName;
|
wxString refName;
|
||||||
|
@ -800,7 +804,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart(
|
||||||
|
|
||||||
lastRef = refName;
|
lastRef = refName;
|
||||||
|
|
||||||
// if the next cmoponent has same value the line will be printed after.
|
// if the next component has same value the line will be printed after.
|
||||||
#if defined(KICAD_GOST)
|
#if defined(KICAD_GOST)
|
||||||
if( nextCmp && nextCmp->GetField( VALUE )->m_Text.CmpNoCase( valName ) == 0
|
if( nextCmp && nextCmp->GetField( VALUE )->m_Text.CmpNoCase( valName ) == 0
|
||||||
&& nextCmp->GetField( FOOTPRINT )->m_Text.CmpNoCase( footName ) == 0
|
&& nextCmp->GetField( FOOTPRINT )->m_Text.CmpNoCase( footName ) == 0
|
||||||
|
@ -856,10 +860,9 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int DIALOG_BUILD_BOM::PrintComponentsListByVal(
|
int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f,
|
||||||
FILE* f,
|
std::vector <SCH_REFERENCE>& aList,
|
||||||
std::vector <OBJ_CMP_TO_LIST>& aList,
|
bool aIncludeSubComponents )
|
||||||
bool aIncludeSubComponents )
|
|
||||||
{
|
{
|
||||||
EDA_ITEM* schItem;
|
EDA_ITEM* schItem;
|
||||||
SCH_COMPONENT* DrawLibItem;
|
SCH_COMPONENT* DrawLibItem;
|
||||||
|
@ -871,6 +874,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal(
|
||||||
|
|
||||||
if( aIncludeSubComponents )
|
if( aIncludeSubComponents )
|
||||||
msg << _( " (with SubCmp)" );
|
msg << _( " (with SubCmp)" );
|
||||||
|
|
||||||
msg << wxT( "\n" );
|
msg << wxT( "\n" );
|
||||||
|
|
||||||
fputs( CONV_TO_UTF8( msg ), f );
|
fputs( CONV_TO_UTF8( msg ), f );
|
||||||
|
|
|
@ -46,13 +46,13 @@ private:
|
||||||
*/
|
*/
|
||||||
void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents );
|
void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents );
|
||||||
|
|
||||||
int PrintComponentsListByRef( FILE* f, std::vector <OBJ_CMP_TO_LIST>& aList,
|
int PrintComponentsListByRef( FILE* f, std::vector <SCH_REFERENCE>& aList,
|
||||||
bool CompactForm, bool aIncludeSubComponents );
|
bool CompactForm, bool aIncludeSubComponents );
|
||||||
|
|
||||||
int PrintComponentsListByVal( FILE* f, std::vector <OBJ_CMP_TO_LIST>& aList,
|
int PrintComponentsListByVal( FILE* f, std::vector <SCH_REFERENCE>& aList,
|
||||||
bool aIncludeSubComponents );
|
bool aIncludeSubComponents );
|
||||||
|
|
||||||
int PrintComponentsListByPart( FILE* f, std::vector <OBJ_CMP_TO_LIST>& aList,
|
int PrintComponentsListByPart( FILE* f, std::vector <SCH_REFERENCE>& aList,
|
||||||
bool aIncludeSubComponents );
|
bool aIncludeSubComponents );
|
||||||
|
|
||||||
void PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, bool CompactForm = FALSE );
|
void PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, bool CompactForm = FALSE );
|
||||||
|
|
|
@ -412,7 +412,9 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
|
||||||
|
|
||||||
m_writeErcFile = m_WriteResultOpt->GetValue();
|
m_writeErcFile = m_WriteResultOpt->GetValue();
|
||||||
|
|
||||||
ReAnnotatePowerSymbolsOnly();
|
/* Build the whole sheet list in hierarchy (sheet, not screen) */
|
||||||
|
SCH_SHEET_LIST sheets;
|
||||||
|
sheets.AnnotatePowerSymbols();
|
||||||
|
|
||||||
if( m_Parent->CheckAnnotate( aMessagesList, false ) )
|
if( m_Parent->CheckAnnotate( aMessagesList, false ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include "eeschema_id.h"
|
#include "eeschema_id.h"
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
#include "netlist.h"
|
#include "netlist_control.h"
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
#include "libeditframe.h"
|
#include "libeditframe.h"
|
||||||
#include "eeschema_config.h"
|
#include "eeschema_config.h"
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <wx/gdicmn.h>
|
#include <wx/gdicmn.h>
|
||||||
|
|
||||||
#include "block_commande.h"
|
#include "block_commande.h"
|
||||||
|
#include "class_netlist_object.h"
|
||||||
|
|
||||||
|
|
||||||
class SCH_ITEM;
|
class SCH_ITEM;
|
||||||
|
@ -203,4 +204,12 @@ extern int g_ItemSelectetColor;
|
||||||
// eeschema
|
// eeschema
|
||||||
extern int g_InvisibleItemColor;
|
extern int g_InvisibleItemColor;
|
||||||
|
|
||||||
|
/* Global Variables */
|
||||||
|
|
||||||
|
extern NETLIST_OBJECT_LIST g_NetObjectslist;
|
||||||
|
|
||||||
|
extern bool g_OptNetListUseNames; /* TRUE to use names rather than
|
||||||
|
* net numbers. SPICE netlist only
|
||||||
|
*/
|
||||||
|
|
||||||
#endif // _GENERAL_H_
|
#endif // _GENERAL_H_
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
|
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
#include "netlist.h"
|
#include "netlist.h"
|
||||||
|
#include "netlist_control.h"
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
#include "class_library.h"
|
#include "class_library.h"
|
||||||
#include "lib_pin.h"
|
#include "lib_pin.h"
|
||||||
|
@ -143,7 +144,7 @@ class EXPORT_HELP
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function eraseDuplicatePins
|
* Function eraseDuplicatePins
|
||||||
* removes duplicate Pins fromt the pin list, m_SortedComponentPinList.
|
* removes duplicate Pins from the pin list, m_SortedComponentPinList.
|
||||||
* (This is a list of pins found in the whole schematic, for a single
|
* (This is a list of pins found in the whole schematic, for a single
|
||||||
* component.) These duplicate pins were put in list because some pins (powers... )
|
* component.) These duplicate pins were put in list because some pins (powers... )
|
||||||
* are found more than one time when we have a multiple parts per package
|
* are found more than one time when we have a multiple parts per package
|
||||||
|
@ -725,7 +726,7 @@ XNODE* EXPORT_HELP::makeGenericLibParts()
|
||||||
LIB_COMPONENT* lcomp = (LIB_COMPONENT*) *it;
|
LIB_COMPONENT* lcomp = (LIB_COMPONENT*) *it;
|
||||||
CMP_LIBRARY* library = lcomp->GetLibrary();
|
CMP_LIBRARY* library = lcomp->GetLibrary();
|
||||||
|
|
||||||
m_Libraries.insert( library ); // inserts component's library iff unique
|
m_Libraries.insert( library ); // inserts component's library if unique
|
||||||
|
|
||||||
XNODE* xlibpart;
|
XNODE* xlibpart;
|
||||||
xlibparts->AddChild( xlibpart = node( sLibpart ) );
|
xlibparts->AddChild( xlibpart = node( sLibpart ) );
|
||||||
|
@ -958,7 +959,7 @@ XNODE* EXPORT_HELP::makeGenericComponents()
|
||||||
|
|
||||||
XNODE* xcomp; // current component being constructed
|
XNODE* xcomp; // current component being constructed
|
||||||
|
|
||||||
// Output the component's elments in order of expected access frequency.
|
// Output the component's elements in order of expected access frequency.
|
||||||
// This may not always look best, but it will allow faster execution
|
// This may not always look best, but it will allow faster execution
|
||||||
// under XSL processing systems which do sequential searching within
|
// under XSL processing systems which do sequential searching within
|
||||||
// an element.
|
// an element.
|
||||||
|
@ -1015,8 +1016,8 @@ XNODE* EXPORT_HELP::makeGenericComponents()
|
||||||
timeStamp.Printf( sTSFmt, comp->m_TimeStamp );
|
timeStamp.Printf( sTSFmt, comp->m_TimeStamp );
|
||||||
xcomp->AddChild( node( sTStamp, timeStamp ) );
|
xcomp->AddChild( node( sTStamp, timeStamp ) );
|
||||||
|
|
||||||
// Add pins list for this cmponent.
|
// Add pins list for this component.
|
||||||
// Usedful to build netlist which have pads connection inside the footprint description
|
// Useful to build netlist which have pads connection inside the footprint description
|
||||||
// (Spice, OrcadPCB2 ...)
|
// (Spice, OrcadPCB2 ...)
|
||||||
XNODE* xpinslist;
|
XNODE* xpinslist;
|
||||||
xcomp->AddChild( xpinslist = node( sPins ) );
|
xcomp->AddChild( xpinslist = node( sPins ) );
|
||||||
|
@ -1086,7 +1087,7 @@ bool EXPORT_HELP::WriteGENERICNetList( SCH_EDIT_FRAME* frame, const wxString& aO
|
||||||
|
|
||||||
return xdoc.Save( aOutFileName, 2 /* indent bug, today was ignored by wxXml lib */ );
|
return xdoc.Save( aOutFileName, 2 /* indent bug, today was ignored by wxXml lib */ );
|
||||||
|
|
||||||
#else // ouput the well established/old generic net list format which was not XML.
|
#else // output the well established/old generic net list format which was not XML.
|
||||||
|
|
||||||
wxString field;
|
wxString field;
|
||||||
wxString footprint;
|
wxString footprint;
|
||||||
|
@ -1341,7 +1342,7 @@ bool EXPORT_HELP::WriteNetListPCBNEW( SCH_EDIT_FRAME* frame, FILE* f, bool with_
|
||||||
int ret = 0; // zero now, OR in the sign bit on error
|
int ret = 0; // zero now, OR in the sign bit on error
|
||||||
wxString netName;
|
wxString netName;
|
||||||
|
|
||||||
std::vector<OBJ_CMP_TO_LIST> cmpList;
|
std::vector< SCH_REFERENCE > cmpList;
|
||||||
|
|
||||||
DateAndTime( dateBuf );
|
DateAndTime( dateBuf );
|
||||||
|
|
||||||
|
@ -1361,6 +1362,7 @@ bool EXPORT_HELP::WriteNetListPCBNEW( SCH_EDIT_FRAME* frame, FILE* f, bool with_
|
||||||
for( EDA_ITEM* item = path->LastDrawList(); item; item = item->Next() )
|
for( EDA_ITEM* item = path->LastDrawList(); item; item = item->Next() )
|
||||||
{
|
{
|
||||||
SCH_COMPONENT* comp = findNextComponentAndCreatPinList( item, path );
|
SCH_COMPONENT* comp = findNextComponentAndCreatPinList( item, path );
|
||||||
|
|
||||||
if( !comp )
|
if( !comp )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1375,8 +1377,7 @@ bool EXPORT_HELP::WriteNetListPCBNEW( SCH_EDIT_FRAME* frame, FILE* f, bool with_
|
||||||
{
|
{
|
||||||
if( entry->GetFootPrints().GetCount() != 0 ) // Put in list
|
if( entry->GetFootPrints().GetCount() != 0 ) // Put in list
|
||||||
{
|
{
|
||||||
cmpList.push_back( OBJ_CMP_TO_LIST() );
|
cmpList.push_back( SCH_REFERENCE() );
|
||||||
|
|
||||||
cmpList.back().m_RootCmp = comp;
|
cmpList.back().m_RootCmp = comp;
|
||||||
cmpList.back().SetRef( comp->GetRef( path ) );
|
cmpList.back().SetRef( comp->GetRef( path ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,98 @@ void dumpNetTable()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_COMPONENT* aLibComponent,
|
||||||
|
SCH_SHEET_PATH& aSheetPath )
|
||||||
|
{
|
||||||
|
wxASSERT( aComponent != NULL && aLibComponent != NULL );
|
||||||
|
|
||||||
|
m_RootCmp = aComponent;
|
||||||
|
m_Entry = aLibComponent;
|
||||||
|
m_Unit = aComponent->GetUnitSelection( &aSheetPath );
|
||||||
|
m_SheetPath = aSheetPath;
|
||||||
|
m_IsNew = false;
|
||||||
|
m_Flag = 0;
|
||||||
|
m_TimeStamp = aComponent->m_TimeStamp;
|
||||||
|
|
||||||
|
if( aComponent->GetRef( &aSheetPath ).IsEmpty() )
|
||||||
|
aComponent->SetRef( &aSheetPath, wxT( "DefRef?" ) );
|
||||||
|
|
||||||
|
SetRef( aComponent->GetRef( &aSheetPath ) );
|
||||||
|
|
||||||
|
m_NumRef = -1;
|
||||||
|
|
||||||
|
if( aComponent->GetField( VALUE )->GetText().IsEmpty() )
|
||||||
|
aComponent->GetField( VALUE )->SetText( wxT( "~" ) );
|
||||||
|
|
||||||
|
m_Value = &aComponent->GetField( VALUE )->m_Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_REFERENCE::Annotate()
|
||||||
|
{
|
||||||
|
if( m_NumRef < 0 )
|
||||||
|
m_Ref += wxChar( '?' );
|
||||||
|
else
|
||||||
|
m_Ref = CONV_TO_UTF8( GetRef() << m_NumRef );
|
||||||
|
|
||||||
|
m_RootCmp->SetRef( &m_SheetPath, CONV_FROM_UTF8( m_Ref.c_str() ) );
|
||||||
|
m_RootCmp->SetUnit( m_Unit );
|
||||||
|
m_RootCmp->SetUnitSelection( &m_SheetPath, m_Unit );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_REFERENCE::Split()
|
||||||
|
{
|
||||||
|
std::string refText = GetRefStr();
|
||||||
|
|
||||||
|
m_NumRef = -1;
|
||||||
|
|
||||||
|
int ll = refText.length() - 1;
|
||||||
|
|
||||||
|
if( refText[ll] == '?' )
|
||||||
|
{
|
||||||
|
m_IsNew = true;
|
||||||
|
|
||||||
|
if( !IsPartsLocked() )
|
||||||
|
m_Unit = 0x7FFFFFFF;
|
||||||
|
|
||||||
|
refText.erase( ll ); // delete last char
|
||||||
|
|
||||||
|
SetRefStr( refText );
|
||||||
|
}
|
||||||
|
else if( isdigit( refText[ll] ) == 0 )
|
||||||
|
{
|
||||||
|
m_IsNew = true;
|
||||||
|
|
||||||
|
if( !IsPartsLocked() )
|
||||||
|
m_Unit = 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while( ll >= 0 )
|
||||||
|
{
|
||||||
|
if( (refText[ll] <= ' ' ) || isdigit( refText[ll] ) )
|
||||||
|
ll--;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( isdigit( refText[ll + 1] ) )
|
||||||
|
{
|
||||||
|
// null terminated C string into cp
|
||||||
|
const char* cp = refText.c_str() + ll + 1;
|
||||||
|
|
||||||
|
m_NumRef = atoi( cp );
|
||||||
|
}
|
||||||
|
|
||||||
|
refText.erase( ll+1 ); // delete from ll+1 to end
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetRefStr( refText );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routine to free memory used to calculate the netlist TabNetItems = pointer
|
* Routine to free memory used to calculate the netlist TabNetItems = pointer
|
||||||
* to the main table (list items)
|
* to the main table (list items)
|
||||||
|
@ -369,8 +461,8 @@ void FindBestNetNameForEachNet( NETLIST_OBJECT_LIST& aNetItemBuffer )
|
||||||
* @param aLabelItemBuffer = list of NETLIST_OBJECT type labels candidates.
|
* @param aLabelItemBuffer = list of NETLIST_OBJECT type labels candidates.
|
||||||
* labels are local labels, hierarchical labels or pin labels
|
* labels are local labels, hierarchical labels or pin labels
|
||||||
* labels in included sheets have a lower priority than labels in the current sheet.
|
* labels in included sheets have a lower priority than labels in the current sheet.
|
||||||
* so labels inside the root sheet have the highter priority.
|
* so labels inside the root sheet have the higher priority.
|
||||||
* pin labels are global labels and have the highter priority
|
* pin labels are global labels and have the higher priority
|
||||||
* local labels have the lower priority
|
* local labels have the lower priority
|
||||||
* labels having the same priority are sorted by alphabetic order.
|
* labels having the same priority are sorted by alphabetic order.
|
||||||
*
|
*
|
||||||
|
@ -434,7 +526,7 @@ static NETLIST_OBJECT* FindBestNetName( NETLIST_OBJECT_LIST& aLabelItemBuffer )
|
||||||
}
|
}
|
||||||
else // not global: names are prefixed by their sheetpath
|
else // not global: names are prefixed by their sheetpath
|
||||||
{
|
{
|
||||||
// use name defined in highter hierarchical sheet
|
// use name defined in higher hierarchical sheet
|
||||||
// (i.e. shorter path because paths are /<timestamp1>/<timestamp2>/...
|
// (i.e. shorter path because paths are /<timestamp1>/<timestamp2>/...
|
||||||
// and timestamp = 8 letters.
|
// and timestamp = 8 letters.
|
||||||
if( candidate->m_SheetList.Path().Length() < item->m_SheetList.Path().Length() )
|
if( candidate->m_SheetList.Path().Length() < item->m_SheetList.Path().Length() )
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
#include "class_libentry.h"
|
#include "class_libentry.h"
|
||||||
|
#include "sch_sheet_path.h"
|
||||||
|
|
||||||
|
|
||||||
class SCH_COMPONENT;
|
class SCH_COMPONENT;
|
||||||
|
@ -18,37 +19,19 @@ class SCH_COMPONENT;
|
||||||
|
|
||||||
#define ISBUS 1
|
#define ISBUS 1
|
||||||
|
|
||||||
#define CUSTOMPANEL_COUNTMAX 8 // Max number of netlist plugins
|
|
||||||
|
|
||||||
#include "class_netlist_object.h"
|
|
||||||
|
|
||||||
/* Id to select netlist type */
|
|
||||||
enum TypeNetForm {
|
|
||||||
NET_TYPE_UNINIT = 0,
|
|
||||||
NET_TYPE_PCBNEW,
|
|
||||||
NET_TYPE_ORCADPCB2,
|
|
||||||
NET_TYPE_CADSTAR,
|
|
||||||
NET_TYPE_SPICE,
|
|
||||||
NET_TYPE_CUSTOM1, /* NET_TYPE_CUSTOM1
|
|
||||||
* is the first id for user netlist format
|
|
||||||
* NET_TYPE_CUSTOM1+CUSTOMPANEL_COUNTMAX-1
|
|
||||||
* is the last id for user netlist format
|
|
||||||
*/
|
|
||||||
NET_TYPE_CUSTOM_MAX = NET_TYPE_CUSTOM1 + CUSTOMPANEL_COUNTMAX - 1
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Max pin number per component and footprint */
|
/* Max pin number per component and footprint */
|
||||||
#define MAXPIN 5000
|
#define MAXPIN 5000
|
||||||
|
|
||||||
|
|
||||||
/* object used in annotation to handle a list of components in schematic
|
/**
|
||||||
* because in a complex hierarchy, a component is used more than once,
|
* Class SCH_REFERENCE
|
||||||
* and its reference is depending on the sheet path
|
* is used as a helper to define a component's reference designator in a schematic. This
|
||||||
* for the same component, we must create a flat list of components
|
* helper is required in a complex hierarchy because a component can be used more than
|
||||||
* used in nelist generation, BOM generation and annotation
|
* once and its reference depends on the sheet path. This class is used to flatten the
|
||||||
|
* schematic hierarchy for annotation, net list generation, and bill of material
|
||||||
|
* generation.
|
||||||
*/
|
*/
|
||||||
class OBJ_CMP_TO_LIST
|
class SCH_REFERENCE
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
/// Component reference prefix, without number (for IC1, this is IC) )
|
/// Component reference prefix, without number (for IC1, this is IC) )
|
||||||
|
@ -73,7 +56,7 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
OBJ_CMP_TO_LIST()
|
SCH_REFERENCE()
|
||||||
{
|
{
|
||||||
m_RootCmp = NULL;
|
m_RootCmp = NULL;
|
||||||
m_Entry = NULL;
|
m_Entry = NULL;
|
||||||
|
@ -85,6 +68,24 @@ public:
|
||||||
m_Flag = 0;
|
m_Flag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_COMPONENT* aLibComponent,
|
||||||
|
SCH_SHEET_PATH& aSheetPath );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Annotate
|
||||||
|
* updates the annotation of the component according the the current object state.
|
||||||
|
*/
|
||||||
|
void Annotate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Split
|
||||||
|
* attempts to split the reference designator into a name (U) and number (1). If the
|
||||||
|
* last character is '?' or not a digit, the reference is tagged as not annotated.
|
||||||
|
* For components with multiple parts per package that are not already annotated, set
|
||||||
|
* m_Unit to a max value (0x7FFFFFFF).
|
||||||
|
*/
|
||||||
|
void Split();
|
||||||
|
|
||||||
/* Some accessors which hide the strategy of how the reference is stored,
|
/* Some accessors which hide the strategy of how the reference is stored,
|
||||||
thereby making it easy to change that strategy.
|
thereby making it easy to change that strategy.
|
||||||
*/
|
*/
|
||||||
|
@ -108,13 +109,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CompareValue( const OBJ_CMP_TO_LIST& item ) const
|
int CompareValue( const SCH_REFERENCE& item ) const
|
||||||
{
|
{
|
||||||
return m_Value->CmpNoCase( *item.m_Value );
|
return m_Value->CmpNoCase( *item.m_Value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CompareRef( const OBJ_CMP_TO_LIST& item ) const
|
int CompareRef( const SCH_REFERENCE& item ) const
|
||||||
{
|
{
|
||||||
return m_Ref.compare( item.m_Ref );
|
return m_Ref.compare( item.m_Ref );
|
||||||
}
|
}
|
||||||
|
@ -127,29 +128,4 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Global Variables */
|
|
||||||
|
|
||||||
// Buffer to build the list of items used in netlist and erc calculations
|
|
||||||
typedef std::vector <NETLIST_OBJECT*> NETLIST_OBJECT_LIST;
|
|
||||||
extern NETLIST_OBJECT_LIST g_NetObjectslist;
|
|
||||||
|
|
||||||
extern bool g_OptNetListUseNames; /* TRUE to use names rather than
|
|
||||||
* net numbers. SPICE netlist only
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Prototypes: */
|
|
||||||
void FreeNetObjectsList( std::vector <NETLIST_OBJECT*>& aNetObjectslist );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ReturnUserNetlistTypeName
|
|
||||||
* to retrieve user netlist type names
|
|
||||||
* @param first_item = true: return first name of the list, false = return next
|
|
||||||
* @return a wxString : name of the type netlist or empty string
|
|
||||||
* this function must be called first with "first_item" = true
|
|
||||||
* and after with "first_item" = false to get all the other existing netlist
|
|
||||||
* names
|
|
||||||
*/
|
|
||||||
wxString ReturnUserNetlistTypeName( bool first_item );
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -517,7 +517,8 @@ void WinEDA_NetlistFrame::GenNetlist( wxCommandEvent& event )
|
||||||
bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
|
bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
|
||||||
bool aUse_netnames )
|
bool aUse_netnames )
|
||||||
{
|
{
|
||||||
ReAnnotatePowerSymbolsOnly();
|
SCH_SHEET_LIST sheets;
|
||||||
|
sheets.AnnotatePowerSymbols();
|
||||||
|
|
||||||
// Performs some controls:
|
// Performs some controls:
|
||||||
if( CheckAnnotate( NULL, 0 ) )
|
if( CheckAnnotate( NULL, 0 ) )
|
||||||
|
@ -534,19 +535,8 @@ bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cleanup the entire hierarchy */
|
/* Cleanup the entire hierarchy */
|
||||||
SCH_SCREENS ScreenList;
|
SCH_SCREENS screens;
|
||||||
for( SCH_SCREEN* screen = ScreenList.GetFirst();
|
screens.SchematicCleanUp();
|
||||||
screen != NULL;
|
|
||||||
screen = ScreenList.GetNext() )
|
|
||||||
{
|
|
||||||
bool ModifyWires;
|
|
||||||
ModifyWires = screen->SchematicCleanUp( NULL );
|
|
||||||
|
|
||||||
// if wire list has changed, delete the Undo Redo list to avoid
|
|
||||||
// pointer problems with deleted data
|
|
||||||
if( ModifyWires )
|
|
||||||
screen->ClearUndoRedoList();
|
|
||||||
}
|
|
||||||
|
|
||||||
BuildNetListBase();
|
BuildNetListBase();
|
||||||
bool success = WriteNetListFile( aFormat, aFullFileName, g_OptNetListUseNames );
|
bool success = WriteNetListFile( aFormat, aFullFileName, g_OptNetListUseNames );
|
||||||
|
@ -555,23 +545,18 @@ bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************/
|
|
||||||
void WinEDA_NetlistFrame::OnCancelClick( wxCommandEvent& event )
|
void WinEDA_NetlistFrame::OnCancelClick( wxCommandEvent& event )
|
||||||
/***********************************************************/
|
|
||||||
{
|
{
|
||||||
EndModal( NET_ABORT );
|
EndModal( NET_ABORT );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************/
|
|
||||||
void WinEDA_NetlistFrame::RunSimulator( wxCommandEvent& event )
|
void WinEDA_NetlistFrame::RunSimulator( wxCommandEvent& event )
|
||||||
/***********************************************************/
|
|
||||||
{
|
{
|
||||||
wxFileName fn;
|
wxFileName fn;
|
||||||
wxString ExecFile, CommandLine;
|
wxString ExecFile, CommandLine;
|
||||||
|
|
||||||
g_SimulatorCommandLine =
|
g_SimulatorCommandLine = m_PanelNetType[PANELSPICE]->m_CommandStringCtrl->GetValue();
|
||||||
m_PanelNetType[PANELSPICE]->m_CommandStringCtrl->GetValue();
|
|
||||||
g_SimulatorCommandLine.Trim( FALSE );
|
g_SimulatorCommandLine.Trim( FALSE );
|
||||||
g_SimulatorCommandLine.Trim( TRUE );
|
g_SimulatorCommandLine.Trim( TRUE );
|
||||||
ExecFile = g_SimulatorCommandLine.BeforeFirst( ' ' );
|
ExecFile = g_SimulatorCommandLine.BeforeFirst( ' ' );
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
#ifndef _NETLIST_CONTROL_H_
|
#ifndef _NETLIST_CONTROL_H_
|
||||||
#define _NETLIST_CONTROL_H_
|
#define _NETLIST_CONTROL_H_
|
||||||
|
|
||||||
|
class WinEDA_EnterText;
|
||||||
|
|
||||||
|
|
||||||
/* Event id for notebook page buttons: */
|
/* Event id for notebook page buttons: */
|
||||||
enum id_netlist {
|
enum id_netlist {
|
||||||
ID_CREATE_NETLIST = 1550,
|
ID_CREATE_NETLIST = 1550,
|
||||||
|
@ -67,6 +70,24 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define CUSTOMPANEL_COUNTMAX 8 // Max number of netlist plugins
|
||||||
|
|
||||||
|
/* Id to select netlist type */
|
||||||
|
enum TypeNetForm {
|
||||||
|
NET_TYPE_UNINIT = 0,
|
||||||
|
NET_TYPE_PCBNEW,
|
||||||
|
NET_TYPE_ORCADPCB2,
|
||||||
|
NET_TYPE_CADSTAR,
|
||||||
|
NET_TYPE_SPICE,
|
||||||
|
NET_TYPE_CUSTOM1, /* NET_TYPE_CUSTOM1
|
||||||
|
* is the first id for user netlist format
|
||||||
|
* NET_TYPE_CUSTOM1+CUSTOMPANEL_COUNTMAX-1
|
||||||
|
* is the last id for user netlist format
|
||||||
|
*/
|
||||||
|
NET_TYPE_CUSTOM_MAX = NET_TYPE_CUSTOM1 + CUSTOMPANEL_COUNTMAX - 1
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Dialog frame for creating netlists */
|
/* Dialog frame for creating netlists */
|
||||||
class WinEDA_NetlistFrame : public wxDialog
|
class WinEDA_NetlistFrame : public wxDialog
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,7 +25,7 @@ class PLOTTER;
|
||||||
class SCH_SHEET;
|
class SCH_SHEET;
|
||||||
class LIB_PIN;
|
class LIB_PIN;
|
||||||
class LABEL_OBJECT;
|
class LABEL_OBJECT;
|
||||||
class OBJ_CMP_TO_LIST;
|
class NETLIST_OBJECT;
|
||||||
|
|
||||||
|
|
||||||
wxString ReturnDefaultFieldName( int aFieldNdx );
|
wxString ReturnDefaultFieldName( int aFieldNdx );
|
||||||
|
@ -66,6 +66,7 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, SCH_ITEM* DrawStruct
|
||||||
|
|
||||||
|
|
||||||
// build_BOM.cpp
|
// build_BOM.cpp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class LABEL_OBJECT
|
* Class LABEL_OBJECT
|
||||||
* is used in build BOM to handle the list of labels in schematic
|
* is used in build BOM to handle the list of labels in schematic
|
||||||
|
@ -88,20 +89,21 @@ public: LABEL_OBJECT()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void BuildComponentsListFromSchematic( std::vector <OBJ_CMP_TO_LIST>& aList );
|
|
||||||
void GenListeGLabels( std::vector <LABEL_OBJECT>& aList );
|
void GenListeGLabels( std::vector <LABEL_OBJECT>& aList );
|
||||||
bool SortComponentsByReference( const OBJ_CMP_TO_LIST& obj1, const OBJ_CMP_TO_LIST& obj2 );
|
bool SortComponentsByReference( const SCH_REFERENCE& obj1, const SCH_REFERENCE& obj2 );
|
||||||
bool SortComponentsByValue( const OBJ_CMP_TO_LIST& obj1, const OBJ_CMP_TO_LIST& obj2 );
|
bool SortComponentsByValue( const SCH_REFERENCE& obj1, const SCH_REFERENCE& obj2 );
|
||||||
bool SortLabelsByValue( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 );
|
bool SortLabelsByValue( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 );
|
||||||
bool SortLabelsBySheet( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 );
|
bool SortLabelsBySheet( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 );
|
||||||
void DeleteSubCmp( std::vector <OBJ_CMP_TO_LIST>& aList );
|
void DeleteSubCmp( std::vector< SCH_REFERENCE >& aList );
|
||||||
int PrintListeGLabel( FILE* f, std::vector <LABEL_OBJECT>& aList );
|
int PrintListeGLabel( FILE* f, std::vector <LABEL_OBJECT>& aList );
|
||||||
|
|
||||||
|
|
||||||
// operations_on_item_lists.cpp
|
// operations_on_item_lists.cpp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function DuplicateStruct
|
* Function DuplicateStruct
|
||||||
* Routine to create a new copy of given struct.
|
* creates a new copy of given struct.
|
||||||
* @param aDrawStruct = the SCH_ITEM to duplicate
|
* @param aDrawStruct = the SCH_ITEM to duplicate
|
||||||
* @param aClone (defualt = true)
|
* @param aClone (defualt = true)
|
||||||
* if true duplicate also some parameters that must be unique
|
* if true duplicate also some parameters that must be unique
|
||||||
|
@ -194,12 +196,6 @@ EDA_Colors ReturnLayerColor( int Layer );
|
||||||
/**************/
|
/**************/
|
||||||
int IsBusLabel( const wxString& LabelDrawList );
|
int IsBusLabel( const wxString& LabelDrawList );
|
||||||
|
|
||||||
/***************/
|
|
||||||
/* ANNOTATE.CPP */
|
|
||||||
/***************/
|
|
||||||
void ReAnnotatePowerSymbolsOnly();
|
|
||||||
|
|
||||||
|
|
||||||
/************/
|
/************/
|
||||||
/* PLOT.CPP */
|
/* PLOT.CPP */
|
||||||
/************/
|
/************/
|
||||||
|
@ -312,4 +308,19 @@ void DisplayOptionFrame( SCH_EDIT_FRAME* parent, const wxPoint& framepos );
|
||||||
/****************/
|
/****************/
|
||||||
void RemoteCommand( const char* cmdline );
|
void RemoteCommand( const char* cmdline );
|
||||||
|
|
||||||
|
|
||||||
|
/* Prototypes in netlist_control.cpp */
|
||||||
|
void FreeNetObjectsList( std::vector <NETLIST_OBJECT*>& aNetObjectslist );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ReturnUserNetlistTypeName
|
||||||
|
* to retrieve user netlist type names
|
||||||
|
* @param first_item = true: return first name of the list, false = return next
|
||||||
|
* @return a wxString : name of the type netlist or empty string
|
||||||
|
* this function must be called first with "first_item" = true
|
||||||
|
* and after with "first_item" = false to get all the other existing netlist
|
||||||
|
* names
|
||||||
|
*/
|
||||||
|
wxString ReturnUserNetlistTypeName( bool first_item );
|
||||||
|
|
||||||
#endif /* __PROTOS_H__ */
|
#endif /* __PROTOS_H__ */
|
||||||
|
|
|
@ -622,7 +622,7 @@ void SCH_COMPONENT::Place( SCH_EDIT_FRAME* frame, wxDC* DC )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheet )
|
void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
||||||
{
|
{
|
||||||
wxString defRef = m_prefix;
|
wxString defRef = m_prefix;
|
||||||
bool KeepMulti = false;
|
bool KeepMulti = false;
|
||||||
|
@ -648,15 +648,15 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheet )
|
||||||
wxString NewHref;
|
wxString NewHref;
|
||||||
wxString path;
|
wxString path;
|
||||||
|
|
||||||
if( aSheet )
|
if( aSheetPath )
|
||||||
path = GetPath( aSheet );
|
path = GetPath( aSheetPath );
|
||||||
|
|
||||||
for( unsigned int ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ )
|
for( unsigned int ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ )
|
||||||
{
|
{
|
||||||
// Break hierarchical reference in path, ref and multi selection:
|
// Break hierarchical reference in path, ref and multi selection:
|
||||||
reference_fields = wxStringTokenize( m_PathsAndReferences[ii], separators );
|
reference_fields = wxStringTokenize( m_PathsAndReferences[ii], separators );
|
||||||
|
|
||||||
if( aSheet == NULL || reference_fields[0].Cmp( path ) == 0 )
|
if( aSheetPath == NULL || reference_fields[0].Cmp( path ) == 0 )
|
||||||
{
|
{
|
||||||
if( KeepMulti ) // Get and keep part selection
|
if( KeepMulti ) // Get and keep part selection
|
||||||
multi = reference_fields[2];
|
multi = reference_fields[2];
|
||||||
|
@ -680,6 +680,8 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheet )
|
||||||
// UpdateAllScreenReferences for the active sheet.
|
// UpdateAllScreenReferences for the active sheet.
|
||||||
// But this call cannot made here.
|
// But this call cannot made here.
|
||||||
m_Fields[REFERENCE].m_Text = defRef; //for drawing.
|
m_Fields[REFERENCE].m_Text = defRef; //for drawing.
|
||||||
|
|
||||||
|
SetModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,8 @@ class SCH_COMPONENT : public SCH_ITEM
|
||||||
/**
|
/**
|
||||||
* Defines the hierarchical path and reference of the component. This allowa support
|
* Defines the hierarchical path and reference of the component. This allowa support
|
||||||
* for hierarchical sheets that reference the same schematic. The foramt for the path
|
* for hierarchical sheets that reference the same schematic. The foramt for the path
|
||||||
* is /<sheet time stamp>/<sheet time stamp>/... A single / denotes the root
|
* is /<sheet time stamp>/<sheet time stamp>/.../&lscomponent time stamp>.
|
||||||
* sheet.
|
* A single / denotes the root sheet.
|
||||||
*/
|
*/
|
||||||
wxArrayString m_PathsAndReferences;
|
wxArrayString m_PathsAndReferences;
|
||||||
|
|
||||||
|
@ -168,10 +168,10 @@ public:
|
||||||
/**
|
/**
|
||||||
* Function ClearAnnotation
|
* Function ClearAnnotation
|
||||||
* clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1)
|
* clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1)
|
||||||
* @param aSheet: SCH_SHEET_PATH value: if NULL remove all annotations,
|
* @param aSheetPath: SCH_SHEET_PATH value: if NULL remove all annotations,
|
||||||
* else remove annotation relative to this sheetpath
|
* else remove annotation relative to this sheetpath
|
||||||
*/
|
*/
|
||||||
void ClearAnnotation( SCH_SHEET_PATH* aSheet );
|
void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SetTimeStamp
|
* Function SetTimeStamp
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
|
#include "netlist.h"
|
||||||
#include "class_library.h"
|
#include "class_library.h"
|
||||||
#include "sch_items.h"
|
#include "sch_items.h"
|
||||||
#include "sch_line.h"
|
#include "sch_line.h"
|
||||||
|
@ -418,10 +419,57 @@ int SCH_SCREEN::CountConnectedItems( const wxPoint& aPos, bool aTestJunctions )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
||||||
|
{
|
||||||
|
for( SCH_ITEM* item = GetDrawItems(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->Type() == SCH_COMPONENT_T )
|
||||||
|
{
|
||||||
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
|
component->ClearAnnotation( aSheetPath );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREEN::GetHierarchicalItems( std::vector <SCH_ITEM*> aItems )
|
||||||
|
{
|
||||||
|
SCH_ITEM* item = GetDrawItems();
|
||||||
|
|
||||||
|
while( item )
|
||||||
|
{
|
||||||
|
if( ( item->Type() == SCH_SHEET_T ) || ( item->Type() == SCH_COMPONENT_T ) )
|
||||||
|
aItems.push_back( item );
|
||||||
|
|
||||||
|
item = item->Next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */
|
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SortByTimeStamp
|
||||||
|
* sorts a list of schematic items by time stamp and type.
|
||||||
|
*/
|
||||||
|
static bool SortByTimeStamp( const SCH_ITEM* item1, const SCH_ITEM* item2 )
|
||||||
|
{
|
||||||
|
int ii = item1->m_TimeStamp - item2->m_TimeStamp;
|
||||||
|
|
||||||
|
/* If the time stamps are the same, compare type in order to have component objects
|
||||||
|
* before sheet object. This is done because the changing the sheet time stamp
|
||||||
|
* before the component time stamp could cause the current annotation to be lost.
|
||||||
|
*/
|
||||||
|
if( ( ii == 0 && ( item1->Type() != item2->Type() ) ) && ( item1->Type() == SCH_SHEET_T ) )
|
||||||
|
ii = -1;
|
||||||
|
|
||||||
|
return ii < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_SCREENS::SCH_SCREENS()
|
SCH_SCREENS::SCH_SCREENS()
|
||||||
{
|
{
|
||||||
m_index = 0;
|
m_index = 0;
|
||||||
|
@ -503,3 +551,72 @@ void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREENS::ClearAnnotation()
|
||||||
|
{
|
||||||
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
m_screens[i]->ClearAnnotation( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREENS::SchematicCleanUp()
|
||||||
|
{
|
||||||
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
{
|
||||||
|
// if wire list has changed, delete the undo/redo list to avoid
|
||||||
|
// pointer problems with deleted data.
|
||||||
|
if( m_screens[i]->SchematicCleanUp( NULL ) )
|
||||||
|
m_screens[i]->ClearUndoRedoList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SCH_SCREENS::ReplaceDuplicateTimeStamps()
|
||||||
|
{
|
||||||
|
std::vector <SCH_ITEM*> items;
|
||||||
|
SCH_ITEM* item;
|
||||||
|
|
||||||
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
m_screens[i]->GetHierarchicalItems( items );
|
||||||
|
|
||||||
|
if( items.size() < 2 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
sort( items.begin(), items.end(), SortByTimeStamp );
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for( size_t ii = 0; ii < items.size() - 1; ii++ )
|
||||||
|
{
|
||||||
|
item = items[ii];
|
||||||
|
|
||||||
|
SCH_ITEM* nextItem = items[ii + 1];
|
||||||
|
|
||||||
|
if( item->m_TimeStamp == nextItem->m_TimeStamp )
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
|
||||||
|
// for a component, update its Time stamp and its paths
|
||||||
|
// (m_PathsAndReferences field)
|
||||||
|
if( item->Type() == SCH_COMPONENT_T )
|
||||||
|
( (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)
|
||||||
|
else
|
||||||
|
item->m_TimeStamp = GetTimeStamp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREENS::SetDate( const wxString& aDate )
|
||||||
|
{
|
||||||
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
m_screens[i]->m_Date = aDate;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include "class_sch_screen.h"
|
#include "class_sch_screen.h"
|
||||||
#include "sch_item_struct.h"
|
#include "sch_item_struct.h"
|
||||||
|
|
||||||
|
#include "netlist.h"
|
||||||
|
#include "class_library.h"
|
||||||
#include "sch_sheet.h"
|
#include "sch_sheet.h"
|
||||||
#include "sch_sheet_path.h"
|
#include "sch_sheet_path.h"
|
||||||
#include "sch_component.h"
|
#include "sch_component.h"
|
||||||
|
@ -55,16 +57,20 @@ bool SCH_SHEET_PATH::BuildSheetPathInfoFromSheetPathValue( const wxString& aPath
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
SCH_ITEM* schitem = LastDrawList();
|
SCH_ITEM* schitem = LastDrawList();
|
||||||
|
|
||||||
while( schitem && GetSheetsCount() < NB_MAX_SHEET )
|
while( schitem && GetSheetsCount() < NB_MAX_SHEET )
|
||||||
{
|
{
|
||||||
if( schitem->Type() == SCH_SHEET_T )
|
if( schitem->Type() == SCH_SHEET_T )
|
||||||
{
|
{
|
||||||
SCH_SHEET* sheet = (SCH_SHEET*) schitem;
|
SCH_SHEET* sheet = (SCH_SHEET*) schitem;
|
||||||
Push( sheet );
|
Push( sheet );
|
||||||
|
|
||||||
if( aPath == Path() )
|
if( aPath == Path() )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( BuildSheetPathInfoFromSheetPathValue( aPath ) )
|
if( BuildSheetPathInfoFromSheetPathValue( aPath ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Pop();
|
Pop();
|
||||||
}
|
}
|
||||||
schitem = schitem->Next();
|
schitem = schitem->Next();
|
||||||
|
@ -84,17 +90,17 @@ int SCH_SHEET_PATH::Cmp( const SCH_SHEET_PATH& aSheetPathToTest ) const
|
||||||
{
|
{
|
||||||
if( m_numSheets > aSheetPathToTest.m_numSheets )
|
if( m_numSheets > aSheetPathToTest.m_numSheets )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if( m_numSheets < aSheetPathToTest.m_numSheets )
|
if( m_numSheets < aSheetPathToTest.m_numSheets )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
//otherwise, same number of sheets.
|
//otherwise, same number of sheets.
|
||||||
for( unsigned i = 0; i<m_numSheets; i++ )
|
for( unsigned i = 0; i<m_numSheets; i++ )
|
||||||
{
|
{
|
||||||
if( m_sheets[i]->m_TimeStamp >
|
if( m_sheets[i]->m_TimeStamp > aSheetPathToTest.m_sheets[i]->m_TimeStamp )
|
||||||
aSheetPathToTest.m_sheets[i]->m_TimeStamp )
|
|
||||||
return 1;
|
return 1;
|
||||||
if( m_sheets[i]->m_TimeStamp <
|
|
||||||
aSheetPathToTest.m_sheets[i]->m_TimeStamp )
|
if( m_sheets[i]->m_TimeStamp < aSheetPathToTest.m_sheets[i]->m_TimeStamp )
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,6 +117,7 @@ SCH_SHEET* SCH_SHEET_PATH::Last()
|
||||||
{
|
{
|
||||||
if( m_numSheets )
|
if( m_numSheets )
|
||||||
return m_sheets[m_numSheets - 1];
|
return m_sheets[m_numSheets - 1];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,8 +129,10 @@ SCH_SHEET* SCH_SHEET_PATH::Last()
|
||||||
SCH_SCREEN* SCH_SHEET_PATH::LastScreen()
|
SCH_SCREEN* SCH_SHEET_PATH::LastScreen()
|
||||||
{
|
{
|
||||||
SCH_SHEET* lastSheet = Last();
|
SCH_SHEET* lastSheet = Last();
|
||||||
|
|
||||||
if( lastSheet )
|
if( lastSheet )
|
||||||
return lastSheet->m_AssociatedScreen;
|
return lastSheet->m_AssociatedScreen;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +205,7 @@ SCH_SHEET* SCH_SHEET_PATH::Pop()
|
||||||
m_numSheets--;
|
m_numSheets--;
|
||||||
return m_sheets[m_numSheets];
|
return m_sheets[m_numSheets];
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,6 +276,69 @@ void SCH_SHEET_PATH::UpdateAllScreenReferences()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_PATH::AnnotatePowerSymbols( int* aReference )
|
||||||
|
{
|
||||||
|
int ref = 1;
|
||||||
|
|
||||||
|
if( aReference != NULL )
|
||||||
|
ref = *aReference;
|
||||||
|
|
||||||
|
for( EDA_ITEM* item = LastDrawList(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->Type() != SCH_COMPONENT_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||||
|
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( component->GetLibName() );
|
||||||
|
|
||||||
|
if( ( entry == NULL ) || !entry->IsPower() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
wxString refstr = component->GetPrefix();
|
||||||
|
|
||||||
|
//str will be "C?" or so after the ClearAnnotation call.
|
||||||
|
while( refstr.Last() == '?' )
|
||||||
|
refstr.RemoveLast();
|
||||||
|
|
||||||
|
if( !refstr.StartsWith( wxT( "#" ) ) )
|
||||||
|
refstr = wxT( "#" ) + refstr;
|
||||||
|
|
||||||
|
refstr << wxT( "0" ) << ref;
|
||||||
|
component->SetRef( this, refstr );
|
||||||
|
ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aReference != NULL )
|
||||||
|
*aReference = ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_PATH::GetComponents( std::vector< SCH_REFERENCE >& aReferences,
|
||||||
|
bool aIncludePowerSymbols )
|
||||||
|
{
|
||||||
|
for( SCH_ITEM* item = LastDrawList(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->Type() == SCH_COMPONENT_T )
|
||||||
|
{
|
||||||
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
|
// Skip pseudo components, which have a reference starting with #. This mainly
|
||||||
|
// effects power symbols.
|
||||||
|
if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( component->GetLibName() );
|
||||||
|
|
||||||
|
if( entry == NULL )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_REFERENCE reference = SCH_REFERENCE( component, entry, *this );
|
||||||
|
aReferences.push_back( reference );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM* SCH_SHEET_PATH::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap )
|
SCH_ITEM* SCH_SHEET_PATH::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap )
|
||||||
{
|
{
|
||||||
bool hasWrapped = false;
|
bool hasWrapped = false;
|
||||||
|
@ -371,6 +444,7 @@ bool SCH_SHEET_PATH::operator=( const SCH_SHEET_PATH& d1 )
|
||||||
m_numSheets = d1.m_numSheets;
|
m_numSheets = d1.m_numSheets;
|
||||||
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for( i = 0; i < m_numSheets; i++ )
|
for( i = 0; i < m_numSheets; i++ )
|
||||||
{
|
{
|
||||||
m_sheets[i] = d1.m_sheets[i];
|
m_sheets[i] = d1.m_sheets[i];
|
||||||
|
@ -437,8 +511,10 @@ SCH_SHEET_LIST::SCH_SHEET_LIST( SCH_SHEET* aSheet )
|
||||||
m_index = 0;
|
m_index = 0;
|
||||||
m_count = 0;
|
m_count = 0;
|
||||||
m_List = NULL;
|
m_List = NULL;
|
||||||
|
|
||||||
if( aSheet == NULL )
|
if( aSheet == NULL )
|
||||||
aSheet = g_RootSheet;
|
aSheet = g_RootSheet;
|
||||||
|
|
||||||
BuildSheetList( aSheet );
|
BuildSheetList( aSheet );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,8 +526,10 @@ SCH_SHEET_LIST::SCH_SHEET_LIST( SCH_SHEET* aSheet )
|
||||||
SCH_SHEET_PATH* SCH_SHEET_LIST::GetFirst()
|
SCH_SHEET_PATH* SCH_SHEET_LIST::GetFirst()
|
||||||
{
|
{
|
||||||
m_index = 0;
|
m_index = 0;
|
||||||
|
|
||||||
if( GetCount() > 0 )
|
if( GetCount() > 0 )
|
||||||
return &( m_List[0] );
|
return &( m_List[0] );
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,6 +543,7 @@ SCH_SHEET_PATH* SCH_SHEET_LIST::GetNext()
|
||||||
{
|
{
|
||||||
if( m_index < GetCount() )
|
if( m_index < GetCount() )
|
||||||
m_index++;
|
m_index++;
|
||||||
|
|
||||||
return GetSheet( m_index );
|
return GetSheet( m_index );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,6 +580,7 @@ SCH_SHEET_PATH* SCH_SHEET_LIST::GetSheet( int aIndex )
|
||||||
{
|
{
|
||||||
if( aIndex < GetCount() )
|
if( aIndex < GetCount() )
|
||||||
return &( m_List[aIndex] );
|
return &( m_List[aIndex] );
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,6 +626,23 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_LIST::AnnotatePowerSymbols()
|
||||||
|
{
|
||||||
|
int ref = 1;
|
||||||
|
|
||||||
|
for( SCH_SHEET_PATH* path = GetFirst(); path != NULL; path = GetNext() )
|
||||||
|
path->AnnotatePowerSymbols( &ref );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_LIST::GetComponents( std::vector< SCH_REFERENCE >& aReferences,
|
||||||
|
bool aIncludePowerSymbols )
|
||||||
|
{
|
||||||
|
for( SCH_SHEET_PATH* path = GetFirst(); path != NULL; path = GetNext() )
|
||||||
|
path->GetComponents( aReferences, aIncludePowerSymbols );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn,
|
SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn,
|
||||||
SCH_ITEM* aLastItem, bool aWrap )
|
SCH_ITEM* aLastItem, bool aWrap )
|
||||||
{
|
{
|
||||||
|
@ -566,6 +663,7 @@ SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFo
|
||||||
{
|
{
|
||||||
if( aSheetFoundIn )
|
if( aSheetFoundIn )
|
||||||
*aSheetFoundIn = sheet;
|
*aSheetFoundIn = sheet;
|
||||||
|
|
||||||
return drawItem;
|
return drawItem;
|
||||||
}
|
}
|
||||||
else if( !firstItemFound && drawItem == aLastItem )
|
else if( !firstItemFound && drawItem == aLastItem )
|
||||||
|
@ -610,6 +708,7 @@ SCH_ITEM* SCH_SHEET_LIST::FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aShe
|
||||||
{
|
{
|
||||||
if( aSheetFoundIn )
|
if( aSheetFoundIn )
|
||||||
*aSheetFoundIn = sheet;
|
*aSheetFoundIn = sheet;
|
||||||
|
|
||||||
return drawItem;
|
return drawItem;
|
||||||
}
|
}
|
||||||
else if( !firstItemFound && drawItem == aLastItem )
|
else if( !firstItemFound && drawItem == aLastItem )
|
||||||
|
@ -661,6 +760,7 @@ SCH_ITEM* SCH_SHEET_LIST::MatchNextItem( wxFindReplaceData& aSearchData,
|
||||||
{
|
{
|
||||||
if( aSheetFoundIn )
|
if( aSheetFoundIn )
|
||||||
*aSheetFoundIn = sheet;
|
*aSheetFoundIn = sheet;
|
||||||
|
|
||||||
return drawItem;
|
return drawItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ class SCH_SCREEN;
|
||||||
class SCH_MARKER;
|
class SCH_MARKER;
|
||||||
class SCH_SHEET;
|
class SCH_SHEET;
|
||||||
class SCH_ITEM;
|
class SCH_ITEM;
|
||||||
|
class SCH_REFERENCE;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -185,6 +186,25 @@ public:
|
||||||
*/
|
*/
|
||||||
void UpdateAllScreenReferences();
|
void UpdateAllScreenReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AnnotatePowerSymbols
|
||||||
|
* annotates the power symbols only starting at \a aReference in the sheet path.
|
||||||
|
* @param aReference A pointer to the number for the reference designator of the
|
||||||
|
* first power symbol to be annotated. If the pointer is NULL
|
||||||
|
* the annotation starts at 1. The number is incremented for
|
||||||
|
* each power symbol annotated.
|
||||||
|
*/
|
||||||
|
void AnnotatePowerSymbols( int* aReference );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetComponents
|
||||||
|
* adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet.
|
||||||
|
* @param aReferences List of references to populate.
|
||||||
|
* @param aIncludePowerSymbols Set to false to only get normal components.
|
||||||
|
*/
|
||||||
|
void GetComponents( std::vector< SCH_REFERENCE >& aReferences,
|
||||||
|
bool aIncludePowerSymbols = true );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the next schematic item in this sheet ojbect.
|
* Find the next schematic item in this sheet ojbect.
|
||||||
*
|
*
|
||||||
|
@ -230,7 +250,7 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class SCH_SHEET_LIST
|
* Class SCH_SHEET_LIST
|
||||||
* handles the list of Sheets in a hiearchy.
|
* handles the list of Sheets in a hierarchy.
|
||||||
* Sheets are not unique, there can be many sheets with the same
|
* Sheets are not unique, there can be many sheets with the same
|
||||||
* filename and the same SCH_SCREEN reference.
|
* filename and the same SCH_SCREEN reference.
|
||||||
* The schematic (SCH_SCREEN) is shared between these sheets,
|
* The schematic (SCH_SCREEN) is shared between these sheets,
|
||||||
|
@ -316,6 +336,22 @@ public:
|
||||||
*/
|
*/
|
||||||
SCH_SHEET_PATH* GetSheet( int aIndex );
|
SCH_SHEET_PATH* GetSheet( int aIndex );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AnnotatePowerSymbols
|
||||||
|
* clear and annotates the entire hierarchy of the sheet path list.
|
||||||
|
*/
|
||||||
|
void AnnotatePowerSymbols();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetComponents
|
||||||
|
* adds a SCH_REFERENCE() object to \a aReferences for each component in the list
|
||||||
|
* of sheets.
|
||||||
|
* @param aReferences List of references to populate.
|
||||||
|
* @param aIncludePowerSymbols Set to false to only get normal components.
|
||||||
|
*/
|
||||||
|
void GetComponents( std::vector< SCH_REFERENCE >& aReferences,
|
||||||
|
bool aIncludePowerSymbols = true );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function FindNextItem
|
* Function FindNextItem
|
||||||
* searches the entire schematic for the next schematic object.
|
* searches the entire schematic for the next schematic object.
|
||||||
|
@ -370,7 +406,7 @@ private:
|
||||||
* @param aSheet is the starting sheet from which the list is built,
|
* @param aSheet is the starting sheet from which the list is built,
|
||||||
* or NULL indicating that g_RootSheet should be used.
|
* or NULL indicating that g_RootSheet should be used.
|
||||||
*/
|
*/
|
||||||
void BuildSheetList( SCH_SHEET* sheet );
|
void BuildSheetList( SCH_SHEET* aSheet );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CLASS_DRAWSHEET_PATH_H
|
#endif // CLASS_DRAWSHEET_PATH_H
|
||||||
|
|
|
@ -287,8 +287,10 @@ void SCH_EDIT_FRAME::SetSheetNumberAndCount()
|
||||||
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() )
|
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() )
|
||||||
{
|
{
|
||||||
wxString sheetpath = sheet->Path();
|
wxString sheetpath = sheet->Path();
|
||||||
|
|
||||||
if( sheetpath == current_sheetpath ) // Current sheet path found
|
if( sheetpath == current_sheetpath ) // Current sheet path found
|
||||||
break;
|
break;
|
||||||
|
|
||||||
SheetNumber++; /* Not found, increment sheet
|
SheetNumber++; /* Not found, increment sheet
|
||||||
* number before this current
|
* number before this current
|
||||||
* path */
|
* path */
|
||||||
|
@ -323,11 +325,13 @@ void SCH_EDIT_FRAME::CreateScreens()
|
||||||
{
|
{
|
||||||
g_RootSheet = new SCH_SHEET();
|
g_RootSheet = new SCH_SHEET();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( g_RootSheet->m_AssociatedScreen == NULL )
|
if( g_RootSheet->m_AssociatedScreen == NULL )
|
||||||
{
|
{
|
||||||
g_RootSheet->m_AssociatedScreen = new SCH_SCREEN();
|
g_RootSheet->m_AssociatedScreen = new SCH_SCREEN();
|
||||||
g_RootSheet->m_AssociatedScreen->m_RefCount++;
|
g_RootSheet->m_AssociatedScreen->m_RefCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_RootSheet->m_AssociatedScreen->m_FileName = m_DefaultSchematicFileName;
|
g_RootSheet->m_AssociatedScreen->m_FileName = m_DefaultSchematicFileName;
|
||||||
g_RootSheet->m_AssociatedScreen->m_Date = GenDate();
|
g_RootSheet->m_AssociatedScreen->m_Date = GenDate();
|
||||||
m_CurrentSheet->Clear();
|
m_CurrentSheet->Clear();
|
||||||
|
@ -335,6 +339,7 @@ void SCH_EDIT_FRAME::CreateScreens()
|
||||||
|
|
||||||
if( GetBaseScreen() == NULL )
|
if( GetBaseScreen() == NULL )
|
||||||
SetBaseScreen( new SCH_SCREEN() );
|
SetBaseScreen( new SCH_SCREEN() );
|
||||||
|
|
||||||
GetBaseScreen()->SetZoom( 4 * GetBaseScreen()->m_ZoomScalar );
|
GetBaseScreen()->SetZoom( 4 * GetBaseScreen()->m_ZoomScalar );
|
||||||
GetBaseScreen()->m_UndoRedoCountMax = 10;
|
GetBaseScreen()->m_UndoRedoCountMax = 10;
|
||||||
}
|
}
|
||||||
|
|
|
@ -757,6 +757,10 @@ public:
|
||||||
* @return a wwString withe the style name( Normal, Italic, Bold, Bold+Italic)
|
* @return a wwString withe the style name( Normal, Italic, Bold, Bold+Italic)
|
||||||
*/
|
*/
|
||||||
wxString GetTextStyleName();
|
wxString GetTextStyleName();
|
||||||
|
|
||||||
|
void SetText( const wxString& aText ) { m_Text = aText; }
|
||||||
|
|
||||||
|
wxString GetText() const { return m_Text; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* BASE_STRUCT_H */
|
#endif /* BASE_STRUCT_H */
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
class LIB_PIN;
|
class LIB_PIN;
|
||||||
class SCH_COMPONENT;
|
class SCH_COMPONENT;
|
||||||
|
class SCH_SHEET_PATH;
|
||||||
|
|
||||||
/* Max number of sheets in a hierarchy project: */
|
/* Max number of sheets in a hierarchy project: */
|
||||||
#define NB_MAX_SHEET 500
|
#define NB_MAX_SHEET 500
|
||||||
|
@ -118,6 +118,21 @@ public:
|
||||||
|
|
||||||
LIB_PIN* GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent = NULL );
|
LIB_PIN* GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ClearAnnotation
|
||||||
|
* clears the annotation for the components in \a aSheetPath on the screen.
|
||||||
|
* @param aSheetPath The sheet path of the component annotation to clear. If NULL then
|
||||||
|
* the entire heirarchy is cleared.
|
||||||
|
*/
|
||||||
|
void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetHierarchicalItems
|
||||||
|
* adds all schematica sheet and component object in the screen to \a aItems.
|
||||||
|
* @param aItems Hierarchical item list.
|
||||||
|
*/
|
||||||
|
void GetHierarchicalItems( std::vector <SCH_ITEM*> aItems );
|
||||||
|
|
||||||
virtual void AddItem( SCH_ITEM* aItem ) { BASE_SCREEN::AddItem( (EDA_ITEM*) aItem ); }
|
virtual void AddItem( SCH_ITEM* aItem ) { BASE_SCREEN::AddItem( (EDA_ITEM*) aItem ); }
|
||||||
virtual void InsertItem( EDA_ITEMS::iterator aIter, SCH_ITEM* aItem )
|
virtual void InsertItem( EDA_ITEMS::iterator aIter, SCH_ITEM* aItem )
|
||||||
{
|
{
|
||||||
|
@ -145,6 +160,35 @@ public:
|
||||||
SCH_SCREEN* GetNext();
|
SCH_SCREEN* GetNext();
|
||||||
SCH_SCREEN* GetScreen( unsigned int aIndex );
|
SCH_SCREEN* GetScreen( unsigned int aIndex );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ClearAnnotation
|
||||||
|
* clears the annotation for all components in the hierarchy.
|
||||||
|
*/
|
||||||
|
void ClearAnnotation();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SchematicCleanUp
|
||||||
|
* merges and breaks wire segments in the entire schematic hierarchy.
|
||||||
|
*/
|
||||||
|
void SchematicCleanUp();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ReplaceDuplicateTimeStamps
|
||||||
|
* test all sheet and component objects in the schematic for duplicate time stamps
|
||||||
|
* an replaces them as neccessary. Time stamps must be unique in order for complex
|
||||||
|
* hierarcies know which components go to which sheets.
|
||||||
|
* @return The number of duplicate time stamps replaced.
|
||||||
|
*/
|
||||||
|
int ReplaceDuplicateTimeStamps();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetDate
|
||||||
|
* sets the date string for every screen to \a aDate.
|
||||||
|
* @see GetDate()
|
||||||
|
* @param aDate The date string to set for each screen.
|
||||||
|
*/
|
||||||
|
void SetDate( const wxString& aDate );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void AddScreenToList( SCH_SCREEN* aScreen );
|
void AddScreenToList( SCH_SCREEN* aScreen );
|
||||||
void BuildScreenList( EDA_ITEM* aItem );
|
void BuildScreenList( EDA_ITEM* aItem );
|
||||||
|
|
|
@ -471,13 +471,6 @@ private:
|
||||||
public:
|
public:
|
||||||
bool EditSheet( SCH_SHEET* Sheet, wxDC* DC );
|
bool EditSheet( SCH_SHEET* Sheet, wxDC* DC );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function UpdateSheetNumberAndDate
|
|
||||||
* Set a sheet number, the sheet count for sheets in the whole schematic
|
|
||||||
* and update the date in all screens
|
|
||||||
*/
|
|
||||||
void UpdateSheetNumberAndDate();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void StartMoveSheet( SCH_SHEET* sheet, wxDC* DC );
|
void StartMoveSheet( SCH_SHEET* sheet, wxDC* DC );
|
||||||
SCH_SHEET_PIN* Create_PinSheet( SCH_SHEET* Sheet, wxDC* DC );
|
SCH_SHEET_PIN* Create_PinSheet( SCH_SHEET* Sheet, wxDC* DC );
|
||||||
|
|
Loading…
Reference in New Issue