Change Position Relative To to use anchor, not centroid.
Fixes: lp:1793984 * https://bugs.launchpad.net/kicad/+bug/1793984
This commit is contained in:
parent
9eb574015c
commit
f3c6e1fb62
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" ) );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue