Eeschema: fix assigning netclass to buses

Buses with at least one member can use assign netclass functionality to
set all members to that netclass.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/8743
This commit is contained in:
Mike Williams 2021-07-26 11:20:45 -04:00 committed by Roberto Fernandez Bautista
parent 43cb710297
commit 2c766bdb2b
1 changed files with 44 additions and 19 deletions

View File

@ -922,17 +922,39 @@ int SCH_EDITOR_CONTROL::AssignNetclass( const TOOL_EVENT& aEvent )
if( conn ) if( conn )
{ {
if( !conn->Driver() || CONNECTION_SUBGRAPH::GetDriverPriority( conn->Driver() ) if( !conn->IsBus()
< CONNECTION_SUBGRAPH::PRIORITY::SHEET_PIN ) && ( !conn->Driver()
|| CONNECTION_SUBGRAPH::GetDriverPriority( conn->Driver() )
< CONNECTION_SUBGRAPH::PRIORITY::SHEET_PIN ) )
{ {
m_frame->ShowInfoBarError( _( "Net must be labeled to assign a netclass." ) ); m_frame->ShowInfoBarError( _( "Net must be labeled to assign a netclass." ) );
highlightNet( m_toolMgr, CLEAR ); highlightNet( m_toolMgr, CLEAR );
return 0; return 0;
} }
else if( conn->IsBus() && conn->Members().size() == 0 )
{
m_frame->ShowInfoBarError(
_( "Bus must have at least one member to assign a netclass to members." ) );
highlightNet( m_toolMgr, CLEAR );
return 0;
}
wxArrayString netNames;
if( conn->IsBus() )
{
for( auto& m : conn->Members() )
{
netNames.Add( m->Name() );
}
}
else
{
netNames.Add( conn->Name() );
}
wxString netName = conn->Name();
NET_SETTINGS& netSettings = m_frame->Schematic().Prj().GetProjectFile().NetSettings(); NET_SETTINGS& netSettings = m_frame->Schematic().Prj().GetProjectFile().NetSettings();
wxString netclassName = netSettings.GetNetclassName( netName ); wxString netclassName = netSettings.GetNetclassName( netNames.front() );
wxArrayString headers; wxArrayString headers;
std::vector<wxArrayString> items; std::vector<wxArrayString> items;
@ -957,24 +979,27 @@ int SCH_EDITOR_CONTROL::AssignNetclass( const TOOL_EVENT& aEvent )
{ {
netclassName = dlg.GetTextSelection(); netclassName = dlg.GetTextSelection();
// Remove from old netclass membership list for( auto& netName : netNames )
if( netSettings.m_NetClassAssignments.count( netName ) )
{ {
const wxString oldNetclassName = netSettings.m_NetClassAssignments[ netName ]; // Remove from old netclass membership list
NETCLASSPTR oldNetclass = netSettings.m_NetClasses.Find( oldNetclassName ); if( netSettings.m_NetClassAssignments.count( netName ) )
{
const wxString oldNetclassName = netSettings.m_NetClassAssignments[netName];
NETCLASSPTR oldNetclass = netSettings.m_NetClasses.Find( oldNetclassName );
if( oldNetclass ) if( oldNetclass )
oldNetclass->Remove( netName ); oldNetclass->Remove( netName );
}
// Add to new netclass membership list
NETCLASSPTR newNetclass = netSettings.m_NetClasses.Find( netclassName );
if( newNetclass )
newNetclass->Add( netName );
netSettings.m_NetClassAssignments[netName] = netclassName;
netSettings.ResolveNetClassAssignments();
} }
// Add to new netclass membership list
NETCLASSPTR newNetclass = netSettings.m_NetClasses.Find( netclassName );
if( newNetclass )
newNetclass->Add( netName );
netSettings.m_NetClassAssignments[ netName ] = netclassName;
netSettings.ResolveNetClassAssignments();
} }
} }