-
-
Notifications
You must be signed in to change notification settings - Fork 487
/
gerber_draw_item.h
279 lines (238 loc) · 11 KB
/
gerber_draw_item.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2016 <Jean-Pierre Charras>
* Copyright (C) 1992-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
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef GERBER_DRAW_ITEM_H
#define GERBER_DRAW_ITEM_H
#include <eda_item.h>
#include <layer_ids.h>
#include <gr_basic.h>
#include <gbr_netlist_metadata.h>
#include <dcode.h>
#include <geometry/shape_poly_set.h>
#include <geometry/eda_angle.h>
class GERBER_FILE_IMAGE;
class GBR_LAYOUT;
class D_CODE;
class MSG_PANEL_ITEM;
class GBR_DISPLAY_OPTIONS;
class PCB_BASE_FRAME;
namespace KIGFX
{
class VIEW;
}
/* Shapes id for basic shapes ( .m_ShapeType member ) */
enum GBR_BASIC_SHAPE_TYPE
{
GBR_SEGMENT = 0, // usual segment : line with rounded ends
GBR_ARC, // Arcs (with rounded ends)
GBR_CIRCLE, // ring
GBR_POLYGON, // polygonal shape
GBR_SPOT_CIRCLE, // flashed shape: round shape (can have hole)
GBR_SPOT_RECT, // flashed shape: rectangular shape can have hole)
GBR_SPOT_OVAL, // flashed shape: oval shape
GBR_SPOT_POLY, // flashed shape: regular polygon, 3 to 12 edges
GBR_SPOT_MACRO // complex shape described by a macro
};
class GERBER_DRAW_ITEM : public EDA_ITEM
{
public:
GERBER_DRAW_ITEM( GERBER_FILE_IMAGE* aGerberparams );
~GERBER_DRAW_ITEM();
void SetNetAttributes( const GBR_NETLIST_METADATA& aNetAttributes );
const GBR_NETLIST_METADATA& GetNetAttributes() const { return m_netAttributes; }
/**
* Return the layer this item is on.
*/
int GetLayer() const;
bool GetLayerPolarity() const { return m_LayerNegative; }
/**
* Return the best size and orientation to display the D_Code on screen.
*
* @param aSize is a reference to return the text size
* @param aPos is a reference to return the text position
* @param aOrientation is a reference to return the text orientation
* @return true if the parameters can be calculated, false for unknown D_Code
*/
bool GetTextD_CodePrms( int& aSize, VECTOR2I& aPos, EDA_ANGLE& aOrientation );
/**
* Optimize screen refresh (when no items are in background color refresh can be faster).
*
* @return true if this item or at least one shape (when using aperture macros
* must be drawn in background color.
*/
bool HasNegativeItems();
/**
* Initialize parameters from Image and Layer parameters found in the gerber file:
* m_UnitsMetric,
* m_MirrorA, m_MirrorB,
* m_DrawScale, m_DrawOffset
*/
void SetLayerParameters();
void SetLayerPolarity( bool aNegative) { m_LayerNegative = aNegative; }
/**
* Move this object.
*
* @param aMoveVector the move vector for this object, in XY gerber axis.
*/
void MoveXY( const VECTOR2I& aMoveVector );
/**
* Return the position of this object.
*
* This function exists mainly to satisfy the virtual GetPosition() in parent class
*
* @return The position of this object.
*/
VECTOR2I GetPosition() const override { return m_Start; }
void SetPosition( const VECTOR2I& aPos ) override { m_Start = aPos; }
/**
* Return the image position of aPosition for this object.
*
* Image position is the value of aPosition, modified by image parameters:
* offsets, axis selection, scale, rotation
*
* @param aXYPosition is position in X,Y gerber axis
* @return The given position in plotter A,B axis.
*/
VECTOR2I GetABPosition( const VECTOR2I& aXYPosition ) const;
/**
* Return the image position of aPosition for this object.
*
* Image position is the value of aPosition, modified by image parameters:
* offsets, axis selection, scale, rotation
*
* @param aABPosition = position in A,B plotter axis
* @return The given position in X,Y axis.
*/
VECTOR2I GetXYPosition( const VECTOR2I& aABPosition ) const;
/**
* Return the GetDcodeDescr of this object, or NULL.
*
* @return a pointer to the DCode description (for flashed items).
*/
D_CODE* GetDcodeDescr() const;
const BOX2I GetBoundingBox() const override;
void Print( wxDC* aDC, const VECTOR2I& aOffset, GBR_DISPLAY_OPTIONS* aOptions );
/**
* Convert a line to an equivalent polygon.
*
* Useful when a line is plotted using a rectangular pen.
* In this case, the usual segment plot function cannot be used
* @param aPolygon is the SHAPE_POLY_SET to fill. If null (usual case),
* m_Polygon will be used
*/
void ConvertSegmentToPolygon();
void ConvertSegmentToPolygon( SHAPE_POLY_SET* aPolygon ) const;
/**
* Print the polygon stored in m_PolyCorners.
*/
void PrintGerberPoly( wxDC* aDC, const COLOR4D& aColor, const VECTOR2I& aOffset,
bool aFilledShape );
GBR_BASIC_SHAPE_TYPE ShapeType() const { return m_ShapeType; }
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
wxString ShowGBRShape() const;
/**
* Test if the given wxPoint is within the bounds of this object.
*
* @param aRefPos a wxPoint to test
* @return bool - true if a hit, else false
*/
bool HitTest( const VECTOR2I& aRefPos, int aAccuracy = 0 ) const override;
/**
* Test if the given wxRect intersect this object.
*
* For now, an ending point must be inside this rect.
*
* @param aRefArea a wxPoint to test
* @return true if a hit, else false
*/
bool HitTest( const BOX2I& aRefArea, bool aContained, int aAccuracy = 0 ) const override;
/**
* @return the class name string.
*/
wxString GetClass() const override
{
return wxT( "GERBER_DRAW_ITEM" );
}
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override;
#endif
/// @copydoc VIEW_ITEM::ViewGetLayers()
virtual std::vector<int> ViewGetLayers() const override;
/// @copydoc VIEW_ITEM::ViewBBox()
virtual const BOX2I ViewBBox() const override;
/// @copydoc VIEW_ITEM::ViewGetLOD()
double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
///< @copydoc EDA_ITEM::Visit()
INSPECT_RESULT Visit( INSPECTOR inspector, void* testData,
const std::vector<KICAD_T>& aScanTypes ) override;
///< @copydoc EDA_ITEM::GetItemDescription()
virtual wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
///< @copydoc EDA_ITEM::GetMenuImage()
BITMAPS GetMenuImage() const override;
public:
bool m_UnitsMetric; // store here the gerber units (inch/mm). Used
// only to calculate aperture macros shapes sizes
GBR_BASIC_SHAPE_TYPE m_ShapeType; // Shape type of this gerber item
VECTOR2I m_Start; // Line or arc start point or position of the shape
// for flashed items
VECTOR2I m_End; // Line or arc end point
VECTOR2I m_ArcCentre; // for arcs only: Center of arc
SHAPE_POLY_SET m_ShapeAsPolygon; // Polygon shape data from G36 to G37 coordinates
// or for complex shapes which are converted to polygon
VECTOR2I m_Size; // Flashed shapes: size of the shape
// Lines : m_Size.x = m_Size.y = line width
bool m_Flashed; // True for flashed items
int m_DCode; // DCode used to draw this item.
// Allowed values are >= 10. 0 when unknown
// values 0 to 9 can be used for special purposes
// Regions (polygons) do not use DCode,
// so it is set to 0
wxString m_AperFunction; // the aperture function set by a %TA.AperFunction, xxx
// (stores the xxx value). Used for regions that do
// not have a attached DCode, but
// have a TA.AperFunction defined
GERBER_FILE_IMAGE* m_GerberImageFile; /* Gerber file image source of this item
* Note: some params stored in this class are common
* to the whole gerber file (i.e) the whole graphic
* layer and some can change when reading the file,
* so they are stored inside this item if there is no
* redundancy for these parameters
*/
// This polygon is to draw this item (mainly GBR_POLYGON), according to layer parameters
SHAPE_POLY_SET m_AbsolutePolygon; // the polygon to draw, in absolute coordinates
private:
// These values are used to draw this item, according to gerber layers parameters
// Because they can change inside a gerber image, they are stored here
// for each item
bool m_LayerNegative; // true = item in negative Layer
bool m_swapAxis; // false if A = X, B = Y; true if A =Y, B = Y
bool m_mirrorA; // true: mirror / axis A
bool m_mirrorB; // true: mirror / ax's B
VECTOR2I m_drawScale; // A and B scaling factor
VECTOR2I m_layerOffset; // Offset for A and B axis, from OF parameter
double m_lyrRotation; // Fine rotation, from OR parameter, in degrees
GBR_NETLIST_METADATA m_netAttributes; ///< the string given by a %TO attribute set in aperture
///< (dcode). Stored in each item, because %TO is
///< a dynamic object attribute
};
#endif /* GERBER_DRAW_ITEM_H */