Change Position Relative To to use anchor, not centroid.

Fixes: lp:1793984
* https://bugs.launchpad.net/kicad/+bug/1793984
This commit is contained in:
Jeff Young 2018-09-24 00:42:22 +01:00
parent 9eb574015c
commit f3c6e1fb62
3 changed files with 20 additions and 13 deletions

View File

@ -192,7 +192,7 @@ void DIALOG_POSITION_RELATIVE::OnOkClick( wxCommandEvent& event )
POSITION_RELATIVE_TOOL* posrelTool = m_toolMgr->GetTool<POSITION_RELATIVE_TOOL>(); POSITION_RELATIVE_TOOL* posrelTool = m_toolMgr->GetTool<POSITION_RELATIVE_TOOL>();
wxASSERT( posrelTool ); wxASSERT( posrelTool );
posrelTool->RelativeItemSelectionMove( m_anchor_position, m_translation, 0.0 ); posrelTool->RelativeItemSelectionMove( m_anchor_position, m_translation );
event.Skip(); event.Skip();
} }

View File

@ -102,19 +102,25 @@ int POSITION_RELATIVE_TOOL::PositionRelative( const TOOL_EVENT& aEvent )
} }
int POSITION_RELATIVE_TOOL::RelativeItemSelectionMove( wxPoint anchor, wxPoint relativePosition, int POSITION_RELATIVE_TOOL::RelativeItemSelectionMove( wxPoint aPosAnchor, wxPoint aTranslation )
double rotation )
{ {
VECTOR2I rp = m_selection.GetCenter(); wxPoint aSelAnchor( INT_MAX, INT_MAX );
wxPoint rotPoint( rp.x, rp.y );
wxPoint translation = anchor + relativePosition - rotPoint; // Find top-left item anchor in selection
for( auto item : m_selection )
{
wxPoint itemAnchor = static_cast<BOARD_ITEM*>( item )->GetPosition();
if( EuclideanNorm( itemAnchor ) < EuclideanNorm( aSelAnchor ) )
aSelAnchor = itemAnchor;
}
wxPoint aggregateTranslation = aPosAnchor + aTranslation - aSelAnchor;
for( auto item : m_selection ) for( auto item : m_selection )
{ {
m_commit->Modify( item ); m_commit->Modify( item );
static_cast<BOARD_ITEM*>( item )->Move( aggregateTranslation );
static_cast<BOARD_ITEM*>( item )->Rotate( rotPoint, rotation );
static_cast<BOARD_ITEM*>( item )->Move( translation );
} }
m_commit->Push( _( "Position Relative" ) ); m_commit->Push( _( "Position Relative" ) );

View File

@ -62,17 +62,18 @@ public:
/** /**
* Function SelectPositionRelativeItem() * Function SelectPositionRelativeItem()
* *
* Invokes the picker tool to select the item to which the previos selection will be placed relative to. * Invokes the picker tool to select the item to which the previous selection will be placed
* relative to.
*/ */
int SelectPositionRelativeItem( const TOOL_EVENT& aEvent ); int SelectPositionRelativeItem( const TOOL_EVENT& aEvent );
/** /**
* Function RelativeItemSelectionMove() * Function RelativeItemSelectionMove()
* *
* Positions the m_position_relative_selection selection relative to anchorpostion using the given translation and rotation. * Positions the m_position_relative_selection selection relative to anchorpostion using
* Rotation is around the center of the selection. * the given translation.
*/ */
int RelativeItemSelectionMove( wxPoint anchor, wxPoint translation, double rotation ); int RelativeItemSelectionMove( wxPoint anchor, wxPoint translation );
///> Sets up handlers for various events. ///> Sets up handlers for various events.
void setTransitions() override; void setTransitions() override;