Commit bf3b8f56 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

BOM list code cleanup.

parent eb3ba806
Loading
Loading
Loading
Loading

eeschema/BOM_lister.h

0 → 100644
+78 −0
Original line number Original line 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_
+145 −52
Original line number Original line Diff line number Diff line
/*
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 * 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) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
 * Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
 * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
 *
 *
 * This program is free software; you can redistribute it and/or
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * modify it under the terms of the GNU General Public License
@@ -33,63 +33,97 @@


#include <fctsys.h>
#include <fctsys.h>
#include <class_sch_screen.h>
#include <class_sch_screen.h>
#include <kicad_string.h>

#include <general.h>
#include <sch_sheet.h>
#include <sch_sheet.h>
#include <sch_component.h>
#include <sch_component.h>
#include <template_fieldnames.h>
#include <template_fieldnames.h>
#include <netlist.h>


#include <BOM_lister.h>


/* Fill aList  with labels

 */
void BOM_LISTER::CreateCsvBOMList( char aSeparator, FILE * aFile )
void GenListeGLabels( BOM_LABEL_LIST& aList )
{
{
    // Build the sheet list
    m_outFile = aFile;
    m_separatorSymbol = aSeparator;

    SCH_REFERENCE_LIST cmplist;
    SCH_SHEET_LIST sheetList;
    SCH_SHEET_LIST sheetList;
    BOM_LABEL      label;


    for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() )
    sheetList.GetComponents( cmplist, false );
    {

        SCH_ITEM* schItem = (SCH_ITEM*) path->LastDrawList();
    // 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:
        SCH_COMPONENT *component = aList[index].GetComponent();
            case SCH_GLOBAL_LABEL_T:
        wxString referenceListStr;
                aList.push_back( BOM_LABEL( schItem->Type(), schItem, *path ) );
        int qty = 1;
                break;
        referenceListStr.append( aList[index].GetRef() );

        for( unsigned int i = index+1; i < aList.GetCount(); )
            case SCH_SHEET_T:
        {
        {
                SCH_SHEET* sheet = (SCH_SHEET*) schItem;
            if( *(aList[i].GetComponent()) == *component )

                BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->GetPins() )
            {
            {
                    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:
        // Write value, quantity and list of references
                break;
        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
/* compare function for sorting labels
 * sort by
 * sort by
 *     value
 *     value
 *     if same value: by sheet
 *     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;
    int       ii;


@@ -108,7 +142,7 @@ bool SortLabelsByValue( const BOM_LABEL& obj1, const BOM_LABEL& obj2 )
 *     by sheet
 *     by sheet
 *     in a sheet, by alphabetic order
 *     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;
    int      ii;


@@ -122,41 +156,101 @@ bool SortLabelsBySheet( const BOM_LABEL& obj1, const BOM_LABEL& obj2 )
    return ii < 0;
    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_LABEL* label;
    SCH_SHEET_PIN* pinsheet;
    SCH_SHEET_PIN* pinsheet;
    wxString msg, sheetpath;
    wxString sheetpath;
    wxString labeltype;
    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_HIERARCHICAL_LABEL_T:
        case SCH_GLOBAL_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" );
                labeltype = wxT( "Hierarchical" );
            else
            else
                labeltype = wxT( "Global      " );
                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" ),
            msg.Printf( _( "> %-28.28s %s        (Sheet %s) pos: %3.3f, %3.3f\n" ),
                        GetChars( label->GetText() ),
                        GetChars( label->GetText() ),
                        GetChars( labeltype ),
                        GetChars( labeltype ), GetChars( sheetpath ),
                        GetChars( sheetpath ),
                        (float) label->m_Pos.x / 1000,
                        (float) label->m_Pos.x / 1000,
                        (float) label->m_Pos.y / 1000 );
                        (float) label->m_Pos.y / 1000 );


            fputs( TO_UTF8( msg ), f );
            fputs( TO_UTF8( msg ), m_outFile );
            break;
            break;


        case SCH_SHEET_PIN_T:
        case SCH_SHEET_PIN_T:
        {
        {
            pinsheet = (SCH_SHEET_PIN*) aList[ii].GetLabel();
            pinsheet = (SCH_SHEET_PIN*) m_labelList[ii].GetLabel();
            int jj = pinsheet->GetShape();
            int jj = pinsheet->GetShape();


            if( jj < 0 )
            if( jj < 0 )
@@ -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" ),
            msg.Printf( _( "> %-28.28s PinSheet %-7.7s (Sheet %s) pos: %3.3f, %3.3f\n" ),
                        GetChars( pinsheet->GetText() ),
                        GetChars( pinsheet->GetText() ),
                        GetChars( labtype ),
                        GetChars( labtype ),
                        GetChars( aList[ii].GetSheetPath().PathHumanReadable() ),
                        GetChars( m_labelList[ii].GetSheetPath().PathHumanReadable() ),
                        (float) pinsheet->m_Pos.x / 1000,
                        (float) pinsheet->m_Pos.x / 1000,
                        (float) pinsheet->m_Pos.y / 1000 );
                        (float) pinsheet->m_Pos.y / 1000 );


            fputs( TO_UTF8( msg ), f );
            fputs( TO_UTF8( msg ), m_outFile );
        }
        }


        break;
        break;
@@ -185,6 +279,5 @@ int PrintListeGLabel( FILE* f, BOM_LABEL_LIST& aList )
    }
    }


    msg = _( "#End labels\n" );
    msg = _( "#End labels\n" );
    fputs( TO_UTF8( msg ), f );
    fputs( TO_UTF8( msg ), m_outFile );
    return 0;
}
}
+54 −139
Original line number Original line Diff line number Diff line
/*
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 * 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.
 * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
 *
 *
 * This program is free software; you can redistribute it and/or
 * This program is free software; you can redistribute it and/or
@@ -35,7 +35,6 @@
#include <wxstruct.h>
#include <wxstruct.h>
#include <build_version.h>
#include <build_version.h>


#include <general.h>
#include <netlist.h>
#include <netlist.h>
#include <template_fieldnames.h>
#include <template_fieldnames.h>
#include <sch_component.h>
#include <sch_component.h>
@@ -45,14 +44,7 @@
#include <wx/valgen.h>
#include <wx/valgen.h>


#include <dialog_build_BOM.h>
#include <dialog_build_BOM.h>

#include <BOM_lister.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 );




/* Local variables */
/* Local variables */
@@ -118,10 +110,10 @@ static char s_ExportSeparator[] = ("\t;,.");
DIALOG_BUILD_BOM::DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent ) :
DIALOG_BUILD_BOM::DIALOG_BUILD_BOM( EDA_DRAW_FRAME* parent ) :
    DIALOG_BUILD_BOM_BASE( parent )
    DIALOG_BUILD_BOM_BASE( parent )
{
{
    m_Config = wxGetApp().GetSettings();
    m_config = wxGetApp().GetSettings();
    wxASSERT( m_Config != NULL );
    wxASSERT( m_config != NULL );


    m_Parent = parent;
    m_parent = parent;


    Init();
    Init();


@@ -142,18 +134,18 @@ void DIALOG_BUILD_BOM::Init()
    SetFocus();
    SetFocus();


    /* Get options */
    /* Get options */
    m_Config->Read( OPTION_BOM_LIST_REF, &s_ListByRef );
    m_config->Read( OPTION_BOM_LIST_REF, &s_ListByRef );
    m_Config->Read( OPTION_BOM_LIST_VALUE , &s_ListByValue );
    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, &s_ListHierarchicalPinByName );
    m_Config->Read( OPTION_BOM_LIST_HPINS_BY_SHEET, &s_ListWithSubCmponents );
    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_HPINS_BY_NAME_, &s_ListWithSubCmponents );
    m_Config->Read( OPTION_BOM_LIST_SUB_CMP, &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_SHEET, &s_ListHierarchicalPinBySheet );
    m_Config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName );
    m_config->Read( OPTION_BOM_LIST_HPINS_BY_NAME_, &s_ListHierarchicalPinByName );
    s_OutputFormOpt        = m_Config->Read( OPTION_BOM_FORMAT, (long) 0 );
    s_OutputFormOpt = m_config->Read( OPTION_BOM_FORMAT, 0l );
    m_Config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList );
    m_config->Read( OPTION_BOM_LAUNCH_BROWSER, &s_BrowseCreatedList );
    s_OutputSeparatorOpt   = m_Config->Read( OPTION_BOM_SEPARATOR, (long) 0 );
    s_OutputSeparatorOpt   = m_config->Read( OPTION_BOM_SEPARATOR, 0l );
    long addfields = m_Config->Read( OPTION_BOM_ADD_FIELD, (long) 0 );
    long addfields = m_config->Read( OPTION_BOM_ADD_FIELD, 0l );


    for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
    for( int ii = 0, bitmask = 1; s_AddFieldList[ii] != NULL; ii++ )
    {
    {
@@ -264,8 +256,6 @@ void DIALOG_BUILD_BOM::OnCancelClick( wxCommandEvent& event )


void DIALOG_BUILD_BOM::SavePreferences()
void DIALOG_BUILD_BOM::SavePreferences()
{
{
    wxASSERT( m_Config != NULL );

    // Determine current settings of "List items" and "Options" checkboxes
    // Determine current settings of "List items" and "Options" checkboxes
    s_ListByRef = m_ListCmpbyRefItems->GetValue();
    s_ListByRef = m_ListCmpbyRefItems->GetValue();
    s_ListWithSubCmponents = m_ListSubCmpItems->GetValue();
    s_ListWithSubCmponents = m_ListSubCmpItems->GetValue();
@@ -296,16 +286,16 @@ void DIALOG_BUILD_BOM::SavePreferences()
    s_Add_Alls_state   = m_AddAllFields->GetValue();
    s_Add_Alls_state   = m_AddAllFields->GetValue();


    // Now save current settings of both radiobutton groups
    // Now save current settings of both radiobutton groups
    m_Config->Write( OPTION_BOM_LIST_REF, s_ListByRef );
    m_config->Write( OPTION_BOM_LIST_REF, s_ListByRef );
    m_Config->Write( OPTION_BOM_LIST_VALUE , s_ListByValue );
    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, s_ListHierarchicalPinByName );
    m_Config->Write( OPTION_BOM_LIST_HPINS_BY_SHEET, s_ListHierarchicalPinBySheet );
    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_HPINS_BY_NAME_, s_ListHierarchicalPinByName );
    m_Config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents );
    m_config->Write( OPTION_BOM_LIST_SUB_CMP, s_ListWithSubCmponents );


    m_Config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt );
    m_config->Write( OPTION_BOM_FORMAT, (long) s_OutputFormOpt );
    m_Config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt );
    m_config->Write( OPTION_BOM_SEPARATOR, (long) s_OutputSeparatorOpt );
    m_Config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList );
    m_config->Write( OPTION_BOM_LAUNCH_BROWSER, (long) s_BrowseCreatedList );


    // 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;
