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 <dick@softplc.com>
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 #include <eda_rect.h>
38 
39 class SHAPE_POLY_SET;
40 
41 /*
42  * An aperture macro defines a complex shape and is a list of aperture primitives.
43  * Each aperture primitive defines a simple shape (circle, rect, regular polygon...)
44  * Inside a given aperture primitive, a fixed list of parameters defines info
45  * about the shape: size, thickness, number of vertex ...
46  *
47  * Each parameter can be an immediate value or a deferred value.
48  * When value is deferred, it is defined when the aperture macro is instanced by
49  * an ADD macro command
50  * Note also a deferred parameter can be defined in aperture macro,
51  * but outside aperture primitives. Example
52  * %AMRECTHERM*
53  * $4=$3/2* parameter $4 is half value of parameter $3
54  * 21,1,$1-$3,$2-$3,0-$1/2-$4,0-$2/2-$4,0*
55  * For the aperture primitive, parameters $1 to $3 will be defined in ADD command,
56  * and $4 is defined inside the macro
57  *
58  * Each basic shape can be a positive shape or a negative shape.
59  * a negative shape is "local" to the whole shape.
60  * It must be seen like a hole in the shape, and not like a standard negative object.
61  */
62 
71  AMP_UNKNOWN = -1, // A value for uninitialized AM_PRIMITIVE.
72  AMP_COMMENT = 0, // A primitive description is not really a primitive, this is a
73  // comment
74  AMP_CIRCLE = 1, // Circle. (diameter and position)
75  AMP_LINE2 = 2, // Line with rectangle ends. (Width, start and end pos + rotation)
76  AMP_LINE20 = 20, // Same as AMP_LINE2
77  AMP_LINE_CENTER = 21, // Rectangle. (height, width and center pos + rotation)
78  AMP_LINE_LOWER_LEFT = 22, // Rectangle. (height, width and left bottom corner pos + rotation)
79  AMP_EOF = 3, // End Of File marker: not really a shape
80  AMP_OUTLINE = 4, // Free polyline (n corners + rotation)
81  AMP_POLYGON = 5, // Closed regular polygon(diameter, number of vertices (3 to 10),
82  // rotation)
83  AMP_MOIRE = 6, // A cross hair with n concentric circles + rotation
84  AMP_THERMAL = 7 // Thermal shape (pos, outer and inner diameter, cross hair
85  // thickness + rotation)
86 };
87 
88 
94 {
95 public:
98  // the primitive
99  bool m_GerbMetric; // units for this primitive:
100  // false = Inches, true = metric
101 
102  AM_PRIMITIVE( bool aGerbMetric, AM_PRIMITIVE_ID aId = AMP_UNKNOWN )
103  {
104  primitive_id = aId;
105  m_GerbMetric = aGerbMetric;
106  }
107 
108 
110 
118  bool IsAMPrimitiveExposureOn( const GERBER_DRAW_ITEM* aParent ) const;
119 
120  /* Draw functions: */
121 
133  int GetShapeDim( const GERBER_DRAW_ITEM* aParent );
134 
143  void DrawBasicShape( const GERBER_DRAW_ITEM* aParent,
144  SHAPE_POLY_SET& aShapeBuffer,
145  const wxPoint& aShapePos );
146 
147 private:
158  void ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent, std::vector<wxPoint>& aBuffer );
159 };
160 
161 
162 typedef std::vector<AM_PRIMITIVE> AM_PRIMITIVES;
163 
168 {
181  double GetLocalParam( const D_CODE* aDcode, unsigned aParamId ) const;
182 
183 
193  const wxPoint& aShapePos );
194 
207  void DrawApertureMacroShape( GERBER_DRAW_ITEM* aParent, EDA_RECT* aClipBox, wxDC* aDC,
208  const COLOR4D& aColor, const wxPoint& aShapePos,
209  bool aFilledShape );
210 
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 
244 
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 
265 typedef std::set<APERTURE_MACRO, APERTURE_MACRO_less_than> APERTURE_MACRO_SET;
266 typedef std::pair<APERTURE_MACRO_SET::iterator, bool> APERTURE_MACRO_SET_PAIR;
267 
268 
269 #endif // ifndef AM_PRIMITIVE_H
bool m_GerbMetric
Definition: am_primitive.h:99
wxString name
The name of the aperture macro.
Definition: am_primitive.h:231
bool IsAMPrimitiveExposureOn(const GERBER_DRAW_ITEM *aParent) const
EDA_RECT m_boundingBox
The bounding box of the item, calculated by GetApertureMacroShape.
Definition: am_primitive.h:243
std::vector< AM_PRIMITIVE > AM_PRIMITIVES
Definition: am_primitive.h:162
double GetLocalParam(const D_CODE *aDcode, unsigned aParamId) const
Usually, parameters are defined inside the aperture primitive using immediate mode or deferred mode.
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...
AM_PARAMS m_localparamStack
Definition: am_primitive.h:240
Used by std:set<APERTURE_MACRO> instantiation which uses APERTURE_MACRO.name as its key.
Definition: am_primitive.h:252
void DrawBasicShape(const GERBER_DRAW_ITEM *aParent, SHAPE_POLY_SET &aShapeBuffer, const wxPoint &aShapePos)
Draw (in fact generate the actual polygonal shape of) the primitive shape of an aperture macro instan...
void ConvertShapeToPolygon(const GERBER_DRAW_ITEM *aParent, std::vector< wxPoint > &aBuffer)
Convert a shape to an equivalent polygon.
std::vector< AM_PARAM > AM_PARAMS
Definition: am_param.h:343
EDA_RECT GetBoundingBox() const
Return the bounding box of the shape.
Definition: am_primitive.h:226
Represent a set of closed polygons.
void DrawApertureMacroShape(GERBER_DRAW_ITEM *aParent, EDA_RECT *aClipBox, wxDC *aDC, const COLOR4D &aColor, const wxPoint &aShapePos, bool aFilledShape)
Draw the primitive shape for flashed items.
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
SHAPE_POLY_SET m_shape
The shape of the item, calculated by GetApertureMacroShape.
Definition: am_primitive.h:242
AM_PRIMITIVE(bool aGerbMetric, AM_PRIMITIVE_ID aId=AMP_UNKNOWN)
Definition: am_primitive.h:102
AM_PRIMITIVES primitives
A sequence of AM_PRIMITIVEs.
Definition: am_primitive.h:232
A gerber DCODE (also called Aperture) definition.
Definition: dcode.h:80
Handle the component boundary box.
Definition: eda_rect.h:42
An aperture macro primitive as given in Table 3 of http://gerbv.sourceforge.net/docs/rs274xrevd_e....
Definition: am_primitive.h:93
std::pair< APERTURE_MACRO_SET::iterator, bool > APERTURE_MACRO_SET_PAIR
Definition: am_primitive.h:266
AM_PRIMITIVE_ID
The set of all "aperture macro primitives" (primitive numbers).
Definition: am_primitive.h:70
Support the "aperture macro" defined within standard RS274X.
Definition: am_primitive.h:167
int GetShapeDim(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...
AM_PARAMS params
A sequence of parameters used by.
Definition: am_primitive.h:97
bool operator()(const APERTURE_MACRO &am1, const APERTURE_MACRO &am2) const
Definition: am_primitive.h:255
AM_PRIMITIVE_ID primitive_id
The primitive type.
Definition: am_primitive.h:96
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103
SHAPE_POLY_SET * GetApertureMacroShape(const GERBER_DRAW_ITEM *aParent, const wxPoint &aShapePos)
Calculate the primitive shape for flashed items.