Fix a few minor symbol library inheritance bugs.

Don't clobber value file when load aliases in legacy symbol library cache
parser.

Use actual symbol library LIB_PART pointer rather than a flattened copy
of the symbol.  This fixed a bug when displaying the parent field in the
message panel for derived symbols.

Simplify the flatten code by copying the parent and updating the lesser
information from the inherited symbol.
This commit is contained in:
Wayne Stambaugh 2019-11-07 09:09:24 -05:00
parent 54f066fed7
commit 8e150521a2
10 changed files with 64 additions and 73 deletions

View File

@ -277,39 +277,17 @@ std::unique_ptr< LIB_PART > LIB_PART::Flatten() const
wxCHECK_MSG( parent, retv, wxCHECK_MSG( parent, retv,
wxString::Format( "Parent of derived symbol '%s' undefined", m_name ) ); 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. // Now add the inherited part (this) information.
retv->SetParent( nullptr ); retv->SetName( m_name );
// Flatten parent information into the derived symbol. const LIB_FIELD* datasheetField = GetField( DATASHEET );
retv->SetUnitCount( parent->GetUnitCount() ); retv->GetField( DATASHEET )->SetText( datasheetField->GetText() );
retv->SetDocFileName( m_docFileName );
LIB_ITEM* newItem; retv->SetKeyWords( m_keyWords );
retv->SetDescription( m_description );
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() );
} }
else 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; LIB_FIELD* field = ( LIB_FIELD* ) &item;
@ -876,6 +854,15 @@ bool LIB_PART::HasConversion() const
return true; 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; return false;
} }

View File

@ -271,7 +271,7 @@ public:
* @param aId - Id of field to return. * @param aId - Id of field to return.
* @return The field if found, otherwise NULL. * @return The field if found, otherwise NULL.
*/ */
LIB_FIELD* GetField( int aId ); LIB_FIELD* GetField( int aId ) const;
/** Return reference to the value field. */ /** Return reference to the value field. */
LIB_FIELD& GetValueField(); LIB_FIELD& GetValueField();

View File

@ -2896,9 +2896,13 @@ void SCH_LEGACY_PLUGIN_CACHE::loadAliases( std::unique_ptr<LIB_PART>& aPart,
if( field->GetId() < MANDATORY_FIELDS ) if( field->GetId() < MANDATORY_FIELDS )
{ {
// Get all of the parent field information except for the string.
*newPart->GetField( field->GetId() ) = *field; *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 ); newPart->GetField( field->GetId() )->SetText( tmp );
} }
} }

View File

@ -135,9 +135,7 @@ void SCH_VIEW::DisplayComponent( LIB_PART* aPart )
std::shared_ptr< LIB_PART > parent; std::shared_ptr< LIB_PART > parent;
LIB_PART* drawnPart = aPart; LIB_PART* drawnPart = aPart;
if( aPart->IsAlias() ) // Draw the mandatory fields for aliases and parent symbols.
{
// Draw the alias mandatory fields.
for( auto& item : aPart->GetDrawItems() ) for( auto& item : aPart->GetDrawItems() )
{ {
if( item.Type() != LIB_FIELD_T ) if( item.Type() != LIB_FIELD_T )
@ -149,6 +147,9 @@ void SCH_VIEW::DisplayComponent( LIB_PART* aPart )
Add( &item ); Add( &item );
} }
// Draw the parent items if the symbol is inherited from another symbol.
if( aPart->IsAlias() )
{
parent = aPart->GetParent().lock(); parent = aPart->GetParent().lock();
wxCHECK( parent, /* void */ ); wxCHECK( parent, /* void */ );
@ -158,12 +159,12 @@ void SCH_VIEW::DisplayComponent( LIB_PART* aPart )
for( auto& item : drawnPart->GetDrawItems() ) 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 ) if( item.Type() == LIB_FIELD_T )
{ {
LIB_FIELD* field = (LIB_FIELD*) &item; LIB_FIELD* field = (LIB_FIELD*) &item;
if( aPart->IsAlias() && field->GetId() < MANDATORY_FIELDS ) if( field->GetId() < MANDATORY_FIELDS )
continue; continue;
} }

View File

@ -146,7 +146,7 @@ void LIB_VIEW_FRAME::ReCreateMenuBar()
void LIB_VIEW_FRAME::SyncToolbars() void LIB_VIEW_FRAME::SyncToolbars()
{ {
std::unique_ptr< LIB_PART > symbol( GetSelectedSymbol() ); LIB_PART* symbol = GetSelectedSymbol();
m_mainToolBar->Toggle( EE_ACTIONS::showDatasheet, m_mainToolBar->Toggle( EE_ACTIONS::showDatasheet,
symbol && !symbol->GetDocFileName().IsEmpty() ); symbol && !symbol->GetDocFileName().IsEmpty() );

View File

@ -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 ) ) else if( m_frame->IsType( FRAME_SCH_VIEWER ) || m_frame->IsType( FRAME_SCH_VIEWER_MODAL ) )
{ {
std::unique_ptr< LIB_PART > entry = LIB_PART* entry = static_cast<LIB_VIEW_FRAME*>( m_frame )->GetSelectedSymbol();
static_cast<LIB_VIEW_FRAME*>( m_frame )->GetSelectedSymbol();
if( !entry ) if( !entry )
return 0; return 0;

View File

@ -373,7 +373,7 @@ int LIB_CONTROL::AddSymbolToSchematic( const TOOL_EVENT& aEvent )
} }
else else
{ {
part = viewFrame->GetSelectedSymbol().get(); part = viewFrame->GetSelectedSymbol();
libId = part->GetLibId(); libId = part->GetLibId();
unit = viewFrame->GetUnit(); unit = viewFrame->GetUnit();
convert = viewFrame->GetConvert(); convert = viewFrame->GetConvert();

View File

@ -207,7 +207,7 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame
LIB_VIEW_FRAME::~LIB_VIEW_FRAME() LIB_VIEW_FRAME::~LIB_VIEW_FRAME()
{ {
if( m_previewItem ) 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() ) if( !m_libraryName.IsEmpty() && !m_entryName.IsEmpty() )
{ symbol = Prj().SchSymbolLibTable()->LoadSymbol( m_libraryName, m_entryName );
LIB_PART* tmp = Prj().SchSymbolLibTable()->LoadSymbol( m_libraryName, m_entryName );
if( tmp )
symbol = tmp->Flatten();
}
return symbol; return symbol;
} }
@ -266,12 +261,12 @@ std::unique_ptr< LIB_PART > LIB_VIEW_FRAME::GetSelectedSymbol() const
void LIB_VIEW_FRAME::updatePreviewSymbol() void LIB_VIEW_FRAME::updatePreviewSymbol()
{ {
std::unique_ptr< LIB_PART > symbol = GetSelectedSymbol(); LIB_PART* symbol = GetSelectedSymbol();
KIGFX::SCH_VIEW* view = GetCanvas()->GetView(); KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
if( m_previewItem ) if( m_previewItem )
{ {
view->Remove( m_previewItem.get() ); view->Remove( m_previewItem );
m_previewItem = nullptr; m_previewItem = nullptr;
} }
@ -282,8 +277,8 @@ void LIB_VIEW_FRAME::updatePreviewSymbol()
GetRenderSettings()->m_ShowUnit = m_unit; GetRenderSettings()->m_ShowUnit = m_unit;
GetRenderSettings()->m_ShowConvert = m_convert; GetRenderSettings()->m_ShowConvert = m_convert;
m_previewItem.reset( symbol.release() ); m_previewItem = symbol;
view->Add( m_previewItem.get() ); view->Add( m_previewItem );
wxString parentName = _( "<none>" ); wxString parentName = _( "<none>" );
std::shared_ptr< LIB_PART > parent = m_previewItem->GetParent().lock(); 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 ) void LIB_VIEW_FRAME::onUpdateUnitChoice( wxUpdateUIEvent& aEvent )
{ {
std::unique_ptr< LIB_PART > part = GetSelectedSymbol(); LIB_PART* part = GetSelectedSymbol();
int unit_count = 1; int unit_count = 1;
@ -701,7 +696,7 @@ void LIB_VIEW_FRAME::SetFilter( const SCHLIB_FILTER* aFilter )
const BOX2I LIB_VIEW_FRAME::GetDocumentExtents() const const BOX2I LIB_VIEW_FRAME::GetDocumentExtents() const
{ {
std::unique_ptr< LIB_PART > part = GetSelectedSymbol(); LIB_PART* part = GetSelectedSymbol();
if( !part ) if( !part )
{ {
@ -709,9 +704,14 @@ const BOX2I LIB_VIEW_FRAME::GetDocumentExtents() const
} }
else else
{ {
EDA_RECT bbox = part->GetUnitBoundingBox( m_unit, m_convert ); std::shared_ptr< LIB_PART > tmp;
return BOX2I( bbox.GetOrigin(), VECTOR2I( bbox.GetWidth(), bbox.GetHeight() ) );
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() ) );
} }
} }

View File

@ -137,7 +137,7 @@ public:
int GetUnit() const { return m_unit; } int GetUnit() const { return m_unit; }
int GetConvert() const { return m_convert; } int GetConvert() const { return m_convert; }
std::unique_ptr< LIB_PART > GetSelectedSymbol() const; LIB_PART* GetSelectedSymbol() const;
const BOX2I GetDocumentExtents() const override; const BOX2I GetDocumentExtents() const override;
@ -190,7 +190,7 @@ private:
*/ */
bool m_selection_changed; bool m_selection_changed;
std::unique_ptr< LIB_PART > m_previewItem; LIB_PART* m_previewItem;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@ -55,7 +55,7 @@ void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
const auto libNicknames = libs->GetLogicalLibs(); const auto libNicknames = libs->GetLogicalLibs();
adapter->AddLibraries( libNicknames, this ); adapter->AddLibraries( libNicknames, this );
std::unique_ptr< LIB_PART > current( GetSelectedSymbol() ); LIB_PART* current = GetSelectedSymbol();
LIB_ID id; LIB_ID id;
int unit = 0; int unit = 0;