ADDED: Hide ratsnest for specific nets

List of hidden nets stored in project local settings
Hide/Show actions in context menu only for now, will
add them to some more GUI places soon.

Ref https://gitlab.com/kicad/code/kicad/-/issues/1951
This commit is contained in:
Jon Evans 2020-07-10 21:06:17 -04:00
parent 95bfb64d48
commit 72b08f2b18
13 changed files with 259 additions and 34 deletions

View File

@ -177,8 +177,6 @@ NET_SETTINGS::NET_SETTINGS( JSON_SETTINGS* aParent, const std::string& aPath ) :
} }
}, },
{} ) ); {} ) );
m_params.emplace_back( new PARAM_LIST<wxString>( "hidden_nets", &m_HiddenNets, {} ) );
} }

View File

@ -138,6 +138,11 @@ PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS( const std::string& aFilename ) :
{ "dimensions", true }, { "dimensions", true },
{ "otherItems", true } { "otherItems", true }
} ) ); } ) );
m_params.emplace_back( new PARAM_ENUM<PCB_LAYER_ID>(
"active_layer", &m_ActiveLayer, F_Cu, PCBNEW_LAYER_ID_START, F_Fab ) );
m_params.emplace_back( new PARAM_LIST<wxString>( "hidden_nets", &m_HiddenNets, {} ) );
} }

View File

@ -50,12 +50,6 @@ public:
*/ */
std::map<wxString, KIGFX::COLOR4D> m_PcbNetColors; std::map<wxString, KIGFX::COLOR4D> m_PcbNetColors;
/**
* A list of netnames that have been manually hidden in the board editor.
* Currently, hiding nets means hiding the ratsnest for those nets.
*/
std::vector<wxString> m_HiddenNets;
public: public:
/** /**
* Parses a bus vector (e.g. A[7..0]) into name, begin, and end. * Parses a bus vector (e.g. A[7..0]) into name, begin, and end.

View File

@ -85,6 +85,15 @@ public:
/// The GAL layers (aka items) that are turned on for viewing (@see GAL_LAYER_ID) /// The GAL layers (aka items) that are turned on for viewing (@see GAL_LAYER_ID)
GAL_SET m_VisibleItems; GAL_SET m_VisibleItems;
/// The current (active) board layer for editing
PCB_LAYER_ID m_ActiveLayer;
/**
* A list of netnames that have been manually hidden in the board editor.
* Currently, hiding nets means hiding the ratsnest for those nets.
*/
std::vector<wxString> m_HiddenNets;
/// State of the selection filter widget /// State of the selection filter widget
SELECTION_FILTER_OPTIONS m_SelectionFilter; SELECTION_FILTER_OPTIONS m_SelectionFilter;
}; };

View File

