Fix missing legacy value and footprint field instance data.

The legacy and s-expression (prior to version 20200828) file formats only
supported symbol unit and reference fields so the newly added value and
footprint fields must be updated from the original symbol fields.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/12226
This commit is contained in:
Wayne Stambaugh 2022-08-17 11:31:49 -04:00
parent 19e27ef587
commit 797827b833
8 changed files with 65 additions and 5 deletions

View File

@ -428,6 +428,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// Legacy schematic can have duplicate time stamps so fix that before converting // Legacy schematic can have duplicate time stamps so fix that before converting
// to the s-expression format. // to the s-expression format.
schematic.ReplaceDuplicateTimeStamps(); schematic.ReplaceDuplicateTimeStamps();
schematic.SetLegacySymbolInstanceData();
// Allow the schematic to be saved to new file format without making any edits. // Allow the schematic to be saved to new file format without making any edits.
OnModify(); OnModify();

View File

@ -2297,14 +2297,18 @@ void SCH_SEXPR_PARSER::ParseSchematic( SCH_SHEET* aSheet, bool aIsCopyableOnly,
// polyline keyword is used in eeschema both for SCH_SHAPE and SCH_LINE items. // polyline keyword is used in eeschema both for SCH_SHAPE and SCH_LINE items.
// In symbols it describes a polygon, having n corners and can be filled // In symbols it describes a polygon, having n corners and can be filled
// In schematic it describes a line (with no fill descr), but could be extended to a // In schematic it describes a line (with no fill descr), but could be extended to a
// polygon (for instance when importing files) because the schematic handles all SCH_SHAPE. // polygon (for instance when importing files) because the schematic handles all
// SCH_SHAPE.
// parseSchPolyLine() returns always a SCH_SHAPE, io convert it to a simple SCH_LINE // parseSchPolyLine() returns always a SCH_SHAPE, io convert it to a simple SCH_LINE
// For compatibility reasons, keep SCH_SHAPE for a polygon and convert to SCH_LINE // For compatibility reasons, keep SCH_SHAPE for a polygon and convert to SCH_LINE
// when the item has only 2 corners, similar to a SCH_LINE // when the item has only 2 corners, similar to a SCH_LINE
SCH_SHAPE* poly = parseSchPolyLine(); SCH_SHAPE* poly = parseSchPolyLine();
if( poly->GetPointCount() > 2 ) if( poly->GetPointCount() > 2 )
{
screen->Append( poly ); screen->Append( poly );
}
else else
{ {
// For SCH_SHAPE having only 2 points, this is a "old" SCH_LINE entity. // For SCH_SHAPE having only 2 points, this is a "old" SCH_LINE entity.
@ -2382,6 +2386,9 @@ void SCH_SEXPR_PARSER::ParseSchematic( SCH_SHEET* aSheet, bool aIsCopyableOnly,
} }
screen->UpdateLocalLibSymbolLinks(); screen->UpdateLocalLibSymbolLinks();
if( m_requiredVersion < 20200828 )
screen->SetLegacySymbolInstanceData();
} }

View File

@ -1204,7 +1204,6 @@ SCH_SYMBOL* SCH_LEGACY_PLUGIN::loadSymbol( LINE_READER& aReader )
symbol->AddHierarchicalReference( path, reference, (int)tmp ); symbol->AddHierarchicalReference( path, reference, (int)tmp );
symbol->GetField( REFERENCE_FIELD )->SetText( reference ); symbol->GetField( REFERENCE_FIELD )->SetText( reference );
} }
else if( strCompare( "F", line, &line ) ) else if( strCompare( "F", line, &line ) )
{ {

View File

@ -1431,6 +1431,24 @@ void SCH_SCREEN::AddBusAlias( std::shared_ptr<BUS_ALIAS> aAlias )
} }
void SCH_SCREEN::SetLegacySymbolInstanceData()
{
for( SCH_ITEM* item : Items().OfType( SCH_SYMBOL_T ) )
{
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
// Add missing value and footprint instance data for legacy schematics.
for( const SYMBOL_INSTANCE_REFERENCE& instance : symbol->GetInstanceReferences() )
{
symbol->AddHierarchicalReference( instance.m_Path, instance.m_Reference,
instance.m_Unit,
symbol->GetField( VALUE_FIELD )->GetText(),
symbol->GetField( FOOTPRINT_FIELD )->GetText() );
}
}
}
#if defined(DEBUG) #if defined(DEBUG)
void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const
{ {
@ -1821,3 +1839,11 @@ void SCH_SCREENS::BuildClientSheetPathList()
} }
} }
} }
void SCH_SCREENS::SetLegacySymbolInstanceData()
{
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
screen->SetLegacySymbolInstanceData();
}

View File

@ -498,6 +498,11 @@ public:
void AssignNewUuid() { m_uuid = KIID(); } void AssignNewUuid() { m_uuid = KIID(); }
/**
* Update the symbol value and footprint instance data for legacy designs.
*/
void SetLegacySymbolInstanceData();
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override; void Show( int nestLevel, std::ostream& os ) const override;
#endif #endif
@ -716,6 +721,11 @@ public:
*/ */
bool CanCauseCaseSensitivityIssue( const wxString& aSchematicFileName ) const; bool CanCauseCaseSensitivityIssue( const wxString& aSchematicFileName ) const;
/**
* Update the symbol value and footprint instance data for legacy designs.
*/
void SetLegacySymbolInstanceData();
private: private:
void addScreenToList( SCH_SCREEN* aScreen, SCH_SHEET* aSheet ); void addScreenToList( SCH_SCREEN* aScreen, SCH_SHEET* aSheet );
void buildScreenList( SCH_SHEET* aSheet); void buildScreenList( SCH_SHEET* aSheet);

View File

@ -543,7 +543,8 @@ void SCH_SYMBOL::SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref )
} }
if( !found ) if( !found )
AddHierarchicalReference( path, ref, m_unit ); AddHierarchicalReference( path, ref, m_unit, GetField( VALUE_FIELD )->GetText(),
GetField( FOOTPRINT_FIELD )->GetText() );
for( std::unique_ptr<SCH_PIN>& pin : m_pins ) for( std::unique_ptr<SCH_PIN>& pin : m_pins )
pin->ClearDefaultNetName( sheet ); pin->ClearDefaultNetName( sheet );

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -417,3 +417,11 @@ SCH_SHEET_LIST& SCHEMATIC::GetFullHierarchy() const
return hierarchy; return hierarchy;
} }
void SCHEMATIC::SetLegacySymbolInstanceData()
{
SCH_SCREENS screens( m_rootSheet );
screens.SetLegacySymbolInstanceData();
}

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -169,6 +169,14 @@ public:
*/ */
SCH_SHEET_LIST& GetFullHierarchy() const; SCH_SHEET_LIST& GetFullHierarchy() const;
/**
* Update the symbol value and footprint instance data for legacy designs.
*
* Prior to schematic file format version 20200828 and legacy file format version, only
* symbol reference field and unit were saved in the instance data. The value and footprint
* fields must be carried forward from the original symbol to prevent data loss.
*/
void SetLegacySymbolInstanceData();
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override {} void Show( int nestLevel, std::ostream& os ) const override {}