Loading eeschema/BOM_lister.h 0 → 100644 +78 −0 Original line number Diff line number Diff line /** * @file BOM_lister.h */ /* This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2012 Jean-Pierre Charras jp.charras at wanadoo.fr * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef _BOM_LISTER_H_ #define _BOM_LISTER_H_ #include <netlist.h> // A helper class to build item lists for BOM, // and write lists on files class BOM_LISTER { BOM_LABEL_LIST m_labelList; // a list of global and hierarchical labels FILE * m_outFile; // the output file for BOM generation char m_separatorSymbol; // the separator used for csv files ( usually \t ; or , ) bool m_outputFmtCsv; // true to create Csv files, false to create text lists bool m_includeSubComponents; // true to list each part // of a multiple part per package component // false to list only once this kind of component std::vector <int> m_fieldIDactive; // list of field IDs to print public: BOM_LISTER() { m_outFile = NULL; m_separatorSymbol = '\t'; m_outputFmtCsv = false; m_includeSubComponents = false; } void SetIncludeSubCmp( bool aIncludeSubCmp ) { m_includeSubComponents = aIncludeSubCmp; } void CreateCsvBOMList( char aSeparator, FILE * aFile ); void PrintComponentsListByPart( SCH_REFERENCE_LIST& aList ); void AddFieldIdToPrintList( int aFieldId ); void ClearFieldIdPrintList() { m_fieldIDactive.clear(); } /** * Function PrintGlobalAndHierarchicalLabelsList * print the list of global and hierarchical labels bu sheet or by name * @param aSortBySheet = true to print by sheet name order * false to print by label name order * @param aFile = the file to write to (will be NOT clesed) */ void PrintGlobalAndHierarchicalLabelsList( FILE * aFile, bool aSortBySheet ); private: bool isFieldPrintable( int aFieldId ); void buildGlobalAndHierarchicalLabelsList(); }; #endif // _BOM_LISTER_H_ eeschema/build_BOM.cpp +145 −52 Original line number Diff line number Diff line /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License Loading Loading @@ -33,63 +33,97 @@ #include <fctsys.h> #include <class_sch_screen.h> #include <kicad_string.h> #include <general.h> #include <sch_sheet.h> #include <sch_component.h> #include <template_fieldnames.h> #include <netlist.h> #include <BOM_lister.h> /* Fill aList with labels */ void GenListeGLabels( BOM_LABEL_LIST& aList ) void BOM_LISTER::CreateCsvBOMList( char aSeparator, FILE * aFile ) { // Build the sheet list m_outFile = aFile; m_separatorSymbol = aSeparator; SCH_REFERENCE_LIST cmplist; SCH_SHEET_LIST sheetList; BOM_LABEL label; for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) { SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList(); sheetList.GetComponents( cmplist, false ); // sort component list by ref and remove sub components cmplist.RemoveSubComponentsFromList(); while( schItem ) // sort component list by value cmplist.SortByValueOnly( ); PrintComponentsListByPart( cmplist ); fclose( m_outFile ); m_outFile = NULL; } void BOM_LISTER::PrintComponentsListByPart( SCH_REFERENCE_LIST& aList ) { switch( schItem->Type() ) unsigned int index = 0; while( index < aList.GetCount() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: aList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) ); break; case SCH_SHEET_T: SCH_COMPONENT *component = aList[index].GetComponent(); wxString referenceListStr; int qty = 1; referenceListStr.append( aList[index].GetRef() ); for( unsigned int i = index+1; i < aList.GetCount(); ) { SCH_SHEET* sheet = (SCH_SHEET*) schItem; BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->GetPins() ) if( *(aList[i].GetComponent()) == *component ) { aList.push_back( BOM_LABEL( SCH_SHEET_PIN_T, &sheetPin, *path ) ); referenceListStr.append( wxT( " " ) + aList[i].GetRef() ); aList.RemoveItem( i ); qty++; } else i++; // Increment index only when current item is not removed from the list } break; default: break; } // Write value, quantity and list of references fprintf( m_outFile, "%s%c%d%c\"%s\"", TO_UTF8( component->GetField( VALUE )->GetText() ), m_separatorSymbol, qty, m_separatorSymbol, TO_UTF8( referenceListStr ) ); schItem = schItem->Next(); for( int i = FOOTPRINT; i < component->GetFieldCount(); i++ ) { if( isFieldPrintable( i ) ) fprintf( m_outFile, "%c%s", m_separatorSymbol, TO_UTF8( component->GetField( i )->GetText() ) ); } fprintf( m_outFile, "\n" ); index++; } } bool BOM_LISTER::isFieldPrintable( int aFieldId ) { for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii ++ ) if( m_fieldIDactive[ii] == aFieldId ) return true; return false; } void BOM_LISTER::AddFieldIdToPrintList( int aFieldId ) { for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii ++ ) if( m_fieldIDactive[ii] == aFieldId ) return; m_fieldIDactive.push_back( aFieldId ); } /* compare function for sorting labels * sort by * value * if same value: by sheet */ bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) static bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) { int ii; Loading @@ -108,7 +142,7 @@ bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) * by sheet * in a sheet, by alphabetic order */ bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) static bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) { int ii; Loading @@ -122,41 +156,101 @@ bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) return ii < 0; } void BOM_LISTER::buildGlobalAndHierarchicalLabelsList() { m_labelList.clear(); // Explore the flat sheet list SCH_SHEET_LIST sheetList; for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) { SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList(); for( ; schItem; schItem = schItem->Next() ) { switch( schItem->Type() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: m_labelList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) ); break; case SCH_SHEET_T: { SCH_SHEET* sheet = (SCH_SHEET*) schItem; BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->GetPins() ) { m_labelList.push_back( BOM_LABEL( SCH_SHEET_PIN_T, &sheetPin, *path ) ); } } break; default: break; } } } } int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) void BOM_LISTER::PrintGlobalAndHierarchicalLabelsList( FILE * aFile, bool aSortBySheet ) { m_outFile = aFile; buildGlobalAndHierarchicalLabelsList(); wxString msg; if( aSortBySheet ) { sort( m_labelList.begin(), m_labelList.end(), SortLabelsBySheet ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets \ ( order = Sheet Number ) count = %d\n" ), m_labelList.size() ); } else { sort( m_labelList.begin(), m_labelList.end(), SortLabelsByValue ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets ( \ order = Alphab. ) count = %d\n\n" ), m_labelList.size() ); } fprintf( m_outFile, "%s", TO_UTF8( msg ) ); SCH_LABEL* label; SCH_SHEET_PIN* pinsheet; wxString msg, sheetpath; wxString sheetpath; wxString labeltype; for( unsigned ii = 0; ii < aList.size(); ii++ ) for( unsigned ii = 0; ii < m_labelList.size(); ii++ ) { switch( aList[ii].GetType() ) switch( m_labelList[ii].GetType() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: label = (SCH_LABEL*)(aList[ii].GetLabel()); label = (SCH_LABEL*)(m_labelList[ii].GetLabel()); if( aList[ii].GetType() == SCH_HIERARCHICAL_LABEL_T ) if( m_labelList[ii].GetType() == SCH_HIERARCHICAL_LABEL_T ) labeltype = wxT( "Hierarchical" ); else labeltype = wxT( "Global " ); sheetpath = aList[ii].GetSheetPath().PathHumanReadable(); sheetpath = m_labelList[ii].GetSheetPath().PathHumanReadable(); msg.Printf( _( "> %-28.28s %s (Sheet %s) pos: %3.3f, %3.3f\n" ), GetChars( label->GetText() ), GetChars( labeltype ), GetChars( sheetpath ), GetChars( labeltype ), GetChars( sheetpath ), (float) label->m_Pos.x / 1000, (float) label->m_Pos.y / 1000 ); fputs( TO_UTF8( msg ), f ); fputs( TO_UTF8( msg ), m_outFile ); break; case SCH_SHEET_PIN_T: { pinsheet = (SCH_SHEET_PIN*) aList[ii].GetLabel(); pinsheet = (SCH_SHEET_PIN*) m_labelList[ii].GetLabel(); int jj = pinsheet->GetShape(); if( jj < 0 ) Loading @@ -170,11 +264,11 @@ int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) msg.Printf( _( "> %-28.28s PinSheet %-7.7s (Sheet %s) pos: %3.3f, %3.3f\n" ), GetChars( pinsheet->GetText() ), GetChars( labtype ), GetChars( aList[ii].GetSheetPath().PathHumanReadable() ), GetChars( m_labelList[ii].GetSheetPath().PathHumanReadable() ), (float) pinsheet->m_Pos.x / 1000, (float) pinsheet->m_Pos.y / 1000 ); fputs( TO_UTF8( msg ), f ); fputs( TO_UTF8( msg ), m_outFile ); } break; Loading @@ -185,6 +279,5 @@ int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) } msg = _( "#End labels\n" ); fputs( TO_UTF8( msg ), f ); return 0; fputs( TO_UTF8( msg ), m_outFile ); } eeschema/dialogs/dialog_build_BOM.cpp +54 −139 Original line number Diff line number Diff line /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2008 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or Loading Loading @@ -35,7 +35,6 @@ #include <wxstruct.h> #include <build_version.h> #include <general.h> #include <netlist.h> #include <template_fieldnames.h> #include <sch_component.h> Loading @@ -45,14 +44,7 @@ #include <wx/valgen.h> #include <dialog_build_BOM.h> #include <protos.h> extern void GenListeGLabels( std::vector <BOM_LABEL>& aList ); extern bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ); extern bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ); extern int PrintListeGLabel( FILE* f, std::vector <BOM_LABEL>& aList ); #include <BOM_lister.h> /* Local variables */ Loading Loading @@ -118,10 +110,10 @@ static char s_ExportSeparator[] = ("\t;,."); DIALOG_BUILD_BOM::DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent ) : DIALOG_BUILD_BOM_BASE( parent ) { m_Config = wxGetApp().GetSettings(); wxASSERT( m_Config != NULL ); m_config = wxGetApp().GetSettings(); wxASSERT( m_config != NULL ); m_Parent = parent; m_parent = parent; Init(); Loading @@ -142,18 +134,18 @@ void DIALOG_BUILD_BOM::Init() SetFocus(); /* Get options */ m_Config->Read( OPTION_BOM_LIST_REF, &s_ListByRef ); m_Config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue ); m_Config->Read( OPTION_BOM_LIST_HPINS, &s_ListHierarchicalPinByName ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_SUB_CMP, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListHierarchicalPinBySheet ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName ); s_OutputFormOpt = m_Config->Read( OPTION_BOM_FORMAT, (long) 0 ); m_Config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList ); s_OutputSeparatorOpt = m_Config->Read( OPTION_BOM_SEPARATOR, (long) 0 ); long addfields = m_Config->Read( OPTION_BOM_ADD_FIELD, (long) 0 ); m_config->Read( OPTION_BOM_LIST_REF, &s_ListByRef ); m_config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue ); m_config->Read( OPTION_BOM_LIST_HPINS, &s_ListHierarchicalPinByName ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_SUB_CMP, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListHierarchicalPinBySheet ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName ); s_OutputFormOpt = m_config->Read( OPTION_BOM_FORMAT, 0l ); m_config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList ); s_OutputSeparatorOpt = m_config->Read( OPTION_BOM_SEPARATOR, 0l ); long addfields = m_config->Read( OPTION_BOM_ADD_FIELD, 0l ); for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ ) { Loading Loading @@ -264,8 +256,6 @@ void DIALOG_BUILD_BOM::OnCancelClick( wxCommandEvent& event ) void DIALOG_BUILD_BOM::SavePreferences() { wxASSERT( m_Config != NULL ); // Determine current settings of "List items" and "Options" checkboxes s_ListByRef = m_ListCmpbyRefItems->GetValue(); s_ListWithSubCmponents = m_ListSubCmpItems->GetValue(); Loading Loading @@ -296,16 +286,16 @@ void DIALOG_BUILD_BOM::SavePreferences() s_Add_Alls_state = m_AddAllFields->GetValue(); // Now save current settings of both radiobutton groups m_Config->Write( OPTION_BOM_LIST_REF, s_ListByRef ); m_Config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue ); m_Config->Write( OPTION_BOM_LIST_HPINS, s_ListHierarchicalPinByName ); m_Config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet ); m_Config->Write( OPTION_BOM_LIST_HPINS_BY_NAME_, s_ListHierarchicalPinByName ); m_Config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents ); m_config->Write( OPTION_BOM_LIST_REF, s_ListByRef ); m_config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue ); m_config->Write( OPTION_BOM_LIST_HPINS, s_ListHierarchicalPinByName ); m_config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet ); m_config->Write( OPTION_BOM_LIST_HPINS_BY_NAME_, s_ListHierarchicalPinByName ); m_config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents ); m_Config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt ); m_Config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt ); m_Config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList ); m_config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt ); m_config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt ); m_config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList ); // Now save current settings of all "Fields to add" checkboxes long addfields = 0; Loading @@ -318,7 +308,7 @@ void DIALOG_BUILD_BOM::SavePreferences() bitmask <<= 1; } m_Config->Write( OPTION_BOM_ADD_FIELD, addfields ); m_config->Write( OPTION_BOM_ADD_FIELD, addfields ); } Loading Loading @@ -371,7 +361,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, fn = dlg.GetPath(); // remember path+filename+ext for subsequent runs. m_ListFileName = dlg.GetPath(); m_listFileName = dlg.GetPath(); // Close dialog, then show the list (if so requested) Loading @@ -395,7 +385,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, if( aRunBrowser ) { wxString editorname = wxGetApp().GetEditorName(); wxString filename = m_ListFileName; wxString filename = m_listFileName; AddDelimiterString( filename ); ExecuteFile( this, editorname, filename ); } Loading Loading @@ -449,29 +439,22 @@ bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId) void DIALOG_BUILD_BOM::CreatePartsList( ) { FILE* f; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { wxString msg; msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } SCH_REFERENCE_LIST cmplist; SCH_SHEET_LIST sheetList; sheetList.GetComponents( cmplist, false ); // sort component list by ref and remove sub components cmplist.RemoveSubComponentsFromList(); // sort component list by value cmplist.SortByValueOnly( ); PrintComponentsListByPart( f, cmplist, false ); fclose( f ); BOM_LISTER bom_lister; // Set the list of fields to add to list for( int ii = FOOTPRINT, ii < FIELD8; ii++ ) if IsFieldChecked( ii ) bom_lister.AddFieldIdToPrintList( ii ); bom_lister.CreateCsvBOMList( s_ExportSeparatorSymbol, f ); } Loading @@ -486,10 +469,10 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents ) FILE* f; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } Loading @@ -515,7 +498,7 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents ) /* * GenereListeOfItems() * Main function to create the list of components and/or labels * (global labels and pin sheets" ) * (global labels, hierarchical labels and pin sheets ) */ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) { Loading @@ -523,10 +506,10 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) int itemCount; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } Loading Loading @@ -561,39 +544,14 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) } } /*************************************************/ /* Create list of global labels and pins sheets */ /*************************************************/ std::vector <BOM_LABEL> listOfLabels; GenListeGLabels( listOfLabels ); // Create list of global labels, hierrachical labels and pins sheets BOM_LISTER bom_lister; if( ( itemCount = listOfLabels.size() ) > 0 ) { if( m_GenListLabelsbySheet->GetValue() ) { sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsBySheet ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets \ ( order = Sheet Number ) count = %d\n" ), itemCount ); fprintf( f, "%s", TO_UTF8( msg ) ); PrintListeGLabel( f, listOfLabels ); } bom_lister.PrintGlobalAndHierarchicalLabelsList( f, true ); if( m_GenListLabelsbyVal->GetValue() ) { sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsByValue ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets ( \ order = Alphab. ) count = %d\n\n" ), itemCount ); fprintf( f, "%s", TO_UTF8( msg ) ); PrintListeGLabel( f, listOfLabels ); } } bom_lister.PrintGlobalAndHierarchicalLabelsList( f, false ); msg = _( "\n#End List\n" ); fprintf( f, "%s", TO_UTF8( msg ) ); Loading Loading @@ -763,11 +721,11 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, { #if defined(KICAD_GOST) strCur.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol, GetChars( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); strCur.Printf( wxT( "%c%s)" ), s_ExportSeparatorSymbol, GetChars( msg ) ); #else fprintf( f, "%c%s", s_ExportSeparatorSymbol, TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); fprintf( f, "%c%s)", s_ExportSeparatorSymbol, TO_UTF8( msg ) ); #endif Loading @@ -775,7 +733,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, else { fprintf( f, " (Sheet %s)", TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); fprintf( f, " (loc %s)", TO_UTF8( msg ) ); } } Loading Loading @@ -865,49 +823,6 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, } int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* aFile, SCH_REFERENCE_LIST& aList, bool aIncludeSubComponents ) { unsigned int index = 0; while( index < aList.GetCount() ) { SCH_COMPONENT *component = aList[index].GetComponent(); wxString referenceListStr; int qty = 1; referenceListStr.append( aList[index].GetRef() ); for( unsigned int i = index+1; i < aList.GetCount(); ) { if( *(aList[i].GetComponent()) == *component ) { referenceListStr.append( wxT( " " ) + aList[i].GetRef() ); aList.RemoveItem( i ); qty++; } else i++; // Increment index only when current item is not removed from the list } // Write value, quantity and list of references fprintf( aFile, "%15s%c%3d%c\"%s\"", TO_UTF8( component->GetField( VALUE )->GetText() ), s_ExportSeparatorSymbol, qty, s_ExportSeparatorSymbol, TO_UTF8( referenceListStr ) ); // Write the rest of the fields if required #if defined( KICAD_GOST ) fprintf( aFile, "%c%20s", s_ExportSeparatorSymbol, TO_UTF8( component->GetField( DATASHEET )->GetText() ) ); #endif for( int i = FOOTPRINT; i < component->GetFieldCount(); i++ ) if( IsFieldChecked( i ) ) fprintf( aFile, "%c%15s", s_ExportSeparatorSymbol, TO_UTF8( component->GetField( i )->GetText() ) ); fprintf( aFile, "\n" ); index++; } return 0; } int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f, SCH_REFERENCE_LIST& aList, bool aIncludeSubComponents ) Loading Loading @@ -968,7 +883,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f, { msg = aList[ii].GetSheetPath().PathHumanReadable(); fprintf( f, " (Sheet %s)", TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( DrawLibItem->GetPosition() ); msg = m_parent->GetXYSheetReferences( DrawLibItem->GetPosition() ); fprintf( f, " (loc %s)", TO_UTF8( msg ) ); } } Loading Loading
eeschema/BOM_lister.h 0 → 100644 +78 −0 Original line number Diff line number Diff line /** * @file BOM_lister.h */ /* This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2012 Jean-Pierre Charras jp.charras at wanadoo.fr * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef _BOM_LISTER_H_ #define _BOM_LISTER_H_ #include <netlist.h> // A helper class to build item lists for BOM, // and write lists on files class BOM_LISTER { BOM_LABEL_LIST m_labelList; // a list of global and hierarchical labels FILE * m_outFile; // the output file for BOM generation char m_separatorSymbol; // the separator used for csv files ( usually \t ; or , ) bool m_outputFmtCsv; // true to create Csv files, false to create text lists bool m_includeSubComponents; // true to list each part // of a multiple part per package component // false to list only once this kind of component std::vector <int> m_fieldIDactive; // list of field IDs to print public: BOM_LISTER() { m_outFile = NULL; m_separatorSymbol = '\t'; m_outputFmtCsv = false; m_includeSubComponents = false; } void SetIncludeSubCmp( bool aIncludeSubCmp ) { m_includeSubComponents = aIncludeSubCmp; } void CreateCsvBOMList( char aSeparator, FILE * aFile ); void PrintComponentsListByPart( SCH_REFERENCE_LIST& aList ); void AddFieldIdToPrintList( int aFieldId ); void ClearFieldIdPrintList() { m_fieldIDactive.clear(); } /** * Function PrintGlobalAndHierarchicalLabelsList * print the list of global and hierarchical labels bu sheet or by name * @param aSortBySheet = true to print by sheet name order * false to print by label name order * @param aFile = the file to write to (will be NOT clesed) */ void PrintGlobalAndHierarchicalLabelsList( FILE * aFile, bool aSortBySheet ); private: bool isFieldPrintable( int aFieldId ); void buildGlobalAndHierarchicalLabelsList(); }; #endif // _BOM_LISTER_H_
eeschema/build_BOM.cpp +145 −52 Original line number Diff line number Diff line /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License Loading Loading @@ -33,63 +33,97 @@ #include <fctsys.h> #include <class_sch_screen.h> #include <kicad_string.h> #include <general.h> #include <sch_sheet.h> #include <sch_component.h> #include <template_fieldnames.h> #include <netlist.h> #include <BOM_lister.h> /* Fill aList with labels */ void GenListeGLabels( BOM_LABEL_LIST& aList ) void BOM_LISTER::CreateCsvBOMList( char aSeparator, FILE * aFile ) { // Build the sheet list m_outFile = aFile; m_separatorSymbol = aSeparator; SCH_REFERENCE_LIST cmplist; SCH_SHEET_LIST sheetList; BOM_LABEL label; for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) { SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList(); sheetList.GetComponents( cmplist, false ); // sort component list by ref and remove sub components cmplist.RemoveSubComponentsFromList(); while( schItem ) // sort component list by value cmplist.SortByValueOnly( ); PrintComponentsListByPart( cmplist ); fclose( m_outFile ); m_outFile = NULL; } void BOM_LISTER::PrintComponentsListByPart( SCH_REFERENCE_LIST& aList ) { switch( schItem->Type() ) unsigned int index = 0; while( index < aList.GetCount() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: aList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) ); break; case SCH_SHEET_T: SCH_COMPONENT *component = aList[index].GetComponent(); wxString referenceListStr; int qty = 1; referenceListStr.append( aList[index].GetRef() ); for( unsigned int i = index+1; i < aList.GetCount(); ) { SCH_SHEET* sheet = (SCH_SHEET*) schItem; BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->GetPins() ) if( *(aList[i].GetComponent()) == *component ) { aList.push_back( BOM_LABEL( SCH_SHEET_PIN_T, &sheetPin, *path ) ); referenceListStr.append( wxT( " " ) + aList[i].GetRef() ); aList.RemoveItem( i ); qty++; } else i++; // Increment index only when current item is not removed from the list } break; default: break; } // Write value, quantity and list of references fprintf( m_outFile, "%s%c%d%c\"%s\"", TO_UTF8( component->GetField( VALUE )->GetText() ), m_separatorSymbol, qty, m_separatorSymbol, TO_UTF8( referenceListStr ) ); schItem = schItem->Next(); for( int i = FOOTPRINT; i < component->GetFieldCount(); i++ ) { if( isFieldPrintable( i ) ) fprintf( m_outFile, "%c%s", m_separatorSymbol, TO_UTF8( component->GetField( i )->GetText() ) ); } fprintf( m_outFile, "\n" ); index++; } } bool BOM_LISTER::isFieldPrintable( int aFieldId ) { for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii ++ ) if( m_fieldIDactive[ii] == aFieldId ) return true; return false; } void BOM_LISTER::AddFieldIdToPrintList( int aFieldId ) { for( unsigned ii = 0; ii < m_fieldIDactive.size(); ii ++ ) if( m_fieldIDactive[ii] == aFieldId ) return; m_fieldIDactive.push_back( aFieldId ); } /* compare function for sorting labels * sort by * value * if same value: by sheet */ bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) static bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) { int ii; Loading @@ -108,7 +142,7 @@ bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) * by sheet * in a sheet, by alphabetic order */ bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) static bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) { int ii; Loading @@ -122,41 +156,101 @@ bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ) return ii < 0; } void BOM_LISTER::buildGlobalAndHierarchicalLabelsList() { m_labelList.clear(); // Explore the flat sheet list SCH_SHEET_LIST sheetList; for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) { SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList(); for( ; schItem; schItem = schItem->Next() ) { switch( schItem->Type() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: m_labelList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) ); break; case SCH_SHEET_T: { SCH_SHEET* sheet = (SCH_SHEET*) schItem; BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->GetPins() ) { m_labelList.push_back( BOM_LABEL( SCH_SHEET_PIN_T, &sheetPin, *path ) ); } } break; default: break; } } } } int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) void BOM_LISTER::PrintGlobalAndHierarchicalLabelsList( FILE * aFile, bool aSortBySheet ) { m_outFile = aFile; buildGlobalAndHierarchicalLabelsList(); wxString msg; if( aSortBySheet ) { sort( m_labelList.begin(), m_labelList.end(), SortLabelsBySheet ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets \ ( order = Sheet Number ) count = %d\n" ), m_labelList.size() ); } else { sort( m_labelList.begin(), m_labelList.end(), SortLabelsByValue ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets ( \ order = Alphab. ) count = %d\n\n" ), m_labelList.size() ); } fprintf( m_outFile, "%s", TO_UTF8( msg ) ); SCH_LABEL* label; SCH_SHEET_PIN* pinsheet; wxString msg, sheetpath; wxString sheetpath; wxString labeltype; for( unsigned ii = 0; ii < aList.size(); ii++ ) for( unsigned ii = 0; ii < m_labelList.size(); ii++ ) { switch( aList[ii].GetType() ) switch( m_labelList[ii].GetType() ) { case SCH_HIERARCHICAL_LABEL_T: case SCH_GLOBAL_LABEL_T: label = (SCH_LABEL*)(aList[ii].GetLabel()); label = (SCH_LABEL*)(m_labelList[ii].GetLabel()); if( aList[ii].GetType() == SCH_HIERARCHICAL_LABEL_T ) if( m_labelList[ii].GetType() == SCH_HIERARCHICAL_LABEL_T ) labeltype = wxT( "Hierarchical" ); else labeltype = wxT( "Global " ); sheetpath = aList[ii].GetSheetPath().PathHumanReadable(); sheetpath = m_labelList[ii].GetSheetPath().PathHumanReadable(); msg.Printf( _( "> %-28.28s %s (Sheet %s) pos: %3.3f, %3.3f\n" ), GetChars( label->GetText() ), GetChars( labeltype ), GetChars( sheetpath ), GetChars( labeltype ), GetChars( sheetpath ), (float) label->m_Pos.x / 1000, (float) label->m_Pos.y / 1000 ); fputs( TO_UTF8( msg ), f ); fputs( TO_UTF8( msg ), m_outFile ); break; case SCH_SHEET_PIN_T: { pinsheet = (SCH_SHEET_PIN*) aList[ii].GetLabel(); pinsheet = (SCH_SHEET_PIN*) m_labelList[ii].GetLabel(); int jj = pinsheet->GetShape(); if( jj < 0 ) Loading @@ -170,11 +264,11 @@ int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) msg.Printf( _( "> %-28.28s PinSheet %-7.7s (Sheet %s) pos: %3.3f, %3.3f\n" ), GetChars( pinsheet->GetText() ), GetChars( labtype ), GetChars( aList[ii].GetSheetPath().PathHumanReadable() ), GetChars( m_labelList[ii].GetSheetPath().PathHumanReadable() ), (float) pinsheet->m_Pos.x / 1000, (float) pinsheet->m_Pos.y / 1000 ); fputs( TO_UTF8( msg ), f ); fputs( TO_UTF8( msg ), m_outFile ); } break; Loading @@ -185,6 +279,5 @@ int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList ) } msg = _( "#End labels\n" ); fputs( TO_UTF8( msg ), f ); return 0; fputs( TO_UTF8( msg ), m_outFile ); }
eeschema/dialogs/dialog_build_BOM.cpp +54 −139 Original line number Diff line number Diff line /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2008 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or Loading Loading @@ -35,7 +35,6 @@ #include <wxstruct.h> #include <build_version.h> #include <general.h> #include <netlist.h> #include <template_fieldnames.h> #include <sch_component.h> Loading @@ -45,14 +44,7 @@ #include <wx/valgen.h> #include <dialog_build_BOM.h> #include <protos.h> extern void GenListeGLabels( std::vector <BOM_LABEL>& aList ); extern bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ); extern bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 ); extern int PrintListeGLabel( FILE* f, std::vector <BOM_LABEL>& aList ); #include <BOM_lister.h> /* Local variables */ Loading Loading @@ -118,10 +110,10 @@ static char s_ExportSeparator[] = ("\t;,."); DIALOG_BUILD_BOM::DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent ) : DIALOG_BUILD_BOM_BASE( parent ) { m_Config = wxGetApp().GetSettings(); wxASSERT( m_Config != NULL ); m_config = wxGetApp().GetSettings(); wxASSERT( m_config != NULL ); m_Parent = parent; m_parent = parent; Init(); Loading @@ -142,18 +134,18 @@ void DIALOG_BUILD_BOM::Init() SetFocus(); /* Get options */ m_Config->Read( OPTION_BOM_LIST_REF, &s_ListByRef ); m_Config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue ); m_Config->Read( OPTION_BOM_LIST_HPINS, &s_ListHierarchicalPinByName ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_SUB_CMP, &s_ListWithSubCmponents ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListHierarchicalPinBySheet ); m_Config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName ); s_OutputFormOpt = m_Config->Read( OPTION_BOM_FORMAT, (long) 0 ); m_Config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList ); s_OutputSeparatorOpt = m_Config->Read( OPTION_BOM_SEPARATOR, (long) 0 ); long addfields = m_Config->Read( OPTION_BOM_ADD_FIELD, (long) 0 ); m_config->Read( OPTION_BOM_LIST_REF, &s_ListByRef ); m_config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue ); m_config->Read( OPTION_BOM_LIST_HPINS, &s_ListHierarchicalPinByName ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_SUB_CMP, &s_ListWithSubCmponents ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListHierarchicalPinBySheet ); m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName ); s_OutputFormOpt = m_config->Read( OPTION_BOM_FORMAT, 0l ); m_config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList ); s_OutputSeparatorOpt = m_config->Read( OPTION_BOM_SEPARATOR, 0l ); long addfields = m_config->Read( OPTION_BOM_ADD_FIELD, 0l ); for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ ) { Loading Loading @@ -264,8 +256,6 @@ void DIALOG_BUILD_BOM::OnCancelClick( wxCommandEvent& event ) void DIALOG_BUILD_BOM::SavePreferences() { wxASSERT( m_Config != NULL ); // Determine current settings of "List items" and "Options" checkboxes s_ListByRef = m_ListCmpbyRefItems->GetValue(); s_ListWithSubCmponents = m_ListSubCmpItems->GetValue(); Loading Loading @@ -296,16 +286,16 @@ void DIALOG_BUILD_BOM::SavePreferences() s_Add_Alls_state = m_AddAllFields->GetValue(); // Now save current settings of both radiobutton groups m_Config->Write( OPTION_BOM_LIST_REF, s_ListByRef ); m_Config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue ); m_Config->Write( OPTION_BOM_LIST_HPINS, s_ListHierarchicalPinByName ); m_Config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet ); m_Config->Write( OPTION_BOM_LIST_HPINS_BY_NAME_, s_ListHierarchicalPinByName ); m_Config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents ); m_config->Write( OPTION_BOM_LIST_REF, s_ListByRef ); m_config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue ); m_config->Write( OPTION_BOM_LIST_HPINS, s_ListHierarchicalPinByName ); m_config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet ); m_config->Write( OPTION_BOM_LIST_HPINS_BY_NAME_, s_ListHierarchicalPinByName ); m_config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents ); m_Config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt ); m_Config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt ); m_Config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList ); m_config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt ); m_config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt ); m_config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList ); // Now save current settings of all "Fields to add" checkboxes long addfields = 0; Loading @@ -318,7 +308,7 @@ void DIALOG_BUILD_BOM::SavePreferences() bitmask <<= 1; } m_Config->Write( OPTION_BOM_ADD_FIELD, addfields ); m_config->Write( OPTION_BOM_ADD_FIELD, addfields ); } Loading Loading @@ -371,7 +361,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, fn = dlg.GetPath(); // remember path+filename+ext for subsequent runs. m_ListFileName = dlg.GetPath(); m_listFileName = dlg.GetPath(); // Close dialog, then show the list (if so requested) Loading @@ -395,7 +385,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, if( aRunBrowser ) { wxString editorname = wxGetApp().GetEditorName(); wxString filename = m_ListFileName; wxString filename = m_listFileName; AddDelimiterString( filename ); ExecuteFile( this, editorname, filename ); } Loading Loading @@ -449,29 +439,22 @@ bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId) void DIALOG_BUILD_BOM::CreatePartsList( ) { FILE* f; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { wxString msg; msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } SCH_REFERENCE_LIST cmplist; SCH_SHEET_LIST sheetList; sheetList.GetComponents( cmplist, false ); // sort component list by ref and remove sub components cmplist.RemoveSubComponentsFromList(); // sort component list by value cmplist.SortByValueOnly( ); PrintComponentsListByPart( f, cmplist, false ); fclose( f ); BOM_LISTER bom_lister; // Set the list of fields to add to list for( int ii = FOOTPRINT, ii < FIELD8; ii++ ) if IsFieldChecked( ii ) bom_lister.AddFieldIdToPrintList( ii ); bom_lister.CreateCsvBOMList( s_ExportSeparatorSymbol, f ); } Loading @@ -486,10 +469,10 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents ) FILE* f; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } Loading @@ -515,7 +498,7 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents ) /* * GenereListeOfItems() * Main function to create the list of components and/or labels * (global labels and pin sheets" ) * (global labels, hierarchical labels and pin sheets ) */ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) { Loading @@ -523,10 +506,10 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) int itemCount; wxString msg; if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL ) { msg = _( "Failed to open file " ); msg << m_ListFileName; msg << m_listFileName; DisplayError( this, msg ); return; } Loading Loading @@ -561,39 +544,14 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents ) } } /*************************************************/ /* Create list of global labels and pins sheets */ /*************************************************/ std::vector <BOM_LABEL> listOfLabels; GenListeGLabels( listOfLabels ); // Create list of global labels, hierrachical labels and pins sheets BOM_LISTER bom_lister; if( ( itemCount = listOfLabels.size() ) > 0 ) { if( m_GenListLabelsbySheet->GetValue() ) { sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsBySheet ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets \ ( order = Sheet Number ) count = %d\n" ), itemCount ); fprintf( f, "%s", TO_UTF8( msg ) ); PrintListeGLabel( f, listOfLabels ); } bom_lister.PrintGlobalAndHierarchicalLabelsList( f, true ); if( m_GenListLabelsbyVal->GetValue() ) { sort( listOfLabels.begin(), listOfLabels.end(), SortLabelsByValue ); msg.Printf( _( "\n#Global, Hierarchical Labels and PinSheets ( \ order = Alphab. ) count = %d\n\n" ), itemCount ); fprintf( f, "%s", TO_UTF8( msg ) ); PrintListeGLabel( f, listOfLabels ); } } bom_lister.PrintGlobalAndHierarchicalLabelsList( f, false ); msg = _( "\n#End List\n" ); fprintf( f, "%s", TO_UTF8( msg ) ); Loading Loading @@ -763,11 +721,11 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, { #if defined(KICAD_GOST) strCur.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol, GetChars( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); strCur.Printf( wxT( "%c%s)" ), s_ExportSeparatorSymbol, GetChars( msg ) ); #else fprintf( f, "%c%s", s_ExportSeparatorSymbol, TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); fprintf( f, "%c%s)", s_ExportSeparatorSymbol, TO_UTF8( msg ) ); #endif Loading @@ -775,7 +733,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, else { fprintf( f, " (Sheet %s)", TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( comp->GetPosition() ); msg = m_parent->GetXYSheetReferences( comp->GetPosition() ); fprintf( f, " (loc %s)", TO_UTF8( msg ) ); } } Loading Loading @@ -865,49 +823,6 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, } int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* aFile, SCH_REFERENCE_LIST& aList, bool aIncludeSubComponents ) { unsigned int index = 0; while( index < aList.GetCount() ) { SCH_COMPONENT *component = aList[index].GetComponent(); wxString referenceListStr; int qty = 1; referenceListStr.append( aList[index].GetRef() ); for( unsigned int i = index+1; i < aList.GetCount(); ) { if( *(aList[i].GetComponent()) == *component ) { referenceListStr.append( wxT( " " ) + aList[i].GetRef() ); aList.RemoveItem( i ); qty++; } else i++; // Increment index only when current item is not removed from the list } // Write value, quantity and list of references fprintf( aFile, "%15s%c%3d%c\"%s\"", TO_UTF8( component->GetField( VALUE )->GetText() ), s_ExportSeparatorSymbol, qty, s_ExportSeparatorSymbol, TO_UTF8( referenceListStr ) ); // Write the rest of the fields if required #if defined( KICAD_GOST ) fprintf( aFile, "%c%20s", s_ExportSeparatorSymbol, TO_UTF8( component->GetField( DATASHEET )->GetText() ) ); #endif for( int i = FOOTPRINT; i < component->GetFieldCount(); i++ ) if( IsFieldChecked( i ) ) fprintf( aFile, "%c%15s", s_ExportSeparatorSymbol, TO_UTF8( component->GetField( i )->GetText() ) ); fprintf( aFile, "\n" ); index++; } return 0; } int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f, SCH_REFERENCE_LIST& aList, bool aIncludeSubComponents ) Loading Loading @@ -968,7 +883,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f, { msg = aList[ii].GetSheetPath().PathHumanReadable(); fprintf( f, " (Sheet %s)", TO_UTF8( msg ) ); msg = m_Parent->GetXYSheetReferences( DrawLibItem->GetPosition() ); msg = m_parent->GetXYSheetReferences( DrawLibItem->GetPosition() ); fprintf( f, " (loc %s)", TO_UTF8( msg ) ); } } Loading