KiCad PCB EDA Suite
Loading...
Searching...
No Matches
graphics_importer_buffer.h
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) 2017 CERN
5 * Copyright (C) 2018-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Janito Vaqueiro Ferreira Filho <[email protected]>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#ifndef GRAPHICS_IMPORTER_BUFFER_H
28#define GRAPHICS_IMPORTER_BUFFER_H
29
30#include "graphics_importer.h"
31
32#include <math/matrix3x3.h>
33#include <list>
34
35
37{
38public:
39 virtual ~IMPORTED_SHAPE() {}
40 virtual void ImportTo( GRAPHICS_IMPORTER& aImporter ) const = 0;
41
42 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const = 0;
43
44 virtual void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) = 0;
45
46 void SetParentShapeIndex( int aIndex ) { m_parentShapeIndex = aIndex; }
48
49protected:
51};
52
53
55{
56public:
57 IMPORTED_LINE( const VECTOR2D& aStart, const VECTOR2D& aEnd, const IMPORTED_STROKE& aStroke ) :
58 m_start( aStart ), m_end( aEnd ), m_stroke( aStroke )
59 {
60 }
61
62 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
63 {
64 aImporter.AddLine( m_start, m_end, m_stroke );
65 }
66
67 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
68 {
69 return std::make_unique<IMPORTED_LINE>( *this );
70 }
71
72 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
73 {
74 m_start = aTransform * m_start + aTranslation;
75 m_end = aTransform * m_end + aTranslation;
76 }
77
78private:
82};
83
84
86{
87public:
88 IMPORTED_CIRCLE( const VECTOR2D& aCenter, double aRadius, const IMPORTED_STROKE& aStroke,
89 bool aFilled, const COLOR4D& aFillColor ) :
90 m_center( aCenter ),
91 m_radius( aRadius ), m_stroke( aStroke ), m_filled( aFilled ), m_fillColor( aFillColor )
92 {
93 }
94
95 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
96 {
98 }
99
100 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
101 {
102 return std::make_unique<IMPORTED_CIRCLE>( *this );
103 }
104
105 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
106 {
107 VECTOR2D newCenter = ( aTransform * m_center ) + aTranslation;
108
109 VECTOR2D newRadius = VECTOR2D( m_radius, 0 );
110 newRadius = aTransform * newRadius;
111
112 m_center = newCenter;
113 m_radius = newRadius.EuclideanNorm();
114 }
115
116private:
118 double m_radius;
122};
123
124
126{
127public:
128 IMPORTED_ARC( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
129 const IMPORTED_STROKE& aStroke ) :
130 m_center( aCenter ),
131 m_start( aStart ), m_angle( aAngle ), m_stroke( aStroke )
132 {
133 }
134
135 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
136 {
137 aImporter.AddArc( m_center, m_start, m_angle, m_stroke );
138 }
139
140 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
141 {
142 return std::make_unique<IMPORTED_ARC>( *this );
143 }
144
145 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
146 {
147 m_start = aTransform * m_start + aTranslation;
148 m_center = aTransform * m_center + aTranslation;
149 }
150
151private:
156};
157
158
160{
161public:
162 IMPORTED_POLYGON( const std::vector<VECTOR2D>& aVertices, const IMPORTED_STROKE& aStroke,
163 bool aFilled, const COLOR4D& aFillColor ) :
164 m_vertices( aVertices ),
165 m_stroke( aStroke ), m_filled( aFilled ), m_fillColor( aFillColor )
166 {
167 }
168
169 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
170 {
172 }
173
174 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
175 {
176 return std::make_unique<IMPORTED_POLYGON>( *this );
177 }
178
179 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
180 {
181 for( VECTOR2D& vert : m_vertices )
182 {
183 vert = aTransform * vert + aTranslation;
184 }
185 }
186
187 std::vector<VECTOR2D>& Vertices() { return m_vertices; }
188
189 bool IsFilled() const { return m_filled; }
190
191 const COLOR4D& GetFillColor() const { return m_fillColor; }
192
193 const IMPORTED_STROKE& GetStroke() const { return m_stroke; }
194
195private:
196 std::vector<VECTOR2D> m_vertices;
200};
201
202
204{
205public:
206 IMPORTED_TEXT( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
207 double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
208 GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D& aColor ) :
209 m_origin( aOrigin ),
210 m_text( aText ), m_height( aHeight ), m_width( aWidth ), m_thickness( aThickness ),
211 m_orientation( aOrientation ), m_hJustify( aHJustify ), m_vJustify( aVJustify ),
212 m_color( aColor )
213 {
214 }
215
216 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
217 {
220 }
221
222 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
223 {
224 return std::make_unique<IMPORTED_TEXT>( *this );
225 }
226
227 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
228 {
229 m_origin = aTransform * m_origin + aTranslation;
230 }
231
232private:
234 const wxString m_text;
235 double m_height;
236 double m_width;
242};
243
244
246{
247public:
248 IMPORTED_SPLINE( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
249 const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd,
250 const IMPORTED_STROKE& aStroke ) :
251 m_start( aStart ),
252 m_bezierControl1( aBezierControl1 ), m_bezierControl2( aBezierControl2 ), m_end( aEnd ),
253 m_stroke( aStroke )
254 {
255 }
256
257 void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
258 {
260 }
261
262 virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
263 {
264 return std::make_unique<IMPORTED_SPLINE>( *this );
265 }
266
267 void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
268 {
269 m_start = aTransform * m_start + aTranslation;
270 m_bezierControl1 = aTransform * m_bezierControl1 + aTranslation;
271 m_bezierControl2 = aTransform * m_bezierControl2 + aTranslation;
272 m_end = aTransform * m_end + aTranslation;
273 }
274
275private:
281};
282
283
285{
286public:
287 void AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd,
288 const IMPORTED_STROKE& aStroke ) override;
289
290 void AddCircle( const VECTOR2D& aCenter, double aRadius, const IMPORTED_STROKE& aStroke,
291 bool aFilled, const COLOR4D& aFillColor = COLOR4D::UNSPECIFIED ) override;
292
293 void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
294 const IMPORTED_STROKE& aStroke ) override;
295
296 void AddPolygon( const std::vector<VECTOR2D>& aVertices, const IMPORTED_STROKE& aStroke,
297 bool aFilled, const COLOR4D& aFillColor = COLOR4D::UNSPECIFIED ) override;
298
299 void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
300 double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
301 GR_TEXT_V_ALIGN_T aVJustify,
302 const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
303
304 void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
305 const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd,
306 const IMPORTED_STROKE& aStroke ) override;
307
308 void ImportTo( GRAPHICS_IMPORTER& aImporter );
309 void AddShape( std::unique_ptr<IMPORTED_SHAPE>& aShape );
310
311 std::list<std::unique_ptr<IMPORTED_SHAPE>>& GetShapes() { return m_shapes; }
312
313 void ClearShapes() { m_shapes.clear(); }
314
316
317protected:
319 std::list<std::unique_ptr<IMPORTED_SHAPE>> m_shapes;
320};
321
322#endif /* GRAPHICS_IMPORTER_BUFFER */
std::list< std::unique_ptr< IMPORTED_SHAPE > > & GetShapes()
void AddCircle(const VECTOR2D &aCenter, double aRadius, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor=COLOR4D::UNSPECIFIED) override
Create an object representing a circle.
void AddSpline(const VECTOR2D &aStart, const VECTOR2D &aBezierControl1, const VECTOR2D &aBezierControl2, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke) override
Create an object representing an arc.
void AddLine(const VECTOR2D &aStart, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke) override
Create an object representing a line segment.
void ImportTo(GRAPHICS_IMPORTER &aImporter)
void AddArc(const VECTOR2D &aCenter, const VECTOR2D &aStart, const EDA_ANGLE &aAngle, const IMPORTED_STROKE &aStroke) override
Create an object representing an arc.
void AddText(const VECTOR2D &aOrigin, const wxString &aText, double aHeight, double aWidth, double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D &aColor=COLOR4D::UNSPECIFIED) override
Create an object representing a text.
std::list< std::unique_ptr< IMPORTED_SHAPE > > m_shapes
< List of imported shapes
void AddShape(std::unique_ptr< IMPORTED_SHAPE > &aShape)
void AddPolygon(const std::vector< VECTOR2D > &aVertices, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor=COLOR4D::UNSPECIFIED) override
Create an object representing a polygon.
Interface that creates objects representing shapes for a given data model.
virtual void AddArc(const VECTOR2D &aCenter, const VECTOR2D &aStart, const EDA_ANGLE &aAngle, const IMPORTED_STROKE &aStroke)=0
Create an object representing an arc.
virtual void AddPolygon(const std::vector< VECTOR2D > &aVertices, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor)=0
Create an object representing a polygon.
virtual void AddLine(const VECTOR2D &aOrigin, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke)=0
Create an object representing a line segment.
virtual void AddText(const VECTOR2D &aOrigin, const wxString &aText, double aHeight, double aWidth, double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D &aColor)=0
Create an object representing a text.
virtual void AddCircle(const VECTOR2D &aCenter, double aRadius, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor)=0
Create an object representing a circle.
virtual void AddSpline(const VECTOR2D &aStart, const VECTOR2D &aBezierControl1, const VECTOR2D &aBezierControl2, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke)=0
Create an object representing an arc.
IMPORTED_STROKE m_stroke
IMPORTED_ARC(const VECTOR2D &aCenter, const VECTOR2D &aStart, const EDA_ANGLE &aAngle, const IMPORTED_STROKE &aStroke)
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
IMPORTED_CIRCLE(const VECTOR2D &aCenter, double aRadius, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor)
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
IMPORTED_LINE(const VECTOR2D &aStart, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke)
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
IMPORTED_STROKE m_stroke
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
std::vector< VECTOR2D > & Vertices()
const IMPORTED_STROKE & GetStroke() const
IMPORTED_POLYGON(const std::vector< VECTOR2D > &aVertices, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor)
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
const COLOR4D & GetFillColor() const
std::vector< VECTOR2D > m_vertices
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
int GetParentShapeIndex() const
virtual void ImportTo(GRAPHICS_IMPORTER &aImporter) const =0
void SetParentShapeIndex(int aIndex)
virtual void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation)=0
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const =0
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
IMPORTED_SPLINE(const VECTOR2D &aStart, const VECTOR2D &aBezierControl1, const VECTOR2D &aBezierControl2, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke)
A clone of IMPORTED_STROKE, but with floating-point width.
void Transform(const MATRIX3x3D &aTransform, const VECTOR2D &aTranslation) override
GR_TEXT_H_ALIGN_T m_hJustify
IMPORTED_TEXT(const VECTOR2D &aOrigin, const wxString &aText, double aHeight, double aWidth, double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D &aColor)
GR_TEXT_V_ALIGN_T m_vJustify
virtual std::unique_ptr< IMPORTED_SHAPE > clone() const override
void ImportTo(GRAPHICS_IMPORTER &aImporter) const override
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
Definition: vector2d.h:265
GR_TEXT_H_ALIGN_T
GR_TEXT_V_ALIGN_T
VECTOR2< double > VECTOR2D
Definition: vector2d.h:587