mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
Support Bezier curve editing in eeschema.
This commit is contained in:
parent
338914c7cf
commit
5bd620d8f9
@ -1353,6 +1353,16 @@ void EDA_SHAPE::beginEdit( const VECTOR2I& aPosition )
|
|||||||
m_editState = 1;
|
m_editState = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SHAPE_T::BEZIER:
|
||||||
|
SetStart( aPosition );
|
||||||
|
SetEnd( aPosition );
|
||||||
|
SetBezierC1( aPosition );
|
||||||
|
SetBezierC2( aPosition );
|
||||||
|
m_editState = 1;
|
||||||
|
|
||||||
|
RebuildBezierToSegmentsPointsList( GetWidth() );
|
||||||
|
break;
|
||||||
|
|
||||||
case SHAPE_T::POLY:
|
case SHAPE_T::POLY:
|
||||||
m_poly.NewOutline();
|
m_poly.NewOutline();
|
||||||
m_poly.Outline( 0 ).SetClosed( false );
|
m_poly.Outline( 0 ).SetClosed( false );
|
||||||
@ -1378,6 +1388,13 @@ bool EDA_SHAPE::continueEdit( const VECTOR2I& aPosition )
|
|||||||
case SHAPE_T::RECTANGLE:
|
case SHAPE_T::RECTANGLE:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
case SHAPE_T::BEZIER:
|
||||||
|
if( m_editState == 3 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_editState++;
|
||||||
|
return true;
|
||||||
|
|
||||||
case SHAPE_T::POLY:
|
case SHAPE_T::POLY:
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
|
SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
|
||||||
@ -1407,6 +1424,28 @@ void EDA_SHAPE::calcEdit( const VECTOR2I& aPosition )
|
|||||||
SetEnd( aPosition );
|
SetEnd( aPosition );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SHAPE_T::BEZIER:
|
||||||
|
{
|
||||||
|
switch( m_editState )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
SetStart( aPosition );
|
||||||
|
SetEnd( aPosition );
|
||||||
|
SetBezierC1( aPosition );
|
||||||
|
SetBezierC2( aPosition );
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
SetBezierC2( aPosition );
|
||||||
|
SetEnd( aPosition );
|
||||||
|
break;
|
||||||
|
case 2: SetBezierC1( aPosition ); break;
|
||||||
|
case 3: SetBezierC2( aPosition ); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
RebuildBezierToSegmentsPointsList( GetWidth() );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case SHAPE_T::ARC:
|
case SHAPE_T::ARC:
|
||||||
{
|
{
|
||||||
double radius = GetRadius();
|
double radius = GetRadius();
|
||||||
@ -1528,6 +1567,7 @@ void EDA_SHAPE::endEdit( bool aClosed )
|
|||||||
case SHAPE_T::SEGMENT:
|
case SHAPE_T::SEGMENT:
|
||||||
case SHAPE_T::CIRCLE:
|
case SHAPE_T::CIRCLE:
|
||||||
case SHAPE_T::RECTANGLE:
|
case SHAPE_T::RECTANGLE:
|
||||||
|
case SHAPE_T::BEZIER:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::POLY:
|
case SHAPE_T::POLY:
|
||||||
|
@ -1465,6 +1465,9 @@ void OPENGL_GAL::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aContro
|
|||||||
BEZIER_POLY converter( pointCtrl );
|
BEZIER_POLY converter( pointCtrl );
|
||||||
converter.GetPoly( output, aFilterValue );
|
converter.GetPoly( output, aFilterValue );
|
||||||
|
|
||||||
|
if( output.size() == 1 )
|
||||||
|
output.push_back( output.front() );
|
||||||
|
|
||||||
DrawPolygon( &output[0], output.size() );
|
DrawPolygon( &output[0], output.size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,16 +52,19 @@ enum ARC_POINTS
|
|||||||
ARC_CENTER, ARC_START, ARC_END
|
ARC_CENTER, ARC_START, ARC_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum CIRCLE_POINTS
|
enum CIRCLE_POINTS
|
||||||
{
|
{
|
||||||
CIRC_CENTER, CIRC_END
|
CIRC_CENTER, CIRC_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum RECTANGLE_POINTS
|
enum RECTANGLE_POINTS
|
||||||
{
|
{
|
||||||
RECT_TOPLEFT, RECT_TOPRIGHT, RECT_BOTLEFT, RECT_BOTRIGHT
|
RECT_TOPLEFT, RECT_TOPRIGHT, RECT_BOTLEFT, RECT_BOTRIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum RECTANGLE_LINES
|
enum RECTANGLE_LINES
|
||||||
{
|
{
|
||||||
RECT_TOP, RECT_RIGHT, RECT_BOT, RECT_LEFT
|
RECT_TOP, RECT_RIGHT, RECT_BOT, RECT_LEFT
|
||||||
@ -73,6 +76,16 @@ enum LINE_POINTS
|
|||||||
LINE_START, LINE_END
|
LINE_START, LINE_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum BEZIER_CURVE_POINTS
|
||||||
|
{
|
||||||
|
BEZIER_CURVE_START,
|
||||||
|
BEZIER_CURVE_CONTROL_POINT1,
|
||||||
|
BEZIER_CURVE_CONTROL_POINT2,
|
||||||
|
BEZIER_CURVE_END
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class EDIT_POINTS_FACTORY
|
class EDIT_POINTS_FACTORY
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -134,7 +147,10 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
points->AddPoint( mapCoords( shape->GetStart() ) );
|
||||||
|
points->AddPoint( mapCoords( shape->GetBezierC1() ) );
|
||||||
|
points->AddPoint( mapCoords( shape->GetBezierC2() ) );
|
||||||
|
points->AddPoint( mapCoords( shape->GetEnd() ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -218,7 +234,10 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
points->AddPoint( shape->GetStart() );
|
||||||
|
points->AddPoint( shape->GetBezierC1() );
|
||||||
|
points->AddPoint( shape->GetBezierC2() );
|
||||||
|
points->AddPoint( shape->GetEnd() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -771,7 +790,12 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
shape->SetStart( mapCoords( m_editPoints->Point( BEZIER_CURVE_START ).GetPosition() ) );
|
||||||
|
shape->SetBezierC1( mapCoords( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).GetPosition() ) );
|
||||||
|
shape->SetBezierC2( mapCoords( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).GetPosition() ) );
|
||||||
|
shape->SetEnd( mapCoords( m_editPoints->Point( BEZIER_CURVE_END ).GetPosition() ) );
|
||||||
|
|
||||||
|
shape->RebuildBezierToSegmentsPointsList( shape->GetWidth() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -925,7 +949,12 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
shape->SetStart( m_editPoints->Point( BEZIER_CURVE_START ).GetPosition() );
|
||||||
|
shape->SetBezierC1( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).GetPosition() );
|
||||||
|
shape->SetBezierC2( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).GetPosition() );
|
||||||
|
shape->SetEnd( m_editPoints->Point( BEZIER_CURVE_END ).GetPosition() );
|
||||||
|
|
||||||
|
shape->RebuildBezierToSegmentsPointsList( shape->GetWidth() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1196,7 +1225,10 @@ void EE_POINT_EDITOR::updatePoints()
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
m_editPoints->Point( BEZIER_CURVE_START ).SetPosition( mapCoords( shape->GetStart() ) );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).SetPosition( mapCoords( shape->GetBezierC1() ) );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).SetPosition( mapCoords( shape->GetBezierC2() ) );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_END ).SetPosition( mapCoords( shape->GetEnd() ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1284,7 +1316,10 @@ void EE_POINT_EDITOR::updatePoints()
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
// TODO
|
m_editPoints->Point( BEZIER_CURVE_START ).SetPosition( shape->GetStart() );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).SetPosition( shape->GetBezierC1() );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).SetPosition( shape->GetBezierC2() );
|
||||||
|
m_editPoints->Point( BEZIER_CURVE_END ).SetPosition( shape->GetEnd() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user