@ -219,6 +219,75 @@ private:
} }
}; };
/**
* Stores an enum as an integer
*/
template<typename EnumType>
class PARAM_ENUM : public PARAM_BASE
{
public:
PARAM_ENUM( const std::string& aJsonPath, EnumType* aPtr, EnumType aDefault,
EnumType aMin, EnumType aMax, bool aReadOnly = false ) :
PARAM_BASE( aJsonPath, aReadOnly ),
m_ptr( aPtr ),
m_min( aMin ),
m_max( aMax ),
m_default( aDefault )
{
}
void Load( JSON_SETTINGS* aSettings, bool aResetIfMissing = true ) const override
{
if( m_readOnly )
return;
if( OPT<int> val = aSettings->Get<int>( m_path ) )
{
if( *val >= static_cast<int>( m_min ) && *val <= static_cast<int>( m_max ) )
*m_ptr = static_cast<EnumType>( *val );
else if( aResetIfMissing )
*m_ptr = m_default;
}
else if( aResetIfMissing )
*m_ptr = m_default;
}
void Store( JSON_SETTINGS* aSettings ) const override
{
aSettings->Set<int>( m_path, static_cast<int>( *m_ptr ) );
}
EnumType GetDefault() const
{
return m_default;
}
void SetDefault() override
{
*m_ptr = m_default;
}
bool IsDefault() const override
{
return *m_ptr == m_default;
}
bool MatchesFile( JSON_SETTINGS* aSettings ) const override
{
if( OPT<int> val = aSettings->Get<int>( m_path ) )
return *val == static_cast<int>( *m_ptr );
return false;
}
private:
EnumType* m_ptr;
EnumType m_min;
EnumType m_max;
EnumType m_default;
};
/** /**
* Like a normal param, but with custom getter and setter functions * Like a normal param, but with custom getter and setter functions
* @tparam ValueType is the value to store * @tparam ValueType is the value to store

View File

@ -605,6 +605,9 @@ void PCB_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
wxMessageBox( msg, Pgm().App().GetAppName(), wxOK | wxICON_ERROR, this ); wxMessageBox( msg, Pgm().App().GetAppName(), wxOK | wxICON_ERROR, this );
} }
// Make sure local settings are persisted
SaveProjectSettings();
// Do not show the layer manager during closing to avoid flicker // Do not show the layer manager during closing to avoid flicker
// on some platforms (Windows) that generate useless redraw of items in // on some platforms (Windows) that generate useless redraw of items in
// the Layer Manger // the Layer Manger

View File

@ -218,8 +218,8 @@ void PCB_RENDER_SETTINGS::LoadDisplayOptions( const PCB_DISPLAY_OPTIONS& aOption
} }
void PCB_RENDER_SETTINGS::LoadNetSettings( const NET_SETTINGS& aSettings, void PCB_RENDER_SETTINGS::LoadNetSettings( const NET_SETTINGS& aSettings, const NETINFO_LIST& aList,
const NETINFO_LIST& aList ) const std::set<int>& aHiddenNets )
{ {
m_netColors.clear(); m_netColors.clear();
@ -237,13 +237,9 @@ void PCB_RENDER_SETTINGS::LoadNetSettings( const NET_SETTINGS& aSettings,
m_netclassColors[pair.first] = pair.second->GetPcbColor(); m_netclassColors[pair.first] = pair.second->GetPcbColor();
} }
m_hiddenNets.clear(); m_hiddenNets = aHiddenNets;
for( const wxString& hidden : aSettings.m_HiddenNets )
{
if( NETINFO_ITEM* net = aList.GetNetItem( hidden ) )
m_hiddenNets.insert( net->GetNet() );
}
} }

View File

@ -108,9 +108,11 @@ public:
/** /**
* Loads net-specific render settings * Loads net-specific render settings
* @param aSettings is the NET_SETTINGS for the current proejct * @param aSettings is the NET_SETTINGS for the current proejct
* @param aList is the list of nets in the board * @param aList is the list of nets on the board
* @param aHiddenNets is a list of nets to hide from the ratsnest
*/ */
void LoadNetSettings( const NET_SETTINGS& aSettings, const NETINFO_LIST& aList ); void LoadNetSettings( const NET_SETTINGS& aSettings, const NETINFO_LIST& aList,
const std::set<int>& aHiddenNets );
virtual void LoadColors( const COLOR_SETTINGS* aSettings ) override; virtual void LoadColors( const COLOR_SETTINGS* aSettings ) override;

View File

@ -84,7 +84,8 @@ bool PCB_EDIT_FRAME::LoadProjectSettings()
{ {
wxLogDebug( wxT( "Loading project '%s' settings." ), GetChars( Prj().GetProjectFullName() ) ); wxLogDebug( wxT( "Loading project '%s' settings." ), GetChars( Prj().GetProjectFullName() ) );
PROJECT_FILE& project = Prj().GetProjectFile(); PROJECT_FILE& project = Prj().GetProjectFile();
PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
BASE_SCREEN::m_PageLayoutDescrFileName = project.m_BoardPageLayoutDescrFile; BASE_SCREEN::m_PageLayoutDescrFileName = project.m_BoardPageLayoutDescrFile;
@ -100,9 +101,16 @@ bool PCB_EDIT_FRAME::LoadProjectSettings()
KIGFX::PCB_RENDER_SETTINGS* rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( KIGFX::PCB_RENDER_SETTINGS* rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>(
GetCanvas()->GetView()->GetPainter()->GetSettings() ); GetCanvas()->GetView()->GetPainter()->GetSettings() );
rs->LoadNetSettings( project.NetSettings(), GetBoard()->GetNetInfo() ); NETINFO_LIST& nets = GetBoard()->GetNetInfo();
std::set<int> hiddenNets;
PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings(); for( const wxString& hidden : localSettings.m_HiddenNets )
{
if( NETINFO_ITEM* net = nets.GetNetItem( hidden ) )
hiddenNets.insert( net->GetNet() );
}
rs->LoadNetSettings( project.NetSettings(), nets, hiddenNets );
SELECTION_FILTER_OPTIONS& filterOpts = GetToolManager()->GetTool<SELECTION_TOOL>()->GetFilter(); SELECTION_FILTER_OPTIONS& filterOpts = GetToolManager()->GetTool<SELECTION_TOOL>()->GetFilter();
@ -126,18 +134,29 @@ void PCB_EDIT_FRAME::SaveProjectSettings()
if( !IsWritable( fn ) ) if( !IsWritable( fn ) )
return; return;
PROJECT_FILE& project = Prj().GetProjectFile(); PROJECT_FILE& project = Prj().GetProjectFile();
PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
// TODO: Can this be pulled out of BASE_SCREEN? // TODO: Can this be pulled out of BASE_SCREEN?
project.m_BoardPageLayoutDescrFile = BASE_SCREEN::m_PageLayoutDescrFileName; project.m_BoardPageLayoutDescrFile = BASE_SCREEN::m_PageLayoutDescrFileName;
RecordDRCExclusions(); RecordDRCExclusions();
PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings(); KIGFX::PCB_RENDER_SETTINGS* rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>(
GetCanvas()->GetView()->GetPainter()->GetSettings() );
NETINFO_LIST& nets = GetBoard()->GetNetInfo();
localSettings.m_HiddenNets.clear();
for( int netcode : rs->GetHiddenNets() )
{
if( NETINFO_ITEM* net = nets.GetNetItem( netcode ) )
localSettings.m_HiddenNets.emplace_back( net->GetNetname() );
}
SELECTION_FILTER_OPTIONS& filterOpts = GetToolManager()->GetTool<SELECTION_TOOL>()->GetFilter(); SELECTION_FILTER_OPTIONS& filterOpts = GetToolManager()->GetTool<SELECTION_TOOL>()->GetFilter();
localSettings.m_SelectionFilter = filterOpts;
localSettings.m_SelectionFilter = filterOpts;
GetSettingsManager()->SaveProject(); GetSettingsManager()->SaveProject();
} }

