Commit 9ec6139f authored by Marco Mattila's avatar Marco Mattila

Edit eeschema single part per line sorting code.

parent 9d8c684a
......@@ -242,6 +242,18 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
}
static bool splitRefStr( const wxString& aRef, wxString* aStr, int* aNumber )
{
static wxRegEx refRegEx( wxT( "^([a-zA-Z]+)([0-9]+)" ) );
if( !refRegEx.Matches( aRef ) )
return false;
*aStr = refRegEx.GetMatch( aRef, 1 );
*aNumber = wxAtoi( refRegEx.GetMatch( aRef, 2 ) );
return true;
}
/* 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 ..)
......@@ -250,28 +262,22 @@ static bool engStrToDouble( wxString aStr, double* aDouble )
bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
const SCH_REFERENCE& item2 )
{
// First, group by type, assuming 2 first letter of references
// 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];
// First, group by type according to reference text part (R, C, etc.)
wxString text1 = item1.GetComponent()->GetField( REFERENCE )->GetText();
wxString text2 = item2.GetComponent()->GetField( REFERENCE )->GetText();
wxString refNameStr1, refNameStr2;
int refNumber1, refNumber2;
// 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];
}
if( !splitRefStr( text1, &refNameStr1, &refNumber1 ) )
return false;
if( !splitRefStr( text2, &refNameStr2, &refNumber2 ) )
return false;
// 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 );
int ii = refNameStr1.CmpNoCase( refNameStr2 );
if( ii != 0 )
return ii < 0;
// We can compare here 2 values relative to components of the same type
// assuming references are correctly chosen
......@@ -292,25 +298,28 @@ bool SCH_REFERENCE_LIST::sortByValueOnly( const SCH_REFERENCE& item1,
if( !match1 && match2 )
return false;
if( match1 && match2 )
{
if( value1 == value2 )
return same_footprint < 0;
if( match1 && match2 && (value1 != value2) )
return value1 < value2;
}
// 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();
ii = text1.CmpNoCase( text2 );
if( ii != 0 )
return ii < 0;
if( refNumber1 != refNumber2 )
return refNumber1 < refNumber2;
// Fall back to normal string compare
int ii = text1.CmpNoCase( text2 );
ii = text1.CmpNoCase( text2 );
if( ii == 0 )
{
ii = RefDesStringCompare( item1.GetRef(), item2.GetRef() );
}
if( ii == 0 )
{
ii = item1.m_Unit - item2.m_Unit;
}
return ii < 0;
}
......
......@@ -872,14 +872,14 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* aFile, SCH_REFERENCE_LIST
while( index < aList.GetCount() )
{
SCH_COMPONENT *component = aList[index].GetComponent();
wxArrayString referenceStrList;
wxString referenceListStr;
int qty = 1;
referenceStrList.Add( aList[index].GetRef() );
referenceListStr.append( aList[index].GetRef() );
for( unsigned int i = index+1; i < aList.GetCount(); )
{
if( *(aList[i].GetComponent()) == *component )
{
referenceStrList.Add( aList[i].GetRef() );
referenceListStr.append( wxT( " " ) + aList[i].GetRef() );
aList.RemoveItem( i );
qty++;
}
......@@ -887,22 +887,10 @@ int DIALOG_BUILD_BOM::PrintComponentsListByPart( FILE* aFile, SCH_REFERENCE_LIST
i++; // Increment index only when current item is not removed from the list
}
referenceStrList.Sort( RefDesStringCompare ); // Sort references for this component
// Write value, quantity
fprintf( aFile, "%15s%c%3d", TO_UTF8( component->GetField( VALUE )->GetText() ),
s_ExportSeparatorSymbol, qty );
// Write list of references
for( int i = 0; i < referenceStrList.Count(); i++ )
{
if( i == 0 )
fprintf( aFile, "%c\"%s", s_ExportSeparatorSymbol, TO_UTF8( referenceStrList[i] ) );
else
fprintf( aFile, " %s", TO_UTF8( referenceStrList[i] ) );
}
if( referenceStrList.Count() )
fprintf( aFile, "\"" );
// 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 )
......
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