Blob Blame History Raw
diff -ru kicad-2010.04.06/eeschema/build_BOM.cpp kicad-2010.04.06-new/eeschema/build_BOM.cpp
--- kicad-2010.04.06/eeschema/build_BOM.cpp	2010-03-19 21:15:30.000000000 +0100
+++ kicad-2010.04.06-new/eeschema/build_BOM.cpp	2010-05-01 11:11:13.000000000 +0200
@@ -71,7 +71,6 @@
 static bool SortLabelsBySheet( const LABEL_OBJECT& obj1,
                                const LABEL_OBJECT& obj2 );
 static void DeleteSubCmp( std::vector <OBJ_CMP_TO_LIST>& aList );
-
 static int  PrintListeGLabel( FILE* f, std::vector <LABEL_OBJECT>& aList );
 
 int         RefDesStringCompare( const char* obj1, const char* obj2 );
@@ -204,7 +203,7 @@
 
     /*  sort component list by value*/
     sort( cmplist.begin(), cmplist.end(), SortComponentsByValue );
-    PrintComponentsListByPart( f, cmplist );
+    PrintComponentsListByPart( f, cmplist, aIncludeSubComponents );
 
     fclose( f );
 }
@@ -369,6 +368,11 @@
 
             // Ensure always null terminate m_Ref.
             item.m_Reference[sizeof( item.m_Reference ) - 1 ] = 0;
+            // Skip pseudo components:
+            // pseudo components have a reference starting by #. Mainly power symbols
+            if( item.m_Reference[0] == '#' )
+                continue;
+            // Real component found, push it in list
             aList.push_back( item );
         }
     }
@@ -626,7 +630,6 @@
     bool                           CompactForm,
     bool                           aIncludeSubComponents )
 {
-    int             Multi, Unit;
     EDA_BaseStruct* DrawList;
     SCH_COMPONENT*  DrawLibItem;
     LIB_COMPONENT*  Entry;
@@ -683,66 +686,42 @@
             continue;
 
         DrawLibItem = (SCH_COMPONENT*) DrawList;
-        if( aList[ii].m_Reference[0] == '#' )
-            continue;
 
-        Multi = 0;
-        Unit  = ' ';
+        bool isMulti = false;
+        wxString subRef;
         Entry = CMP_LIBRARY::FindLibraryComponent( DrawLibItem->m_ChipName );
         if( Entry )
-            Multi = Entry->GetPartCount();
-
-        if( ( Multi > 1 ) && aIncludeSubComponents )
-#if defined(KICAD_GOST)
-
-
-
-            Unit = aList[ii].m_Unit + '1' - 1;
-#else
+            isMulti = Entry->IsMulti();
 
-
-
-            Unit = aList[ii].m_Unit + 'A' - 1;
-#endif
+        if( isMulti && aIncludeSubComponents )
+            subRef = LIB_COMPONENT::ReturnSubReference( aList[ii].m_Unit );
+        else
+            subRef.Empty();
 
         sprintf( CmpName, "%s", aList[ii].m_Reference );
-        if( !CompactForm || Unit != ' ' )
-            sprintf( CmpName + strlen( CmpName ), "%c", Unit );
+        if( !CompactForm )
+            sprintf( CmpName + strlen( CmpName ), "%s", CONV_TO_UTF8(subRef) );
 
         if( CompactForm )
 #if defined(KICAD_GOST)
-
-
-
             fprintf( f, "%s%c%s%c%s", CmpName, s_ExportSeparatorSymbol,
                     CONV_TO_UTF8( DrawLibItem->GetField(
                                       VALUE )->m_Text ), s_ExportSeparatorSymbol,
                     CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) );
 #else
-
-
-
             fprintf( f, "%s%c%s", CmpName, s_ExportSeparatorSymbol,
                     CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) );
 #endif
 
         else
 #if defined(KICAD_GOST)
-
-
-
             fprintf( f, "| %-10s %-12s %-20s", CmpName,
                     CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ),
                     CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET )->m_Text ) );
 #else
-
-
-
             fprintf( f, "| %-10s %-12s", CmpName,
                     CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ) );
 #endif
