Commit b1fb59ad authored by Maciej Suminski's avatar Maciej Suminski

Refactorization: moved drawing 45 degree multiple line to a function.

parent 3ecae4fa
......@@ -693,23 +693,9 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
{
// 45 degree lines
if( linesAngle45 && aShape == S_SEGMENT )
{
VECTOR2D lineVector( wxPoint( cursorPos.x, cursorPos.y ) - graphic.GetStart() );
double angle = lineVector.Angle();
double newAngle = round( angle / ( M_PI / 4.0 ) ) * M_PI / 4.0;
VECTOR2D newLineVector = lineVector.Rotate( newAngle - angle );
// Snap the new line to the grid // TODO fix it, does not work good..
VECTOR2D newLineEnd = VECTOR2D( graphic.GetStart() ) + newLineVector;
VECTOR2D snapped = m_view->GetGAL()->GetGridPoint( newLineEnd );
graphic.SetEnd( wxPoint( snapped.x, snapped.y ) );
}
make45DegLine( &graphic );
else
{
graphic.SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
}
// Show a preview of the item
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
......@@ -847,27 +833,11 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
else if( evt->IsMotion() )
{
helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
// 45 degree lines
if( linesAngle45 )
{
VECTOR2D lineVector( wxPoint( cursorPos.x, cursorPos.y ) - helperLine->GetStart() );
double angle = lineVector.Angle();
double newAngle = round( angle / ( M_PI / 4.0 ) ) * M_PI / 4.0;
VECTOR2D newLineVector = lineVector.Rotate( newAngle - angle );
// Snap the new line to the grid // TODO fix it, does not work good..
VECTOR2D newLineEnd = VECTOR2D( helperLine->GetStart() ) + newLineVector;
VECTOR2D snapped = m_view->GetGAL()->GetGridPoint( newLineEnd );
helperLine->SetEnd( wxPoint( snapped.x, snapped.y ) );
}
make45DegLine( helperLine );
else
{
helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
}
// Show a preview of the item
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
......@@ -888,6 +858,27 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
}
void DRAWING_TOOL::make45DegLine( DRAWSEGMENT* aSegment ) const
{
VECTOR2I cursorPos = m_controls->GetCursorPosition();
// Current line vector
VECTOR2D lineVector( wxPoint( cursorPos.x, cursorPos.y ) - aSegment->GetStart() );
double angle = lineVector.Angle();
// Find the closest angle, which is a multiple of 45 degrees
double newAngle = round( angle / ( M_PI / 4.0 ) ) * M_PI / 4.0;
VECTOR2D newLineVector = lineVector.Rotate( newAngle - angle );
VECTOR2D newLineEnd = VECTOR2D( aSegment->GetStart() ) + newLineVector;
// Snap the new line to the grid
newLineEnd = m_view->GetGAL()->GetGridPoint( newLineEnd );
aSegment->SetEnd( wxPoint( newLineEnd.x, newLineEnd.y ) );
}
void DRAWING_TOOL::setTransitions()
{
Go( &DRAWING_TOOL::DrawLine, COMMON_ACTIONS::drawLine.MakeEvent() );
......
......@@ -34,6 +34,7 @@ namespace KIGFX
}
class BOARD;
class PCB_EDIT_FRAME;
class DRAWSEGMENT;
/**
* Class DRAWING_TOOL
......@@ -84,6 +85,11 @@ private:
///> @param aKeepout decides if the drawn polygon is a zone or a keepout area.
int drawZone( bool aKeepout );
///> Forces a DRAWSEGMENT to be drawn at multiple of 45 degrees. The origin
///> stays the same, the end of the aSegment is modified according to the
///> current cursor position.
void make45DegLine( DRAWSEGMENT* aSegment ) const;
///> Sets up handlers for various events.
void setTransitions();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment