Fix symbol library save issue.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/15561
This commit is contained in:
parent
a24a8aaca7
commit
f8cb239f40
|
@ -35,39 +35,6 @@
|
||||||
#include <trace_helpers.h>
|
#include <trace_helpers.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Symbol library file sorting algorithm.
|
|
||||||
*
|
|
||||||
* The sort order of symbol library files is a twofold process based on the inheritance
|
|
||||||
* depth of a given symbol. The following criteria is used to sort the symbols in the
|
|
||||||
* library file:
|
|
||||||
*
|
|
||||||
* 1. The inheritance depth from 0 to N.
|
|
||||||
* 2. The alphabetical order using our #ValueStringCompare natural sorting.
|
|
||||||
*
|
|
||||||
* @note It is imperative that symbols with an inheritance depth of 0 are stored in the
|
|
||||||
* file before symbols with an inheritance depth of 1 and so on and so forth. This
|
|
||||||
* is necessary because the symbol library file parser expects parent symbols to be
|
|
||||||
* defined before child symbols to ensure they can be parented on load.
|
|
||||||
*
|
|
||||||
* @param aLhs is the left hand side to compare.
|
|
||||||
* @parem aRhs is the right hand side to compare.
|
|
||||||
* @return true if @a aLhs is less than @a aRhs otherwise false.
|
|
||||||
*/
|
|
||||||
struct LibSymbolFileSort
|
|
||||||
{
|
|
||||||
bool operator() ( const LIB_SYMBOL* aLhs, const LIB_SYMBOL* aRhs ) const
|
|
||||||
{
|
|
||||||
wxCHECK( aLhs && aRhs, false );
|
|
||||||
|
|
||||||
if( aLhs->GetInheritanceDepth() < aRhs->GetInheritanceDepth() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return ( ValueStringCompare( aLhs->GetName(), aRhs->GetName() ) < 0 );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
SCH_SEXPR_PLUGIN_CACHE::SCH_SEXPR_PLUGIN_CACHE( const wxString& aFullPathAndFileName ) :
|
SCH_SEXPR_PLUGIN_CACHE::SCH_SEXPR_PLUGIN_CACHE( const wxString& aFullPathAndFileName ) :
|
||||||
SCH_LIB_PLUGIN_CACHE( aFullPathAndFileName )
|
SCH_LIB_PLUGIN_CACHE( aFullPathAndFileName )
|
||||||
{
|
{
|
||||||
|
@ -128,10 +95,22 @@ void SCH_SEXPR_PLUGIN_CACHE::Save( const std::optional<bool>& aOpt )
|
||||||
formatter->Print( 0, "(kicad_symbol_lib (version %d) (generator kicad_symbol_editor)\n",
|
formatter->Print( 0, "(kicad_symbol_lib (version %d) (generator kicad_symbol_editor)\n",
|
||||||
SEXPR_SYMBOL_LIB_FILE_VERSION );
|
SEXPR_SYMBOL_LIB_FILE_VERSION );
|
||||||
|
|
||||||
std::set<LIB_SYMBOL*, LibSymbolFileSort> orderedSymbols;
|
std::vector<LIB_SYMBOL*> orderedSymbols;
|
||||||
|
|
||||||
for( const std::pair<const wxString, LIB_SYMBOL*>& parent : m_symbols )
|
for( const std::pair<const wxString, LIB_SYMBOL*>& parent : m_symbols )
|
||||||
orderedSymbols.emplace( parent.second );
|
orderedSymbols.push_back( parent.second );
|
||||||
|
|
||||||
|
// Library must be ordered by inheritance depth.
|
||||||
|
std::sort( orderedSymbols.begin(), orderedSymbols.end(),
|
||||||
|
[]( const LIB_SYMBOL* aLhs, const LIB_SYMBOL* aRhs )
|
||||||
|
{
|
||||||
|
wxCHECK( aLhs && aRhs, false );
|
||||||
|
|
||||||
|
if( aLhs->GetInheritanceDepth() < aRhs->GetInheritanceDepth() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return aLhs->GetName() < aRhs->GetName();
|
||||||
|
} );
|
||||||
|
|
||||||
for( LIB_SYMBOL* symbol : orderedSymbols )
|
for( LIB_SYMBOL* symbol : orderedSymbols )
|
||||||
SaveSymbol( symbol, *formatter.get(), 1 );
|
SaveSymbol( symbol, *formatter.get(), 1 );
|
||||||
|
|
Loading…
Reference in New Issue