Pin helpers can help sheet pins also
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17923
This commit is contained in:
parent
62936b7e01
commit
dffb2c1994
|
@ -147,6 +147,12 @@ SELECTION_CONDITION EE_CONDITIONS::AllPins = []( const SELECTION& aSel )
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SELECTION_CONDITION EE_CONDITIONS::AllPinsOrSheetPins = []( const SELECTION& aSel )
|
||||||
|
{
|
||||||
|
return aSel.GetSize() >= 1 && aSel.OnlyContains( { SCH_PIN_T, SCH_SHEET_PIN_T } );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#define HITTEST_THRESHOLD_PIXELS 5
|
#define HITTEST_THRESHOLD_PIXELS 5
|
||||||
|
|
||||||
|
|
||||||
|
@ -368,6 +374,31 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
KIID lastRolloverItem = niluuid;
|
KIID lastRolloverItem = niluuid;
|
||||||
EE_GRID_HELPER grid( m_toolMgr );
|
EE_GRID_HELPER grid( m_toolMgr );
|
||||||
|
|
||||||
|
auto pinOrientation =
|
||||||
|
[]( EDA_ITEM* aItem )
|
||||||
|
{
|
||||||
|
SCH_PIN* pin = dynamic_cast<SCH_PIN*>( aItem );
|
||||||
|
|
||||||
|
if( pin )
|
||||||
|
return pin->GetOrientation();
|
||||||
|
|
||||||
|
SCH_SHEET_PIN* sheetPin = dynamic_cast<SCH_SHEET_PIN*>( aItem );
|
||||||
|
|
||||||
|
if( sheetPin )
|
||||||
|
{
|
||||||
|
switch( sheetPin->GetSide() )
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case SHEET_SIDE::LEFT: return PIN_ORIENTATION::PIN_RIGHT;
|
||||||
|
case SHEET_SIDE::RIGHT: return PIN_ORIENTATION::PIN_LEFT;
|
||||||
|
case SHEET_SIDE::TOP: return PIN_ORIENTATION::PIN_DOWN;
|
||||||
|
case SHEET_SIDE::BOTTOM: return PIN_ORIENTATION::PIN_UP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PIN_ORIENTATION::PIN_LEFT;
|
||||||
|
};
|
||||||
|
|
||||||
// Main loop: keep receiving events
|
// Main loop: keep receiving events
|
||||||
while( TOOL_EVENT* evt = Wait() )
|
while( TOOL_EVENT* evt = Wait() )
|
||||||
{
|
{
|
||||||
|
@ -631,8 +662,11 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
else if( *evt->GetCommandId() >= ID_POPUP_SCH_PIN_TRICKS_START
|
else if( *evt->GetCommandId() >= ID_POPUP_SCH_PIN_TRICKS_START
|
||||||
&& *evt->GetCommandId() <= ID_POPUP_SCH_PIN_TRICKS_END )
|
&& *evt->GetCommandId() <= ID_POPUP_SCH_PIN_TRICKS_END )
|
||||||
{
|
{
|
||||||
if( !m_selection.OnlyContains( { SCH_PIN_T } ) || m_selection.Empty() )
|
if( !m_selection.OnlyContains( { SCH_PIN_T, SCH_SHEET_PIN_T } )
|
||||||
|
|| m_selection.Empty() )
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Keep track of new items so we make them the new selection at the end
|
// Keep track of new items so we make them the new selection at the end
|
||||||
EDA_ITEMS newItems;
|
EDA_ITEMS newItems;
|
||||||
|
@ -642,8 +676,7 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
for( EDA_ITEM* item : m_selection )
|
for( EDA_ITEM* item : m_selection )
|
||||||
{
|
{
|
||||||
SCH_PIN* pin = static_cast<SCH_PIN*>( item );
|
SCH_NO_CONNECT* nc = new SCH_NO_CONNECT( item->GetPosition() );
|
||||||
SCH_NO_CONNECT* nc = new SCH_NO_CONNECT( pin->GetPosition() );
|
|
||||||
commit.Add( nc, m_frame->GetScreen() );
|
commit.Add( nc, m_frame->GetScreen() );
|
||||||
newItems.push_back( nc );
|
newItems.push_back( nc );
|
||||||
}
|
}
|
||||||
|
@ -657,14 +690,13 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
for( EDA_ITEM* item : m_selection )
|
for( EDA_ITEM* item : m_selection )
|
||||||
{
|
{
|
||||||
SCH_PIN* pin = static_cast<SCH_PIN*>( item );
|
SCH_LINE* wire = new SCH_LINE( item->GetPosition(), LAYER_WIRE );
|
||||||
SCH_LINE* wire = new SCH_LINE( pin->GetPosition(), LAYER_WIRE );
|
|
||||||
|
|
||||||
// Add some length to the wire as nothing in our code base handles
|
// Add some length to the wire as nothing in our code base handles
|
||||||
// 0 length wires very well, least of all the ortho drag algorithm
|
// 0 length wires very well, least of all the ortho drag algorithm
|
||||||
VECTOR2I stub;
|
VECTOR2I stub;
|
||||||
|
|
||||||
switch( pin->GetOrientation() )
|
switch( pinOrientation( item ) )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case PIN_ORIENTATION::PIN_RIGHT:
|
case PIN_ORIENTATION::PIN_RIGHT:
|
||||||
|
@ -681,7 +713,7 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
wire->SetEndPoint( pin->GetPosition() + stub );
|
wire->SetEndPoint( item->GetPosition() + stub );
|
||||||
|
|
||||||
m_frame->AddToScreen( wire, m_frame->GetScreen() );
|
m_frame->AddToScreen( wire, m_frame->GetScreen() );
|
||||||
commit.Added( wire, m_frame->GetScreen() );
|
commit.Added( wire, m_frame->GetScreen() );
|
||||||
|
@ -713,24 +745,33 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
// selected by the user
|
// selected by the user
|
||||||
for( EDA_ITEM* item : m_selection )
|
for( EDA_ITEM* item : m_selection )
|
||||||
{
|
{
|
||||||
SCH_PIN* pin = static_cast<SCH_PIN*>( item );
|
SCH_PIN* pin = dynamic_cast<SCH_PIN*>( item );
|
||||||
|
SCH_SHEET_PIN* sheetPin = dynamic_cast<SCH_SHEET_PIN*>( item );
|
||||||
|
SCH_EDIT_FRAME* sf = dynamic_cast<SCH_EDIT_FRAME*>( m_frame );
|
||||||
SCH_LABEL_BASE* label = nullptr;
|
SCH_LABEL_BASE* label = nullptr;
|
||||||
|
|
||||||
|
wxString labelText;
|
||||||
|
|
||||||
|
if( pin )
|
||||||
|
labelText = pin->GetShownName();
|
||||||
|
else if( sheetPin && sf )
|
||||||
|
labelText = sheetPin->GetShownText( &sf->GetCurrentSheet(), false );
|
||||||
|
|
||||||
switch( *evt->GetCommandId() )
|
switch( *evt->GetCommandId() )
|
||||||
{
|
{
|
||||||
case ID_POPUP_SCH_PIN_TRICKS_NET_LABEL:
|
case ID_POPUP_SCH_PIN_TRICKS_NET_LABEL:
|
||||||
label = new SCH_LABEL( pin->GetPosition(), pin->GetShownName() );
|
label = new SCH_LABEL( item->GetPosition(), labelText );
|
||||||
break;
|
break;
|
||||||
case ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL:
|
case ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL:
|
||||||
label = new SCH_HIERLABEL( pin->GetPosition(), pin->GetShownName() );
|
label = new SCH_HIERLABEL( item->GetPosition(), labelText );
|
||||||
break;
|
break;
|
||||||
case ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL:
|
case ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL:
|
||||||
label = new SCH_GLOBALLABEL( pin->GetPosition(), pin->GetShownName() );
|
label = new SCH_GLOBALLABEL( item->GetPosition(), labelText );
|
||||||
break;
|
break;
|
||||||
default: continue;
|
default: continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( pin->GetOrientation() )
|
switch( pinOrientation( item ) )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case PIN_ORIENTATION::PIN_RIGHT:
|
case PIN_ORIENTATION::PIN_RIGHT:
|
||||||
|
@ -747,7 +788,25 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( pin->GetType() )
|
ELECTRICAL_PINTYPE pinType = ELECTRICAL_PINTYPE::PT_UNSPECIFIED;
|
||||||
|
|
||||||
|
if( pin )
|
||||||
|
{
|
||||||
|
pinType = pin->GetType();
|
||||||
|
}
|
||||||
|
else if( sheetPin )
|
||||||
|
{
|
||||||
|
switch( sheetPin->GetLabelShape() )
|
||||||
|
{
|
||||||
|
case LABEL_INPUT: pinType = ELECTRICAL_PINTYPE::PT_INPUT; break;
|
||||||
|
case LABEL_OUTPUT: pinType = ELECTRICAL_PINTYPE::PT_OUTPUT; break;
|
||||||
|
case LABEL_BIDI: pinType = ELECTRICAL_PINTYPE::PT_BIDI; break;
|
||||||
|
case LABEL_TRISTATE: pinType = ELECTRICAL_PINTYPE::PT_TRISTATE; break;
|
||||||
|
case LABEL_PASSIVE: pinType = ELECTRICAL_PINTYPE::PT_PASSIVE; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( pinType )
|
||||||
{
|
{
|
||||||
case ELECTRICAL_PINTYPE::PT_BIDI:
|
case ELECTRICAL_PINTYPE::PT_BIDI:
|
||||||
label->SetShape( LABEL_FLAG_SHAPE::L_BIDI );
|
label->SetShape( LABEL_FLAG_SHAPE::L_BIDI );
|
||||||
|
|
|
@ -56,6 +56,7 @@ public:
|
||||||
static SELECTION_CONDITION SingleNonExcludedMarker;
|
static SELECTION_CONDITION SingleNonExcludedMarker;
|
||||||
static SELECTION_CONDITION MultipleSymbolsOrPower;
|
static SELECTION_CONDITION MultipleSymbolsOrPower;
|
||||||
static SELECTION_CONDITION AllPins;
|
static SELECTION_CONDITION AllPins;
|
||||||
|
static SELECTION_CONDITION AllPinsOrSheetPins;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -194,10 +194,11 @@ private:
|
||||||
EE_SELECTION_TOOL* selTool = getToolManager()->GetTool<EE_SELECTION_TOOL>();
|
EE_SELECTION_TOOL* selTool = getToolManager()->GetTool<EE_SELECTION_TOOL>();
|
||||||
EE_SELECTION& selection = selTool->GetSelection();
|
EE_SELECTION& selection = selTool->GetSelection();
|
||||||
SCH_PIN* pin = dynamic_cast<SCH_PIN*>( selection.Front() );
|
SCH_PIN* pin = dynamic_cast<SCH_PIN*>( selection.Front() );
|
||||||
|
SCH_SHEET_PIN* sheetPin = dynamic_cast<SCH_SHEET_PIN*>( selection.Front() );
|
||||||
|
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
if( !pin )
|
if( !pin && !sheetPin )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Add( _( "Wire" ), ID_POPUP_SCH_PIN_TRICKS_WIRE, BITMAPS::add_line );
|
Add( _( "Wire" ), ID_POPUP_SCH_PIN_TRICKS_WIRE, BITMAPS::add_line );
|
||||||
|
@ -586,7 +587,7 @@ bool SCH_EDIT_TOOL::Init()
|
||||||
|
|
||||||
selToolMenu.AddMenu( makeSymbolUnitMenu( m_selectionTool ), E_C::SingleMultiUnitSymbol, 1 );
|
selToolMenu.AddMenu( makeSymbolUnitMenu( m_selectionTool ), E_C::SingleMultiUnitSymbol, 1 );
|
||||||
selToolMenu.AddMenu( makePinFunctionMenu( m_selectionTool ), E_C::SingleMultiFunctionPin, 1 );
|
selToolMenu.AddMenu( makePinFunctionMenu( m_selectionTool ), E_C::SingleMultiFunctionPin, 1 );
|
||||||
selToolMenu.AddMenu( makePinTricksMenu( m_selectionTool ), E_C::AllPins, 1 );
|
selToolMenu.AddMenu( makePinTricksMenu( m_selectionTool ), E_C::AllPinsOrSheetPins, 1 );
|
||||||
|
|
||||||
selToolMenu.AddMenu( makeTransformMenu(), orientCondition, 200 );
|
selToolMenu.AddMenu( makeTransformMenu(), orientCondition, 200 );
|
||||||
selToolMenu.AddMenu( makeAttributesMenu(), E_C::HasType( SCH_SYMBOL_T ), 200 );
|
selToolMenu.AddMenu( makeAttributesMenu(), E_C::HasType( SCH_SYMBOL_T ), 200 );
|
||||||
|
|
Loading…
Reference in New Issue