Add support for symbol unit display names in eeschema and symbol editor

This commit is contained in:
kliment 2022-09-14 22:11:37 +00:00 committed by Wayne Stambaugh
parent 26a1114e3c
commit b97f9ea329
18 changed files with 233 additions and 8 deletions

View File

@ -156,7 +156,16 @@ LIB_TREE_NODE_UNIT::LIB_TREE_NODE_UNIT( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* a
m_LibId = aParent->m_LibId;
m_Name = namePrefix + " " + aItem->GetUnitReference( aUnit );
m_Desc = wxEmptyString;
if( aItem->HasUnitDisplayName( aUnit ) )
{
m_Desc = aItem->GetUnitDisplayName( aUnit );
}
else
{
m_Desc = wxEmptyString;
}
m_MatchName = wxEmptyString;
m_IntrinsicRank = -aUnit;

View File

@ -481,7 +481,12 @@ bool DIALOG_SYMBOL_PROPERTIES::TransferDataToWindow()
m_symbol->UpdateUnit( m_symbol->GetUnitSelection( &GetParent()->GetCurrentSheet() ) );
for( int ii = 1; ii <= m_symbol->GetUnitCount(); ii++ )
m_unitChoice->Append( LIB_SYMBOL::SubReference( ii, false ) );
{
if( m_symbol->HasUnitDisplayName( ii ) )
m_unitChoice->Append( m_symbol->GetUnitDisplayName( ii ) );
else
m_unitChoice->Append( LIB_SYMBOL::SubReference( ii, false ) );
}
if( m_symbol->GetUnit() <= ( int )m_unitChoice->GetCount() )
m_unitChoice->SetSelection( m_symbol->GetUnit() - 1 );

View File

@ -150,6 +150,8 @@ LIB_SYMBOL::LIB_SYMBOL( const LIB_SYMBOL& aSymbol, SYMBOL_LIB* aLibrary ) :
m_description = aSymbol.m_description;
m_keyWords = aSymbol.m_keyWords;
aSymbol.CopyUnitDisplayNames( m_unitDisplayNames );
ClearSelected();
for( const LIB_ITEM& oldItem : aSymbol.m_drawings )
@ -206,6 +208,9 @@ const LIB_SYMBOL& LIB_SYMBOL::operator=( const LIB_SYMBOL& aSymbol )
m_description = aSymbol.m_description;
m_keyWords = aSymbol.m_keyWords;
m_unitDisplayNames.clear();
aSymbol.CopyUnitDisplayNames( m_unitDisplayNames );
m_drawings.clear();
for( const LIB_ITEM& oldItem : aSymbol.m_drawings )
@ -369,6 +374,16 @@ int LIB_SYMBOL::Compare( const LIB_SYMBOL& aRhs, int aCompareFlags ) const
return ( m_includeOnBoard ) ? 1 : -1;
}
// Compare unit display names
if( m_unitDisplayNames < aRhs.m_unitDisplayNames )
{
return -1;
}
else if( m_unitDisplayNames > aRhs.m_unitDisplayNames )
{
return 1;
}
return 0;
}
@ -379,6 +394,50 @@ wxString LIB_SYMBOL::GetUnitReference( int aUnit )
}
bool LIB_SYMBOL::HasUnitDisplayName( int aUnit )
{
return ( m_unitDisplayNames.count( aUnit ) == 1 );
}
wxString LIB_SYMBOL::GetUnitDisplayName( int aUnit )
{
if( HasUnitDisplayName( aUnit ) )
{
return m_unitDisplayNames[aUnit];
}
else
{
return wxString::Format( _( "Unit %s" ), GetUnitReference( aUnit ) );
}
}
void LIB_SYMBOL::CopyUnitDisplayNames( std::map<int, wxString>& aTarget ) const
{
for( const auto& it : m_unitDisplayNames )
{
aTarget[it.first] = it.second;
}
}
void LIB_SYMBOL::SetUnitDisplayName( int aUnit, const wxString& aName )
{
if( aUnit <= GetUnitCount() )
{
if( aName.Length() > 0 )
{
m_unitDisplayNames[aUnit] = aName;
}
else
{
m_unitDisplayNames.erase( aUnit );
}
}
}
void LIB_SYMBOL::SetName( const wxString& aName )
{
m_name = aName;

View File

@ -526,6 +526,26 @@ public:
*/
wxString GetUnitReference( int aUnit ) override;
/**
* Return true if the given unit \a aUnit has a display name defined
*/
bool HasUnitDisplayName( int aUnit ) override;
/**
* Return the user-defined display name for \a aUnit for symbols with units.
*/
wxString GetUnitDisplayName( int aUnit ) override;
/**
* Copy all unit display names into the given map \a aTarget
*/
void CopyUnitDisplayNames( std::map<int, wxString>& aTarget ) const;
/**
* Set the user-defined display name for \a aUnit to \a aName for symbols with units.
*/
void SetUnitDisplayName( int aUnit, const wxString& aName );
/**
* @return true if the symbol has multiple units per symbol.
* When true, the reference has a sub reference to identify symbol.
@ -731,6 +751,7 @@ private:
static int m_subpartFirstId; ///< the ASCII char value to calculate the subpart
///< symbol id from the symbol number: only 'A', 'a'
///< or '1' can be used, other values have no sense.
std::map<int, wxString> m_unitDisplayNames;
};
#endif // CLASS_LIBENTRY_H

View File

@ -228,6 +228,13 @@ void SCH_SEXPR_PLUGIN_CACHE::SaveSymbol( LIB_SYMBOL* aSymbol, OUTPUTFORMATTER& a
aFormatter.Print( aNestLevel + 1, "(symbol %s_%d_%d\"\n",
name.c_str(), unit.m_unit, unit.m_convert );
// if the unit has a display name, write that
if( aSymbol->HasUnitDisplayName( unit.m_unit ) )
{
name = aSymbol->GetUnitDisplayName( unit.m_unit );
aFormatter.Print( aNestLevel + 2, "(unit_name %s)\n",
aFormatter.Quotes( name ).c_str() );
}
// Enforce item ordering
auto cmp =
[]( const LIB_ITEM* a, const LIB_ITEM* b )

View File

@ -168,6 +168,7 @@ LIB_SYMBOL* SCH_SEXPR_PARSER::ParseSymbol( LIB_SYMBOL_MAP& aSymbolLibMap, int aF
long tmp;
wxString name;
wxString error;
wxString unitDisplayName;
LIB_ITEM* item;
std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>( wxEmptyString );
@ -335,6 +336,17 @@ LIB_SYMBOL* SCH_SEXPR_PARSER::ParseSymbol( LIB_SYMBOL_MAP& aSymbolLibMap, int aF
switch( token )
{
case T_unit_name:
token = NextTok();
if( IsSymbol( token ) )
{
unitDisplayName = FromUTF8();
symbol->SetUnitDisplayName( m_unit, unitDisplayName );
}
NeedRIGHT();
break;
case T_arc:
case T_bezier:
case T_circle:

View File

@ -147,6 +147,7 @@ SCH_SYMBOL::SCH_SYMBOL( const LIB_SYMBOL& aSymbol, const LIB_ID& aLibId,
// Inherit the include in bill of materials and board netlist settings from library symbol.
m_inBom = aSymbol.GetIncludeInBom();
m_onBoard = aSymbol.GetIncludeOnBoard();
}
@ -430,6 +431,22 @@ int SCH_SYMBOL::GetUnitCount() const
}
wxString SCH_SYMBOL::GetUnitDisplayName( int aUnit )
{
wxCHECK( m_part, ( wxString::Format( _( "Unit %s" ), LIB_SYMBOL::SubReference( aUnit ) ) ) );
return m_part->GetUnitDisplayName( aUnit );
}
bool SCH_SYMBOL::HasUnitDisplayName( int aUnit )
{
wxCHECK( m_part, false );
return m_part->HasUnitDisplayName( aUnit );
}
void SCH_SYMBOL::Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
{
LIB_SYMBOL_OPTIONS opts;

View File

@ -240,6 +240,20 @@ public:
*/
void SetUnit( int aUnit );
/**
* Return true if the given unit \a aUnit has a display name set.
*
* @return true if the display name of a unit is set, otherwise false.
*/
bool HasUnitDisplayName( int aUnit );
/**
* Return the display name for a given unit \a aUnit.
*
* @return the display name of a unit if set, or the ordinal name of the unit otherwise.
*/
wxString GetUnitDisplayName( int aUnit );
/**
* Change the unit number to \a aUnit without setting any internal flags.
* This has meaning only for symbols made up of multiple units per package.

View File

@ -130,6 +130,7 @@ top
tri_state
type
unit
unit_name
unspecified
uuid
value

View File

@ -98,6 +98,7 @@ void SYMBOL_EDIT_FRAME::ReCreateMenuBar()
editMenu->AppendSeparator();
editMenu->Add( EE_ACTIONS::pinTable );
editMenu->Add( EE_ACTIONS::setUnitDisplayName );
editMenu->Add( EE_ACTIONS::updateSymbolFields );

View File

@ -474,6 +474,12 @@ void SYMBOL_EDIT_FRAME::setupUIConditions()
return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
};
auto hasMultipleUnitsCond =
[this]( const SELECTION& )
{
return m_symbol && m_symbol->IsMulti();
};
auto syncedPinsModeCond =
[this]( const SELECTION& )
{
@ -497,6 +503,8 @@ void SYMBOL_EDIT_FRAME::setupUIConditions()
ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
mgr->SetConditions( EE_ACTIONS::toggleSyncedPinsMode,
ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
mgr->SetConditions( EE_ACTIONS::setUnitDisplayName,
ACTION_CONDITIONS().Enable( isEditableCond && hasMultipleUnitsCond ) );
// Only enable a tool if the symbol is edtable
#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
@ -594,9 +602,8 @@ void SYMBOL_EDIT_FRAME::RebuildSymbolUnitsList()
{
for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
{
wxString sub = LIB_SYMBOL::SubReference( i+1, false );
wxString unit = wxString::Format( _( "Unit %s" ), sub );
m_unitSelectBox->Append( unit );
wxString unitDisplayName = m_symbol->GetUnitDisplayName( i + 1 );
m_unitSelectBox->Append( unitDisplayName );
}
}
@ -1552,4 +1559,4 @@ void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aU
eda_text->ClearBoundingBoxCache();
eda_text->ClearRenderCache();
}
}
}

View File

@ -543,8 +543,7 @@ void SYMBOL_VIEWER_FRAME::onUpdateUnitChoice( wxUpdateUIEvent& aEvent )
for( int ii = 0; ii < unit_count; ii++ )
{
wxString sub = LIB_SYMBOL::SubReference( ii + 1, false );
wxString unit = wxString::Format( _( "Unit %s" ), sub );
wxString unit = symbol->GetUnitDisplayName( ii + 1 );
m_unitChoice->Append( unit );
}

View File

@ -182,6 +182,10 @@ TOOL_ACTION EE_ACTIONS::updateSymbolFields( "eeschema.SymbolLibraryControl.updat
_( "Update Symbol Fields..." ), _( "Update symbol to match changes made in parent symbol" ),
BITMAPS::refresh );
TOOL_ACTION EE_ACTIONS::setUnitDisplayName( "eeschema.SymbolLibraryControl.setUnitDisplayName",
AS_GLOBAL, 0, "", _( "Set Unit Display Name..." ),
_( "Set the display name for a unit" ) );
TOOL_ACTION EE_ACTIONS::addSymbolToSchematic( "eeschema.SymbolLibraryControl.addSymbolToSchematic",
AS_GLOBAL, 0, "",
_( "Add Symbol to Schematic" ), _( "Add Symbol to Schematic" ),

View File

@ -192,6 +192,7 @@ public:
static TOOL_ACTION importSymbol;
static TOOL_ACTION exportSymbol;
static TOOL_ACTION updateSymbolFields;
static TOOL_ACTION setUnitDisplayName;
// Hierarchy navigation
static TOOL_ACTION changeSheet;

View File

@ -225,6 +225,18 @@ bool EE_SELECTION_TOOL::Init()
static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->GetCurSymbol();
};
auto symbolDisplayNameIsEditable =
[&]( const SELECTION& sel )
{
if ( !m_isSymbolEditor )
return false;
SYMBOL_EDIT_FRAME* symEditFrame = dynamic_cast<SYMBOL_EDIT_FRAME*>( m_frame );
return symEditFrame->GetCurSymbol() && symEditFrame->GetCurSymbol()->IsMulti()
&& symEditFrame->IsSymbolEditable() && !symEditFrame->IsSymbolAlias();
};
auto& menu = m_menu.GetMenu();
menu.AddItem( EE_ACTIONS::clearHighlight, haveHighlight && EE_CONDITIONS::Idle, 1 );
@ -260,6 +272,8 @@ bool EE_SELECTION_TOOL::Init()
menu.AddSeparator( 400 );
menu.AddItem( EE_ACTIONS::symbolProperties, haveSymbol && EE_CONDITIONS::Empty, 400 );
menu.AddItem( EE_ACTIONS::pinTable, haveSymbol && EE_CONDITIONS::Empty, 400 );
menu.AddItem( EE_ACTIONS::setUnitDisplayName,
haveSymbol && symbolDisplayNameIsEditable && EE_CONDITIONS::Empty, 400 );
menu.AddSeparator( 1000 );
m_frame->AddStandardSubMenus( m_menu );

View File

@ -42,6 +42,7 @@
#include "symbol_editor_edit_tool.h"
#include "dialog_lib_textbox_properties.h"
#include "lib_textbox.h"
#include <wx/textdlg.h> // for wxTextEntryDialog
#include <math/util.h> // for KiROUND
SYMBOL_EDITOR_EDIT_TOOL::SYMBOL_EDITOR_EDIT_TOOL() :
@ -646,6 +647,47 @@ int SYMBOL_EDITOR_EDIT_TOOL::UpdateSymbolFields( const TOOL_EVENT& aEvent )
}
int SYMBOL_EDITOR_EDIT_TOOL::SetUnitDisplayName( const TOOL_EVENT& aEvent )
{
LIB_SYMBOL* symbol = m_frame->GetCurSymbol();
if( !symbol )
return 0;
int unitid = m_frame->GetUnit();
if( unitid == 0 )
{
return -1;
}
wxString promptText = wxString::Format( _( "Enter display name for unit %s" ),
symbol->GetUnitReference( unitid ) );
wxString currentvalue;
if( symbol->HasUnitDisplayName( unitid ) )
{
currentvalue = symbol->GetUnitDisplayName( unitid );
}
wxTextEntryDialog dlg( m_frame, promptText, _( "Set Unit Display Name" ), currentvalue );
if( dlg.ShowModal() == wxID_OK )
{
saveCopyInUndoList( symbol, UNDO_REDO::LIBEDIT );
symbol->SetUnitDisplayName( unitid, dlg.GetValue() );
m_frame->RebuildSymbolUnitsList();
m_frame->OnModify();
}
else
{
return -1;
}
return 0;
}
int SYMBOL_EDITOR_EDIT_TOOL::Undo( const TOOL_EVENT& aEvent )
{
m_frame->GetSymbolFromUndoList();
@ -854,4 +896,5 @@ void SYMBOL_EDITOR_EDIT_TOOL::setTransitions()
Go( &SYMBOL_EDITOR_EDIT_TOOL::Properties, EE_ACTIONS::symbolProperties.MakeEvent() );
Go( &SYMBOL_EDITOR_EDIT_TOOL::PinTable, EE_ACTIONS::pinTable.MakeEvent() );
Go( &SYMBOL_EDITOR_EDIT_TOOL::UpdateSymbolFields, EE_ACTIONS::updateSymbolFields.MakeEvent() );
Go( &SYMBOL_EDITOR_EDIT_TOOL::SetUnitDisplayName, EE_ACTIONS::setUnitDisplayName.MakeEvent() );
}

View File

@ -47,6 +47,7 @@ public:
int Properties( const TOOL_EVENT& aEvent );
int PinTable( const TOOL_EVENT& aEvent );
int SetUnitDisplayName( const TOOL_EVENT& aEvent );
int UpdateSymbolFields( const TOOL_EVENT& aEvent );
int Undo( const TOOL_EVENT& aEvent );

View File

@ -76,6 +76,16 @@ public:
* For items with units, return an identifier for unit x.
*/
virtual wxString GetUnitReference( int aUnit ) { return wxEmptyString; }
/**
* For items with units, return a display name for unit x.
*/
virtual wxString GetUnitDisplayName( int aUnit ) { return wxEmptyString; }
/**
* For items with units, return true if a display name is set for x.
*/
virtual bool HasUnitDisplayName( int aUnit ) { return false; }
};
#endif //LIB_TREE_ITEM_H