Schematic: add pin helpers menu (quickly breakout pins)

This commit is contained in:
Mike Williams 2023-09-28 10:27:27 -04:00
parent be9e4c79ee
commit 5f88c132c9
4 changed files with 148 additions and 0 deletions

View File

@ -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
};

View File

@ -40,6 +40,7 @@
#include <sch_painter.h>
#include <preview_items/selection_area.h>
#include <sch_base_frame.h>
#include <sch_commit.h>
#include <sch_symbol.h>
#include <sch_field.h>
#include <sch_edit_frame.h>
@ -48,6 +49,7 @@
#include <sch_bus_entry.h>
#include <sch_junction.h>
#include <sch_marker.h>
#include <sch_no_connect.h>
#include <sch_sheet.h>
#include <sch_sheet_pin.h>
#include <lib_shape.h>
@ -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<SCH_EDIT_FRAME*>( 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<SCH_EDIT_FRAME*>( m_frame ) );
if( *evt->GetCommandId() == ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT )
{
for( EDA_ITEM* item : m_selection )
{
SCH_PIN* pin = static_cast<SCH_PIN*>( 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<SCH_PIN*>( 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 )
{

View File

@ -53,6 +53,7 @@ public:
static SELECTION_CONDITION SingleMultiFunctionPin;
static SELECTION_CONDITION SingleNonExcludedMarker;
static SELECTION_CONDITION MultipleSymbolsOrPower;
static SELECTION_CONDITION AllPins;
};

View File

@ -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_TOOL>();
EE_SELECTION& selection = selTool->GetSelection();
SCH_PIN* pin = dynamic_cast<SCH_PIN*>( 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<SCH_EDIT_FRAME>( "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<PIN_TRICKS_MENU> pinTricksMenu = std::make_shared<PIN_TRICKS_MENU>();
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 );