Schematic: add pin helpers menu (quickly breakout pins)
This commit is contained in:
parent
be9e4c79ee
commit
5f88c132c9
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -53,6 +53,7 @@ public:
|
|||
static SELECTION_CONDITION SingleMultiFunctionPin;
|
||||
static SELECTION_CONDITION SingleNonExcludedMarker;
|
||||
static SELECTION_CONDITION MultipleSymbolsOrPower;
|
||||
static SELECTION_CONDITION AllPins;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue