Loading eeschema/component_references_lister.cpp +39 −30 Original line number Diff line number Diff line Loading @@ -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 ..) Loading @@ -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 Loading @@ -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; } Loading eeschema/dialogs/dialog_build_BOM.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -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++; } Loading @@ -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 ) Loading Loading
eeschema/component_references_lister.cpp +39 −30 Original line number Diff line number Diff line Loading @@ -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 ..) Loading @@ -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 Loading @@ -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; } Loading
eeschema/dialogs/dialog_build_BOM.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -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++; } Loading @@ -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 ) Loading