From 5bd620d8f909de9108a49fcfe9554e41bdaebfb8 Mon Sep 17 00:00:00 2001 From: Alex Shvartzkop Date: Tue, 16 Jan 2024 14:11:25 +0300 Subject: [PATCH] Support Bezier curve editing in eeschema. --- common/eda_shape.cpp | 40 +++++++++++++++++++++++++ common/gal/opengl/opengl_gal.cpp | 3 ++ eeschema/tools/ee_point_editor.cpp | 47 ++++++++++++++++++++++++++---- 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp index 534fda40c9..f0f12b588b 100644 --- a/common/eda_shape.cpp +++ b/common/eda_shape.cpp @@ -1353,6 +1353,16 @@ void EDA_SHAPE::beginEdit( const VECTOR2I& aPosition ) m_editState = 1; break; + case SHAPE_T::BEZIER: + SetStart( aPosition ); + SetEnd( aPosition ); + SetBezierC1( aPosition ); + SetBezierC2( aPosition ); + m_editState = 1; + + RebuildBezierToSegmentsPointsList( GetWidth() ); + break; + case SHAPE_T::POLY: m_poly.NewOutline(); m_poly.Outline( 0 ).SetClosed( false ); @@ -1378,6 +1388,13 @@ bool EDA_SHAPE::continueEdit( const VECTOR2I& aPosition ) case SHAPE_T::RECTANGLE: return false; + case SHAPE_T::BEZIER: + if( m_editState == 3 ) + return false; + + m_editState++; + return true; + case SHAPE_T::POLY: { SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 ); @@ -1407,6 +1424,28 @@ void EDA_SHAPE::calcEdit( const VECTOR2I& aPosition ) SetEnd( aPosition ); 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: { double radius = GetRadius(); @@ -1528,6 +1567,7 @@ void EDA_SHAPE::endEdit( bool aClosed ) case SHAPE_T::SEGMENT: case SHAPE_T::CIRCLE: case SHAPE_T::RECTANGLE: + case SHAPE_T::BEZIER: break; case SHAPE_T::POLY: diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp index 1764281d42..d6d5603555 100644 --- a/common/gal/opengl/opengl_gal.cpp +++ b/common/gal/opengl/opengl_gal.cpp @@ -1465,6 +1465,9 @@ void OPENGL_GAL::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aContro BEZIER_POLY converter( pointCtrl ); converter.GetPoly( output, aFilterValue ); + if( output.size() == 1 ) + output.push_back( output.front() ); + DrawPolygon( &output[0], output.size() ); } diff --git a/eeschema/tools/ee_point_editor.cpp b/eeschema/tools/ee_point_editor.cpp index f697fa80b3..9b4074e52c 100644 --- a/eeschema/tools/ee_point_editor.cpp +++ b/eeschema/tools/ee_point_editor.cpp @@ -52,16 +52,19 @@ enum ARC_POINTS ARC_CENTER, ARC_START, ARC_END }; + enum CIRCLE_POINTS { CIRC_CENTER, CIRC_END }; + enum RECTANGLE_POINTS { RECT_TOPLEFT, RECT_TOPRIGHT, RECT_BOTLEFT, RECT_BOTRIGHT }; + enum RECTANGLE_LINES { RECT_TOP, RECT_RIGHT, RECT_BOT, RECT_LEFT @@ -73,6 +76,16 @@ enum LINE_POINTS 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 { public: @@ -134,7 +147,10 @@ public: break; 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; default: @@ -218,7 +234,10 @@ public: break; case SHAPE_T::BEZIER: - // TODO + points->AddPoint( shape->GetStart() ); + points->AddPoint( shape->GetBezierC1() ); + points->AddPoint( shape->GetBezierC2() ); + points->AddPoint( shape->GetEnd() ); break; default: @@ -771,7 +790,12 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const } 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; default: @@ -925,7 +949,12 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const } 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; default: @@ -1196,7 +1225,10 @@ void EE_POINT_EDITOR::updatePoints() } 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; default: @@ -1284,7 +1316,10 @@ void EE_POINT_EDITOR::updatePoints() } 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; default: