diff --git a/eeschema/component_class.cpp b/eeschema/component_class.cpp index 5191cad3c3..eb7a013522 100644 --- a/eeschema/component_class.cpp +++ b/eeschema/component_class.cpp @@ -42,14 +42,15 @@ SCH_COMPONENT::SCH_COMPONENT( const wxPoint& aPos, SCH_ITEM* aParent ) : m_Fields.reserve( NUMBER_OF_FIELDS ); - for( int i=0; im_Text.IsEmpty() ) + if( !GetField( REFERENCE )->m_Text.IsEmpty() ) { - SetRef( sheet, GetField(REFERENCE)->m_Text ); - return GetField(REFERENCE)->m_Text; + SetRef( sheet, GetField( REFERENCE )->m_Text ); + return GetField( REFERENCE )->m_Text; } return m_PrefixString; } @@ -399,6 +399,17 @@ void SCH_COMPONENT::SwapData( SCH_COMPONENT* copyitem ) EXCHG( m_Transform[1][1], copyitem->m_Transform[1][1] ); m_Fields.swap( copyitem->m_Fields ); // std::vector's swap() + + // Reparent items after copying data (after swap() m_Pareny member does not points the right parent): + for( int ii = 0; ii < copyitem->GetFieldCount(); ++ii ) + { + copyitem->GetField(ii)->m_Parent = copyitem; + } + for( int ii = 0; ii < GetFieldCount(); ++ii ) + { + GetField(ii)->m_Parent = this; + } + } @@ -455,7 +466,7 @@ void SCH_COMPONENT::ClearAnnotation( DrawSheetPath* aSheet ) wxString multi = wxT( "1" ); - if ( KeepMulti ) // We cannot remove all annotations: part selection must be kept + if( KeepMulti ) // We cannot remove all annotations: part selection must be kept { wxString NewHref; wxString path; @@ -487,7 +498,6 @@ void SCH_COMPONENT::ClearAnnotation( DrawSheetPath* aSheet ) // UpdateAllScreenReferences for the active sheet. // But this call cannot made here. m_Fields[REFERENCE].m_Text = defRef; //for drawing. - } @@ -495,27 +505,14 @@ void SCH_COMPONENT::ClearAnnotation( DrawSheetPath* aSheet ) SCH_COMPONENT* SCH_COMPONENT::GenCopy() /**************************************************************/ { - -#if 0 - SCH_COMPONENT* new_item = new SCH_COMPONENT( m_Pos ); - - new_item->m_Multi = m_Multi; - new_item->m_ChipName = m_ChipName; - new_item->m_PrefixString = m_PrefixString; - - new_item->m_Convert = m_Convert; - new_item->m_Transform[0][0] = m_Transform[0][0]; - new_item->m_Transform[0][1] = m_Transform[0][1]; - new_item->m_Transform[1][0] = m_Transform[1][0]; - new_item->m_Transform[1][1] = m_Transform[1][1]; - new_item->m_TimeStamp = m_TimeStamp; - - new_item->m_Fields = m_Fields; -#else SCH_COMPONENT* new_item = new SCH_COMPONENT( *this ); - -#endif - + // Reset chain pointers: + new_item->Pback = new_item->Pnext = new_item->m_Son = NULL; + // Reparent items after copy: + for( int ii = 0; ii < new_item->GetFieldCount(); ++ii ) + { + new_item->GetField(ii)->m_Parent = new_item; + } return new_item; } @@ -785,7 +782,6 @@ void SCH_COMPONENT::Show( int nestLevel, std::ostream& os ) #endif - /****************************************/ bool SCH_COMPONENT::Save( FILE* f ) const /****************************************/ @@ -805,10 +801,10 @@ bool SCH_COMPONENT::Save( FILE* f ) const } else { - if( GetField(REFERENCE)->m_Text.IsEmpty() ) + if( GetField( REFERENCE )->m_Text.IsEmpty() ) strncpy( Name1, CONV_TO_UTF8( m_PrefixString ), sizeof(Name1) ); else - strncpy( Name1, CONV_TO_UTF8( GetField(REFERENCE)->m_Text ), sizeof(Name1) ); + strncpy( Name1, CONV_TO_UTF8( GetField( REFERENCE )->m_Text ), sizeof(Name1) ); } for( ii = 0; ii < (int) strlen( Name1 ); ii++ ) { @@ -878,11 +874,11 @@ bool SCH_COMPONENT::Save( FILE* f ) const } } - for( int fieldNdx=0; fieldNdxGetBoundaryBox() ); + bbox.Merge( GetField( ii )->GetBoundaryBox() ); } // ... add padding