Commit 9d3f7230 authored by Maciej Suminski's avatar Maciej Suminski

New items are created using pointers (instead of copying automatic variables...

New items are created using pointers (instead of copying automatic variables when drawing is finished).
parent b1fb59ad
......@@ -40,7 +40,6 @@
#include <class_mire.h>
#include <class_zone.h>
#include <class_module.h>
#include <class_netinfo.h> // TODO to be removed if we do not need the flags
DRAWING_TOOL::DRAWING_TOOL() :
TOOL_INTERACTIVE( "pcbnew.InteractiveDrawing" )
......@@ -79,16 +78,16 @@ int DRAWING_TOOL::DrawCircle( TOOL_EVENT& aEvent )
int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
{
bool clockwise = true;
bool clockwise = true; // drawing direction of the arc
double startAngle; // angle of the first arc line
VECTOR2I cursorPos = m_controls->GetCursorPosition();
// Init the new item attributes
DRAWSEGMENT graphic;
graphic.SetShape( S_ARC );
graphic.SetAngle( 0.0 );
graphic.SetWidth( m_board->GetDesignSettings().m_DrawSegmentWidth );
graphic.SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
DRAWSEGMENT* graphic = new DRAWSEGMENT( m_board );
graphic->SetShape( S_ARC );
graphic->SetAngle( 0.0 );
graphic->SetWidth( m_board->GetDesignSettings().m_DrawSegmentWidth );
graphic->SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
DRAWSEGMENT helperLine;
helperLine.SetShape( S_SEGMENT );
......@@ -120,23 +119,26 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
cursorPos = m_controls->GetCursorPosition();
if( evt->IsCancel() )
{
delete graphic;
break;
}
else if( evt->IsKeyUp() )
{
int width = graphic.GetWidth();
int width = graphic->GetWidth();
// Modify the new item width
if( evt->KeyCode() == '-' && width > WIDTH_STEP )
graphic.SetWidth( width - WIDTH_STEP );
graphic->SetWidth( width - WIDTH_STEP );
else if( evt->KeyCode() == '=' )
graphic.SetWidth( width + WIDTH_STEP );
graphic->SetWidth( width + WIDTH_STEP );
else if( evt->KeyCode() == '/' )
{
if( clockwise )
graphic.SetAngle( graphic.GetAngle() - 3600.0 );
graphic->SetAngle( graphic->GetAngle() - 3600.0 );
else
graphic.SetAngle( graphic.GetAngle() + 3600.0 );
graphic->SetAngle( graphic->GetAngle() + 3600.0 );
clockwise = !clockwise;
}
......@@ -159,9 +161,9 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
}
else
{
helperLine.SetStart( graphic.GetCenter() );
graphic.SetLayer( layer );
preview.Add( &graphic );
helperLine.SetStart( graphic->GetCenter() );
graphic->SetLayer( layer );
preview.Add( graphic );
preview.Add( &helperLine );
}
}
......@@ -169,19 +171,23 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
case SET_END:
{
VECTOR2D startLine( graphic.GetArcStart() - graphic.GetCenter() );
VECTOR2D startLine( graphic->GetArcStart() - graphic->GetCenter() );
startAngle = startLine.Angle();
}
break;
case SET_ANGLE:
{
if( wxPoint( cursorPos.x, cursorPos.y ) != graphic.GetCenter() )
if( wxPoint( cursorPos.x, cursorPos.y ) != graphic->GetCenter() )
{
DRAWSEGMENT* newItem = new DRAWSEGMENT( graphic );
m_view->Add( newItem );
m_board->Add( newItem );
newItem->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
m_view->Add( graphic );
m_board->Add( graphic );
graphic->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
else
{
// Let's give the user another chance of drawing a proper arc (i.e. angle > 0)
--step;
}
}
break;
......@@ -196,18 +202,18 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
switch( step )
{
case SET_ORIGIN:
graphic.SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
graphic->SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
break;
case SET_END:
helperLine.SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
graphic.SetArcStart( wxPoint( cursorPos.x, cursorPos.y ) );
graphic->SetArcStart( wxPoint( cursorPos.x, cursorPos.y ) );
break;
case SET_ANGLE:
{
// Compute the current angle
VECTOR2D endLine( wxPoint( cursorPos.x, cursorPos.y ) - graphic.GetCenter() );
VECTOR2D endLine( wxPoint( cursorPos.x, cursorPos.y ) - graphic->GetCenter() );
double newAngle = RAD2DECIDEG( endLine.Angle() - startAngle );
if( clockwise && newAngle < 0.0 )
......@@ -215,7 +221,7 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
else if( !clockwise && newAngle > 0.0 )
newAngle -= 3600.0;
graphic.SetAngle( newAngle );
graphic->SetAngle( newAngle );
}
break;
}
......@@ -395,6 +401,12 @@ int DRAWING_TOOL::DrawDimension( TOOL_EVENT& aEvent )
}
break;
case SET_END:
// Dimensions that have origin and end in the same spot are not valid
if( dimension->GetOrigin() == wxPoint( cursorPos.x, cursorPos.y ) )
--step;
break;
case SET_HEIGHT:
{
if( wxPoint( cursorPos.x, cursorPos.y ) != dimension->GetPosition() )
......@@ -610,12 +622,11 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
// Only two shapes are currently supported
assert( aShape == S_SEGMENT || aShape == S_CIRCLE );
bool started = false;
DRAWSEGMENT graphic;
DRAWSEGMENT* graphic = new DRAWSEGMENT( m_board );
// Init the new item attributes
graphic.SetShape( (STROKE_T) aShape );
graphic.SetWidth( m_board->GetDesignSettings().m_DrawSegmentWidth );
graphic->SetShape( (STROKE_T) aShape );
graphic->SetWidth( m_board->GetDesignSettings().m_DrawSegmentWidth );
// Add a VIEW_GROUP that serves as a preview for the new item
KIGFX::VIEW_GROUP preview( m_view );
......@@ -626,6 +637,7 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
Activate();
bool started = false;
// Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() )
{
......@@ -634,17 +646,22 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
VECTOR2I cursorPos = m_controls->GetCursorPosition();
if( evt->IsCancel() )
{
preview.FreeItems();
if( !started )
delete graphic;
break;
}
else if( evt->IsKeyUp() )
{
int width = graphic.GetWidth();
int width = graphic->GetWidth();
// Modify the new item width
if( evt->KeyCode() == '-' && width > WIDTH_STEP )
graphic.SetWidth( width - WIDTH_STEP );
graphic->SetWidth( width - WIDTH_STEP );
else if( evt->KeyCode() == '=' )
graphic.SetWidth( width + WIDTH_STEP );
graphic->SetWidth( width + WIDTH_STEP );
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
......@@ -663,29 +680,37 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
{
m_controls->SetAutoPan( true );
graphic.SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
graphic.SetLayer( layer );
preview.Add( &graphic );
graphic->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
graphic->SetLayer( layer );
preview.Add( graphic );
started = true;
}
}
else
{
if( wxPoint( cursorPos.x, cursorPos.y ) != graphic.GetStart() )
if( wxPoint( cursorPos.x, cursorPos.y ) != graphic->GetStart() )
{
DRAWSEGMENT* newItem = new DRAWSEGMENT( graphic );
m_view->Add( newItem );
m_board->Add( newItem );
newItem->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
m_view->Add( graphic );
m_board->Add( graphic );
graphic->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
preview.Remove( graphic );
if( aContinous )
graphic.SetStart( graphic.GetEnd() ); // This is the origin point for a new item
{
graphic = new DRAWSEGMENT( *graphic );
// Start the new line in the same spot where the previous one has ended
graphic->SetStart( graphic->GetEnd() );
preview.Add( graphic );
}
else
break;
}
else // User has clicked twice in the same spot
break; // seems like a clear sign that the drawing is finished
else
{ // User has clicked twice in the same spot
delete graphic; // seems like a clear sign that the drawing is finished
break; // and we should remove the latest DRAWSEGMENT we have created
}
}
}
......@@ -693,9 +718,9 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
{
// 45 degree lines
if( linesAngle45 && aShape == S_SEGMENT )
make45DegLine( &graphic );
make45DegLine( graphic );
else
graphic.SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
graphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
// Show a preview of the item
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
......@@ -809,8 +834,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
{
// Add the first point
zone->Outline()->Start( zoneInfo.m_CurrentZone_Layer,
cursorPos.x,
cursorPos.y,
cursorPos.x, cursorPos.y,
zone->GetHatchStyle() );
helperLine->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
origin = cursorPos;
......
......@@ -54,25 +54,70 @@ public:
/**
* Function DrawLine()
* Starts interactively drawing a line. After invoking the function it expects the user
* to click at least twice to determine the origin and the end for a line. If there are
* to click at least two times to determine the origin and the end for a line. If there are
* more clicks, the line is drawn as a continous polyline.
*/
int DrawLine( TOOL_EVENT& aEvent );
/**
* Function DrawCircle()
* Starts interactively drawing a circle. After invoking the function it expects the user
* to first click on a point that is going to be used as the center of the circle. The second
* click determines the circle radius.
*/
int DrawCircle( TOOL_EVENT& aEvent );
/**
* Function DrawArc()
* Starts interactively drawing an arc. After invoking the function it expects the user
* to first click on a point that is going to be used as the center of the arc. The second
* click determines the origin and radius, the third one - the angle.
*/
int DrawArc( TOOL_EVENT& aEvent );
/**
* Function DrawText()
* Displays a dialog that allows to input text and its settings and then lets the user decide
* where to place the text.
*/
int DrawText( TOOL_EVENT& aEvent );
/**
* Function DrawDimension()
* Starts interactively drawing a dimension. After invoking the function it expects the user
* to first click on a point that is going to be used as the origin of the dimension.
* The second click determines the end and the third click modifies its height.
*/
int DrawDimension( TOOL_EVENT& aEvent );
/**
* Function DrawZone()
* Starts interactively drawing a zone. After invoking the function a zone settings dialog
* is displayed. After confirmation it allows the user to set points that are going to be used
* as a boundary polygon of the zone. Double click or clicking on the origin of the boundary
* polyline finishes the drawing.
*/
int DrawZone( TOOL_EVENT& aEvent );
/**
* Function DrawKeepout()
* Starts interactively drawing a keepout area. After invoking the function an area settings
* dialog is displayed. After confirmation it allows the user to set points that are going to
* be used as a boundary polygon of the area. Double click or clicking on the origin of the
* boundary polyline finishes the drawing.
*/
int DrawKeepout( TOOL_EVENT& aEvent );
/**
* Function PlaceTarget()
* Allows user to place a layer alignment target.
*/
int PlaceTarget( TOOL_EVENT& aEvent );
/**
* Function PlaceModule()
* Displays a dialog to selected a module to be added and then allows user to set its position..
*/
int PlaceModule( TOOL_EVENT& aEvent );
private:
......
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