Eeschema: fixed bug 577083. Also fixed a bad import of predefined fields when loading a component from a library, when this component has some empty fields like footprint and documentation but have user fields not void.

This commit is contained in:
jean-pierre charras 2010-05-08 18:35:09 +02:00
commit cc1327b462
5 changed files with 21 additions and 20 deletions

View File

@ -137,10 +137,9 @@ bool LIB_FIELD::Load( char* line, wxString& errorMsg )
char fieldUserName[1024]; char fieldUserName[1024];
char* text; char* text;
if( sscanf( line + 1, "%d", &m_FieldId ) != 1 if( sscanf( line + 1, "%d", &m_FieldId ) != 1 || m_FieldId < 0 )
|| m_FieldId < REFERENCE || m_FieldId >= NUMBER_OF_FIELDS )
{ {
errorMsg = _( "invalid field number defined" ); errorMsg = wxT( "invalid field header" );
return false; return false;
} }

View File

@ -63,8 +63,6 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent,
const wxPoint& pos, bool setNewItemFlag ) : const wxPoint& pos, bool setNewItemFlag ) :
SCH_ITEM( NULL, TYPE_SCH_COMPONENT ) SCH_ITEM( NULL, TYPE_SCH_COMPONENT )
{ {
size_t i;
LIB_FIELD_LIST libFields;
Init( pos ); Init( pos );
@ -76,32 +74,34 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent,
if( setNewItemFlag ) if( setNewItemFlag )
m_Flags = IS_NEW | IS_MOVED; m_Flags = IS_NEW | IS_MOVED;
// Import predefined fields from the library component:
LIB_FIELD_LIST libFields;
libComponent.GetFields( libFields ); libComponent.GetFields( libFields );
for( i = 0; i < libFields.size(); i++ ) for( size_t i = 0; i < libFields.size(); i++ )
{ {
if( libFields[i].m_Text.IsEmpty() && libFields[i].m_Name.IsEmpty() ) if( libFields[i].m_Text.IsEmpty() && libFields[i].m_Name.IsEmpty() )
continue; continue;
int field_idx = libFields[i].m_FieldId;
/* Add extra fields if library component has more than the default /* Add extra fields if library component has more than the default
* number of fields. * number of fields.
*/ */
if( (int) i >= GetFieldCount() ) if( field_idx >= GetFieldCount() )
{ {
while( (int) i >= GetFieldCount() ) while( field_idx >= GetFieldCount() )
{ {
SCH_FIELD field( wxPoint( 0, 0 ), GetFieldCount(), this, SCH_FIELD field( wxPoint( 0, 0 ), GetFieldCount(), this,
ReturnDefaultFieldName( i ) ); ReturnDefaultFieldName( field_idx ) );
AddField( field ); AddField( field );
} }
} }
SCH_FIELD* schField = GetField( field_idx );
SCH_FIELD* schField = GetField( i );
schField->m_Pos = m_Pos + libFields[i].m_Pos; schField->m_Pos = m_Pos + libFields[i].m_Pos;
schField->ImportValues( libFields[i] ); schField->ImportValues( libFields[i] );
schField->m_Text = libFields[i].m_Text; schField->m_Text = libFields[i].m_Text;
schField->m_Name = ( i < FIELD1 ) ? ReturnDefaultFieldName( i ) : schField->m_Name = ( field_idx < FIELD1 ) ? ReturnDefaultFieldName( field_idx ) :
libFields[i].m_Name; libFields[i].m_Name;
} }
@ -156,9 +156,9 @@ void SCH_COMPONENT::Init( const wxPoint& pos )
m_Transform[1][0] = 0; m_Transform[1][0] = 0;
m_Transform[1][1] = -1; m_Transform[1][1] = -1;
m_Fields.reserve( NUMBER_OF_FIELDS ); m_Fields.reserve( DEFAULT_NUMBER_OF_FIELDS );
for( int i = 0; i < NUMBER_OF_FIELDS; ++i ) for( int i = 0; i < DEFAULT_NUMBER_OF_FIELDS; ++i )
{ {
SCH_FIELD field( pos, i, this, ReturnDefaultFieldName( i ) ); SCH_FIELD field( pos, i, this, ReturnDefaultFieldName( i ) );
@ -1174,7 +1174,7 @@ bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void * aAuxData )
if( !( aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS ) ) if( !( aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS ) )
return false; return false;
for( size_t i = VALUE+1; i < NUMBER_OF_FIELDS; i++ ) for( size_t i = VALUE+1; i < m_Fields.size(); i++ )
{ {
if( GetField( i )->Matches( aSearchData, aAuxData ) ) if( GetField( i )->Matches( aSearchData, aAuxData ) )
return true; return true;

View File

@ -35,6 +35,8 @@ struct Error
/** /**
* Enum NumFieldType * Enum NumFieldType
* is the numbered set of all fields a SCH_COMPONENT can hold * is the numbered set of all fields a SCH_COMPONENT can hold
* Note more than 8 user fields are allowed, but for efficiency reasons
* the defualt number of users fields is 8
*/ */
enum NumFieldType { enum NumFieldType {
REFERENCE = 0, ///< Field Reference of part, i.e. "IC21" REFERENCE = 0, ///< Field Reference of part, i.e. "IC21"
@ -51,7 +53,7 @@ enum NumFieldType {
FIELD7, FIELD7,
FIELD8, FIELD8,
NUMBER_OF_FIELDS DEFAULT_NUMBER_OF_FIELDS
}; };

View File

@ -421,7 +421,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers( void )
m_LibEntry->GetFields( fields ); m_LibEntry->GetFields( fields );
// copy all the fields to a work area // copy all the fields to a work area
m_FieldsBuf.reserve(NUMBER_OF_FIELDS); m_FieldsBuf.reserve(DEFAULT_NUMBER_OF_FIELDS);
// Creates a working copy of fields // Creates a working copy of fields
for( size_t i = 0; i < fields.size(); i++ ) for( size_t i = 0; i < fields.size(); i++ )
@ -430,7 +430,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers( void )
// Display 12 fields (or more), and add missing fields // Display 12 fields (or more), and add missing fields
LIB_FIELD blank( 2 ); LIB_FIELD blank( 2 );
unsigned fcount = m_FieldsBuf.size(); unsigned fcount = m_FieldsBuf.size();
for( unsigned ii = 2; ii < NUMBER_OF_FIELDS; ii++ ) for( unsigned ii = 2; ii < DEFAULT_NUMBER_OF_FIELDS; ii++ )
{ {
unsigned jj; unsigned jj;
for ( jj = 2; jj < fcount; jj ++ ) for ( jj = 2; jj < fcount; jj ++ )
@ -449,7 +449,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers( void )
// Now, all fields with Id 0 to NUMBER_OF_FIELDS-1 exist // Now, all fields with Id 0 to NUMBER_OF_FIELDS-1 exist
// init default fields names // init default fields names
for( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) for( unsigned ii = 0; ii < m_FieldsBuf.size(); ii++ )
{ {
if( m_FieldsBuf[ii].m_Name.IsEmpty() || ii < FIELD1 ) if( m_FieldsBuf[ii].m_Name.IsEmpty() || ii < FIELD1 )
m_FieldsBuf[ii].m_Name = ReturnDefaultFieldName( ii ); m_FieldsBuf[ii].m_Name = ReturnDefaultFieldName( ii );

View File

@ -54,7 +54,7 @@ static void PlotLibPart( PLOTTER* plotter, SCH_COMPONENT* DrawLibItem )
Entry->Plot( plotter, DrawLibItem->m_Multi, DrawLibItem->m_Convert, Entry->Plot( plotter, DrawLibItem->m_Multi, DrawLibItem->m_Convert,
DrawLibItem->m_Pos, TransMat ); DrawLibItem->m_Pos, TransMat );
bool isMulti = Entry->GetPartCount() > 1; bool isMulti = Entry->GetPartCount() > 1;
for( int fieldId = 0; fieldId < NUMBER_OF_FIELDS; fieldId++ ) for( int fieldId = 0; fieldId < DrawLibItem->GetFieldCount(); fieldId++ )
{ {
PlotTextField( plotter, DrawLibItem, fieldId, isMulti, 0 ); PlotTextField( plotter, DrawLibItem, fieldId, isMulti, 0 );
} }