@@ -318,7 +308,7 @@ void DIALOG_BUILD_BOM::SavePreferences()
        bitmask <<= 1;
        bitmask <<= 1;
    }
    }


    m_Config->Write( OPTION_BOM_ADD_FIELD, addfields );
    m_config->Write( OPTION_BOM_ADD_FIELD, addfields );
}
}




@@ -371,7 +361,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,


    fn = dlg.GetPath();        // remember path+filename+ext for subsequent runs.
    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)
    // Close dialog, then show the list (if so requested)


@@ -395,7 +385,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
    if( aRunBrowser )
    if( aRunBrowser )
    {
    {
        wxString editorname = wxGetApp().GetEditorName();
        wxString editorname = wxGetApp().GetEditorName();
        wxString filename   = m_ListFileName;
        wxString filename   = m_listFileName;
        AddDelimiterString( filename );
        AddDelimiterString( filename );
        ExecuteFile( this, editorname, filename );
        ExecuteFile( this, editorname, filename );
    }
    }
@@ -449,29 +439,22 @@ bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId)
void DIALOG_BUILD_BOM::CreatePartsList( )
void DIALOG_BUILD_BOM::CreatePartsList( )
{
{
    FILE* f;
    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 = _( "Failed to open file " );
        msg << m_ListFileName;
        msg << m_listFileName;
        DisplayError( this, msg );
        DisplayError( this, msg );
        return;
        return;
    }
    }


    SCH_REFERENCE_LIST cmplist;
    BOM_LISTER bom_lister;
    SCH_SHEET_LIST sheetList;
    // Set the list of fields to add to list

    for( int ii = FOOTPRINT, ii < FIELD8; ii++ )
    sheetList.GetComponents( cmplist, false );
        if IsFieldChecked( ii )

            bom_lister.AddFieldIdToPrintList( ii );
    // sort component list by ref and remove sub components
    bom_lister.CreateCsvBOMList( s_ExportSeparatorSymbol, f );
    cmplist.RemoveSubComponentsFromList();

    // sort component list by value
    cmplist.SortByValueOnly( );
    PrintComponentsListByPart( f, cmplist, false );

    fclose( f );
}
}




