Commit b28e976e authored by jean-pierre charras's avatar jean-pierre charras

Eeschema: BOM list generation: some fixes and enhancements.

drawframe.cpp: commit a fix about scrollbars  from lajos kamocsay
parent bed96be7
...@@ -554,68 +554,80 @@ void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPosition ) ...@@ -554,68 +554,80 @@ void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPosition )
{ {
virtualSize = drawingRect.GetSize(); virtualSize = drawingRect.GetSize();
} }
else if( drawingRect.Contains( logicalClientRect ) )
{
virtualSize = drawingRect.GetSize();
}
else else
{ {
int drawingCenterX = drawingRect.x + ( drawingRect.width / 2 ); if( drawingRect.GetLeft() < logicalClientRect.GetLeft() && drawingRect.GetRight() > logicalClientRect.GetRight() )
int clientCenterX = logicalClientRect.x + ( logicalClientRect.width / 2 );
int drawingCenterY = drawingRect.y + ( drawingRect.height / 2 );
int clientCenterY = logicalClientRect.y + ( logicalClientRect.height / 2 );
if( logicalClientRect.width > drawingRect.width )
{ {
if( drawingCenterX > clientCenterX ) virtualSize.x = drawingRect.GetSize().x;
virtualSize.x = ( drawingCenterX - logicalClientRect.GetLeft() ) * 2;
else if( drawingCenterX < clientCenterX )
virtualSize.x = ( logicalClientRect.GetRight() - drawingCenterX ) * 2;
else
virtualSize.x = logicalClientRect.width;
} }
else if( logicalClientRect.width < drawingRect.width ) else
{ {
if( drawingCenterX > clientCenterX ) int drawingCenterX = drawingRect.x + ( drawingRect.width / 2 );
virtualSize.x = drawingRect.width + int clientCenterX = logicalClientRect.x + ( logicalClientRect.width / 2 );
( (drawingRect.GetLeft() - logicalClientRect.GetLeft() ) * 2 );
else if( drawingCenterX < clientCenterX ) if( logicalClientRect.width > drawingRect.width )
virtualSize.x = drawingRect.width + {
( (logicalClientRect.GetRight() - drawingRect.GetRight() ) * 2 ); if( drawingCenterX > clientCenterX )
virtualSize.x = ( drawingCenterX - logicalClientRect.GetLeft() ) * 2;
else if( drawingCenterX < clientCenterX )
virtualSize.x = ( logicalClientRect.GetRight() - drawingCenterX ) * 2;
else
virtualSize.x = logicalClientRect.width;
}
else if( logicalClientRect.width < drawingRect.width )
{
if( drawingCenterX > clientCenterX )
virtualSize.x = drawingRect.width +
( (drawingRect.GetLeft() - logicalClientRect.GetLeft() ) * 2 );
else if( drawingCenterX < clientCenterX )
virtualSize.x = drawingRect.width +
( (logicalClientRect.GetRight() - drawingRect.GetRight() ) * 2 );
else
virtualSize.x = drawingRect.width;
}
else else
{
virtualSize.x = drawingRect.width; virtualSize.x = drawingRect.width;
} }
else
{
virtualSize.x = drawingRect.width;
} }
if( logicalClientRect.height > drawingRect.height ) if( drawingRect.GetTop() < logicalClientRect.GetTop() && drawingRect.GetBottom() > logicalClientRect.GetBottom() )
{ {
if( drawingCenterY > clientCenterY ) virtualSize.y = drawingRect.GetSize().y;
virtualSize.y = ( drawingCenterY - logicalClientRect.GetTop() ) * 2;
else if( drawingCenterY < clientCenterY )
virtualSize.y = ( logicalClientRect.GetBottom() - drawingCenterY ) * 2;
else
virtualSize.y = logicalClientRect.height;
} }
else if( logicalClientRect.height < drawingRect.height ) else
{ {
if( drawingCenterY > clientCenterY ) int drawingCenterY = drawingRect.y + ( drawingRect.height / 2 );
virtualSize.y = drawingRect.height + int clientCenterY = logicalClientRect.y + ( logicalClientRect.height / 2 );
( ( drawingRect.GetTop() - logicalClientRect.GetTop() ) * 2 );
else if( drawingCenterY < clientCenterY ) if( logicalClientRect.height > drawingRect.height )
virtualSize.y = drawingRect.height + {
( ( logicalClientRect.GetBottom() - drawingRect.GetBottom() ) * 2 ); if( drawingCenterY > clientCenterY )
virtualSize.y = ( drawingCenterY - logicalClientRect.GetTop() ) * 2;
else if( drawingCenterY < clientCenterY )
virtualSize.y = ( logicalClientRect.GetBottom() - drawingCenterY ) * 2;
else
virtualSize.y = logicalClientRect.height;
}
else if( logicalClientRect.height < drawingRect.height )
{
if( drawingCenterY > clientCenterY )
virtualSize.y = drawingRect.height +
( ( drawingRect.GetTop() - logicalClientRect.GetTop() ) * 2 );
else if( drawingCenterY < clientCenterY )
virtualSize.y = drawingRect.height +
( ( logicalClientRect.GetBottom() - drawingRect.GetBottom() ) * 2 );
else
virtualSize.y = drawingRect.height;
}
else else
{
virtualSize.y = drawingRect.height; virtualSize.y = drawingRect.height;
} }
else
{
virtualSize.y = drawingRect.height;
} }
} }
if( screen->m_Center ) if( screen->m_Center )
{ {
screen->m_DrawOrg.x = -( wxRound( (double) virtualSize.x / 2.0 ) ); screen->m_DrawOrg.x = -( wxRound( (double) virtualSize.x / 2.0 ) );
......
...@@ -110,29 +110,52 @@ bool SCH_REFERENCE_LIST::sortByValueAndRef( const SCH_REFERENCE& item1, ...@@ -110,29 +110,52 @@ bool SCH_REFERENCE_LIST::sortByValueAndRef( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 ) const SCH_REFERENCE& item2 )
{ {
int ii = item1.CompareValue( item2 ); int ii = item1.CompareValue( item2 );
if( ii == 0 ) if( ii == 0 )
ii = RefDesStringCompare( item1.GetRef(), item2.GetRef() ); ii = RefDesStringCompare( item1.GetRef(), item2.GetRef() );
if( ii == 0 ) if( ii == 0 )
ii = item1.m_Unit - item2.m_Unit; ii = item1.m_Unit - item2.m_Unit;
if( ii == 0 ) if( ii == 0 )
ii = item1.m_SheetNum - item2.m_SheetNum; ii = item1.m_SheetNum - item2.m_SheetNum;
if( ii == 0 ) if( ii == 0 )
ii = item1.m_CmpPos.x - item2.m_CmpPos.x; ii = item1.m_CmpPos.x - item2.m_CmpPos.x;
if( ii == 0 ) if( ii == 0 )
ii = item1.m_CmpPos.y - item2.m_CmpPos.y; ii = item1.m_CmpPos.y - item2.m_CmpPos.y;
if( ii == 0 ) if( ii == 0 )
ii = item1.m_TimeStamp - item2.m_TimeStamp; ii = item1.m_TimeStamp - item2.m_TimeStamp;
return ii < 0; return ii < 0;
} }
/*
* Helper function to calculate in a component value string
* the value, depending on multiplier symbol:
* pico
* nano
* micro (u)
* milli (m)
* kilo (k ou K)
* Mega
* Giga
* Tera
*
* with notations like 1K; 1.5K; 1,5K; 1k5
* returns true if the string is a value, false if not
* (a value is a string starting by a number)
*/
static bool engStrToDouble( wxString aStr, double* aDouble ) static bool engStrToDouble( wxString aStr, double* aDouble )
{ {
// A trick to take care of strings without a multiplier // A trick to take care of strings without a multiplier
aStr.Append( wxT( "R" ) ); aStr.Append( wxT( "R" ) );
// Regular expression for a value string, e.g., 47k2 // Regular expression for a value string, e.g., 47k2
static wxRegEx valueRegEx( wxT( "^([0-9]+)([pnumRkMGT.])([0-9]*)" ) ); static wxRegEx valueRegEx( wxT( "^([0-9]+)([pnumRkKMGT.,])([0-9]*)([pnumRkKMGT]*)" ) );
if( !valueRegEx.Matches( aStr ) ) if( !valueRegEx.Matches( aStr ) )
return false; return false;
...@@ -141,6 +164,7 @@ static bool engStrToDouble( wxString aStr, double* aDouble ) ...@@ -141,6 +164,7 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
+ wxT( "." ) + wxT( "." )
+ valueRegEx.GetMatch( aStr, 3 ) ); + valueRegEx.GetMatch( aStr, 3 ) );
wxString multiplierString = valueRegEx.GetMatch( aStr, 2 ); wxString multiplierString = valueRegEx.GetMatch( aStr, 2 );
wxString post_multiplierString = valueRegEx.GetMatch( aStr, 4 );
double multiplier; double multiplier;
switch( (wxChar)multiplierString[0] ) switch( (wxChar)multiplierString[0] )
...@@ -158,6 +182,7 @@ static bool engStrToDouble( wxString aStr, double* aDouble ) ...@@ -158,6 +182,7 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
multiplier = 1e-3; multiplier = 1e-3;
break; break;
case 'k': case 'k':
case 'K':
multiplier = 1e3; multiplier = 1e3;
break; break;
case 'M': case 'M':
...@@ -170,12 +195,46 @@ static bool engStrToDouble( wxString aStr, double* aDouble ) ...@@ -170,12 +195,46 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
multiplier = 1e12; multiplier = 1e12;
break; break;
case 'R': case 'R':
case '.': case '.': // floatting point separator
case ',': // floatting point separator (some languages)
default: default:
multiplier = 1; multiplier = 1;
break; break;
} }
switch( (wxChar)post_multiplierString[0] )
{
case 'p':
multiplier = 1e-12;
break;
case 'n':
multiplier = 1e-9;
break;
case 'u':
multiplier = 1e-6;
break;
case 'm':
multiplier = 1e-3;
break;
case 'k':
case 'K':
multiplier = 1e3;
break;
case 'M':
multiplier = 1e6;
break;
case 'G':
multiplier = 1e9;
break;
case 'T':
multiplier = 1e12;
break;
case 'R':
default:
break;
}
LOCALE_IO dummy; // set to C floatting point standard
valueStr.ToDouble( aDouble ); valueStr.ToDouble( aDouble );
*aDouble *= multiplier; *aDouble *= multiplier;
...@@ -183,11 +242,41 @@ static bool engStrToDouble( wxString aStr, double* aDouble ) ...@@ -183,11 +242,41 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
} }
/* sort the list of references by value.
* Components are grouped by type and are sorted by value:
* The value of a component accept multiplier symbols (p, n, K ..)
* groups are made by first letter of reference
*/
bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1, bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 ) const SCH_REFERENCE& item2 )
{ {
wxString text1 = item1.GetComponent()->GetField( VALUE )->GetText(); // First, group by type, assuming 2 first letter of references
wxString text2 = item2.GetComponent()->GetField( VALUE )->GetText(); // are different for different types of components.
wxString text1 = item1.GetComponent()->GetField( REFERENCE )->GetText().Left(2);
wxString text2 = item2.GetComponent()->GetField( REFERENCE )->GetText().Left(2);
if( text1[0] != text2[0] )
return text1[0] < text2[0];
// Compare the second letter, if exists
if( text1.length() > 1 && text2.length() > 1 )
{
if( (text1[1] < '0') || (text1[1] > '9') ||
(text2[1] < '0') || (text2[1] > '9') )
return text1[1] < text2[1];
}
// Inside a group of components of same value, it could be good to group per footprints
text1 = item1.GetComponent()->GetField( FOOTPRINT )->GetText();
text2 = item2.GetComponent()->GetField( FOOTPRINT )->GetText();
int same_footprint = text1.IsEmpty() || text2.IsEmpty();
if( same_footprint == 0 )
same_footprint = text1.CmpNoCase( text2 );
// We can compare here 2 values relative to components of the same type
// assuming references are correctly chosen
text1 = item1.GetComponent()->GetField( VALUE )->GetText();
text2 = item2.GetComponent()->GetField( VALUE )->GetText();
double value1, value2; double value1, value2;
...@@ -204,7 +293,11 @@ bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1, ...@@ -204,7 +293,11 @@ bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
return false; return false;
if( match1 && match2 ) if( match1 && match2 )
{
if( value1 == value2 )
return same_footprint < 0;
return value1 < value2; return value1 < value2;
}
// Fall back to normal string compare // Fall back to normal string compare
int ii = text1.CmpNoCase( text2 ); int ii = text1.CmpNoCase( text2 );
......
...@@ -60,11 +60,11 @@ static bool s_ListByRef = true; ...@@ -60,11 +60,11 @@ static bool s_ListByRef = true;
static bool s_ListByValue = true; static bool s_ListByValue = true;
static bool s_ListWithSubCmponents; static bool s_ListWithSubCmponents;
static bool s_ListHierarchicalPinByName; static bool s_ListHierarchicalPinByName;
static bool s_ListBySheet; static bool s_ListHierarchicalPinBySheet;
static bool s_BrowseCreatedList; static bool s_BrowseCreatedList;
static int s_OutputFormOpt; static int s_OutputFormOpt;
static int s_OutputSeparatorOpt; static int s_OutputSeparatorOpt;
static bool s_Add_FpField_state; static bool s_Add_FpField_state = true;
static bool s_Add_F1_state; static bool s_Add_F1_state;
static bool s_Add_F2_state; static bool s_Add_F2_state;
static bool s_Add_F3_state; static bool s_Add_F3_state;
...@@ -93,10 +93,17 @@ static bool* s_AddFieldList[] = ...@@ -93,10 +93,17 @@ static bool* s_AddFieldList[] =
}; };
#define OPTION_BOM_FORMAT wxT( "BomFormat" ) const wxString OPTION_BOM_LIST_REF( wxT("BomListPerRef") );
#define OPTION_BOM_LAUNCH_BROWSER wxT( "BomLaunchBrowser" ) const wxString OPTION_BOM_LIST_VALUE( wxT("BomListPerValue") );
#define OPTION_BOM_SEPARATOR wxT( "BomExportSeparator" ) const wxString OPTION_BOM_LIST_HPINS( wxT("BomListPerHPins") );
#define OPTION_BOM_ADD_FIELD wxT( "BomAddField" ) const wxString OPTION_BOM_LIST_HPINS_BY_SHEET( wxT("BomListHPinsPerSheet") );
const wxString OPTION_BOM_LIST_HPINS_BY_NAME_( wxT("BomListHPinsPerName") );
const wxString OPTION_BOM_LIST_SUB_CMP( wxT("BomListSubCmps") );
const wxString OPTION_BOM_FORMAT( wxT("BomFormat") );
const wxString OPTION_BOM_LAUNCH_BROWSER( wxT("BomLaunchBrowser") );
const wxString OPTION_BOM_SEPARATOR( wxT("BomExportSeparator") );
const wxString OPTION_BOM_ADD_FIELD ( wxT("BomAddField") );
/* list of separators used in bom export to spreadsheet /* list of separators used in bom export to spreadsheet
* (selected by s_OutputSeparatorOpt, and s_OutputSeparatorOpt radiobox) * (selected by s_OutputSeparatorOpt, and s_OutputSeparatorOpt radiobox)
...@@ -135,8 +142,16 @@ void DIALOG_BUILD_BOM::Init() ...@@ -135,8 +142,16 @@ 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_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 ); s_OutputFormOpt = m_Config->Read( OPTION_BOM_FORMAT, (long) 0 );
s_BrowseCreatedList = m_Config->Read( OPTION_BOM_LAUNCH_BROWSER, (long) 0 ); 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, (long) 0 );
long addfields = m_Config->Read( OPTION_BOM_ADD_FIELD, (long) 0 ); long addfields = m_Config->Read( OPTION_BOM_ADD_FIELD, (long) 0 );
...@@ -155,7 +170,7 @@ void DIALOG_BUILD_BOM::Init() ...@@ -155,7 +170,7 @@ void DIALOG_BUILD_BOM::Init()
m_ListSubCmpItems->SetValidator( wxGenericValidator( &s_ListWithSubCmponents ) ); m_ListSubCmpItems->SetValidator( wxGenericValidator( &s_ListWithSubCmponents ) );
m_ListCmpbyValItems->SetValidator( wxGenericValidator( &s_ListByValue ) ); m_ListCmpbyValItems->SetValidator( wxGenericValidator( &s_ListByValue ) );
m_GenListLabelsbyVal->SetValidator( wxGenericValidator( &s_ListHierarchicalPinByName ) ); m_GenListLabelsbyVal->SetValidator( wxGenericValidator( &s_ListHierarchicalPinByName ) );
m_GenListLabelsbySheet->SetValidator( wxGenericValidator( &s_ListBySheet ) ); m_GenListLabelsbySheet->SetValidator( wxGenericValidator( &s_ListHierarchicalPinBySheet ) );
m_OutputFormCtrl->SetValidator( wxGenericValidator( &s_OutputFormOpt ) ); m_OutputFormCtrl->SetValidator( wxGenericValidator( &s_OutputFormOpt ) );
m_OutputSeparatorCtrl->SetValidator( wxGenericValidator( &s_OutputSeparatorOpt ) ); m_OutputSeparatorCtrl->SetValidator( wxGenericValidator( &s_OutputSeparatorOpt ) );
m_GetListBrowser->SetValidator( wxGenericValidator( &s_BrowseCreatedList ) ); m_GetListBrowser->SetValidator( wxGenericValidator( &s_BrowseCreatedList ) );
...@@ -185,19 +200,34 @@ void DIALOG_BUILD_BOM::Init() ...@@ -185,19 +200,34 @@ void DIALOG_BUILD_BOM::Init()
void DIALOG_BUILD_BOM::OnRadioboxSelectFormatSelected( wxCommandEvent& event ) void DIALOG_BUILD_BOM::OnRadioboxSelectFormatSelected( wxCommandEvent& event )
{ {
if( m_OutputFormCtrl->GetSelection() == 0 ) switch( m_OutputFormCtrl->GetSelection() )
{
m_OutputSeparatorCtrl->Enable( false );
m_ListCmpbyValItems->Enable( true );
m_GenListLabelsbyVal->Enable( true );
m_GenListLabelsbySheet->Enable( true );
}
else
{ {
m_OutputSeparatorCtrl->Enable( true ); case 0:
m_ListCmpbyValItems->Enable( false ); m_OutputSeparatorCtrl->Enable( false );
m_GenListLabelsbyVal->Enable( false ); m_ListCmpbyRefItems->Enable( true );
m_GenListLabelsbySheet->Enable( false ); m_ListCmpbyValItems->Enable( true );
m_GenListLabelsbyVal->Enable( true );
m_GenListLabelsbySheet->Enable( true );
m_ListSubCmpItems->Enable( true );
break;
case 1:
m_OutputSeparatorCtrl->Enable( true );
m_ListCmpbyRefItems->Enable( false );
m_ListCmpbyValItems->Enable( false );
m_GenListLabelsbyVal->Enable( false );
m_GenListLabelsbySheet->Enable( false );
m_ListSubCmpItems->Enable( true );
break;
case 2:
m_OutputSeparatorCtrl->Enable( true );
m_ListCmpbyRefItems->Enable( false );
m_ListCmpbyValItems->Enable( false );
m_GenListLabelsbyVal->Enable( false );
m_GenListLabelsbySheet->Enable( false );
m_ListSubCmpItems->Enable( false );
break;
} }
} }
...@@ -237,13 +267,11 @@ void DIALOG_BUILD_BOM::SavePreferences() ...@@ -237,13 +267,11 @@ void DIALOG_BUILD_BOM::SavePreferences()
wxASSERT( m_Config != NULL ); wxASSERT( m_Config != NULL );
// Determine current settings of "List items" and "Options" checkboxes // Determine current settings of "List items" and "Options" checkboxes
// (NOTE: These 6 settings are restored when the dialog box is next
// invoked, but are *not* still saved after Eeschema is next shut down.)
s_ListByRef = m_ListCmpbyRefItems->GetValue(); s_ListByRef = m_ListCmpbyRefItems->GetValue();
s_ListWithSubCmponents = m_ListSubCmpItems->GetValue(); s_ListWithSubCmponents = m_ListSubCmpItems->GetValue();
s_ListByValue = m_ListCmpbyValItems->GetValue(); s_ListByValue = m_ListCmpbyValItems->GetValue();
s_ListHierarchicalPinByName = m_GenListLabelsbyVal->GetValue(); s_ListHierarchicalPinByName = m_GenListLabelsbyVal->GetValue();
s_ListBySheet = m_GenListLabelsbySheet->GetValue(); s_ListHierarchicalPinBySheet = m_GenListLabelsbySheet->GetValue();
s_BrowseCreatedList = m_GetListBrowser->GetValue(); s_BrowseCreatedList = m_GetListBrowser->GetValue();
// (saved in config ): // (saved in config ):
...@@ -268,6 +296,13 @@ void DIALOG_BUILD_BOM::SavePreferences() ...@@ -268,6 +296,13 @@ 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_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_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 );
...@@ -343,15 +378,15 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, ...@@ -343,15 +378,15 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile,
switch( aTypeFile ) switch( aTypeFile )
{ {
case 0: // list case 0: // list
GenereListeOfItems( m_ListFileName, aIncludeSubComponents ); GenereListeOfItems( aIncludeSubComponents );
break; break;
case 1: // spreadsheet case 1: // spreadsheet, Single Part per line
CreateExportList( m_ListFileName, aIncludeSubComponents ); CreateExportList( aIncludeSubComponents );
break; break;
case 2: // Single Part per line case 2: // spreadsheet, one value per line and no sub-component
CreatePartsList( m_ListFileName, aIncludeSubComponents ); CreatePartsList();
break; break;
} }
...@@ -404,31 +439,37 @@ bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId) ...@@ -404,31 +439,37 @@ bool DIALOG_BUILD_BOM::IsFieldChecked(int aFieldId)
} }
void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents ) /* Prints a list of components, in a form which can be imported by a spreadsheet.
* components having the same value and the same footprint
* are grouped on the same line
* Form is:
* value; number of components; list of references; <footprint>; <field1>; ...;
* list is sorted by values
*/
void DIALOG_BUILD_BOM::CreatePartsList( )
{ {
FILE* f; FILE* f;
wxString msg; wxString msg;
if( ( f = wxFopen( aFullFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL )
{ {
msg = _( "Failed to open file " ); msg = _( "Failed to open file " );
msg << aFullFileName; msg << m_ListFileName;
DisplayError( this, msg ); DisplayError( this, msg );
return; return;
} }
SCH_REFERENCE_LIST cmplist; SCH_REFERENCE_LIST cmplist;
SCH_SHEET_LIST sheetList; // uses a global SCH_SHEET_LIST sheetList;
sheetList.GetComponents( cmplist, false ); sheetList.GetComponents( cmplist, false );
// sort component list by ref and remove sub components // sort component list by ref and remove sub components
if( !aIncludeSubComponents ) cmplist.RemoveSubComponentsFromList();
cmplist.RemoveSubComponentsFromList();
// sort component list by value // sort component list by value
cmplist.SortByValueAndRef( ); cmplist.SortByValueAndRef( );
PrintComponentsListByPart( f, cmplist, aIncludeSubComponents ); PrintComponentsListByPart( f, cmplist, false );
fclose( f ); fclose( f );
} }
...@@ -437,18 +478,18 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName, bool aInc ...@@ -437,18 +478,18 @@ void DIALOG_BUILD_BOM::CreatePartsList( const wxString& aFullFileName, bool aInc
/* /*
* 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:
* cmp name; cmp val; fields; * cmp ref; cmp val; fields;
* Components are sorted by reference
*/ */
void DIALOG_BUILD_BOM::CreateExportList( const wxString& aFullFileName, void DIALOG_BUILD_BOM::CreateExportList( bool aIncludeSubComponents )
bool aIncludeSubComponents )
{ {
FILE* f; FILE* f;
wxString msg; wxString msg;
if( ( f = wxFopen( aFullFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL )
{ {
msg = _( "Failed to open file " ); msg = _( "Failed to open file " );
msg << aFullFileName; msg << m_ListFileName;
DisplayError( this, msg ); DisplayError( this, msg );
return; return;
} }
...@@ -471,21 +512,21 @@ void DIALOG_BUILD_BOM::CreateExportList( const wxString& aFullFileName, ...@@ -471,21 +512,21 @@ void DIALOG_BUILD_BOM::CreateExportList( const wxString& aFullFileName,
} }
/** 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 and pin sheets" )
*/ */
void DIALOG_BUILD_BOM::GenereListeOfItems( const wxString& aFullFileName, void DIALOG_BUILD_BOM::GenereListeOfItems( bool aIncludeSubComponents )
bool aIncludeSubComponents )
{ {
FILE* f; FILE* f;
int itemCount; int itemCount;
wxString msg; wxString msg;
if( ( f = wxFopen( aFullFileName, wxT( "wt" ) ) ) == NULL ) if( ( f = wxFopen( m_ListFileName, wxT( "wt" ) ) ) == NULL )
{ {
msg = _( "Failed to open file " ); msg = _( "Failed to open file " );
msg << aFullFileName; msg << m_ListFileName;
DisplayError( this, msg ); DisplayError( this, msg );
return; return;
} }
...@@ -559,39 +600,23 @@ order = Alphab. ) count = %d\n\n" ), ...@@ -559,39 +600,23 @@ order = Alphab. ) count = %d\n\n" ),
fclose( f ); fclose( f );
} }
#if defined(KICAD_GOST)
wxString DIALOG_BUILD_BOM::PrintFieldData( SCH_COMPONENT* DrawLibItem, wxString DIALOG_BUILD_BOM::PrintFieldData( SCH_COMPONENT* DrawLibItem,
#else
void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem,
#endif
bool CompactForm ) bool CompactForm )
{ {
#if defined(KICAD_GOST)
wxString outStr; wxString outStr;
wxString tmpStr; wxString tmpStr;
#endif
if( IsFieldChecked( FOOTPRINT ) ) if( IsFieldChecked( FOOTPRINT ) )
{ {
if( CompactForm ) if( CompactForm )
{ {
#if defined(KICAD_GOST)
outStr.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol, outStr.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol,
GetChars( DrawLibItem->GetField( FOOTPRINT )->m_Text ) ); GetChars( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
#else
fprintf( f, "%c%s", s_ExportSeparatorSymbol,
TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
#endif
} }
else else
{ {
#if defined(KICAD_GOST)
outStr.Printf( wxT( "; %-12s" ), outStr.Printf( wxT( "; %-12s" ),
GetChars( DrawLibItem->GetField( FOOTPRINT )->m_Text ) ); GetChars( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
#else
fprintf( f, "; %-12s",
TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
#endif
} }
} }
...@@ -601,31 +626,19 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, ...@@ -601,31 +626,19 @@ void DIALOG_BUILD_BOM::PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem,
continue; continue;
if( CompactForm ) if( CompactForm )
#if defined(KICAD_GOST)
{ {
tmpStr.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol, tmpStr.Printf( wxT( "%c%s" ), s_ExportSeparatorSymbol,
GetChars( DrawLibItem->GetField( ii )->m_Text ) ); GetChars( DrawLibItem->GetField( ii )->m_Text ) );
outStr += tmpStr; outStr += tmpStr;
} }
#else
fprintf( f, "%c%s", s_ExportSeparatorSymbol,
TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) );
#endif
else else
#if defined(KICAD_GOST)
{ {
tmpStr.Printf( wxT( "; %-12s" ), tmpStr.Printf( wxT( "; %-12s" ),
GetChars( DrawLibItem->GetField( ii )->m_Text ) ); GetChars( DrawLibItem->GetField( ii )->m_Text ) );
outStr += tmpStr; outStr += tmpStr;
} }
#else
fprintf( f, "; %-12s",
TO_UTF8( DrawLibItem->GetField( ii )->m_Text ) );
#endif
} }
#if defined(KICAD_GOST)
return outStr; return outStr;
#endif
} }
...@@ -813,8 +826,8 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f, ...@@ -813,8 +826,8 @@ int DIALOG_BUILD_BOM::PrintComponentsListByRef( FILE* f,
fprintf( f, "\n" ); fprintf( f, "\n" );
} }
#else #else
PrintFieldData( f, comp, CompactForm ); wxString tmpStr = PrintFieldData( comp, CompactForm );
fprintf( f, "\n" ); fprintf( f, "%s\n", TO_UTF8( tmpStr ) );
#endif #endif
} }
...@@ -960,14 +973,8 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f, ...@@ -960,14 +973,8 @@ int DIALOG_BUILD_BOM::PrintComponentsListByVal( FILE* f,
} }
} }
#if defined(KICAD_GOST) fprintf( f, "%s\n", TO_UTF8( PrintFieldData( DrawLibItem ) ) );
fprintf( f, "%s", TO_UTF8( PrintFieldData( DrawLibItem ) ) ); }
#else
PrintFieldData( f, DrawLibItem );
#endif
fputs( "\n", f );
}
msg = _( "#End Cmp\n" ); msg = _( "#End Cmp\n" );
fputs( TO_UTF8( msg ), f ); fputs( TO_UTF8( msg ), f );
......
...@@ -20,7 +20,7 @@ class DIALOG_BUILD_BOM : public DIALOG_BUILD_BOM_BASE ...@@ -20,7 +20,7 @@ class DIALOG_BUILD_BOM : public DIALOG_BUILD_BOM_BASE
private: private:
EDA_DRAW_FRAME* m_Parent; EDA_DRAW_FRAME* m_Parent;
wxConfig* m_Config; wxConfig* m_Config;
wxString m_ListFileName; wxString m_ListFileName; // The full filename of the file report.
private: private:
void OnRadioboxSelectFormatSelected( wxCommandEvent& event ); void OnRadioboxSelectFormatSelected( wxCommandEvent& event );
...@@ -34,17 +34,27 @@ private: ...@@ -34,17 +34,27 @@ private:
char aExportSeparatorSymbol, char aExportSeparatorSymbol,
bool aRunBrowser ); bool aRunBrowser );
void GenereListeOfItems( const wxString& FullFileName, bool aIncludeSubComponents ); void GenereListeOfItems( bool aIncludeSubComponents );
void CreateExportList( const wxString& FullFileName, bool aIncludeSubComponents );
/** /**
* Function CreateParstList * Function CreateExportList
* prints a list of components, in a form which can be imported by a * prints a list of components, in a form which can be imported by a
* spreadsheet. Form is: * spreadsheet. Form is:
* cmp value; number of components; \<footprint\>; \<field1\>; ...; * reference; cmp value; \<footprint\>; \<field1\>; ...;
* list of references having the same value * Components are sorted by reference
*/ */
void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents ); void CreateExportList( bool aIncludeSubComponents );
/**
* Function CreatePartsList
* prints a list of components, in a form which can be imported by a spreadsheet.
* components having the same value and the same footprint
* are grouped on the same line
* Form is:
* value; number of components; list of references; \<footprint\>; \<field1\>; ...;
* list is sorted by values
*/
void CreatePartsList();
int PrintComponentsListByRef( FILE* f, SCH_REFERENCE_LIST& aList, int PrintComponentsListByRef( FILE* f, SCH_REFERENCE_LIST& aList,
bool CompactForm, bool aIncludeSubComponents ); bool CompactForm, bool aIncludeSubComponents );
...@@ -55,11 +65,7 @@ private: ...@@ -55,11 +65,7 @@ private:
int PrintComponentsListByPart( FILE* f, SCH_REFERENCE_LIST& aList, int PrintComponentsListByPart( FILE* f, SCH_REFERENCE_LIST& aList,
bool aIncludeSubComponents ); bool aIncludeSubComponents );
#if defined(KICAD_GOST)
wxString PrintFieldData( SCH_COMPONENT* DrawLibItem, bool CompactForm = false ); wxString PrintFieldData( SCH_COMPONENT* DrawLibItem, bool CompactForm = false );
#else
void PrintFieldData( FILE* f, SCH_COMPONENT* DrawLibItem, bool CompactForm = false );
#endif
bool IsFieldChecked( int aFieldId ); bool IsFieldChecked( int aFieldId );
......
...@@ -416,13 +416,15 @@ public: ...@@ -416,13 +416,15 @@ public:
* Function SortByValueOnly * Function SortByValueOnly
* sort the list of references by value. * sort the list of references by value.
* <p> * <p>
* Components are sorted in the following order: * Components are grouped by type and are sorted in the following order:
* <ul> * <ul>
* <li>Value of component.</li> * <li>Value of component.</li>
* <li>Numeric value of reference designator.</li> * <li>Numeric value of reference designator.</li>
* <li>Unit number when component has multiple parts.</li> * <li>Unit number when component has multiple parts.</li>
* </ul> * </ul>
* </p> * </p>
* groups are made by the first letter of reference
* or the 2 first letters when existing
*/ */
void SortByValueOnly() void SortByValueOnly()
{ {
......
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