Make sheet pin positions invariant to four rotations more often
This commit is contained in:
parent
4b87c4c21c
commit
65af3a8568
|
@ -250,8 +250,52 @@ void SCH_SHEET_PIN::MirrorHorizontally( int aCenter )
|
||||||
void SCH_SHEET_PIN::Rotate( const wxPoint& aCenter )
|
void SCH_SHEET_PIN::Rotate( const wxPoint& aCenter )
|
||||||
{
|
{
|
||||||
wxPoint pt = GetTextPos();
|
wxPoint pt = GetTextPos();
|
||||||
|
wxPoint delta = pt - aCenter;
|
||||||
|
|
||||||
RotatePoint( &pt, aCenter, 900 );
|
RotatePoint( &pt, aCenter, 900 );
|
||||||
|
|
||||||
|
SHEET_SIDE oldSide = GetEdge();
|
||||||
ConstrainOnEdge( pt );
|
ConstrainOnEdge( pt );
|
||||||
|
|
||||||
|
// If the new side is the same as the old side, instead mirror across the center of that side.
|
||||||
|
if( GetEdge() == oldSide )
|
||||||
|
{
|
||||||
|
switch( GetEdge() )
|
||||||
|
{
|
||||||
|
case SHEET_SIDE::TOP:
|
||||||
|
case SHEET_SIDE::BOTTOM:
|
||||||
|
SetTextPos( wxPoint( aCenter.x - delta.x, GetTextPos().y ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SHEET_SIDE::LEFT:
|
||||||
|
case SHEET_SIDE::RIGHT:
|
||||||
|
SetTextPos( wxPoint( GetTextPos().x, aCenter.y - delta.y ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the new side is opposite to the old side, instead mirror across the center of an adjacent
|
||||||
|
// side.
|
||||||
|
else if( GetEdge() == GetOppositeSide( oldSide ) )
|
||||||
|
{
|
||||||
|
switch( GetEdge() )
|
||||||
|
{
|
||||||
|
case SHEET_SIDE::TOP:
|
||||||
|
case SHEET_SIDE::BOTTOM:
|
||||||
|
SetTextPos( wxPoint( aCenter.x + delta.x, GetTextPos().y ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SHEET_SIDE::LEFT:
|
||||||
|
case SHEET_SIDE::RIGHT:
|
||||||
|
SetTextPos( wxPoint( GetTextPos().x, aCenter.y + delta.y ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,18 @@ public:
|
||||||
|
|
||||||
bool operator ==( const SCH_SHEET_PIN* aPin ) const;
|
bool operator ==( const SCH_SHEET_PIN* aPin ) const;
|
||||||
|
|
||||||
|
static SHEET_SIDE GetOppositeSide( SHEET_SIDE aSide )
|
||||||
|
{
|
||||||
|
switch( aSide )
|
||||||
|
{
|
||||||
|
case SHEET_SIDE::TOP: return SHEET_SIDE::BOTTOM;
|
||||||
|
case SHEET_SIDE::BOTTOM: return SHEET_SIDE::TOP;
|
||||||
|
case SHEET_SIDE::LEFT: return SHEET_SIDE::RIGHT;
|
||||||
|
case SHEET_SIDE::RIGHT: return SHEET_SIDE::LEFT;
|
||||||
|
default: return SHEET_SIDE::UNDEFINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true for items which are moved with the anchor point at mouse cursor
|
* Return true for items which are moved with the anchor point at mouse cursor
|
||||||
* and false for items moved with no reference to anchor (usually large items).
|
* and false for items moved with no reference to anchor (usually large items).
|
||||||
|
|
|
@ -505,7 +505,7 @@ int SCH_EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
|
||||||
SCH_SHEET* sheet = pin->GetParent();
|
SCH_SHEET* sheet = pin->GetParent();
|
||||||
|
|
||||||
for( int i = 0; clockwise ? i < 3 : i < 1; ++i )
|
for( int i = 0; clockwise ? i < 3 : i < 1; ++i )
|
||||||
pin->Rotate( sheet->GetBoundingBox().GetCenter() );
|
pin->Rotate( sheet->GetBodyBoundingBox().GetCenter() );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -606,7 +606,7 @@ int SCH_EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
|
||||||
SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
|
SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
|
||||||
SCH_SHEET* sheet = pin->GetParent();
|
SCH_SHEET* sheet = pin->GetParent();
|
||||||
|
|
||||||
pin->Rotate( sheet->GetBoundingBox().GetCenter() );
|
pin->Rotate( sheet->GetBodyBoundingBox().GetCenter() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( item->Type() == SCH_FIELD_T )
|
else if( item->Type() == SCH_FIELD_T )
|
||||||
|
|
|
@ -78,16 +78,12 @@ static SCH_ITEM* Instatiate( KICAD_T aType, SCH_SHEET* sheet )
|
||||||
case SCH_SYMBOL_T: return new SCH_SYMBOL();
|
case SCH_SYMBOL_T: return new SCH_SYMBOL();
|
||||||
|
|
||||||
case SCH_SHEET_PIN_T:
|
case SCH_SHEET_PIN_T:
|
||||||
{
|
|
||||||
// XXX: Sheet pins need to be manually placed on sheet item side.
|
// XXX: Sheet pins need to be manually placed on sheet item side.
|
||||||
SCH_SHEET_PIN* pin = new SCH_SHEET_PIN(
|
return new SCH_SHEET_PIN(
|
||||||
sheet,
|
sheet,
|
||||||
wxPoint( sheet->GetPosition().x, sheet->GetPosition().y + Millimeter2iu( 40 ) ),
|
wxPoint( sheet->GetPosition().x, sheet->GetPosition().y + Millimeter2iu( 40 ) ),
|
||||||
"test pin" );
|
"test pin" );
|
||||||
|
|
||||||
return pin;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SCH_SHEET_T:
|
case SCH_SHEET_T:
|
||||||
case SCH_PIN_T:
|
case SCH_PIN_T:
|
||||||
case SCHEMATIC_T:
|
case SCHEMATIC_T:
|
||||||
|
|
Loading…
Reference in New Issue