@@ -486,10 +469,10 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents )
    FILE*    f;
    FILE*    f;
    wxString msg;
    wxString msg;


    if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL )
    if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL )
    {
    {
        msg = _( "Failed to open file " );
        msg = _( "Failed to open file " );
        msg << m_ListFileName;
        msg << m_listFileName;
        DisplayError( this, msg );
        DisplayError( this, msg );
        return;
        return;
    }
    }
@@ -515,7 +498,7 @@ void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents )
/*
/*
 * GenereListeOfItems()
 * GenereListeOfItems()
 * Main function to create the list of components and/or labels
 * 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 )
void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents )
{
{
@@ -523,10 +506,10 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents )
    int      itemCount;
    int      itemCount;
    wxString msg;
    wxString msg;


    if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL )
    if( ( f = wxFopen( m_listFileName, wxT( "wt" ) ) ) == NULL )
    {
    {
        msg = _( "Failed to open file " );
        msg = _( "Failed to open file " );
        msg << m_ListFileName;
        msg << m_listFileName;
        DisplayError( this, msg );
        DisplayError( this, msg );
        return;
        return;
    }
    }
@@ -561,39 +544,14 @@ void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents )
        }
        }
    }
    }


    /*************************************************/
    // Create list of global labels, hierrachical labels and pins sheets
    /* Create list of global labels and pins sheets */
    BOM_LISTER bom_lister;
    /*************************************************/
    std::vector <BOM_LABEL> listOfLabels;

    GenListeGLabels( listOfLabels );


    if( ( itemCount = listOfLabels.size() ) > 0 )
    {
    if( m_GenListLabelsbySheet->GetValue() )
    if( m_GenListLabelsbySheet->GetValue() )
        {
        bom_lister.PrintGlobalAndHierarchicalLabelsList( f, true );
            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 );
        }


    if( m_GenListLabelsbyVal->GetValue() )
    if( m_GenListLabelsbyVal->GetValue() )
        {
        bom_lister.PrintGlobalAndHierarchicalLabelsList( f, false );
            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 );
        }
    }


    msg = _( "\n#End List\n" );
    msg = _( "\n#End List\n" );
    fprintf( f, "%s", TO_UTF8( msg ) );
    fprintf( f, "%s", TO_UTF8( msg ) );
@@ -763,11 +721,11 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
                {
                {
#if defined(KICAD_GOST)
#if defined(KICAD_GOST)
                    strCur.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol, GetChars( msg ) );
                    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 ) );
                    strCur.Printf( wxT( "%c%s)" ), s_ExportSeparatorSymbol, GetChars( msg ) );
#else
#else
                    fprintf( f, "%c%s", s_ExportSeparatorSymbol, TO_UTF8( msg ) );
                    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,
                    fprintf( f, "%c%s)", s_ExportSeparatorSymbol,
                             TO_UTF8( msg ) );
                             TO_UTF8( msg ) );
#endif
#endif
@@ -775,7 +733,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
                else
                else
                {
                {
                    fprintf( f, "   (Sheet %s)", TO_UTF8( msg ) );
                    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 ) );
                    fprintf( f, "   (loc %s)", TO_UTF8( msg ) );
                }
                }
            }
            }
@@ -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,
int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE*               f,
                                                SCH_REFERENCE_LIST& aList,
                                                SCH_REFERENCE_LIST& aList,
                                                bool                aIncludeSubComponents )
                                                bool                aIncludeSubComponents )
@@ -968,7 +883,7 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f,
            {
            {
                msg = aList[ii].GetSheetPath().PathHumanReadable();
                msg = aList[ii].GetSheetPath().PathHumanReadable();
                fprintf( f, "   (Sheet %s)", TO_UTF8( msg ) );
                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 ) );
                fprintf( f, "   (loc %s)", TO_UTF8( msg ) );
            }
            }
        }
        }
+29 −12

File changed.

Preview size limit exceeded, changes collapsed.

+148 −155

File changed.

Preview size limit exceeded, changes collapsed.

Loading