From 5f88c132c91157760b8fe2e2be0f9290d6799fea Mon Sep 17 00:00:00 2001 From: Mike Williams Date: Thu, 28 Sep 2023 10:27:27 -0400 Subject: [PATCH] Schematic: add pin helpers menu (quickly breakout pins) --- eeschema/eeschema_id.h | 7 ++ eeschema/tools/ee_selection_tool.cpp | 102 +++++++++++++++++++++++++++ eeschema/tools/ee_selection_tool.h | 1 + eeschema/tools/sch_edit_tool.cpp | 38 ++++++++++ 4 files changed, 148 insertions(+) diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 39019f738d..f8308dc9b6 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -86,6 +86,13 @@ enum id_eeschema_frm // to select one unit among MAX_UNIT_COUNT_PER_PACKAGE in popup menu ID_POPUP_SCH_SELECT_UNIT_END = ID_POPUP_SCH_SELECT_UNIT1 + MAX_UNIT_COUNT_PER_PACKAGE, + ID_POPUP_SCH_PIN_TRICKS_START, + ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT = ID_POPUP_SCH_PIN_TRICKS_START, + ID_POPUP_SCH_PIN_TRICKS_NET_LABEL, + ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL, + ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL, + ID_POPUP_SCH_PIN_TRICKS_END = ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL, + ID_POPUP_SCH_ALT_PIN_FUNCTION, ID_POPUP_SCH_ALT_PIN_FUNCTION_END = ID_POPUP_SCH_ALT_PIN_FUNCTION + MAX_ALT_PIN_FUNCTION_ITEMS }; diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index 3d90bb00b3..bba12ac826 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -141,6 +143,12 @@ SELECTION_CONDITION EE_CONDITIONS::MultipleSymbolsOrPower = []( const SELECTION& }; +SELECTION_CONDITION EE_CONDITIONS::AllPins = []( const SELECTION& aSel ) +{ + return aSel.GetSize() >= 1 && aSel.OnlyContains( { SCH_PIN_T } ); +}; + + #define HITTEST_THRESHOLD_PIXELS 5 @@ -607,6 +615,100 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) if( pin ) static_cast( m_frame )->SetAltPinFunction( pin, alt ); } + else if( *evt->GetCommandId() >= ID_POPUP_SCH_PIN_TRICKS_START + && *evt->GetCommandId() <= ID_POPUP_SCH_PIN_TRICKS_END ) + { + if( !m_selection.OnlyContains( { SCH_PIN_T } ) ) + return 0; + + // Keep track of new items so we make them the new selection at the end + EDA_ITEMS newItems; + SCH_COMMIT commit( static_cast( m_frame ) ); + + if( *evt->GetCommandId() == ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT ) + { + for( EDA_ITEM* item : m_selection ) + { + SCH_PIN* pin = static_cast( item ); + SCH_NO_CONNECT* nc = new SCH_NO_CONNECT( pin->GetPosition() ); + commit.Add( nc, m_frame->GetScreen() ); + newItems.push_back( nc ); + } + + commit.Push( wxS( "No Connect Pins" ) ); + ClearSelection(); + } + else + { + // For every pin in the selection, add a label according to menu item + // selected by the user + for( EDA_ITEM* item : m_selection ) + { + SCH_PIN* pin = static_cast( item ); + SCH_LABEL_BASE* label = nullptr; + + switch( *evt->GetCommandId() ) + { + case ID_POPUP_SCH_PIN_TRICKS_NET_LABEL: + label = new SCH_LABEL( pin->GetPosition(), pin->GetShownName() ); + break; + case ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL: + label = new SCH_HIERLABEL( pin->GetPosition(), pin->GetShownName() ); + break; + case ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL: + label = new SCH_GLOBALLABEL( pin->GetPosition(), pin->GetShownName() ); + break; + default: continue; + } + + switch( pin->GetOrientation() ) + { + case PIN_ORIENTATION::PIN_LEFT: + label->SetSpinStyle( SPIN_STYLE::SPIN::RIGHT ); + break; + case PIN_ORIENTATION::PIN_RIGHT: + label->SetSpinStyle( SPIN_STYLE::SPIN::LEFT ); + break; + case PIN_ORIENTATION::PIN_UP: + label->SetSpinStyle( SPIN_STYLE::SPIN::BOTTOM ); + break; + case PIN_ORIENTATION::PIN_DOWN: + label->SetSpinStyle( SPIN_STYLE::SPIN::UP ); + break; + } + + switch( pin->GetType() ) + { + case ELECTRICAL_PINTYPE::PT_BIDI: + label->SetShape( LABEL_FLAG_SHAPE::L_BIDI ); + break; + case ELECTRICAL_PINTYPE::PT_INPUT: + label->SetShape( LABEL_FLAG_SHAPE::L_INPUT ); + break; + case ELECTRICAL_PINTYPE::PT_OUTPUT: + label->SetShape( LABEL_FLAG_SHAPE::L_OUTPUT ); + break; + case ELECTRICAL_PINTYPE::PT_TRISTATE: + label->SetShape( LABEL_FLAG_SHAPE::L_TRISTATE ); + break; + case ELECTRICAL_PINTYPE::PT_UNSPECIFIED: + label->SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED ); + break; + default: + label->SetShape( LABEL_FLAG_SHAPE::L_INPUT ); + } + + commit.Add( label, m_frame->GetScreen() ); + newItems.push_back( label ); + } + + commit.Push( wxS( "Label Pins" ) ); + + // Many users will want to drag these items to wire off of the pins, so pre-select them + ClearSelection(); + AddItemsToSel( &newItems ); + } + } else if( *evt->GetCommandId() >= ID_POPUP_SCH_UNFOLD_BUS && *evt->GetCommandId() <= ID_POPUP_SCH_UNFOLD_BUS_END ) { diff --git a/eeschema/tools/ee_selection_tool.h b/eeschema/tools/ee_selection_tool.h index 82a36a9693..e3bb1d3473 100644 --- a/eeschema/tools/ee_selection_tool.h +++ b/eeschema/tools/ee_selection_tool.h @@ -53,6 +53,7 @@ public: static SELECTION_CONDITION SingleMultiFunctionPin; static SELECTION_CONDITION SingleNonExcludedMarker; static SELECTION_CONDITION MultipleSymbolsOrPower; + static SELECTION_CONDITION AllPins; }; diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index f1474f9e48..c5b053183e 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -191,6 +191,39 @@ private: }; +class PIN_TRICKS_MENU : public ACTION_MENU +{ +public: + PIN_TRICKS_MENU() : ACTION_MENU( true ) + { + SetIcon( BITMAPS::pin ); + SetTitle( _( "Pin Helpers" ) ); + } + +protected: + ACTION_MENU* create() const override { return new PIN_TRICKS_MENU(); } + +private: + void update() override + { + EE_SELECTION_TOOL* selTool = getToolManager()->GetTool(); + EE_SELECTION& selection = selTool->GetSelection(); + SCH_PIN* pin = dynamic_cast( selection.Front() ); + + Clear(); + + if( !pin ) + return; + + Add( wxS( "No Connect" ), ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT, BITMAPS::noconn ); + Add( wxS( "Net Label" ), ID_POPUP_SCH_PIN_TRICKS_NET_LABEL, BITMAPS::add_label ); + Add( wxS( "Hierarchical Label" ), ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL, + BITMAPS::add_hierarchical_label ); + Add( wxS( "Global Label" ), ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL, BITMAPS::add_glabel ); + } +}; + + SCH_EDIT_TOOL::SCH_EDIT_TOOL() : EE_TOOL_BASE( "eeschema.InteractiveEdit" ) { @@ -675,6 +708,11 @@ bool SCH_EDIT_TOOL::Init() m_selectionTool->GetToolMenu().RegisterSubMenu( altPinMenu ); selToolMenu.AddMenu( altPinMenu.get(), E_C::SingleMultiFunctionPin, 1 ); + std::shared_ptr pinTricksMenu = std::make_shared(); + pinTricksMenu->SetTool( m_selectionTool ); + m_selectionTool->GetToolMenu().RegisterSubMenu( pinTricksMenu ); + selToolMenu.AddMenu( pinTricksMenu.get(), E_C::AllPins, 1 ); + selToolMenu.AddItem( EE_ACTIONS::editWithLibEdit, E_C::SingleSymbolOrPower && E_C::Idle, 200 ); selToolMenu.AddItem( EE_ACTIONS::changeSymbol, E_C::SingleSymbolOrPower, 200 ); selToolMenu.AddItem( EE_ACTIONS::updateSymbol, E_C::SingleSymbolOrPower, 200 );