Back-port some fixes from 7.0 branch.

This commit is contained in:
Jeff Young 2021-07-13 16:10:18 +01:00
parent 8b3ccab0a3
commit f0513978ff
2 changed files with 23 additions and 47 deletions

View File

@ -31,6 +31,7 @@
#include <common.h>
#include <utility>
#include <geometry/geometry_utils.h>
void EC_VERTICAL::Apply( EDIT_POINT& aHandle )
{
@ -50,13 +51,8 @@ void EC_HORIZONTAL::Apply( EDIT_POINT& aHandle )
void EC_45DEGREE::Apply( EDIT_POINT& aHandle )
{
// Current line vector
VECTOR2I lineVector( aHandle.GetPosition() - m_constrainer.GetPosition() );
double angle = lineVector.Angle();
// Find the closest angle, which is a multiple of 45 degrees
double newAngle = KiROUND( angle / ( M_PI / 4.0 ) ) * M_PI / 4.0;
VECTOR2I newLineVector = lineVector.Rotate( newAngle - angle );
VECTOR2I newLineVector = GetVectorSnapped45( lineVector );
aHandle.SetPosition( m_constrainer.GetPosition() + newLineVector );
}

View File

@ -334,6 +334,9 @@ std::shared_ptr<EDIT_POINTS> PCB_POINT_EDITOR::makePoints( EDA_ITEM* aItem )
points->AddPoint( dimension->GetEnd() );
points->AddPoint( dimension->Text().GetPosition() );
points->Point( DIM_TEXT ).SetConstraint( new EC_45DEGREE( points->Point( DIM_TEXT ),
points->Point( DIM_END ) ) );
break;
}
@ -512,7 +515,10 @@ int PCB_POINT_EDITOR::OnSelectionChange( const TOOL_EVENT& aEvent )
m_editedPoint->ApplyConstraint();
if( m_editedPoint->GetGridConstraint() == SNAP_TO_GRID )
m_editedPoint->SetPosition( grid.BestSnapAnchor( pos, snapLayers, { item } ) );
{
m_editedPoint->SetPosition( grid.BestSnapAnchor( m_editedPoint->GetPosition(),
snapLayers, { item } ) );
}
updateItem();
getViewControls()->ForceCursorPosition( true, m_editedPoint->GetPosition() );
@ -1024,15 +1030,9 @@ void PCB_POINT_EDITOR::updateItem() const
{
case PCB_SHAPE_TYPE::SEGMENT:
if( isModified( m_editPoints->Point( SEG_START ) ) )
{
shape->SetStart( wxPoint( m_editPoints->Point( SEG_START ).GetPosition().x,
m_editPoints->Point( SEG_START ).GetPosition().y ) );
}
shape->SetStart( (wxPoint) m_editPoints->Point( SEG_START ).GetPosition() );
else if( isModified( m_editPoints->Point( SEG_END ) ) )
{
shape->SetEnd( wxPoint( m_editPoints->Point( SEG_END ).GetPosition().x,
m_editPoints->Point( SEG_END ).GetPosition().y ) );
}
shape->SetEnd( (wxPoint) m_editPoints->Point( SEG_END ).GetPosition() );
break;
@ -1040,7 +1040,7 @@ void PCB_POINT_EDITOR::updateItem() const
{
if( isModified( m_editPoints->Point( RECT_TOP_LEFT ) ) )
{
shape->SetStart((wxPoint) m_editPoints->Point( RECT_TOP_LEFT ).GetPosition() );
shape->SetStart( (wxPoint) m_editPoints->Point( RECT_TOP_LEFT ).GetPosition() );
}
else if( isModified( m_editPoints->Point( RECT_TOP_RIGHT ) ) )
{
@ -1049,7 +1049,7 @@ void PCB_POINT_EDITOR::updateItem() const
}
else if( isModified( m_editPoints->Point( RECT_BOT_RIGHT ) ) )
{
shape->SetEnd((wxPoint) m_editPoints->Point( RECT_BOT_RIGHT ).GetPosition() );
shape->SetEnd( (wxPoint) m_editPoints->Point( RECT_BOT_RIGHT ).GetPosition() );
}
else if( isModified( m_editPoints->Point( RECT_BOT_LEFT ) ) )
{
@ -1343,8 +1343,7 @@ void PCB_POINT_EDITOR::updateItem() const
}
else if( isModified( m_editPoints->Point( DIM_START ) ) )
{
dimension->SetStart( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
dimension->Update();
m_editPoints->Point( DIM_CROSSBARSTART ).SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBARSTART ),
@ -1354,8 +1353,7 @@ void PCB_POINT_EDITOR::updateItem() const
}
else if( isModified( m_editPoints->Point( DIM_END ) ) )
{
dimension->SetEnd( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
dimension->Update();
m_editPoints->Point( DIM_CROSSBARSTART ).SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBARSTART ),
@ -1399,25 +1397,16 @@ void PCB_POINT_EDITOR::updateItem() const
// If the dimension is horizontal or vertical, set correct orientation
// otherwise, test if we're left/right of the bounding box or above/below it
if( bounds.GetWidth() == 0 )
{
vert = true;
}
else if( bounds.GetHeight() == 0 )
{
vert = false;
}
else if( cursorPos.x > bounds.GetLeft() && cursorPos.x < bounds.GetRight() )
{
vert = false;
}
else if( cursorPos.y > bounds.GetTop() && cursorPos.y < bounds.GetBottom() )
{
vert = true;
}
else
{
vert = std::abs( direction.y ) < std::abs( direction.x );
}
dimension->SetOrientation( vert ? PCB_DIM_ORTHOGONAL::DIR::VERTICAL
: PCB_DIM_ORTHOGONAL::DIR::HORIZONTAL );
}
@ -1430,13 +1419,11 @@ void PCB_POINT_EDITOR::updateItem() const
}
else if( isModified( m_editPoints->Point( DIM_START ) ) )
{
dimension->SetStart( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
}
else if( isModified( m_editPoints->Point( DIM_END ) ) )
{
dimension->SetEnd( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
}
else if( isModified( m_editPoints->Point(DIM_TEXT ) ) )
{
@ -1455,15 +1442,9 @@ void PCB_POINT_EDITOR::updateItem() const
PCB_DIM_CENTER* dimension = static_cast<PCB_DIM_CENTER*>( item );
if( isModified( m_editPoints->Point( DIM_START ) ) )
{
dimension->SetStart( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
}
dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
else if( isModified( m_editPoints->Point( DIM_END ) ) )
{
dimension->SetEnd( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
}
dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
dimension->Update();
@ -1476,12 +1457,11 @@ void PCB_POINT_EDITOR::updateItem() const
if( isModified( m_editPoints->Point( DIM_START ) ) )
{
dimension->SetStart( wxPoint( m_editedPoint->GetPosition().x,
m_editedPoint->GetPosition().y ) );
dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
}
else if( isModified( m_editPoints->Point( DIM_END ) ) )
{
wxPoint newPoint( m_editedPoint->GetPosition().x, m_editedPoint->GetPosition().y );
wxPoint newPoint( m_editedPoint->GetPosition() );
wxPoint delta = newPoint - dimension->GetEnd();
dimension->SetEnd( newPoint );
@ -1489,7 +1469,7 @@ void PCB_POINT_EDITOR::updateItem() const
}
else if( isModified( m_editPoints->Point( DIM_TEXT ) ) )
{
dimension->Text().SetPosition( wxPoint( m_editedPoint->GetPosition() ) );
dimension->Text().SetPosition( (wxPoint) m_editedPoint->GetPosition() );
}
dimension->Update();