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:
parent
43cb710297
commit
2c766bdb2b
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue