KiCad PCB EDA Suite
marker_base.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2018-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
33#include "base_screen.h"
34#include "marker_base.h"
35#include <core/arraydim.h>
37#include <render_settings.h>
39
40
41/* The graphic shape of markers is a polygon.
42 * MarkerShapeCorners contains the coordinates of corners of the polygonal default shape
43 * they are arbitrary units to make coding shape easy.
44 * internal units coordinates are these values scaled by .m_ScalingFactor
45 */
47{
48 VECTOR2I( 0, 0 ),
49 VECTOR2I( 8, 1 ),
50 VECTOR2I( 4, 3 ),
51 VECTOR2I( 13, 8 ),
52 VECTOR2I( 9, 9 ),
53 VECTOR2I( 8, 13 ),
54 VECTOR2I( 3, 4 ),
55 VECTOR2I( 1, 8 ),
56 VECTOR2I( 0, 0 )
57};
59
60
61MARKER_BASE::MARKER_BASE( int aScalingFactor, std::shared_ptr<RC_ITEM> aItem, TYPEMARKER aType ) :
62 m_markerType( aType ),
63 m_excluded( false ),
64 m_rcItem( aItem ),
65 m_scalingFactor( aScalingFactor )
66{
67 const VECTOR2I* point_shape = MarkerShapeCorners;
68 VECTOR2I start( point_shape->x, point_shape->y );
69 VECTOR2I end = start;
70
71 for( unsigned ii = 1; ii < CORNERS_COUNT; ii++ )
72 {
73 ++point_shape;
74 start.x = std::min( start.x, point_shape->x );
75 start.y = std::min( start.y, point_shape->y );
76 end.x = std::max( end.x, point_shape->x );
77 end.y = std::max( end.y, point_shape->y );
78 }
79
82}
83
84
86{
87}
88
89
90bool MARKER_BASE::HitTestMarker( const VECTOR2I& aHitPosition, int aAccuracy ) const
91{
93 bbox.Inflate( aAccuracy );
94
95 // Fast hit test using boundary box. A finer test will be made if requested
96 bool hit = bbox.Contains( aHitPosition );
97
98 if( hit ) // Fine test
99 {
100 SHAPE_LINE_CHAIN polygon;
101 ShapeToPolygon( polygon );
102 VECTOR2I rel_pos( aHitPosition - m_Pos );
103 hit = polygon.PointInside( rel_pos, aAccuracy );
104 }
105
106 return hit;
107}
108
109
110void MARKER_BASE::ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon, int aScale ) const
111{
112 if( aScale < 0 )
113 aScale = MarkerScale();
114
115 for( const VECTOR2I& corner : MarkerShapeCorners )
116 aPolygon.Append( corner * aScale );
117
118 // Be sure aPolygon is seen as a closed polyline:
119 aPolygon.SetClosed( true );
120}
121
122
124{
126
127 VECTOR2I pos = m_Pos;
129
130 return BOX2I( pos, bbox.GetSize() * m_scalingFactor );
131}
132
133
134void MARKER_BASE::PrintMarker( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
135{
136 wxDC* DC = aSettings->GetPrintDC();
137
138 // Build the marker shape polygon in internal units:
139 std::vector<VECTOR2I> shape;
140 shape.reserve( CORNERS_COUNT );
141
142 for( const VECTOR2I& corner : MarkerShapeCorners )
143 shape.emplace_back( corner * MarkerScale() + m_Pos + aOffset );
144
145 GRClosedPoly( DC, CORNERS_COUNT, &shape[0], true, getColor() );
146}
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
BASE_SCREEN class implementation.
BOX2< VECTOR2I > BOX2I
Definition: box2.h:847
void SetOrigin(const Vec &pos)
Definition: box2.h:202
const Vec & GetPosition() const
Definition: box2.h:184
bool Contains(const Vec &aPoint) const
Definition: box2.h:141
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:506
const Vec & GetSize() const
Definition: box2.h:179
void SetEnd(coord_type x, coord_type y)
Definition: box2.h:255
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
wxDC * GetPrintDC() const
MARKER_BASE(int aScalingFactor, std::shared_ptr< RC_ITEM > aItem, TYPEMARKER aType=MARKER_UNSPEC)
Definition: marker_base.cpp:61
void PrintMarker(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset)
Print the shape is the polygon defined in m_Corners (array of VECTOR2Is).
bool HitTestMarker(const VECTOR2I &aHitPosition, int aAccuracy) const
Test if the given VECTOR2I is within the bounds of this object.
Definition: marker_base.cpp:90
virtual KIGFX::COLOR4D getColor() const =0
int m_scalingFactor
Definition: marker_base.h:135
int MarkerScale() const
The scaling factor to convert polygonal shape coordinates to internal units.
Definition: marker_base.h:68
VECTOR2I m_Pos
position of the marker
Definition: marker_base.h:128
virtual ~MARKER_BASE()
Definition: marker_base.cpp:85
BOX2I m_shapeBoundingBox
Definition: marker_base.h:137
void ShapeToPolygon(SHAPE_LINE_CHAIN &aPolygon, int aScale=-1) const
Return the shape polygon in internal units in a SHAPE_LINE_CHAIN the coordinates are relatives to the...
BOX2I GetBoundingBoxMarker() const
Return the orthogonal, bounding box of this object for display purposes.
bool PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const
Check if point aP lies inside a polygon (any type) defined by the line chain.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
void GRClosedPoly(wxDC *DC, int n, const VECTOR2I *Points, bool Fill, const COLOR4D &Color)
Draw a closed polyline and fill it if Fill, in object space.
Definition: gr_basic.cpp:342
static const VECTOR2I MarkerShapeCorners[]
Definition: marker_base.cpp:46
const unsigned CORNERS_COUNT
Definition: marker_base.cpp:58
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618