View File

@ -604,7 +604,8 @@ TOOL_ACTION PCB_ACTIONS::appendBoard( "pcbnew.EditorControl.appendBoard",
add_board_xpm ); add_board_xpm );
TOOL_ACTION PCB_ACTIONS::highlightNet( "pcbnew.EditorControl.highlightNet", TOOL_ACTION PCB_ACTIONS::highlightNet( "pcbnew.EditorControl.highlightNet",
AS_GLOBAL ); AS_GLOBAL, 0, "", _( "Highlight Net" ), _( "Highlight the selected net" ),
net_highlight_xpm );
TOOL_ACTION PCB_ACTIONS::toggleLastNetHighlight( "pcbnew.EditorControl.toggleLastNetHighlight", TOOL_ACTION PCB_ACTIONS::toggleLastNetHighlight( "pcbnew.EditorControl.toggleLastNetHighlight",
AS_GLOBAL, 0, "", AS_GLOBAL, 0, "",
@ -629,6 +630,12 @@ TOOL_ACTION PCB_ACTIONS::highlightNetSelection( "pcbnew.EditorControl.highlightN
TOOL_ACTION PCB_ACTIONS::highlightItem( "pcbnew.EditorControl.highlightItem", TOOL_ACTION PCB_ACTIONS::highlightItem( "pcbnew.EditorControl.highlightItem",
AS_GLOBAL ); AS_GLOBAL );
TOOL_ACTION PCB_ACTIONS::hideNet( "pcbnew.EditorControl.hideNet", AS_GLOBAL, 0, "",
_( "Hide Net" ), _( "Hide the ratsnest for the selected net" ), ratsnest_xpm );
TOOL_ACTION PCB_ACTIONS::showNet( "pcbnew.EditorControl.showNet", AS_GLOBAL, 0, "",
_( "Show Net" ), _( "Show the ratsnest for the selected net" ), ratsnest_xpm );
TOOL_ACTION PCB_ACTIONS::showEeschema( "pcbnew.EditorControl.showEeschema", TOOL_ACTION PCB_ACTIONS::showEeschema( "pcbnew.EditorControl.showEeschema",
AS_GLOBAL, 0, "", AS_GLOBAL, 0, "",
_( "Switch to Schematic Editor" ), _( "Open schematic in Eeschema" ), _( "Switch to Schematic Editor" ), _( "Open schematic in Eeschema" ),

View File

@ -404,17 +404,21 @@ public:
static TOOL_ACTION pickerTool; static TOOL_ACTION pickerTool;
static TOOL_ACTION measureTool; static TOOL_ACTION measureTool;
static TOOL_ACTION updateUnits; static TOOL_ACTION updateUnits;
static TOOL_ACTION drillOrigin;
static TOOL_ACTION placeFileOrigin;
static TOOL_ACTION appendBoard;
static TOOL_ACTION showEeschema;
static TOOL_ACTION boardStatistics;
// Appearance controls
static TOOL_ACTION clearHighlight; static TOOL_ACTION clearHighlight;
static TOOL_ACTION highlightNet; static TOOL_ACTION highlightNet;
static TOOL_ACTION toggleLastNetHighlight; static TOOL_ACTION toggleLastNetHighlight;
static TOOL_ACTION highlightNetTool; static TOOL_ACTION highlightNetTool;
static TOOL_ACTION highlightNetSelection; static TOOL_ACTION highlightNetSelection;
static TOOL_ACTION highlightItem; static TOOL_ACTION highlightItem;
static TOOL_ACTION drillOrigin; static TOOL_ACTION hideNet;
static TOOL_ACTION placeFileOrigin; static TOOL_ACTION showNet;
static TOOL_ACTION appendBoard;
static TOOL_ACTION showEeschema;
static TOOL_ACTION boardStatistics;
// Ratsnest // Ratsnest
static TOOL_ACTION localRatsnestTool; static TOOL_ACTION localRatsnestTool;

View File

@ -21,12 +21,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <bitmaps.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/selection_tool.h> #include <tools/selection_tool.h>
#include <tools/pcbnew_picker_tool.h> #include <tools/pcbnew_picker_tool.h>
#include <tools/edit_tool.h> #include <tools/edit_tool.h>
#include <painter.h> #include <pcb_painter.h>
#include <connectivity/connectivity_data.h> #include <connectivity/connectivity_data.h>
#include <profile.h> #include <profile.h>
#include "pcb_inspection_tool.h" #include "pcb_inspection_tool.h"
@ -43,10 +43,69 @@ PCB_INSPECTION_TOOL::PCB_INSPECTION_TOOL() :
} }
class NET_CONTEXT_MENU : public ACTION_MENU
{
public:
NET_CONTEXT_MENU() : ACTION_MENU( true )
{
SetIcon( ratsnest_xpm );
SetTitle( _( "Net Tools" ) );
Add( PCB_ACTIONS::showNet );
Add( PCB_ACTIONS::hideNet );
// Add( PCB_ACTIONS::highlightNet );
}
private:
void update() override
{
const auto& selection = getToolManager()->GetTool<SELECTION_TOOL>()->GetSelection();
bool haveNetCode = false;
for( EDA_ITEM* item : selection )
{
if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
{
if( bci->GetNetCode() > 0 )
{
haveNetCode = true;
break;
}
}
}
Enable( getMenuId( PCB_ACTIONS::showNet ), haveNetCode );
Enable( getMenuId( PCB_ACTIONS::hideNet ), haveNetCode );
// Enable( getMenuId( PCB_ACTIONS::highlightNet ), haveNetCode );
}
ACTION_MENU* create() const override
{
return new NET_CONTEXT_MENU();
}
};
bool PCB_INSPECTION_TOOL::Init() bool PCB_INSPECTION_TOOL::Init()
{ {
SELECTION_TOOL* selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
auto netSubMenu = std::make_shared<NET_CONTEXT_MENU>();
netSubMenu->SetTool( this );
static KICAD_T connectedTypes[] = { PCB_TRACE_T, PCB_VIA_T, PCB_ARC_T, PCB_PAD_T,
PCB_ZONE_AREA_T, EOT };
CONDITIONAL_MENU& menu = selectionTool->GetToolMenu().GetMenu();
selectionTool->GetToolMenu().AddSubMenu( netSubMenu );
menu.AddMenu( netSubMenu.get(), SELECTION_CONDITIONS::OnlyTypes( connectedTypes ) );
m_ratsnestTimer.SetOwner( this ); m_ratsnestTimer.SetOwner( this );
Connect( m_ratsnestTimer.GetId(), wxEVT_TIMER, wxTimerEventHandler( PCB_INSPECTION_TOOL::ratsnestTimer ), NULL, this ); Connect( m_ratsnestTimer.GetId(), wxEVT_TIMER,
wxTimerEventHandler( PCB_INSPECTION_TOOL::ratsnestTimer ), NULL, this );
return true; return true;
} }
@ -462,6 +521,7 @@ void PCB_INSPECTION_TOOL::calculateSelectionRatsnest()
connectivity->ComputeDynamicRatsnest( items ); connectivity->ComputeDynamicRatsnest( items );
} }
int PCB_INSPECTION_TOOL::ListNets( const TOOL_EVENT& aEvent ) int PCB_INSPECTION_TOOL::ListNets( const TOOL_EVENT& aEvent )
{ {
if( m_listNetsDialog == nullptr ) if( m_listNetsDialog == nullptr )
@ -482,6 +542,7 @@ int PCB_INSPECTION_TOOL::ListNets( const TOOL_EVENT& aEvent )
return 0; return 0;
} }
void PCB_INSPECTION_TOOL::onListNetsDialogClosed( wxCommandEvent& event ) void PCB_INSPECTION_TOOL::onListNetsDialogClosed( wxCommandEvent& event )
{ {
m_listNetsDialogSettings = m_listNetsDialog->Settings(); m_listNetsDialogSettings = m_listNetsDialog->Settings();
@ -496,6 +557,53 @@ void PCB_INSPECTION_TOOL::onListNetsDialogClosed( wxCommandEvent& event )
m_listNetsDialog.release(); m_listNetsDialog.release();
} }
int PCB_INSPECTION_TOOL::HideNet( const TOOL_EVENT& aEvent )
{
doHideNet( aEvent.Parameter<intptr_t>(), true );
return 0;
}
int PCB_INSPECTION_TOOL::ShowNet( const TOOL_EVENT& aEvent )
{
doHideNet( aEvent.Parameter<intptr_t>(), false );
return 0;
}
void PCB_INSPECTION_TOOL::doHideNet( int aNetCode, bool aHide )
{
KIGFX::PCB_RENDER_SETTINGS* rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>(
m_toolMgr->GetView()->GetPainter()->GetSettings() );
SELECTION_TOOL* selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
SELECTION& selection = selectionTool->GetSelection();
if( aNetCode <= 0 && !selection.Empty() )
{
for( EDA_ITEM* item : selection )
{
if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
{
if( bci->GetNetCode() > 0 )
doHideNet( bci->GetNetCode(), aHide );
}
}
return;
}
if( aHide )
rs->GetHiddenNets().insert( aNetCode );
else
rs->GetHiddenNets().erase( aNetCode );
m_frame->GetCanvas()->RedrawRatsnest();
m_frame->GetCanvas()->Refresh();
}
void PCB_INSPECTION_TOOL::setTransitions() void PCB_INSPECTION_TOOL::setTransitions()
{ {
Go( &PCB_INSPECTION_TOOL::CrossProbePcbToSch, EVENTS::SelectedEvent ); Go( &PCB_INSPECTION_TOOL::CrossProbePcbToSch, EVENTS::SelectedEvent );
@ -516,4 +624,7 @@ void PCB_INSPECTION_TOOL::setTransitions()
Go( &PCB_INSPECTION_TOOL::HighlightNetTool, PCB_ACTIONS::highlightNetTool.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::HighlightNetTool, PCB_ACTIONS::highlightNetTool.MakeEvent() );
Go( &PCB_INSPECTION_TOOL::ClearHighlight, ACTIONS::cancelInteractive.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::ClearHighlight, ACTIONS::cancelInteractive.MakeEvent() );
Go( &PCB_INSPECTION_TOOL::HighlightItem, PCB_ACTIONS::highlightItem.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::HighlightItem, PCB_ACTIONS::highlightItem.MakeEvent() );
Go( &PCB_INSPECTION_TOOL::HideNet, PCB_ACTIONS::hideNet.MakeEvent() );
Go( &PCB_INSPECTION_TOOL::ShowNet, PCB_ACTIONS::showNet.MakeEvent() );
} }

View File

@ -82,6 +82,12 @@ public:
int ListNets( const TOOL_EVENT& aEvent ); int ListNets( const TOOL_EVENT& aEvent );
///> Hide the ratsnest for a given net
int HideNet( const TOOL_EVENT& aEvent );
///> Show the ratsnest for a given net
int ShowNet( const TOOL_EVENT& aEvent );
private: private:
///> Event handler to recalculate dynamic ratsnest ///> Event handler to recalculate dynamic ratsnest
void ratsnestTimer( wxTimerEvent& aEvent ); void ratsnestTimer( wxTimerEvent& aEvent );
@ -91,6 +97,8 @@ private:
bool highlightNet( const VECTOR2D& aPosition, bool aUseSelection ); bool highlightNet( const VECTOR2D& aPosition, bool aUseSelection );
void doHideNet( int aNetCode, bool aHide );
///> Bind handlers to corresponding TOOL_ACTIONs ///> Bind handlers to corresponding TOOL_ACTIONs
void setTransitions() override; void setTransitions() override;