-
-
         if( aIncludeSubComponents )
         {
             msg = aList[ii].m_SheetPath.PathHumanReadable();
@@ -794,82 +773,76 @@
  */
 int DIALOG_BUILD_BOM::PrintComponentsListByPart(
     FILE*                          f,
-    std::vector <OBJ_CMP_TO_LIST>& aList )
+    std::vector <OBJ_CMP_TO_LIST>& aList,
+    bool aIncludeSubComponents)
 {
-    int             qty = 1;
+    int             qty = 0;
     wxString        RefName;
+    wxString        fullRefName;        // reference + part Id (for multiple parts per package
     wxString        ValName;
-    wxString        NxtName;
     wxString        RNames;
-    EDA_BaseStruct* DrawList;
-    EDA_BaseStruct* NxtList;
-    SCH_COMPONENT*  DrawLibItem;
-    SCH_COMPONENT*  NxtLibItem;
+    wxString        lastRef;
+    wxString        unitId;
+    SCH_COMPONENT*  currCmp, *nextCmp;
     SCH_COMPONENT   dummyCmp;        // A dummy component, to store fields
 
     for( unsigned ii = 0; ii < aList.size(); ii++ )
     {
-        DrawList = aList[ii].m_RootCmp;
-        if( DrawList == NULL )
-            continue;
-        if( DrawList->Type() != TYPE_SCH_COMPONENT )
-            continue;
-        if( aList[ii].m_Reference[0] == '#' )
-            continue;
-        DrawLibItem = (SCH_COMPONENT*) DrawList;
-        if( ( DrawLibItem->GetField( VALUE )->m_Text.IsEmpty() ) )
-            continue;
+        currCmp = (SCH_COMPONENT*) aList[ii].m_RootCmp;
+        if( ii < aList.size() -1 )
+            nextCmp = aList[ii+1].m_RootCmp;
+        else
+            nextCmp = NULL;
 
         // Store fields. Store non empty fields only.
-        for( int jj = FOOTPRINT; jj < DrawLibItem->GetFieldCount(); jj++ )
+        for( int jj = FOOTPRINT; jj < currCmp->GetFieldCount(); jj++ )
         {
-            if( !DrawLibItem->GetField( jj )->m_Text.IsEmpty() )
-                dummyCmp.GetField( jj )->m_Text = DrawLibItem->GetField( jj )->m_Text;
+            if( !currCmp->GetField( jj )->m_Text.IsEmpty() )
+                dummyCmp.GetField( jj )->m_Text = currCmp->GetField( jj )->m_Text;
         }
 
-        NxtLibItem = NULL;
-        for( unsigned ij = ii + 1; ij < aList.size(); ij++ )
+        RefName = CONV_FROM_UTF8( aList[ii].m_Reference );
+        ValName = currCmp->GetField( VALUE )->m_Text;
+
+        int multi = 0;
+        if( aIncludeSubComponents )
         {
-            NxtList = aList[ij].m_RootCmp;
-            if( NxtList == NULL )
-                continue;
-            if( NxtList->Type() != TYPE_SCH_COMPONENT )
-                continue;
-            if( aList[ij].m_Reference[0] == '#' )
-                continue;
-            NxtLibItem = (SCH_COMPONENT*) NxtList;
-            if( ( NxtLibItem->GetField( VALUE )->m_Text.IsEmpty() ) )
-            {
-                continue;
-            }
-            break;
+            LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( currCmp->m_ChipName );
+            if( Entry )
+                multi = Entry->GetPartCount();
+            if ( multi <= 1 )
+                multi = 0;
         }
 
-        if( NxtLibItem != NULL )
-            NxtName = NxtLibItem->GetField( VALUE )->m_Text;
-        else
-            NxtName = wxT( "" );
+        if ( multi && aList[ii].m_Unit > 0 )
+            unitId.Printf(wxT("%c"), 'A' -1 + aList[ii].m_Unit);
+        else unitId.Empty();
+        fullRefName = RefName + unitId;
 
-        RefName = CONV_FROM_UTF8( aList[ii].m_Reference );
-        ValName = DrawLibItem->GetField( VALUE )->m_Text;
-
-        if( !NxtName.CmpNoCase( ValName ) )
-        {
+        if( RNames.IsEmpty() )
+            RNames = fullRefName;
+        else
+            RNames << wxT( ", " ) << fullRefName;
+        // In multi parts per package, we have the reference more than once
+        // but we must count only one package
+        if( lastRef != RefName )
             qty++;
-            RNames << wxT( ", " ) << RefName;
-            continue;
-        }
+        lastRef = RefName;
 
-        fprintf( f, "%15s%c%3d", CONV_TO_UTF8( ValName ), s_ExportSeparatorSymbol, qty );
-        qty = 1;
+        // if the next cmoponent has same value the line will be printed after.
+        if( nextCmp && nextCmp->GetField( VALUE )->m_Text.CmpNoCase( ValName ) == 0 )
+            continue;
+ 
+       // Print line for the current component value:
+       fprintf( f, "%15s%c%3d", CONV_TO_UTF8( ValName ), s_ExportSeparatorSymbol, qty );
 
         if( IsFieldChecked(FOOTPRINT ) )
             fprintf( f, "%c%15s", s_ExportSeparatorSymbol,
-                    CONV_TO_UTF8( DrawLibItem->GetField( FOOTPRINT )->m_Text ) );
+                    CONV_TO_UTF8( currCmp->GetField( FOOTPRINT )->m_Text ) );
 
 #if defined(KICAD_GOST)
             fprintf( f, "%c%20s", s_ExportSeparatorSymbol,
-                    CONV_TO_UTF8( DrawLibItem->GetField( DATASHEET) ->m_Text ) );
+                    CONV_TO_UTF8( currCmp->GetField( DATASHEET) ->m_Text ) );
 #endif
 
         // print fields, on demand
