KiCad PCB EDA Suite
am_primitive.h
Go to the documentation of this file.
1
5#ifndef AM_PRIMITIVE_H
6#define AM_PRIMITIVE_H
7
8/*
9 * This program source code file is part of KiCad, a free EDA CAD application.
10 *
11 * Copyright (C) 1992-2010 Jean-Pierre Charras <jp.charras at wanadoo.fr>
12 * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
13 * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, you may find one here:
27 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
28 * or you may search the http://www.gnu.org website for the version 2 license,
29 * or you may write to the Free Software Foundation, Inc.,
30 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
31 */
32
33#include <vector>
34#include <set>
35
36#include <am_param.h>
37
38class SHAPE_POLY_SET;
39
40/*
41 * An aperture macro defines a complex shape and is a list of aperture primitives.
42 * Each aperture primitive defines a simple shape (circle, rect, regular polygon...)
43 * Inside a given aperture primitive, a fixed list of parameters defines info
44 * about the shape: size, thickness, number of vertex ...
45 *
46 * Each parameter can be an immediate value or a deferred value.
47 * When value is deferred, it is defined when the aperture macro is instanced by
48 * an ADD macro command
49 * Note also a deferred parameter can be defined in aperture macro,
50 * but outside aperture primitives. Example
51 * %AMRECTHERM*
52 * $4=$3/2* parameter $4 is half value of parameter $3
53 * 21,1,$1-$3,$2-$3,0-$1/2-$4,0-$2/2-$4,0*
54 * For the aperture primitive, parameters $1 to $3 will be defined in ADD command,
55 * and $4 is defined inside the macro
56 *
57 * Each basic shape can be a positive shape or a negative shape.
58 * a negative shape is "local" to the whole shape.
59 * It must be seen like a hole in the shape, and not like a standard negative object.
60 */
61
70 AMP_UNKNOWN = -1, // A value for uninitialized AM_PRIMITIVE.
71 AMP_COMMENT = 0, // A primitive description is not really a primitive, this is a
72 // comment
73 AMP_CIRCLE = 1, // Circle. (diameter and position)
74 AMP_LINE2 = 2, // Line with rectangle ends. (Width, start and end pos + rotation)
75 AMP_LINE20 = 20, // Same as AMP_LINE2
76 AMP_LINE_CENTER = 21, // Rectangle. (height, width and center pos + rotation)
77 AMP_LINE_LOWER_LEFT = 22, // Rectangle. (height, width and left bottom corner pos + rotation)
78 AMP_EOF = 3, // End Of File marker: not really a shape
79 AMP_OUTLINE = 4, // Free polyline (n corners + rotation)
80 AMP_POLYGON = 5, // Closed regular polygon(diameter, number of vertices (3 to 10),
81 // rotation)
82 AMP_MOIRE = 6, // A cross hair with n concentric circles + rotation
83 AMP_THERMAL = 7 // Thermal shape (pos, outer and inner diameter, cross hair
84 // thickness + rotation)
85};
86
87
93{
94public:
97 // the primitive
98 bool m_GerbMetric; // units for this primitive:
99 // false = Inches, true = metric
100
101 AM_PRIMITIVE( bool aGerbMetric, AM_PRIMITIVE_ID aId = AMP_UNKNOWN )
102 {
103 primitive_id = aId;
104 m_GerbMetric = aGerbMetric;
105 }
106
107
109
117 bool IsAMPrimitiveExposureOn( const GERBER_DRAW_ITEM* aParent ) const;
118
119 /* Draw functions: */
120
132 int GetShapeDim( const GERBER_DRAW_ITEM* aParent );
133
142 void DrawBasicShape( const GERBER_DRAW_ITEM* aParent,
143 SHAPE_POLY_SET& aShapeBuffer,
144 const VECTOR2I& aShapePos );
145
146private:
157 void ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent, std::vector<VECTOR2I>& aBuffer );
158};
159
160
161typedef std::vector<AM_PRIMITIVE> AM_PRIMITIVES;
162
167{
180 double GetLocalParam( const D_CODE* aDcode, unsigned aParamId ) const;
181
182
192 const VECTOR2I& aShapePos );
193
205 void DrawApertureMacroShape( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
206 const COLOR4D& aColor,
207 const VECTOR2I& aShapePos, bool aFilledShape );
208
223 int GetShapeDim( GERBER_DRAW_ITEM* aParent );
224
227 {
228 return m_boundingBox;
229 }
230
231 wxString name;
233
234 /* A deferred parameter can be defined in aperture macro,
235 * but outside aperture primitives. Example
236 * %AMRECTHERM*
237 * $4=$3/2* parameter $4 is half value of parameter $3
238 * m_localparamStack handle a list of local deferred parameters
239 */
241
245
246};
247
248
253{
254 // a "less than" test on two APERTURE_MACROs (.name wxStrings)
255 bool operator()( const APERTURE_MACRO& am1, const APERTURE_MACRO& am2 ) const
256 {
257 return am1.name.Cmp( am2.name ) < 0; // case specific wxString compare
258 }
259};
260
261
265typedef std::set<APERTURE_MACRO, APERTURE_MACRO_less_than> APERTURE_MACRO_SET;
266typedef std::pair<APERTURE_MACRO_SET::iterator, bool> APERTURE_MACRO_SET_PAIR;
267
268
269#endif // ifndef AM_PRIMITIVE_H
std::vector< AM_PARAM > AM_PARAMS
Definition: am_param.h:343
AM_PRIMITIVE_ID
The set of all "aperture macro primitives" (primitive numbers).
Definition: am_primitive.h:69
@ AMP_POLYGON
Definition: am_primitive.h:80
@ AMP_LINE_LOWER_LEFT
Definition: am_primitive.h:77
@ AMP_LINE2
Definition: am_primitive.h:74
@ AMP_CIRCLE
Definition: am_primitive.h:73
@ AMP_THERMAL
Definition: am_primitive.h:83
@ AMP_EOF
Definition: am_primitive.h:78
@ AMP_UNKNOWN
Definition: am_primitive.h:70
@ AMP_COMMENT
Definition: am_primitive.h:71
@ AMP_LINE_CENTER
Definition: am_primitive.h:76
@ AMP_MOIRE
Definition: am_primitive.h:82
@ AMP_OUTLINE
Definition: am_primitive.h:79
@ AMP_LINE20
Definition: am_primitive.h:75
std::set< APERTURE_MACRO, APERTURE_MACRO_less_than > APERTURE_MACRO_SET
A sorted collection of APERTURE_MACROS whose key is the name field in the APERTURE_MACRO.
Definition: am_primitive.h:265
std::vector< AM_PRIMITIVE > AM_PRIMITIVES
Definition: am_primitive.h:161
std::pair< APERTURE_MACRO_SET::iterator, bool > APERTURE_MACRO_SET_PAIR
Definition: am_primitive.h:266
An aperture macro primitive as given in Table 3 of http://gerbv.sourceforge.net/docs/rs274xrevd_e....
Definition: am_primitive.h:93
int GetShapeDim(const GERBER_DRAW_ITEM *aParent)
Calculate a value that can be used to evaluate the size of text when displaying the D-Code of an item...
void ConvertShapeToPolygon(const GERBER_DRAW_ITEM *aParent, std::vector< VECTOR2I > &aBuffer)
Convert a shape to an equivalent polygon.
AM_PRIMITIVE_ID primitive_id
The primitive type.
Definition: am_primitive.h:95
void DrawBasicShape(const GERBER_DRAW_ITEM *aParent, SHAPE_POLY_SET &aShapeBuffer, const VECTOR2I &aShapePos)
Draw (in fact generate the actual polygonal shape of) the primitive shape of an aperture macro instan...
bool IsAMPrimitiveExposureOn(const GERBER_DRAW_ITEM *aParent) const
AM_PARAMS params
A sequence of parameters used by.
Definition: am_primitive.h:96
AM_PRIMITIVE(bool aGerbMetric, AM_PRIMITIVE_ID aId=AMP_UNKNOWN)
Definition: am_primitive.h:101
bool m_GerbMetric
Definition: am_primitive.h:98
A gerber DCODE (also called Aperture) definition.
Definition: dcode.h:80
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Represent a set of closed polygons.
Used by std:set<APERTURE_MACRO> instantiation which uses APERTURE_MACRO.name as its key.
Definition: am_primitive.h:253
bool operator()(const APERTURE_MACRO &am1, const APERTURE_MACRO &am2) const
Definition: am_primitive.h:255
Support the "aperture macro" defined within standard RS274X.
Definition: am_primitive.h:167
wxString name
The name of the aperture macro.
Definition: am_primitive.h:231
BOX2I GetBoundingBox() const
Return the bounding box of the shape.
Definition: am_primitive.h:226
AM_PRIMITIVES primitives
A sequence of AM_PRIMITIVEs.
Definition: am_primitive.h:232
BOX2I m_boundingBox
The bounding box of the item, calculated by GetApertureMacroShape.
Definition: am_primitive.h:243
void DrawApertureMacroShape(const GERBER_DRAW_ITEM *aParent, wxDC *aDC, const COLOR4D &aColor, const VECTOR2I &aShapePos, bool aFilledShape)
Draw the primitive shape for flashed items.
int GetShapeDim(GERBER_DRAW_ITEM *aParent)
C.
SHAPE_POLY_SET * GetApertureMacroShape(const GERBER_DRAW_ITEM *aParent, const VECTOR2I &aShapePos)
Calculate the primitive shape for flashed items.
AM_PARAMS m_localparamStack
Definition: am_primitive.h:240
SHAPE_POLY_SET m_shape
The shape of the item, calculated by GetApertureMacroShape.
Definition: am_primitive.h:242
double GetLocalParam(const D_CODE *aDcode, unsigned aParamId) const
Usually, parameters are defined inside the aperture primitive using immediate mode or deferred mode.