diff --git a/common/plotters/SVG_plotter.cpp b/common/plotters/SVG_plotter.cpp index 6ded555136..110c46036d 100644 --- a/common/plotters/SVG_plotter.cpp +++ b/common/plotters/SVG_plotter.cpp @@ -469,13 +469,6 @@ void SVG_PLOTTER::Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, VECTOR2D centre_device = userToDeviceCoordinates( aCenter ); double radius_device = userToDeviceSize( aRadius ); - if( !m_yaxisReversed ) // Should be never the case - { - std::swap( startAngle, endAngle ); - startAngle = -startAngle; - endAngle = -endAngle; - } - if( m_plotMirror ) { if( m_mirrorIsHorizontal ) diff --git a/common/plotters/plotter.cpp b/common/plotters/plotter.cpp index 11a5f3a231..312a35af41 100644 --- a/common/plotters/plotter.cpp +++ b/common/plotters/plotter.cpp @@ -161,9 +161,9 @@ void PLOTTER::Arc( const VECTOR2I& aCenter, const VECTOR2I& aStart, const VECTOR startAngle = startAngle.Normalize() - ANGLE_360; } - // In Kicad code, call to Arc() using angles call this function after - // sawpping angles and negate them (to compensate the inverted Y axis). - // So to mimic the other calls in Kicad, do the same thing + // In old Kicad code, calls to Arc() using angles calls this function after + // swapping angles and negate them (to compensate the inverted Y axis). + // So to be compatible with Arc() calls with angles, do the same thing std::swap( startAngle, endAngle ); startAngle = -startAngle; endAngle = -endAngle; diff --git a/eeschema/sch_shape.cpp b/eeschema/sch_shape.cpp index f20db1cc42..9ef6c0bac8 100644 --- a/eeschema/sch_shape.cpp +++ b/eeschema/sch_shape.cpp @@ -138,11 +138,10 @@ void SCH_SHAPE::Plot( PLOTTER* aPlotter, bool aBackground ) const { case SHAPE_T::ARC: { - EDA_ANGLE start; - EDA_ANGLE end; - CalcArcAngles( start, end ); - - aPlotter->Arc( getCenter(), -end, -start, GetRadius(), m_fill, 0 ); + // In some plotters (not all) the arc is approximated by segments, and + // a error max is needed. We try to approximate by 360/5 segments by 360 deg + int arc2segment_error = CircleToEndSegmentDeltaRadius( GetRadius(), 360/5 ); + aPlotter->Arc( getCenter(), GetStart(), GetEnd(), m_fill, 0, arc2segment_error ); } break; @@ -182,11 +181,10 @@ void SCH_SHAPE::Plot( PLOTTER* aPlotter, bool aBackground ) const { case SHAPE_T::ARC: { - EDA_ANGLE start; - EDA_ANGLE end; - CalcArcAngles( start, end ); - - aPlotter->Arc( getCenter(), -end, -start, GetRadius(), FILL_T::NO_FILL, pen_size ); + // In some plotters (not all) the arc is approximated by segments, and + // a error max is needed. We try to approximate by 360/5 segments by 360 deg + int arc2segment_error = CircleToEndSegmentDeltaRadius( GetRadius(), 360/5 ); + aPlotter->Arc( getCenter(), GetStart(), GetEnd(), FILL_T::NO_FILL, pen_size, arc2segment_error ); } break; diff --git a/include/plotters/plotter.h b/include/plotters/plotter.h index cc9094e02d..e74e994a4b 100644 --- a/include/plotters/plotter.h +++ b/include/plotters/plotter.h @@ -223,13 +223,6 @@ public: virtual void Arc( const VECTOR2I& aCenter, const VECTOR2I& aStart, const VECTOR2I& aEnd, FILL_T aFill, int aWidth, int aMaxError ); - /** - * Generic fallback: arc rendered as a polyline. - */ - virtual void Arc( const VECTOR2I& aCentre, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, - int aWidth = USE_DEFAULT_LINE_WIDTH ); - /** * Generic fallback: Cubic Bezier curve rendered as a polyline * In KiCad the bezier curves have 4 control points: @@ -310,10 +303,6 @@ public: virtual void ThickSegment( const VECTOR2I& start, const VECTOR2I& end, int width, OUTLINE_MODE tracemode, void* aData ); - virtual void ThickArc( const VECTOR2I& aCentre, const EDA_ANGLE& StAngle, - const EDA_ANGLE& EndAngle, int aRadius, int aWidth, - OUTLINE_MODE aTraceMode, void* aData ); - virtual void ThickArc( const VECTOR2I& aCentre, const VECTOR2I& aStart, const VECTOR2I& aEnd, int aWidth, OUTLINE_MODE aTraceMode, void* aData ); @@ -526,6 +515,17 @@ public: protected: + /** + * Generic fallback: arc rendered as a polyline. + */ + virtual void Arc( const VECTOR2I& aCentre, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, + int aWidth = USE_DEFAULT_LINE_WIDTH ); + + virtual void ThickArc( const VECTOR2I& aCentre, const EDA_ANGLE& StAngle, + const EDA_ANGLE& EndAngle, int aRadius, int aWidth, + OUTLINE_MODE aTraceMode, void* aData ); + // These are marker subcomponents /** * Plot a circle centered on the position. Building block for markers diff --git a/include/plotters/plotter_dxf.h b/include/plotters/plotter_dxf.h index 49fcfaa46b..90aa09585a 100644 --- a/include/plotters/plotter_dxf.h +++ b/include/plotters/plotter_dxf.h @@ -112,9 +112,7 @@ public: int aWidth = USE_DEFAULT_LINE_WIDTH, void* aData = nullptr ) override; virtual void ThickSegment( const VECTOR2I& start, const VECTOR2I& end, int width, OUTLINE_MODE tracemode, void* aData ) override; - virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, - int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + virtual void PenTo( const VECTOR2I& pos, char plume ) override; /** @@ -208,6 +206,10 @@ public: } protected: + virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, + int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + bool m_textAsLines; COLOR4D m_currentColor; PLOT_DASH_TYPE m_currentLineType; diff --git a/include/plotters/plotter_gerber.h b/include/plotters/plotter_gerber.h index 232939f474..75c42bd43e 100644 --- a/include/plotters/plotter_gerber.h +++ b/include/plotters/plotter_gerber.h @@ -69,18 +69,11 @@ public: int width = USE_DEFAULT_LINE_WIDTH ) override; virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill, int width = USE_DEFAULT_LINE_WIDTH ) override; - virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, - int aWidth = USE_DEFAULT_LINE_WIDTH ) override; // These functions plot an item and manage X2 gerber attributes virtual void ThickSegment( const VECTOR2I& start, const VECTOR2I& end, int width, OUTLINE_MODE tracemode, void* aData ) override; - virtual void ThickArc( const VECTOR2I& aCentre, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, int aWidth, - OUTLINE_MODE aTraceMode, void* aData ) override; - virtual void ThickArc( const VECTOR2I& aCentre, const VECTOR2I& aStart, const VECTOR2I& aEnd, int aWidth, OUTLINE_MODE aTraceMode, void* aData ) override; @@ -263,6 +256,14 @@ public: APERTURE::APERTURE_TYPE aType, int aApertureAttribute ); protected: + virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, + int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + + virtual void ThickArc( const VECTOR2I& aCentre, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, int aWidth, + OUTLINE_MODE aTraceMode, void* aData ) override; + /** * Plot a round rect (a round rect shape in fact) as a Gerber region using lines and arcs * for corners. diff --git a/include/plotters/plotter_hpgl.h b/include/plotters/plotter_hpgl.h index 603f6f07ce..4e53f6f7a4 100644 --- a/include/plotters/plotter_hpgl.h +++ b/include/plotters/plotter_hpgl.h @@ -106,22 +106,6 @@ public: virtual void ThickSegment( const VECTOR2I& start, const VECTOR2I& end, int width, OUTLINE_MODE tracemode, void* aData ) override; - /** - * Plot an arc. - * - * Command - * PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, NbSegm; PU; - * Or PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, PU; - * - * center is the center of the arc. - * StAngled is the start angle of the arc. - * aEndAngle is end angle the arc. - * Radius is the radius of the arc. - */ - virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, - int aWidth = USE_DEFAULT_LINE_WIDTH ) override; - virtual void Arc( const VECTOR2I& aCenter, const VECTOR2I& aStart, const VECTOR2I& aEnd, FILL_T aFill, int aWidth, int aMaxError ) override; @@ -149,6 +133,22 @@ public: void* aData ) override; protected: + /** + * Plot an arc. + * + * Command + * PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, NbSegm; PU; + * Or PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, PU; + * + * center is the center of the arc. + * StAngled is the start angle of the arc. + * aEndAngle is end angle the arc. + * Radius is the radius of the arc. + */ + virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, + int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + /** * Start a new HPGL_ITEM if necessary, keeping the current one if it exists. * diff --git a/include/plotters/plotters_pslike.h b/include/plotters/plotters_pslike.h index 1df8d839ef..fbcbb36d42 100644 --- a/include/plotters/plotters_pslike.h +++ b/include/plotters/plotters_pslike.h @@ -326,10 +326,6 @@ public: virtual void Arc( const VECTOR2I& aCenter, const VECTOR2I& aStart, const VECTOR2I& aEnd, FILL_T aFill, int aWidth, int aMaxError ) override; - virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, - FILL_T aFill, int aWidth = USE_DEFAULT_LINE_WIDTH ) override; - /** * Polygon plotting for PDF. Everything is supported */ @@ -363,6 +359,11 @@ public: protected: + + virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, + FILL_T aFill, int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + /// convert a wxString unicode string to a char string compatible with the accepted /// string PDF format (convert special chars and non ascii7 chars) std::string encodeStringForPlotter( const wxString& aUnicode ) override; @@ -470,9 +471,6 @@ public: int width = USE_DEFAULT_LINE_WIDTH ) override; virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill, int width = USE_DEFAULT_LINE_WIDTH ) override; - virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, - const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill, - int aWidth = USE_DEFAULT_LINE_WIDTH ) override; virtual void BezierCurve( const VECTOR2I& aStart, const VECTOR2I& aControl1, const VECTOR2I& aControl2, const VECTOR2I& aEnd, @@ -531,6 +529,10 @@ public: void* aData = nullptr ) override; protected: + virtual void Arc( const VECTOR2I& aCenter, const EDA_ANGLE& aStartAngle, + const EDA_ANGLE& aEndAngle, int aRadius, + FILL_T aFill, int aWidth = USE_DEFAULT_LINE_WIDTH ) override; + /** * Initialize m_pen_rgb_color from reduced values r, g ,b * ( reduced values are 0.0 to 1.0 )