@@ -880,14 +853,13 @@
                         CONV_TO_UTF8( dummyCmp.GetField( jj )->m_Text ) );
         }
 
-        fprintf( f, "%c%s%s", s_ExportSeparatorSymbol,
-                CONV_TO_UTF8( RefName ),
+        fprintf( f, "%c%s\n", s_ExportSeparatorSymbol,
                 CONV_TO_UTF8( RNames ) );
-        fputs( "\n", f );
 
-        // Clear strings, to prepare next component
+        // Clear strings and values, to prepare next component
+        qty = 0;
         RNames.Empty();
-        for( int jj = FOOTPRINT; jj < DrawLibItem->GetFieldCount(); jj++ )
+        for( int jj = FOOTPRINT; jj < currCmp->GetFieldCount(); jj++ )
             dummyCmp.GetField( jj )->m_Text.Empty();
     }
 
@@ -900,8 +872,6 @@
     std::vector <OBJ_CMP_TO_LIST>& aList,
     bool                           aIncludeSubComponents )
 {
-    int             Multi;
-    wxChar          Unit;
     EDA_BaseStruct* DrawList;
     SCH_COMPONENT*  DrawLibItem;
     LIB_COMPONENT*  Entry;
@@ -926,28 +896,20 @@
             continue;
 
         DrawLibItem = (SCH_COMPONENT*) DrawList;
-        if( aList[ii].m_Reference[0] == '#' )
-            continue;
 
-        Multi = 0;
-        Unit  = ' ';
+        bool isMulti = false;
         Entry = CMP_LIBRARY::FindLibraryComponent( DrawLibItem->m_ChipName );
         if( Entry )
-            Multi = Entry->GetPartCount();
+            isMulti = Entry->IsMulti();
 
-        if( ( Multi > 1 ) && aIncludeSubComponents )
-        {
-#if defined(KICAD_GOST)
-            Unit = aList[ii].m_Unit + '1' - 1;
-        }
+        wxString subRef;
+        if( isMulti && aIncludeSubComponents )
+            subRef = LIB_COMPONENT::ReturnSubReference( aList[ii].m_Unit );
+        else
+            subRef.Empty();
 
-        sprintf( CmpName, "%s.%c", aList[ii].m_Reference, Unit );
-#else
-            Unit = aList[ii].m_Unit + 'A' - 1;
-        }
+        sprintf( CmpName, "%s%s", aList[ii].m_Reference, CONV_TO_UTF8(subRef) );
 
-        sprintf( CmpName, "%s%c", aList[ii].m_Reference, Unit );
-#endif
         fprintf( f, "| %-12s %-10s",
                  CONV_TO_UTF8( DrawLibItem->GetField( VALUE )->m_Text ),
                  CmpName );
diff -ru kicad-2010.04.06/eeschema/class_libentry.cpp kicad-2010.04.06-new/eeschema/class_libentry.cpp
--- kicad-2010.04.06/eeschema/class_libentry.cpp	2010-03-28 17:46:49.000000000 +0200
+++ kicad-2010.04.06-new/eeschema/class_libentry.cpp	2010-05-01 11:13:41.000000000 +0200
@@ -230,6 +230,22 @@
 {
 }
 
+/** function IsMulti
+ * @return the sub reference for component having multiple parts per package.
+ * The sub reference identify the part (or unit)
+ * @param aUnit = the part identifier ( 1 to 26)
+ */
+wxString LIB_COMPONENT::ReturnSubReference( int aUnit )
+{
+    wxString subRef;
+ #if defined(KICAD_GOST)
+    subRef.Printf( wxT(".%d" ), aUnit);
+#else
+    subRef.Append( aUnit + 'A' - 1 );
+#endif
+    return subRef;
+}
+
 
 void LIB_COMPONENT::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDc,
                           const wxPoint& aOffset, int aMulti,
diff -ru kicad-2010.04.06/eeschema/class_libentry_fields.cpp kicad-2010.04.06-new/eeschema/class_libentry_fields.cpp
--- kicad-2010.04.06/eeschema/class_libentry_fields.cpp	2009-11-03 14:26:31.000000000 +0100
+++ kicad-2010.04.06-new/eeschema/class_libentry_fields.cpp	2010-05-01 11:15:27.000000000 +0200
@@ -502,20 +502,10 @@
         return m_Text;
 
     wxString text = m_Text;
+    text << wxT( "?" );
 
-    if( GetParent()->GetPartCount() > 1 )
-    {
-#if defined(KICAD_GOST)
-        text.Printf( wxT( "%s?.%c" ),
-                     m_Text.GetData(), unit + '1' - 1 );
-#else
-
-        text.Printf( wxT( "%s?%c" ),
-                     m_Text.GetData(), unit + 'A' - 1 );
-#endif
-    }
-    else
-        text << wxT( "?" );
+    if( GetParent()->IsMulti() )
+        text << LIB_COMPONENT::ReturnSubReference( unit );
 
     return text;
 }
diff -ru kicad-2010.04.06/eeschema/class_libentry.h kicad-2010.04.06-new/eeschema/class_libentry.h
--- kicad-2010.04.06/eeschema/class_libentry.h	2010-02-17 14:22:25.000000000 +0100
+++ kicad-2010.04.06-new/eeschema/class_libentry.h	2010-05-01 11:14:24.000000000 +0200
@@ -575,6 +575,20 @@
 
     int GetPartCount() { return unitCount; }
 
+    /** function IsMulti
+     * @return true if the component has multiple parts per package.
+     * When happens, the reference has a sub reference ti identify part
+     */
+    bool IsMulti() { return unitCount > 1; }
+
+    /** function IsMulti
+     * @return the sub reference for component having multiple parts per package.
+     * The sub reference identify the part (or unit)
+     * @param aUnit = the part identifier ( 1 to max count)
+     * Note: this is a static function.
+     */
+    static wxString ReturnSubReference( int aUnit );
+
     /**
      * Set or clear the alternate body style (DeMorgan) for the component.
      *
diff -ru kicad-2010.04.06/eeschema/class_sch_cmp_field.cpp kicad-2010.04.06-new/eeschema/class_sch_cmp_field.cpp
--- kicad-2010.04.06/eeschema/class_sch_cmp_field.cpp	2010-04-02 08:19:33.000000000 +0200
+++ kicad-2010.04.06-new/eeschema/class_sch_cmp_field.cpp	2010-05-01 11:17:00.000000000 +0200
@@ -140,14 +140,7 @@
         /* For more than one part per package, we must add the part selection
          * A, B, ... or 1, 2, .. to the reference. */
         wxString fulltext = m_Text;
-        char     part_id;
-#if defined(KICAD_GOST)
-        fulltext.Append( '.' );
-        part_id = '1' - 1 + parentComponent->m_Multi;
-#else
-        part_id = 'A' - 1 + parentComponent->m_Multi;
-#endif
-        fulltext.Append( part_id );
+        fulltext << LIB_COMPONENT::ReturnSubReference( parentComponent->m_Multi );
 
         DrawGraphicText( panel, DC, textpos, color, fulltext,
                          orient,
@@ -432,13 +425,7 @@
             /* For more than one part per package, we must add the part selection
              * A, B, ... or 1, 2, .. to the reference. */
             int part_id = pSch->GetUnitSelection( sheet );
-    #if defined(KICAD_GOST)
-            fulltext.Append( '.' );
-            part_id += '1' - 1;
-    #else
-            part_id += 'A' - 1;
-    #endif
-            fulltext.Append( (char)part_id );
+            fulltext << LIB_COMPONENT::ReturnSubReference( part_id );
         }
         return SCH_ITEM::Matches( fulltext, aSearchData );
     }
diff -ru kicad-2010.04.06/eeschema/dialog_build_BOM.h kicad-2010.04.06-new/eeschema/dialog_build_BOM.h
--- kicad-2010.04.06/eeschema/dialog_build_BOM.h	2010-03-19 21:15:30.000000000 +0100
+++ kicad-2010.04.06-new/eeschema/dialog_build_BOM.h	2010-05-01 11:17:49.000000000 +0200
@@ -34,7 +34,8 @@
                             bool CompactForm, bool aIncludeSubComponents );
     int PrintComponentsListByVal( FILE *f, std::vector <OBJ_CMP_TO_LIST>& aList,
                             bool aIncludeSubComponents);
-    int PrintComponentsListByPart( FILE *f, std::vector <OBJ_CMP_TO_LIST>& aList);
+    int PrintComponentsListByPart( FILE *f, std::vector <OBJ_CMP_TO_LIST>& aList,
+                            bool aIncludeSubComponents);
     void PrintFieldData(FILE * f, SCH_COMPONENT * DrawLibItem, bool CompactForm = FALSE);
     bool IsFieldChecked(int aFieldId);
 
diff -ru kicad-2010.04.06/eeschema/plot.cpp kicad-2010.04.06-new/eeschema/plot.cpp
--- kicad-2010.04.06/eeschema/plot.cpp	2010-03-04 10:32:51.000000000 +0100
+++ kicad-2010.04.06-new/eeschema/plot.cpp	2010-05-01 11:20:18.000000000 +0200
@@ -21,7 +21,7 @@
 static void Plot_Hierarchical_PIN_Sheet( PLOTTER* plotter,
                                          SCH_SHEET_PIN* Struct );
 static void PlotTextField( PLOTTER* plotter, SCH_COMPONENT* DrawLibItem,
-                           int FieldNumber, int IsMulti, int DrawMode );
+                           int FieldNumber, bool IsMulti, int DrawMode );
 
 
 static void PlotNoConnectStruct( PLOTTER* plotter, SCH_NO_CONNECT* Struct )
@@ -53,10 +53,10 @@
 
     Entry->Plot( plotter, DrawLibItem->m_Multi, DrawLibItem->m_Convert,
                  DrawLibItem->m_Pos, TransMat );
-
-    for( int i = 0; i < NUMBER_OF_FIELDS; i++ )
+    bool isMulti = Entry->GetPartCount() > 1;
+    for( int fieldId = 0; fieldId < NUMBER_OF_FIELDS; fieldId++ )
     {
-        PlotTextField( plotter, DrawLibItem, i, 0, 0 );
+        PlotTextField( plotter, DrawLibItem, fieldId, isMulti, 0 );
     }
 }
 
@@ -65,13 +65,13 @@
  * Input:
  * DrawLibItem: pointer to the component
  * FieldNumber: Number Field
- * IsMulti: No Null flag if there are several sides by housing.
+ * IsMulti: true flag if there are several parts per package.
  * Only useful for the field to add a reference to this one
  * The identification from (A, B ...)
  * DrawMode: trace mode
  */
 static void PlotTextField( PLOTTER* plotter, SCH_COMPONENT* DrawLibItem,
-                           int FieldNumber, int IsMulti, int DrawMode )
+                           int FieldNumber, bool IsMulti, int DrawMode )
 {
     SCH_FIELD* field = DrawLibItem->GetField( FieldNumber );
     EDA_Colors color = UNSPECIFIED_COLOR;
@@ -125,15 +125,7 @@
     {
         /* Adding A, B ... to the reference */
         wxString Text;
-        Text = field->m_Text;
-        char     unit_id;
-#if defined(KICAD_GOST)
-        Text.Append( '.' );
-        unit_id = '1' - 1 + DrawLibItem->m_Multi;
-#else
-        unit_id = 'A' - 1 + DrawLibItem->m_Multi;
-#endif
-        Text.Append( unit_id );
+        Text = field->m_Text + LIB_COMPONENT::ReturnSubReference( DrawLibItem->m_Multi );
         plotter->text( textpos, color, Text,
                        orient,
                        field->m_Size, hjustify, vjustify,