diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index 28d43a1de1..440e735a48 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -277,39 +277,17 @@ std::unique_ptr< LIB_PART > LIB_PART::Flatten() const wxCHECK_MSG( parent, retv, wxString::Format( "Parent of derived symbol '%s' undefined", m_name ) ); - retv.reset( new LIB_PART( *const_cast< LIB_PART* >( this ) ) ); + // Copy the parent. + retv.reset( new LIB_PART( *const_cast< LIB_PART* >( parent.get() ) ) ); - // Flattened symbols have no inheritance. - retv->SetParent( nullptr ); + // Now add the inherited part (this) information. + retv->SetName( m_name ); - // Flatten parent information into the derived symbol. - retv->SetUnitCount( parent->GetUnitCount() ); - - LIB_ITEM* newItem; - - for( LIB_ITEM& item : parent->GetDrawItems() ) - { - // Only add fields from the parent that are not present in the child. The child - // symbol fields are already set. - if( item.Type() == LIB_FIELD_T ) - { - LIB_FIELD* field = (LIB_FIELD*) &item; - - if( retv->GetField( field->GetId() ) ) - continue; - } - - newItem = (LIB_ITEM*) item.Clone(); - newItem->SetParent( retv.get() ); - retv->GetDrawItems().push_back( newItem ); - } - - if( parent->IsPower() ) - retv->SetPower(); - else - retv->SetNormal(); - - retv->LockUnits( parent->UnitsLocked() ); + const LIB_FIELD* datasheetField = GetField( DATASHEET ); + retv->GetField( DATASHEET )->SetText( datasheetField->GetText() ); + retv->SetDocFileName( m_docFileName ); + retv->SetKeyWords( m_keyWords ); + retv->SetDescription( m_description ); } else { @@ -803,9 +781,9 @@ void LIB_PART::GetFields( LIB_FIELDS& aList ) } -LIB_FIELD* LIB_PART::GetField( int aId ) +LIB_FIELD* LIB_PART::GetField( int aId ) const { - for( LIB_ITEM& item : m_drawings[ LIB_FIELD_T ] ) + for( const LIB_ITEM& item : m_drawings[ LIB_FIELD_T ] ) { LIB_FIELD* field = ( LIB_FIELD* ) &item; @@ -876,6 +854,15 @@ bool LIB_PART::HasConversion() const return true; } + if( PART_SPTR parent = m_parent.lock() ) + { + for( const LIB_ITEM& item : parent->GetDrawItems() ) + { + if( item.m_Convert > LIB_ITEM::LIB_CONVERT::BASE ) + return true; + } + } + return false; } diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index 9b7685d875..99b7901de8 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -271,7 +271,7 @@ public: * @param aId - Id of field to return. * @return The field if found, otherwise NULL. */ - LIB_FIELD* GetField( int aId ); + LIB_FIELD* GetField( int aId ) const; /** Return reference to the value field. */ LIB_FIELD& GetValueField(); diff --git a/eeschema/sch_legacy_plugin.cpp b/eeschema/sch_legacy_plugin.cpp index a206bd56c6..a23833b29c 100644 --- a/eeschema/sch_legacy_plugin.cpp +++ b/eeschema/sch_legacy_plugin.cpp @@ -2896,9 +2896,13 @@ void SCH_LEGACY_PLUGIN_CACHE::loadAliases( std::unique_ptr& aPart, if( field->GetId() < MANDATORY_FIELDS ) { + // Get all of the parent field information except for the string. *newPart->GetField( field->GetId() ) = *field; - if( field->GetId() == REFERENCE || field->GetId() == FOOTPRINT ) + // Restore the alias strings that are defined in this file format. + if( field->GetId() == REFERENCE + || field->GetId() == FOOTPRINT + || field->GetId() == VALUE ) newPart->GetField( field->GetId() )->SetText( tmp ); } } diff --git a/eeschema/sch_view.cpp b/eeschema/sch_view.cpp index 36915f7d1e..be19cf2c40 100644 --- a/eeschema/sch_view.cpp +++ b/eeschema/sch_view.cpp @@ -135,20 +135,21 @@ void SCH_VIEW::DisplayComponent( LIB_PART* aPart ) std::shared_ptr< LIB_PART > parent; LIB_PART* drawnPart = aPart; + // Draw the mandatory fields for aliases and parent symbols. + for( auto& item : aPart->GetDrawItems() ) + { + if( item.Type() != LIB_FIELD_T ) + continue; + + LIB_FIELD* field = (LIB_FIELD*) &item; + + if( field->GetId() < MANDATORY_FIELDS ) + Add( &item ); + } + + // Draw the parent items if the symbol is inherited from another symbol. if( aPart->IsAlias() ) { - // Draw the alias mandatory fields. - for( auto& item : aPart->GetDrawItems() ) - { - if( item.Type() != LIB_FIELD_T ) - continue; - - LIB_FIELD* field = (LIB_FIELD*) &item; - - if( field->GetId() < MANDATORY_FIELDS ) - Add( &item ); - } - parent = aPart->GetParent().lock(); wxCHECK( parent, /* void */ ); @@ -158,12 +159,12 @@ void SCH_VIEW::DisplayComponent( LIB_PART* aPart ) for( auto& item : drawnPart->GetDrawItems() ) { - // Do not overwrite the alias mandatory fields with the parent mandatory fields. + // The mandatory fields are already in place so we only add user defined fields. if( item.Type() == LIB_FIELD_T ) { LIB_FIELD* field = (LIB_FIELD*) &item; - if( aPart->IsAlias() && field->GetId() < MANDATORY_FIELDS ) + if( field->GetId() < MANDATORY_FIELDS ) continue; } diff --git a/eeschema/toolbars_viewlib.cpp b/eeschema/toolbars_viewlib.cpp index ed67d8674c..d45f105965 100644 --- a/eeschema/toolbars_viewlib.cpp +++ b/eeschema/toolbars_viewlib.cpp @@ -146,7 +146,7 @@ void LIB_VIEW_FRAME::ReCreateMenuBar() void LIB_VIEW_FRAME::SyncToolbars() { - std::unique_ptr< LIB_PART > symbol( GetSelectedSymbol() ); + LIB_PART* symbol = GetSelectedSymbol(); m_mainToolBar->Toggle( EE_ACTIONS::showDatasheet, symbol && !symbol->GetDocFileName().IsEmpty() ); diff --git a/eeschema/tools/ee_inspection_tool.cpp b/eeschema/tools/ee_inspection_tool.cpp index c0ba08a916..a13c61197d 100644 --- a/eeschema/tools/ee_inspection_tool.cpp +++ b/eeschema/tools/ee_inspection_tool.cpp @@ -252,8 +252,7 @@ int EE_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent ) } else if( m_frame->IsType( FRAME_SCH_VIEWER ) || m_frame->IsType( FRAME_SCH_VIEWER_MODAL ) ) { - std::unique_ptr< LIB_PART > entry = - static_cast( m_frame )->GetSelectedSymbol(); + LIB_PART* entry = static_cast( m_frame )->GetSelectedSymbol(); if( !entry ) return 0; diff --git a/eeschema/tools/lib_control.cpp b/eeschema/tools/lib_control.cpp index 5971590a22..00d6080aeb 100644 --- a/eeschema/tools/lib_control.cpp +++ b/eeschema/tools/lib_control.cpp @@ -373,7 +373,7 @@ int LIB_CONTROL::AddSymbolToSchematic( const TOOL_EVENT& aEvent ) } else { - part = viewFrame->GetSelectedSymbol().get(); + part = viewFrame->GetSelectedSymbol(); libId = part->GetLibId(); unit = viewFrame->GetUnit(); convert = viewFrame->GetConvert(); diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index 71ad06e6f3..89f4f13b67 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -207,7 +207,7 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame LIB_VIEW_FRAME::~LIB_VIEW_FRAME() { if( m_previewItem ) - GetCanvas()->GetView()->Remove( m_previewItem.get() ); + GetCanvas()->GetView()->Remove( m_previewItem ); } @@ -248,17 +248,12 @@ void LIB_VIEW_FRAME::SetUnitAndConvert( int aUnit, int aConvert ) } -std::unique_ptr< LIB_PART > LIB_VIEW_FRAME::GetSelectedSymbol() const +LIB_PART* LIB_VIEW_FRAME::GetSelectedSymbol() const { - std::unique_ptr< LIB_PART > symbol; + LIB_PART* symbol = nullptr; if( !m_libraryName.IsEmpty() && !m_entryName.IsEmpty() ) - { - LIB_PART* tmp = Prj().SchSymbolLibTable()->LoadSymbol( m_libraryName, m_entryName ); - - if( tmp ) - symbol = tmp->Flatten(); - } + symbol = Prj().SchSymbolLibTable()->LoadSymbol( m_libraryName, m_entryName ); return symbol; } @@ -266,12 +261,12 @@ std::unique_ptr< LIB_PART > LIB_VIEW_FRAME::GetSelectedSymbol() const void LIB_VIEW_FRAME::updatePreviewSymbol() { - std::unique_ptr< LIB_PART > symbol = GetSelectedSymbol(); + LIB_PART* symbol = GetSelectedSymbol(); KIGFX::SCH_VIEW* view = GetCanvas()->GetView(); if( m_previewItem ) { - view->Remove( m_previewItem.get() ); + view->Remove( m_previewItem ); m_previewItem = nullptr; } @@ -282,8 +277,8 @@ void LIB_VIEW_FRAME::updatePreviewSymbol() GetRenderSettings()->m_ShowUnit = m_unit; GetRenderSettings()->m_ShowConvert = m_convert; - m_previewItem.reset( symbol.release() ); - view->Add( m_previewItem.get() ); + m_previewItem = symbol; + view->Add( m_previewItem ); wxString parentName = _( "" ); std::shared_ptr< LIB_PART > parent = m_previewItem->GetParent().lock(); @@ -370,7 +365,7 @@ void LIB_VIEW_FRAME::OnSize( wxSizeEvent& SizeEv ) void LIB_VIEW_FRAME::onUpdateUnitChoice( wxUpdateUIEvent& aEvent ) { - std::unique_ptr< LIB_PART > part = GetSelectedSymbol(); + LIB_PART* part = GetSelectedSymbol(); int unit_count = 1; @@ -701,7 +696,7 @@ void LIB_VIEW_FRAME::SetFilter( const SCHLIB_FILTER* aFilter ) const BOX2I LIB_VIEW_FRAME::GetDocumentExtents() const { - std::unique_ptr< LIB_PART > part = GetSelectedSymbol(); + LIB_PART* part = GetSelectedSymbol(); if( !part ) { @@ -709,9 +704,14 @@ const BOX2I LIB_VIEW_FRAME::GetDocumentExtents() const } else { - EDA_RECT bbox = part->GetUnitBoundingBox( m_unit, m_convert ); - return BOX2I( bbox.GetOrigin(), VECTOR2I( bbox.GetWidth(), bbox.GetHeight() ) ); + std::shared_ptr< LIB_PART > tmp; + tmp = ( part->IsAlias() ) ? part->GetParent().lock() : part->SharedPtr(); + + wxCHECK( tmp, BOX2I( VECTOR2I(-200, -200), VECTOR2I( 400, 400 ) ) ); + + EDA_RECT bbox = tmp->GetUnitBoundingBox( m_unit, m_convert ); + return BOX2I( bbox.GetOrigin(), VECTOR2I( bbox.GetWidth(), bbox.GetHeight() ) ); } } diff --git a/eeschema/viewlib_frame.h b/eeschema/viewlib_frame.h index af9a1bb419..8e7334d8eb 100644 --- a/eeschema/viewlib_frame.h +++ b/eeschema/viewlib_frame.h @@ -137,7 +137,7 @@ public: int GetUnit() const { return m_unit; } int GetConvert() const { return m_convert; } - std::unique_ptr< LIB_PART > GetSelectedSymbol() const; + LIB_PART* GetSelectedSymbol() const; const BOX2I GetDocumentExtents() const override; @@ -190,7 +190,7 @@ private: */ bool m_selection_changed; - std::unique_ptr< LIB_PART > m_previewItem; + LIB_PART* m_previewItem; DECLARE_EVENT_TABLE() }; diff --git a/eeschema/viewlibs.cpp b/eeschema/viewlibs.cpp index 6b015c1629..64e0f0bdad 100644 --- a/eeschema/viewlibs.cpp +++ b/eeschema/viewlibs.cpp @@ -55,7 +55,7 @@ void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent ) const auto libNicknames = libs->GetLogicalLibs(); adapter->AddLibraries( libNicknames, this ); - std::unique_ptr< LIB_PART > current( GetSelectedSymbol() ); + LIB_PART* current = GetSelectedSymbol(); LIB_ID id; int unit = 0;