KiCad PCB EDA Suite
Loading...
Searching...
No Matches
gerber_file_image.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) 2010-2019 Jean-Pierre Charras jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2024 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
25#ifndef GERBER_FILE_IMAGE_H
26#define GERBER_FILE_IMAGE_H
27
28#include <vector>
29#include <set>
30
31#include <dcode.h>
32#include <gerber_draw_item.h>
33#include <am_primitive.h>
34#include <aperture_macro.h>
36
37typedef std::vector<GERBER_DRAW_ITEM*> GERBER_DRAW_ITEMS;
38
39class GERBVIEW_FRAME;
40class D_CODE;
41
42/* Gerber files have different parameters to define units and how items must be plotted.
43 * some are for the entire file, and other can change along a file.
44 * In Gerber world:
45 * an image is the entire gerber file and its "global" parameters
46 * a layer (that is very different from a board layer) is just a sub set of a file that
47 * have specific parameters
48 * if a Image parameter is set more than once, only the last value is used
49 * Some parameters can change along a file and are not layer specific: they are stored
50 * in GERBER_ITEM items, when instanced.
51 *
52 * In GerbView, to handle these parameters, there are 2 classes:
53 * GERBER_FILE_IMAGE : the main class containing most of parameters and data to plot a
54 * graphic layer
55 * Some of them can change along the file
56 * There is one GERBER_FILE_IMAGE per file and one graphic layer per file or GERBER_FILE_IMAGE
57 * GerbView does not read and merge 2 gerber file in one graphic layer:
58 * I believe this is not possible due to the constraints in Image parameters.
59 * GERBER_LAYER : containing the subset of parameters that is layer specific
60 * A GERBER_FILE_IMAGE must include one GERBER_LAYER to define all parameters to plot a file.
61 * But a GERBER_FILE_IMAGE can use more than one GERBER_LAYER.
62 */
63
65class X2_ATTRIBUTE;
67
68// For arcs, coordinates need 3 info: start point, end point and center or radius
69// In Excellon files it can be a A## value (radius) or I#J# center coordinates (like in gerber)
70// We need to know the last read type when reading a list of routing coordinates
72{
74 ARC_INFO_TYPE_CENTER, // last info is a IJ command: arc center is given
75 ARC_INFO_TYPE_RADIUS, // last info is a A command: arc radius is given
76};
77
79{
80public:
83
84private:
85 void ResetDefaultValues();
86 friend class GERBER_FILE_IMAGE;
87
88public:
89 // These parameters are layer specific:
90 wxString m_LayerName; // Layer name, from LN <name>* command
91 bool m_LayerNegative; // true = Negative Layer: command LP
92 wxRealPoint m_StepForRepeat; // X and Y offsets for Step and Repeat command
93 int m_XRepeatCount; // The repeat count on X axis
94 int m_YRepeatCount; // The repeat count on Y axis
95 bool m_StepForRepeatMetric; // false = Inches, true = metric
96 // needed here because repeated
97 // gerber items can have coordinates
98 // in different units than step parameters
99 // and the actual coordinates calculation must handle this
100};
101
102// Currently, the Gerber file is parsed line by line.
103// This is most of time OK
104// GERBER_BUFZ is the max size of a single line of text from a gerber file.
105// But warning: in rare cases some files can have *very long* lines,
106// so the buffer must be very large.
107// I saw a file using only one line of 1,400,000 chars
108#define GERBER_BUFZ 5000000
109
116{
117public:
118 GERBER_FILE_IMAGE( int layer );
119 virtual ~GERBER_FILE_IMAGE();
120
121 wxString GetClass() const override
122 {
123 return wxT( "GERBER_FILE_IMAGE" );
124 }
125
134 static bool TestFileIsRS274( const wxString& aFullFileName );
135
144 bool LoadGerberFile( const wxString& aFullFileName );
145
146 const wxArrayString& GetMessages() const { return m_messagesList; }
147
151 int GetDcodesCount();
152
156 virtual void ResetDefaultValues();
157
159
164
168 int GetItemsCount() { return m_drawings.size(); }
169
176 {
177 m_drawings.push_back( aItem );
178 }
179
184 {
185 return m_drawings.back();
186 }
187
192 {
193 return m_GBRLayerParams;
194 }
195
200 bool HasNegativeItems();
201
208 {
209 m_messagesList.Clear();
210 }
211
215 void AddMessageToList( const wxString& aMessage )
216 {
217 m_messagesList.Add( aMessage );
218 }
219
228 VECTOR2I ReadXYCoord( char*& aText, bool aExcellonMode = false );
229
236 VECTOR2I ReadIJCoord( char*& Text );
237
243 int CodeNumber( char*& aText );
244
254 D_CODE* GetDCODEOrCreate( int aDCODE, bool aCreateIfNoExist = true );
255
263 D_CODE* GetDCODE( int aDCODE ) const;
264
272
282 void StepAndRepeatItem( const GERBER_DRAW_ITEM& aItem );
283
289 void DisplayImageInfo( GERBVIEW_FRAME* aMainFrame );
290
298 void SetDrawOffetAndRotation( VECTOR2D aOffsetMM, EDA_ANGLE aRotation );
299
311 void RemoveAttribute( X2_ATTRIBUTE& aAttribute );
312
314 INSPECT_RESULT Visit( INSPECTOR inspector, void* testData,
315 const std::vector<KICAD_T>& aScanTypes ) override;
316
317#if defined(DEBUG)
318
319 void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
320
321#endif
322
323private:
336 char* GetNextLine( char *aBuff, unsigned int aBuffSize, char* aText, FILE* aFile );
337
338 bool GetEndOfBlock( char* aBuff, unsigned int aBuffSize, char*& aText, FILE* aGerberFile );
339
343 bool ReadRS274XCommand( char *aBuff, unsigned int aBuffSize, char*& aText );
344
348 bool ExecuteRS274XCommand( int aCommand, char* aBuff, unsigned int aBuffSize, char*& aText );
349
359 int ReadXCommandID( char*& text );
360
372 bool ReadApertureMacro( char *aBuff, unsigned int aBuffSize, char*& text, FILE* gerber_file );
373
374 // functions to execute G commands or D basic commands:
375 bool Execute_G_Command( char*& text, int G_command );
376 bool Execute_DCODE_Command( char*& text, int D_command );
377
378public:
379 bool m_InUse;
383 wxString m_FileName;
384 wxString m_ImageName;
385
389 wxString m_MD5_value;
390 wxString m_PartString;
393
397
402 wxSize m_FmtScale;
403 wxSize m_FmtLen;
404
408
424
427
430
433 FILE* m_Current_File; // Current file to read
434
435 int m_Selected_Tool; // For highlight: current selected Dcode
436
439
440 // true = some DCodes in file are not defined (broken file or deprecated RS274D file).
442 bool m_360Arc_enbl; // Enable 360 deg circular interpolation
443
444 // Set to true when a circular interpolation command type is found. Mandatory before
445 // drawing an arc.
447
448 // Enable polygon mode (read coord as a polygon descr)
450
451 // In polygon mode: 0 = first segm, 1 = next segm
453
456
457 // the net attributes set by a %TO.CN, %TO.C and/or %TO.N add object attribute command.
459
460 // the aperture function set by a %TA.AperFunction, xxx (stores the xxx value).
462
463 std::map<wxString, int> m_ComponentsList; // list of components
464 std::map<wxString, int> m_NetnamesList; // list of net names
465
468
471
472 GERBER_LAYER m_GBRLayerParams; // hold params for the current gerber layer
473 GERBER_DRAW_ITEMS m_drawings; // linked list of Gerber Items to draw
474
479
480 // A large buffer to store one line
481 static char m_LineBuffer[GERBER_BUFZ+1];
482
483private:
484 wxArrayString m_messagesList; // A list of messages created when reading a file
485
497};
498
499#endif // ifndef GERBER_FILE_IMAGE_H
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.
Support the "aperture macro" defined within standard RS274X.
A gerber DCODE (also called Aperture) definition.
Definition: dcode.h:80
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:89
Information which can be added in a gerber file as attribute of an object.
Hold the image data and parameters for one gerber file and layer parameters.
bool Execute_G_Command(char *&text, int G_command)
Definition: rs274d.cpp:425
bool LoadGerberFile(const wxString &aFullFileName)
Read and load a gerber file.
Definition: readgerb.cpp:231
void SetDrawOffetAndRotation(VECTOR2D aOffsetMM, EDA_ANGLE aRotation)
Set the offset and rotation to draw a file image Does not change any coordinate od draw items.
int m_Last_Pen_Command
Current or last pen state (0..9, set by Dn option with n < 10.
GERBER_DRAW_ITEM * GetLastItemInList() const
APERTURE_MACRO * FindApertureMacro(const APERTURE_MACRO &aLookup)
Look up a previously read in aperture macro.
VECTOR2I ReadIJCoord(char *&Text)
Return the current coordinate type pointed to by InnJnn Text (InnnnJmmmm)
X2_ATTRIBUTE_FILEFUNCTION * m_FileFunction
file function parameters, found in a TF command or a G04
void RemoveAttribute(X2_ATTRIBUTE &aAttribute)
Called when a TD command is found the Gerber file.
static char m_LineBuffer[GERBER_BUFZ+1]
int m_hasNegativeItems
True if the image is negative or has some negative items.
virtual void ResetDefaultValues()
Set all parameters to a default value, before reading a file.
const wxArrayString & GetMessages() const
bool m_SwapAxis
false if A = X and B = Y (default); true if A = Y, B = X
void ClearMessageList()
Clear the message list.
double m_LocalRotation
Local rotation added to m_ImageRotation.
VECTOR2I m_Offset
Coord Offset, from OF command.
wxSize m_FmtScale
Fmt 2.3: m_FmtScale = 3, fmt 3.4: m_FmtScale = 4.
int m_ArcRadius
Identifier for arc data type (IJ (center) or A## (radius)).
wxString m_FileName
Full File Name for this layer.
void StepAndRepeatItem(const GERBER_DRAW_ITEM &aItem)
Gerber format has a command Step an Repeat.
bool m_ImageJustifyXCenter
Image Justify Center on X axis (default = false)
bool m_ImageJustifyYCenter
Image Justify Center on Y axis (default = false)
VECTOR2I m_DisplayOffset
< Parameters used only to draw (display) items on this layer.
VECTOR2I m_PreviousPos
old current specified coord for plot
bool m_InUse
true if this image is currently in use (a file is loaded in it) false if it must be not drawn
bool m_ImageNegative
true = Negative image
void AddMessageToList(const wxString &aMessage)
Add a message to the message list.
LAST_EXTRA_ARC_DATA_TYPE m_LastArcDataType
wxArrayString m_messagesList
COLOR4D GetPositiveDrawColor() const
int m_LineNum
Line number of the gerber file while reading.
COLOR4D m_PositiveDrawColor
The color used to draw positive items.
std::map< wxString, int > m_ComponentsList
VECTOR2I m_IJPos
IJ coord (for arcs & circles )
wxString m_ImageName
Image name, from IN <name>* command.
bool m_Relative
false = absolute Coord, true = relative Coord.
bool Execute_DCODE_Command(char *&text, int D_command)
Definition: rs274d.cpp:560
wxString m_MD5_value
MD5 value found in a TF.MD5 command.
char * GetNextLine(char *aBuff, unsigned int aBuffSize, char *aText, FILE *aFile)
Test for an end of line.
Definition: rs274x.cpp:957
static bool TestFileIsRS274(const wxString &aFullFileName)
Performs a heuristics-based check of whether the file is an RS274 gerber file.
Definition: readgerb.cpp:140
bool m_MirrorB
true: mirror / axis B (Y)
wxString m_PartString
string found in a TF.Part command
D_CODE * GetDCODE(int aDCODE) const
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
bool ReadRS274XCommand(char *aBuff, unsigned int aBuffSize, char *&aText)
Read a single RS274X command terminated with a %.
Definition: rs274x.cpp:142
bool m_IsX2_file
True if a X2 gerber attribute was found in file.
int m_ImageRotation
Image rotation (0, 90, 180, 270 only) in degrees.
VECTOR2I m_ImageOffset
Coord Offset, from IO command.
int m_PolygonFillModeState
a collection of APERTURE_MACROS, sorted by name
bool m_Has_DCode
< True if has DCodes in file or false if no DCodes found. Perhaps deprecated RS274D file.
bool GetEndOfBlock(char *aBuff, unsigned int aBuffSize, char *&aText, FILE *aGerberFile)
Definition: rs274x.cpp:931
bool ReadApertureMacro(char *aBuff, unsigned int aBuffSize, char *&text, FILE *gerber_file)
Read in an aperture macro and saves it in m_aperture_macros.
Definition: rs274x.cpp:984
int m_Current_Tool
Current Tool (Dcode) number selected.
D_CODE * GetDCODEOrCreate(int aDCODE, bool aCreateIfNoExist=true)
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
void AddItemToList(GERBER_DRAW_ITEM *aItem)
Add a new GERBER_DRAW_ITEM item to the drawings list.
VECTOR2I ReadXYCoord(char *&aText, bool aExcellonMode=false)
Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm).
bool ExecuteRS274XCommand(int aCommand, char *aBuff, unsigned int aBuffSize, char *&aText)
Execute a RS274X command.
Definition: rs274x.cpp:197
wxSize m_FmtLen
Nb chars per coord. ex fmt 2.3, m_FmtLen = 5.
D_CODE * m_Aperture_List[TOOLS_MAX_COUNT]
< Dcode (Aperture) List for this layer (max TOOLS_MAX_COUNT: see dcode.h)
std::map< wxString, int > m_NetnamesList
wxString GetClass() const override
Return the class name.
int m_GraphicLayer
Graphic layer Number.
APERTURE_MACRO_SET m_aperture_macros
int ReadXCommandID(char *&text)
Read two bytes of data and assembles them into an int with the first byte in the sequence put into th...
Definition: rs274x.cpp:114
GERBER_DRAW_ITEMS m_drawings
bool m_GerbMetric
false = Inches, true = metric
GBR_NETLIST_METADATA m_NetAttributeDict
int m_CommandState
state of gerber analysis command
bool m_NoTrailingZeros
true: remove tailing zeros.
int m_Iterpolation
Linear, 90 arc, Circ.
VECTOR2I m_CurrentPos
current specified coord for plot
bool m_MirrorA
true: mirror / axis A (X)
bool m_LastCoordIsIJPos
A value ( = radius in circular routing in Excellon files ).
VECTOR2I m_Scale
scale (X and Y) of layer.
GERBER_DRAW_ITEMS & GetItems()
VECTOR2I m_ImageJustifyOffset
Image Justify Offset on XY axis (default = 0,0)
int CodeNumber(char *&aText)
Reads the next number and returns the value.
Definition: rs274d.cpp:405
GERBER_LAYER m_GBRLayerParams
GERBER_LAYER & GetLayerParams()
void DisplayImageInfo(GERBVIEW_FRAME *aMainFrame)
Display information about image parameters in the status bar.
wxRealPoint m_StepForRepeat
bool m_StepForRepeatMetric
wxString m_LayerName
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
X2_ATTRIBUTE_FILEFUNCTION ( from TF.FileFunction in Gerber file) Example file function: TF....
The attribute value consists of a number of substrings separated by a comma.
#define TOOLS_MAX_COUNT
Definition: dcode.h:71
INSPECT_RESULT
Definition: eda_item.h:43
const INSPECTOR_FUNC & INSPECTOR
Definition: eda_item.h:82
LAST_EXTRA_ARC_DATA_TYPE
@ ARC_INFO_TYPE_NONE
@ ARC_INFO_TYPE_RADIUS
@ ARC_INFO_TYPE_CENTER
#define GERBER_BUFZ
std::vector< GERBER_DRAW_ITEM * > GERBER_DRAW_ITEMS