Commit 24885c98 authored by charras's avatar charras

fixing serious bugs from last commit in build_BOM.cpp

parent 74f3a9b7
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: build_BOM.cpp // Name: build_BOM.cpp
// Purpose: // Purpose:
// Author: jean-pierre Charras // Author: jean-pierre Charras
...@@ -95,10 +96,10 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, ...@@ -95,10 +96,10 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
m_ListFileName = g_RootSheet->m_AssociatedScreen->m_FileName; m_ListFileName = g_RootSheet->m_AssociatedScreen->m_FileName;
fn = m_ListFileName; fn = m_ListFileName;
if( aTypeFile == 2 ) if( aTypeFile == 2 )
fn.SetExt( CsvFileExtension ); fn.SetExt( CsvFileExtension );
else else
fn.SetExt( BomFileExtension ); fn.SetExt( BomFileExtension );
wxFileDialog dlg( this, _( "Bill of Materials" ), fn.GetPath(), wxFileDialog dlg( this, _( "Bill of Materials" ), fn.GetPath(),
fn.GetFullName(), BomFileWildcard, fn.GetFullName(), BomFileWildcard,
...@@ -111,17 +112,20 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, ...@@ -111,17 +112,20 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
/* Close dialog, then show the list (if so requested) */ /* Close dialog, then show the list (if so requested) */
switch( aTypeFile ) { switch( aTypeFile )
case 0: // list {
case 0: // list
GenereListeOfItems( m_ListFileName, aIncludeSubComponents ); GenereListeOfItems( m_ListFileName, aIncludeSubComponents );
break; break;
case 1: // speadsheet
case 1: // speadsheet
CreateExportList( m_ListFileName, aIncludeSubComponents ); CreateExportList( m_ListFileName, aIncludeSubComponents );
break; break;
case 2: // Single Part per line
case 2: // Single Part per line
CreatePartsList( m_ListFileName ); CreatePartsList( m_ListFileName );
break; break;
} }
EndModal( 1 ); EndModal( 1 );
...@@ -134,6 +138,12 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, ...@@ -134,6 +138,12 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
} }
} }
/*
* Print a list of components, in a form which can be imported by a spreadsheet
* form is:
* cmp value; number of components; <footprint>; field1; field2; field3; list of references having the same value
*/
void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName ) void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName )
{ {
FILE* f; FILE* f;
...@@ -152,11 +162,12 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName ) ...@@ -152,11 +162,12 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName )
/* sort component list */ /* sort component list */
sort( cmplist.begin(), cmplist.end(), SortComponentsByValue ); sort( cmplist.begin(), cmplist.end(), SortComponentsByValue );
PrintComponentsListByPart( f, cmplist); PrintComponentsListByPart( f, cmplist );
fclose( f ); fclose( f );
} }
/* /*
* Print a list of components, in a form which can be imported by a spreadsheet * Print a list of components, in a form which can be imported by a spreadsheet
* form is: * form is:
...@@ -250,8 +261,9 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName, ...@@ -250,8 +261,9 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName,
if( m_GenListLabelsbySheet->GetValue() ) if( m_GenListLabelsbySheet->GetValue() )
{ {
sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsBySheet ); sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsBySheet );
msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets \ msg.Printf( _(
( order = Sheet Number ) count = %d\n" ), "\n#Global, Hierarchical Labels and PinSheets \
( order = Sheet Number ) count = %d\n" ),
itemCount ); itemCount );
fprintf( f, "%s", CONV_TO_UTF8( msg ) ); fprintf( f, "%s", CONV_TO_UTF8( msg ) );
PrintListeGLabel( f, listOfLabels ); PrintListeGLabel( f, listOfLabels );
...@@ -261,8 +273,9 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName, ...@@ -261,8 +273,9 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName,
{ {
sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsByValue ); sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsByValue );
msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets ( \ msg.Printf( _(
order = Alphab. ) count = %d\n\n" ), "\n#Global, Hierarchical Labels and PinSheets ( \
order = Alphab. ) count = %d\n\n" ),
itemCount ); itemCount );
fprintf( f, "%s", CONV_TO_UTF8( msg ) ); fprintf( f, "%s", CONV_TO_UTF8( msg ) );
PrintListeGLabel( f, listOfLabels ); PrintListeGLabel( f, listOfLabels );
...@@ -292,11 +305,11 @@ void BuildComponentsListFromSchematic( std::vector <OBJ_CMP_TO_LIST>& aList ) ...@@ -292,11 +305,11 @@ void BuildComponentsListFromSchematic( std::vector <OBJ_CMP_TO_LIST>& aList )
SCH_SHEET_LIST SheetList; SCH_SHEET_LIST SheetList;
for( sheet = SheetList.GetFirst(); for( sheet = SheetList.GetFirst();
sheet != NULL; sheet != NULL;
sheet = SheetList.GetNext() ) sheet = SheetList.GetNext() )
{ {
for( SchItem = sheet->LastDrawList(); SchItem; for( SchItem = sheet->LastDrawList(); SchItem;
SchItem = SchItem->Next() ) SchItem = SchItem->Next() )
{ {
if( SchItem->Type() != TYPE_SCH_COMPONENT ) if( SchItem->Type() != TYPE_SCH_COMPONENT )
continue; continue;
...@@ -446,14 +459,14 @@ bool SortLabelsByValue( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 ) ...@@ -446,14 +459,14 @@ bool SortLabelsByValue( const LABEL_OBJECT& obj1, const LABEL_OBJECT& obj2 )
wxString* Text1, * Text2; wxString* Text1, * Text2;
if( obj1.m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) if( obj1.m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE )
Text1 = &( (SCH_SHEET_PIN*) (obj1.m_Label) )->m_Text; Text1 = &( (SCH_SHEET_PIN*)(obj1.m_Label) )->m_Text;
else else
Text1 = &( (SCH_TEXT*) (obj1.m_Label) )->m_Text; Text1 = &( (SCH_TEXT*)(obj1.m_Label) )->m_Text;
if( obj2.m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) if( obj2.m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE )
Text2 = &( (SCH_SHEET_PIN*) (obj2.m_Label) )->m_Text; Text2 = &( (SCH_SHEET_PIN*)(obj2.m_Label) )->m_Text;
else else
Text2 = &( (SCH_TEXT*) (obj2.m_Label) )->m_Text; Text2 = &( (SCH_TEXT*)(obj2.m_Label) )->m_Text;
ii = Text1->CmpNoCase( *Text2 ); ii = Text1->CmpNoCase( *Text2 );
...@@ -554,12 +567,12 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, ...@@ -554,12 +567,12 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem,
if( CompactForm ) if( CompactForm )
{ {
fprintf( f, "%c%s", s_ExportSeparatorSymbol, fprintf( f, "%c%s", s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
} }
else else
{ {
fprintf( f, "; %-12s", fprintf( f, "; %-12s",
CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
} }
} }
...@@ -581,13 +594,14 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, ...@@ -581,13 +594,14 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem,
if( CompactForm ) if( CompactForm )
fprintf( f, "%c%s", s_ExportSeparatorSymbol, fprintf( f, "%c%s", s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) );
else else
fprintf( f, "; %-12s", fprintf( f, "; %-12s",
CONV_TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) );
} }
} }
/* 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(
...@@ -620,7 +634,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( ...@@ -620,7 +634,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
// Print comment line: // Print comment line:
#if defined(KICAD_GOST) #if defined(KICAD_GOST)
fprintf( f, "ref%cvalue%cdatasheet", s_ExportSeparatorSymbol,s_ExportSeparatorSymbol ); fprintf( f, "ref%cvalue%cdatasheet", s_ExportSeparatorSymbol, s_ExportSeparatorSymbol );
#else #else
fprintf( f, "ref%cvalue", s_ExportSeparatorSymbol ); fprintf( f, "ref%cvalue", s_ExportSeparatorSymbol );
#endif #endif
...@@ -681,8 +695,12 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( ...@@ -681,8 +695,12 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
if( ( Multi > 1 ) && aIncludeSubComponents ) if( ( Multi > 1 ) && aIncludeSubComponents )
#if defined(KICAD_GOST) #if defined(KICAD_GOST)
Unit = aList[ii].m_Unit + '1' - 1; Unit = aList[ii].m_Unit + '1' - 1;
#else #else
Unit = aList[ii].m_Unit + 'A' - 1; Unit = aList[ii].m_Unit + 'A' - 1;
#endif #endif
...@@ -692,21 +710,31 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( ...@@ -692,21 +710,31 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
if( CompactForm ) if( CompactForm )
#if defined(KICAD_GOST) #if defined(KICAD_GOST)
fprintf( f, "%s%c%s%c%s", CmpName, s_ExportSeparatorSymbol, fprintf( f, "%s%c%s%c%s", CmpName, s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ), s_ExportSeparatorSymbol, CONV_TO_UTF8( DrawLibItem->GetField(
CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) ); VALUE )->m_Text ), s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) );
#else #else
fprintf( f, "%s%c%s", CmpName, s_ExportSeparatorSymbol, fprintf( f, "%s%c%s", CmpName, s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) );
#endif #endif
else else
#if defined(KICAD_GOST) #if defined(KICAD_GOST)
fprintf( f, "| %-10s %-12s %-20s", CmpName, fprintf( f, "| %-10s %-12s %-20s", CmpName,
CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ), CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ),
CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) );
#else #else
fprintf( f, "| %-10s %-12s", CmpName, fprintf( f, "| %-10s %-12s", CmpName,
CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) ); CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) );
#endif #endif
...@@ -716,12 +744,12 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( ...@@ -716,12 +744,12 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
if( CompactForm ) if( CompactForm )
{ {
fprintf( f, "%c%s", s_ExportSeparatorSymbol, fprintf( f, "%c%s", s_ExportSeparatorSymbol,
CONV_TO_UTF8( msg ) ); CONV_TO_UTF8( msg ) );
msg = m_Parent->GetXYSheetReferences( msg = m_Parent->GetXYSheetReferences(
(BASE_SCREEN*) DrawLibItem->GetParent(), (BASE_SCREEN*) DrawLibItem->GetParent(),
DrawLibItem->m_Pos ); DrawLibItem->m_Pos );
fprintf( f, "%c%s)", s_ExportSeparatorSymbol, fprintf( f, "%c%s)", s_ExportSeparatorSymbol,
CONV_TO_UTF8( msg ) ); CONV_TO_UTF8( msg ) );
} }
else else
{ {
...@@ -748,26 +776,35 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( ...@@ -748,26 +776,35 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef(
} }
/* Bom Output format option - single part per line
* a common part being defined as have a common value.
* This is true for most designs but will produce an
* incorrect output if two or more parts with the same
* value have different footprints, tolerances, voltage
* rating, etc. Also usefull if the following fields
* are edited:
* FIELD1 - manufacture
* FIELD2 - manufacture part number
* FIELD3 - distributor part number
*/
int DIALOG_BUILD_BOM::PrintComponentsListByPart( int DIALOG_BUILD_BOM::PrintComponentsListByPart(
FILE* f, FILE* f,
std::vector <OBJ_CMP_TO_LIST>& aList ) std::vector <OBJ_CMP_TO_LIST>& aList )
{ {
int qty = 1 ; int qty = 1;
char RefName[80]; char RefName[80];
char ValName[80]; char ValName[80];
char NxtName[80]; char NxtName[80];
char RNames[1000]; char RNames[1000];
const char * Field[15]; wxArrayString cmpFields;
EDA_BaseStruct* DrawList; EDA_BaseStruct* DrawList;
EDA_BaseStruct* NxtList; EDA_BaseStruct* NxtList;
SCH_COMPONENT* DrawLibItem; SCH_COMPONENT* DrawLibItem;
SCH_COMPONENT* NxtLibItem; SCH_COMPONENT* NxtLibItem;
int jj; int jj;
strcpy(NxtName, ""); strcpy( NxtName, "" );
strcpy(RNames, ""); strcpy( RNames, "" );
for( jj=0; jj<15; jj++ )
Field[jj] = NULL;
for( unsigned ii = 0; ii < aList.size(); ii++ ) for( unsigned ii = 0; ii < aList.size(); ii++ )
{ {
...@@ -780,54 +817,65 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart( ...@@ -780,54 +817,65 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart(
continue; continue;
DrawLibItem = (SCH_COMPONENT*) DrawList; DrawLibItem = (SCH_COMPONENT*) DrawList;
for( unsigned ij = ii+1 ; ij < aList.size(); ij++ ){ NxtLibItem = NULL;
NxtList = aList[ij].m_RootCmp; for( unsigned ij = ii + 1; ij < aList.size(); ij++ )
if( NxtList == NULL ) {
continue; NxtList = aList[ij].m_RootCmp;
if( NxtList->Type() != TYPE_SCH_COMPONENT ) if( NxtList == NULL )
continue; continue;
if( aList[ij].m_Reference[0] == '#' ) if( NxtList->Type() != TYPE_SCH_COMPONENT )
continue; continue;
NxtLibItem = (SCH_COMPONENT*) NxtList; if( aList[ij].m_Reference[0] == '#' )
break; continue;
} NxtLibItem = (SCH_COMPONENT*) NxtList;
break;
}
sprintf( RefName, "%s", aList[ii].m_Reference ); sprintf( RefName, "%s", aList[ii].m_Reference );
sprintf( ValName, "%s", CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) ); sprintf( ValName, "%s", CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) );
sprintf( NxtName, "%s", CONV_TO_UTF8( NxtLibItem->GetField( VALUE )->m_Text ) ); if( NxtLibItem )
for( jj = FIELD1; jj < DrawLibItem->GetFieldCount(); jj++ ) { sprintf( NxtName, "%s", CONV_TO_UTF8( NxtLibItem->GetField( VALUE )->m_Text ) );
if( Field[jj] == NULL || *Field[jj] == 0 )
Field[jj] = CONV_TO_UTF8( DrawLibItem->GetField( jj )->m_Text ); // Store fields. try to store non empty fields.
} if( cmpFields.GetCount() < DrawLibItem->GetFieldCount() )
cmpFields.Alloc(DrawLibItem->GetFieldCount());
if( !strcmp( NxtName, ValName ) ) { for( jj = FIELD1; jj < DrawLibItem->GetFieldCount(); jj++ )
qty++; {
strcat(RNames, ", "); if( cmpFields[jj].IsEmpty() )
strcat(RNames, RefName); cmpFields[jj] = DrawLibItem->GetField( jj )->m_Text;
continue; }
}
if( !strcmp( NxtName, ValName ) )
{
qty++;
strcat( RNames, ", " );
strcat( RNames, RefName );
continue;
}
fprintf( f, "%-15s%c%-3d", ValName, s_ExportSeparatorSymbol, qty ); fprintf( f, "%-15s%c%-3d", ValName, s_ExportSeparatorSymbol, qty );
qty = 1; qty = 1;
if( m_AddFootprintField->IsChecked() )
fprintf( f, "%c%-16s", s_ExportSeparatorSymbol,
CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
if( m_AddFootprintField->IsChecked() ) fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, CONV_TO_UTF8( cmpFields[FIELD1]) );
fprintf( f, "%c%-16s", s_ExportSeparatorSymbol, fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, CONV_TO_UTF8( cmpFields[FIELD2]) );
CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) ); fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, CONV_TO_UTF8( cmpFields[FIELD3]) );
fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, Field[FIELD1] ); cmpFields.Clear();
fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, Field[FIELD2] );
fprintf( f, "%c%-20s", s_ExportSeparatorSymbol, Field[FIELD3] );
for( jj = FIELD1; jj < DrawLibItem->GetFieldCount(); jj++ )
Field[jj] = NULL;
fprintf( f, "%c%s%s", s_ExportSeparatorSymbol, RefName, RNames ); fprintf( f, "%c%s%s", s_ExportSeparatorSymbol, RefName, RNames );
strcpy(RNames, ""); strcpy( RNames, "" );
fputs( "\n", f ); fputs( "\n", f );
} }
return 0; return 0;
} }
int DIALOG_BUILD_BOM::PrintComponentsListByVal( int DIALOG_BUILD_BOM::PrintComponentsListByVal(
FILE* f, FILE* f,
std::vector <OBJ_CMP_TO_LIST>& aList, std::vector <OBJ_CMP_TO_LIST>& aList,
...@@ -919,7 +967,7 @@ static int PrintListeGLabel( FILE* f, std::vector <LABEL_OBJECT>& aList ) ...@@ -919,7 +967,7 @@ static int PrintListeGLabel( FILE* f, std::vector <LABEL_OBJECT>& aList )
{ {
case TYPE_SCH_HIERLABEL: case TYPE_SCH_HIERLABEL:
case TYPE_SCH_GLOBALLABEL: case TYPE_SCH_GLOBALLABEL:
DrawTextItem = (SCH_LABEL*) (aList[ii].m_Label); DrawTextItem = (SCH_LABEL*)(aList[ii].m_Label);
if( aList[ii].m_LabelType == TYPE_SCH_HIERLABEL ) if( aList[ii].m_LabelType == TYPE_SCH_HIERLABEL )
labeltype = wxT( "Hierarchical" ); labeltype = wxT( "Hierarchical" );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment