diff --git a/common/preview_items/draw_context.cpp b/common/preview_items/draw_context.cpp index cf7811b4c2..387dee4ed8 100644 --- a/common/preview_items/draw_context.cpp +++ b/common/preview_items/draw_context.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2019-2023 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -66,6 +66,24 @@ void DRAW_CONTEXT::DrawCircle( const VECTOR2I& aOrigin, double aRad, bool aDeEmp } +void DRAW_CONTEXT::DrawCircleDashed( const VECTOR2I& aOrigin, double aRad, double aStepAngle, + double aFillAngle, bool aDeEmphasised ) +{ + const COLOR4D& color = m_render_settings.GetLayerColor( m_currLayer ); + + m_gal.SetLineWidth( m_lineWidth ); + m_gal.SetStrokeColor( deemphasise( color, aDeEmphasised ) ); + m_gal.SetIsStroke( true ); + m_gal.SetIsFill( false ); + + for( int i = 0; i < 360; i += aStepAngle ) + { + m_gal.DrawArc( aOrigin, aRad, EDA_ANGLE( i, DEGREES_T ), + EDA_ANGLE( i + aFillAngle, DEGREES_T ) ); + } +} + + void DRAW_CONTEXT::DrawLine( const VECTOR2I& aStart, const VECTOR2I& aEnd, bool aDeEmphasised ) { COLOR4D strokeColor = m_render_settings.GetLayerColor( m_currLayer ); @@ -77,6 +95,28 @@ void DRAW_CONTEXT::DrawLine( const VECTOR2I& aStart, const VECTOR2I& aEnd, bool } +void DRAW_CONTEXT::DrawLineDashed( const VECTOR2I& aStart, const VECTOR2I& aEnd, int aDashStep, + int aDashFill, bool aDeEmphasised ) +{ + COLOR4D strokeColor = m_render_settings.GetLayerColor( m_currLayer ); + + m_gal.SetLineWidth( m_lineWidth ); + m_gal.SetIsStroke( true ); + m_gal.SetStrokeColor( deemphasise( strokeColor, aDeEmphasised ) ); + + VECTOR2I delta = aEnd - aStart; + int vecLen = delta.EuclideanNorm(); + + for( int i = 0; i < vecLen; i += aDashStep ) + { + VECTOR2I a = aStart + delta.Resize( i ); + VECTOR2I b = aStart + delta.Resize( std::min( i + aDashFill, vecLen ) ); + + m_gal.DrawLine( a, b ); + } +} + + void DRAW_CONTEXT::DrawLineWithAngleHighlight( const VECTOR2I& aStart, const VECTOR2I& aEnd, bool aDeEmphasised ) { diff --git a/include/preview_items/draw_context.h b/include/preview_items/draw_context.h index 1dbb277816..1a416004bc 100644 --- a/include/preview_items/draw_context.h +++ b/include/preview_items/draw_context.h @@ -1,7 +1,7 @@ /* * This program source code file is part of KICAD, a free EDA CAD application. * - * Copyright (C) 2017 Kicad Developers, see change_log.txt for contributors. + * Copyright (C) 2017-2023 Kicad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -55,6 +55,17 @@ namespace PREVIEW */ void DrawCircle( const VECTOR2I& aOrigin, double aRad, bool aDeEmphasised ); + /** + * Draw a dashed preview circle on the current layer + * + * @param aOrigin circle origin + * @param aRad circle radius + * @param aStepAngle dash step angle + * @param aFillAngle dash fill angle + * @param aDeEmphasised draw the circle de-emphasised + */ + void DrawCircleDashed( const VECTOR2I& aOrigin, double aRad, double aStepAngle, + double aFillAngle, bool aDeEmphasised ); /** * Draw a simple line on the current layer. @@ -65,6 +76,17 @@ namespace PREVIEW */ void DrawLine( const VECTOR2I& aStart, const VECTOR2I& aEnd, bool aDeEmphasised ); + /** + * Draw a dashed line on the current layer. + * + * @param aStart line start point + * @param aEnd line end point + * @param aDashStep dash step distance + * @param aDashFill dash fill distance + * @param aDeEmphasised draw the line de-emphasised + */ + void DrawLineDashed( const VECTOR2I& aStart, const VECTOR2I& aEn, int aDashStep, + int aDashFill, bool aDeEmphasised ); /** * Draw a straight line on the current layer, with a special highlight when