KiCad PCB EDA Suite
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-2021 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 <gbr_netlist_metadata.h>
35 
36 // An useful macro used when reading gerber files;
37 #define IsNumber( x ) ( ( ( (x) >= '0' ) && ( (x) <='9' ) ) \
38  || ( (x) == '-' ) || ( (x) == '+' ) || ( (x) == '.' ) )
39 
40 typedef std::vector<GERBER_DRAW_ITEM*> GERBER_DRAW_ITEMS;
41 
42 class GERBVIEW_FRAME;
43 class D_CODE;
44 
45 /* Gerber files have different parameters to define units and how items must be plotted.
46  * some are for the entire file, and other can change along a file.
47  * In Gerber world:
48  * an image is the entire gerber file and its "global" parameters
49  * a layer (that is very different from a board layer) is just a sub set of a file that
50  * have specific parameters
51  * if a Image parameter is set more than once, only the last value is used
52  * Some parameters can change along a file and are not layer specific: they are stored
53  * in GERBER_ITEM items, when instanced.
54  *
55  * In GerbView, to handle these parameters, there are 2 classes:
56  * GERBER_FILE_IMAGE : the main class containing most of parameters and data to plot a
57  * graphic layer
58  * Some of them can change along the file
59  * There is one GERBER_FILE_IMAGE per file and one graphic layer per file or GERBER_FILE_IMAGE
60  * GerbView does not read and merge 2 gerber file in one graphic layer:
61  * I believe this is not possible due to the constraints in Image parameters.
62  * GERBER_LAYER : containing the subset of parameters that is layer specific
63  * A GERBER_FILE_IMAGE must include one GERBER_LAYER to define all parameters to plot a file.
64  * But a GERBER_FILE_IMAGE can use more than one GERBER_LAYER.
65  */
66 
67 class GERBER_FILE_IMAGE;
68 class X2_ATTRIBUTE;
70 
71 // For arcs, coordinates need 3 info: start point, end point and center or radius
72 // In Excellon files it can be a A## value (radius) or I#J# center coordinates (like in gerber)
73 // We need to know the last read type when reading a list of routing coordinates
75 {
77  ARC_INFO_TYPE_CENTER, // last info is a IJ command: arc center is given
78  ARC_INFO_TYPE_RADIUS, // last info is a A command: arc radius is given
79 };
80 
82 {
83 public:
84  GERBER_LAYER();
85  ~GERBER_LAYER();
86 
87 private:
88  void ResetDefaultValues();
89  friend class GERBER_FILE_IMAGE;
90 
91 public:
92  // These parameters are layer specific:
93  wxString m_LayerName; // Layer name, from LN <name>* command
94  bool m_LayerNegative; // true = Negative Layer: command LP
95  wxRealPoint m_StepForRepeat; // X and Y offsets for Step and Repeat command
96  int m_XRepeatCount; // The repeat count on X axis
97  int m_YRepeatCount; // The repeat count on Y axis
98  bool m_StepForRepeatMetric; // false = Inches, true = metric
99  // needed here because repeated
100  // gerber items can have coordinates
101  // in different units than step parameters
102  // and the actual coordinates calculation must handle this
103 };
104 
111 {
112 public:
113  GERBER_FILE_IMAGE( int layer );
114  virtual ~GERBER_FILE_IMAGE();
115 
116  wxString GetClass() const override
117  {
118  return wxT( "GERBER_FILE_IMAGE" );
119  }
120 
129  bool LoadGerberFile( const wxString& aFullFileName );
130 
131  const wxArrayString& GetMessages() const { return m_messagesList; }
132 
136  int GetDcodesCount();
137 
138  virtual void ResetDefaultValues();
139 
141 
146 
150  int GetItemsCount() { return m_drawings.size(); }
151 
158  {
159  m_drawings.push_back( aItem );
160  }
161 
166  {
167  return m_drawings.back();
168  }
169 
174  {
175  return m_GBRLayerParams;
176  }
177 
182  bool HasNegativeItems();
183 
190  {
191  m_messagesList.Clear();
192  }
193 
197  void AddMessageToList( const wxString& aMessage )
198  {
199  m_messagesList.Add( aMessage );
200  }
201 
202  void InitToolTable();
203 
212  wxPoint ReadXYCoord( char*& aText, bool aExcellonMode = false );
213 
220  wxPoint ReadIJCoord( char*& Text );
221 
222  // functions to read G commands or D commands:
223  int GCodeNumber( char*& Text );
224  int DCodeNumber( char*& Text );
225 
235  D_CODE* GetDCODEOrCreate( int aDCODE, bool aCreateIfNoExist = true );
236 
244  D_CODE* GetDCODE( int aDCODE ) const;
245 
253 
263  void StepAndRepeatItem( const GERBER_DRAW_ITEM& aItem );
264 
270  void DisplayImageInfo( GERBVIEW_FRAME* aMainFrame );
271 
283  void RemoveAttribute( X2_ATTRIBUTE& aAttribute );
284 
286  SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
287 
288 #if defined(DEBUG)
289 
290  void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
291 
292 #endif
293 
294 private:
307  char* GetNextLine( char *aBuff, unsigned int aBuffSize, char* aText, FILE* aFile );
308 
309  bool GetEndOfBlock( char* aBuff, unsigned int aBuffSize, char*& aText, FILE* aGerberFile );
310 
314  bool ReadRS274XCommand( char *aBuff, unsigned int aBuffSize, char*& aText );
315 
319  bool ExecuteRS274XCommand( int aCommand, char* aBuff, unsigned int aBuffSize, char*& aText );
320 
330  int ReadXCommandID( char*& text );
331 
343  bool ReadApertureMacro( char *aBuff, unsigned int aBuffSize,
344  char* & text, FILE * gerber_file );
345 
346  // functions to execute G commands or D basic commands:
347  bool Execute_G_Command( char*& text, int G_command );
348  bool Execute_DCODE_Command( char*& text, int D_command );
349 
350 public:
351  bool m_InUse; // true if this image is currently in use
352  // (a file is loaded in it)
353 
356  // false if it must be not drawn
357  COLOR4D m_PositiveDrawColor; // The color used to draw positive items
358  wxString m_FileName; // Full File Name for this layer
359  wxString m_ImageName; // Image name, from IN <name>* command
360 
363  X2_ATTRIBUTE_FILEFUNCTION* m_FileFunction; // file function parameters, found in a
364  // %TF command or a G04
365  wxString m_MD5_value; // MD5 value found in a %TF.MD5 command
366  wxString m_PartString; // string found in a %TF.Part command
367  int m_GraphicLayer; // Graphic layer Number
368  bool m_ImageNegative; // true = Negative image
369 
372 
375 
378  bool m_GerbMetric; // false = Inches, true = metric
379 
382  bool m_NoTrailingZeros; // true: remove tailing zeros.
383  wxPoint m_ImageOffset; // Coord Offset, from IO command
384 
386  wxSize m_FmtScale;
387 
389  wxSize m_FmtLen;
390 
393 
397  wxPoint m_Offset; // Coord Offset, from OF command
398  wxRealPoint m_Scale; // scale (X and Y) of layer.
399  bool m_SwapAxis; // false (default) if A = X and B = Y
400  // true if A = Y, B = X
401  bool m_MirrorA; // true: mirror / axis A (X)
402  bool m_MirrorB; // true: mirror / axis B (Y)
403  int m_Iterpolation; // Linear, 90 arc, Circ.
404  int m_Current_Tool; // Current Tool (Dcode) number selected
405 
408  int m_CommandState; // state of gerber analysis command.
409 
412  wxPoint m_CurrentPos; // current specified coord for plot
413  wxPoint m_PreviousPos; // old current specified coord for plot
414  wxPoint m_IJPos; // IJ coord (for arcs & circles )
415 
418 
421 
424  FILE* m_Current_File; // Current file to read
425 
426  int m_Selected_Tool; // For highlight: current selected Dcode
427 
430 
431  // true = some DCodes in file are not defined (broken file or deprecated RS274D file).
433  bool m_360Arc_enbl; // Enable 360 deg circular interpolation
434 
435  // Set to true when a circular interpolation command type is found. Mandatory before
436  // drawing an arc.
438 
439  // Enable polygon mode (read coord as a polygon descr)
441 
442  // In polygon mode: 0 = first segm, 1 = next segm
444 
447 
448  // the net attributes set by a %TO.CN, %TO.C and/or %TO.N add object attribute command.
450 
451  // the aperture function set by a %TA.AperFunction, xxx (stores the xxx value).
452  wxString m_AperFunction;
453 
454  std::map<wxString, int> m_ComponentsList; // list of components
455  std::map<wxString, int> m_NetnamesList; // list of net names
456 
459 
462 
463  GERBER_LAYER m_GBRLayerParams; // hold params for the current gerber layer
464  GERBER_DRAW_ITEMS m_drawings; // linked list of Gerber Items to draw
465 
466 private:
467  wxArrayString m_messagesList; // A list of messages created when reading a file
468 
480 };
481 
482 #endif // ifndef GERBER_FILE_IMAGE_H
APERTURE_MACRO_SET m_aperture_macros
X2_ATTRIBUTE_FILEFUNCTION ( from TF.FileFunction in Gerber file) Example file function: TF....
int m_LineNum
< Line number of the gerber file while reading.
void AddMessageToList(const wxString &aMessage)
Add a message to the message list.
wxString m_LayerName
X2_ATTRIBUTE_FILEFUNCTION * m_FileFunction
X2_ATTRIBUTE The attribute value consists of a number of substrings separated by a comma.
bool Execute_DCODE_Command(char *&text, int D_command)
Definition: rs274d.cpp:581
wxString GetClass() const override
Return the class name.
GERBER_DRAW_ITEMS & GetItems()
int m_Last_Pen_Command
< Current or last pen state (0..9, set by Dn option with n < 10.
wxPoint ReadIJCoord(char *&Text)
Return the current coordinate type pointed to by InnJnn Text (InnnnJmmmm)
bool m_ImageJustifyXCenter
< Image Justify Center on X axis (default = false).
bool m_LastCoordIsIJPos
< True if a IJ coord was read (for arcs & circles ).
wxRealPoint m_StepForRepeat
bool m_ImageJustifyYCenter
Image Justify Offset on XY axis (default = 0,0).
GERBER_FILE_IMAGE(int layer)
D_CODE * GetDCODE(int aDCODE) const
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
Hold the image data and parameters for one gerber file and layer parameters.
COLOR4D GetPositiveDrawColor() const
wxSize m_FmtLen
Image rotation (0, 90, 180, 270 only) in degrees.
bool m_IsVisible
< True if the draw layer is visible and must be drawn.
void ClearMessageList()
Clear the message list.
Information which can be added in a gerber file as attribute of an object.
SEARCH_RESULT Visit(INSPECTOR inspector, void *testData, const KICAD_T scanTypes[]) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
wxSize m_FmtScale
< Fmt 2.3: m_FmtScale = 3, fmt 3.4: m_FmtScale = 4.
wxArrayString m_messagesList
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
const INSPECTOR_FUNC & INSPECTOR
Definition: eda_item.h:95
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
D_CODE * m_Aperture_List[TOOLS_MAX_COUNT]
< Dcode (Aperture) List for this layer (max TOOLS_MAX_COUNT: see dcode.h)
int m_ArcRadius
Identifier for arc data type (IJ (center) or A## (radius)).
int m_PolygonFillModeState
a collection of APERTURE_MACROS, sorted by name
int GCodeNumber(char *&Text)
Definition: rs274d.cpp:405
bool m_IsX2_file
< True if a X2 gerber attribute was found in file.
bool ExecuteRS274XCommand(int aCommand, char *aBuff, unsigned int aBuffSize, char *&aText)
Execute a RS274X command.
Definition: rs274x.cpp:197
GERBER_DRAW_ITEMS m_drawings
GERBER_DRAW_ITEM * GetLastItemInList() const
char * GetNextLine(char *aBuff, unsigned int aBuffSize, char *aText, FILE *aFile)
Test for an end of line.
Definition: rs274x.cpp:934
void DisplayImageInfo(GERBVIEW_FRAME *aMainFrame)
Display information about image parameters in the status bar.
void AddItemToList(GERBER_DRAW_ITEM *aItem)
Add a new GERBER_DRAW_ITEM item to the drawings list.
GERBER_LAYER m_GBRLayerParams
int DCodeNumber(char *&Text)
Definition: rs274d.cpp:428
const wxArrayString & GetMessages() const
bool LoadGerberFile(const wxString &aFullFileName)
Read and load a gerber file.
Definition: readgerb.cpp:120
std::vector< GERBER_DRAW_ITEM * > GERBER_DRAW_ITEMS
APERTURE_MACRO * FindApertureMacro(const APERTURE_MACRO &aLookup)
Look up a previously read in aperture macro.
bool m_Relative
< false = absolute Coord, true = relative Coord.
bool m_StepForRepeatMetric
wxPoint ReadXYCoord(char *&aText, bool aExcellonMode=false)
Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm).
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:962
std::map< wxString, int > m_NetnamesList
std::set< APERTURE_MACRO, APERTURE_MACRO_less_than > APERTURE_MACRO_SET
Type APERTURE_MACRO_SET is a sorted collection of APERTURE_MACROS whose key is the name field in the ...
Definition: am_primitive.h:257
void RemoveAttribute(X2_ATTRIBUTE &aAttribute)
Called when a TD command is found the Gerber file.
bool m_Has_DCode
< True if has DCodes in file or false if no DCodes found. Perhaps deprecated RS274D file.
int m_hasNegativeItems
True if the image is negative or has some negative items.
bool Execute_G_Command(char *&text, int G_command)
Definition: rs274d.cpp:448
LAST_EXTRA_ARC_DATA_TYPE m_LastArcDataType
D_CODE holds a gerber DCODE (also called Aperture) definition.
Definition: dcode.h:82
GBR_NETLIST_METADATA m_NetAttributeDict
bool ReadRS274XCommand(char *aBuff, unsigned int aBuffSize, char *&aText)
Read a single RS274X command terminated with a %.
Definition: rs274x.cpp:142
bool GetEndOfBlock(char *aBuff, unsigned int aBuffSize, char *&aText, FILE *aGerberFile)
Definition: rs274x.cpp:908
#define TOOLS_MAX_COUNT
Definition: dcode.h:73
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:150
Struct APERTURE_MACRO helps support the "aperture macro" defined within standard RS274X.
Definition: am_primitive.h:162
SEARCH_RESULT
Definition: eda_item.h:41
void StepAndRepeatItem(const GERBER_DRAW_ITEM &aItem)
Gerber format has a command Step an Repeat.
std::map< wxString, int > m_ComponentsList
D_CODE * GetDCODEOrCreate(int aDCODE, bool aCreateIfNoExist=true)
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
GERBER_LAYER & GetLayerParams()
int m_ImageRotation
Local rotation in degrees added to m_ImageRotation.
virtual void ResetDefaultValues()
LAST_EXTRA_ARC_DATA_TYPE
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:98