KiCad PCB EDA Suite
gendrill_file_writer_base.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) 1992-2017 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
29#ifndef GENDRILL_FILE_WRITER_BASE_H
30#define GENDRILL_FILE_WRITER_BASE_H
31
32// holes can have an attribute in Excellon drill files, similar to attributes
33// in Gerber X2 format
34// They are only comments for a better identification of holes (vias, pads...)
35// Set to 1 to add these comments and 0 to not use these comments
36#define USE_ATTRIB_FOR_HOLES 1
37
38#include <vector>
39
40class BOARD_ITEM;
41
42// hole attribute, mainly to identify vias and pads and add this info as comment
43// in NC drill files
45{
46 HOLE_UNKNOWN, // uninitialized type
47 HOLE_VIA_THROUGH, // a via hole (always plated) from top to bottom
48 HOLE_VIA_BURIED, // a via hole (always plated) not through hole
49 HOLE_PAD, // a plated or not plated pad hole
50 HOLE_MECHANICAL // a mechanical pad (provided, not used)
51};
52
53
54// the DRILL_TOOL class handles tools used in the excellon drill file:
56{
57public:
58 int m_Diameter; // the diameter of the used tool
59 // (for oblong, the smaller size)
60 int m_TotalCount; // how many times it is used (round and oblong)
61 int m_OvalCount; // oblong count
62 bool m_Hole_NotPlated; // Is the hole plated or not plated
63 HOLE_ATTRIBUTE m_HoleAttribute; // Attribute (used in Excellon drill file)
64
65public:
66 DRILL_TOOL( int aDiameter, bool a_NotPlated )
67 {
68 m_TotalCount = 0;
69 m_OvalCount = 0;
70 m_Diameter = aDiameter;
71 m_Hole_NotPlated = a_NotPlated;
73 }
74};
75
76
85{
86public:
88 {
89 m_ItemParent = nullptr;
90 m_Hole_NotPlated = false;
94 m_Hole_Shape = 0;
98 }
99
100public:
101 BOARD_ITEM* m_ItemParent; // The pad or via parent of this hole
102 int m_Hole_Diameter; // hole value, and for oblong: min(hole size x, hole
103 // size y).
104 int m_Tool_Reference; // Tool reference for this hole = 1 ... n (values <=0
105 // must not be used).
106 VECTOR2I m_Hole_Size; // hole size for oblong holes
107 EDA_ANGLE m_Hole_Orient; // Hole rotation (= pad rotation) for oblong holes
108 int m_Hole_Shape; // hole shape: round (0) or oval (1)
109 VECTOR2I m_Hole_Pos; // hole position
110 PCB_LAYER_ID m_Hole_Bottom_Layer; // hole ending layer (usually back layer)
111 PCB_LAYER_ID m_Hole_Top_Layer; // hole starting layer (usually front layer):
112 // m_Hole_Top_Layer < m_Hole_Bottom_Layer
113 bool m_Hole_NotPlated; // hole not plated. Must be in a specific drill file or
114 // section.
115 HOLE_ATTRIBUTE m_HoleAttribute; // Attribute, used in Excellon drill file and to sort holes
116 // by type.
117};
118
119
124{
125public:
126 DRILL_PRECISION( int l = 2, int r = 4 )
127 {
128 m_Lhs = l; m_Rhs = r;
129 }
130
131
133 {
134 wxString text;
135
136 text << m_Lhs << wxT( ":" ) << m_Rhs;
137 return text;
138 }
139
140 int m_Lhs; // Left digit number (integer value of coordinates)
141 int m_Rhs; // Right digit number (decimal value of coordinates)
142};
143
144
145typedef std::pair<PCB_LAYER_ID, PCB_LAYER_ID> DRILL_LAYER_PAIR;
146
153{
154public:
155 enum ZEROS_FMT { // Zero format in coordinates
156 DECIMAL_FORMAT, // Floating point coordinates
157 SUPPRESS_LEADING, // Suppress leading zeros
158 SUPPRESS_TRAILING, // Suppress trailing zeros
159 KEEP_ZEROS // keep zeros
160 };
161
162 enum TYPE_FILE { // type of holes in file: PTH, NPTH, mixed
163 PTH_FILE, // PTH only, this is the default also for blind/buried holes
164 NPTH_FILE, // NPTH only
165 MIXED_FILE // PHT+NPTH (mixed)
166 };
167
169 {
170 }
171
178 void SetMergeOption( bool aMerge ) { m_merge_PTH_NPTH = aMerge; }
179
184
192 void SetPageInfo( const PAGE_INFO* aPageInfo ) { m_pageInfo = aPageInfo; }
193
202 {
203 m_mapFileFmt = aMapFmt;
204 }
205
215 void CreateMapFilesSet( const wxString& aPlotDirectory, REPORTER* aReporter = nullptr );
216
265 bool GenDrillReportFile( const wxString& aFullFileName );
266
270 wxString GetDrillFileExt() const { return m_drillFileExtension; }
271
272protected:
284 bool genDrillMapFile( const wxString& aFullFileName, PLOT_FORMAT aFormat );
285
298 void buildHolesList( DRILL_LAYER_PAIR aLayerPair, bool aGenerateNPTH_list );
299
300 int getHolesCount() const { return m_holeListBuffer.size(); }
301
311 bool plotDrillMarks( PLOTTER* aPlotter );
312
314 std::vector<DRILL_LAYER_PAIR> getUniqueLayerPairs() const;
315
322 unsigned printToolSummary( OUTPUTFORMATTER& aOut, bool aSummaryNPTH ) const;
323
329 const std::string layerPairName( DRILL_LAYER_PAIR aPair ) const;
330
335 const std::string layerName( PCB_LAYER_ID aLayer ) const;
336
346 virtual const wxString getDrillFileName( DRILL_LAYER_PAIR aPair, bool aNPTH,
347 bool aMerge_PTH_NPTH ) const;
348
349
361 const wxString BuildFileFunctionAttributeString( DRILL_LAYER_PAIR aLayerPair,
362 TYPE_FILE aHoleType,
363 bool aCompatNCdrill = false ) const;
364
365
366protected:
367 // Use derived classes to build a fully initialized GENDRILL_WRITER_BASE class.
369 {
370 m_pcb = aPcb;
371 m_conversionUnits = 1.0;
372 m_unitsMetric = true;
374 m_pageInfo = nullptr;
375 m_merge_PTH_NPTH = false;
377 }
378
380 wxString m_drillFileExtension; // .drl or .gbr, depending on format
381 bool m_unitsMetric; // true = mm, false = inches
382 ZEROS_FMT m_zeroFormat; // the zero format option for output file
383 DRILL_PRECISION m_precision; // The current coordinate precision (not
384 // used in decimal format).
385 double m_conversionUnits; // scaling factor to convert the board
386 // unites to Excellon/Gerber units (i.e
387 // inches or mm)
388 VECTOR2I m_offset; // Drill offset coordinates
389 bool m_merge_PTH_NPTH; // True to generate only one drill file
390 std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes
391 std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools
392
393 PLOT_FORMAT m_mapFileFmt; // the format of the map drill file,
394 // if this map is needed
395 const PAGE_INFO* m_pageInfo; // the page info used to plot drill maps
396 // If NULL, use a A4 page format
397};
398
399#endif // #define GENDRILL_FILE_WRITER_BASE_H
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:58
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
Helper to handle drill precision format in excellon files.
DRILL_PRECISION(int l=2, int r=4)
HOLE_ATTRIBUTE m_HoleAttribute
DRILL_TOOL(int aDiameter, bool a_NotPlated)
Create drill maps and drill reports and drill files.
wxString GetDrillFileExt() const
Returns the file extension of the drill writer format.
std::vector< DRILL_LAYER_PAIR > getUniqueLayerPairs() const
Get unique layer pairs by examining the micro and blind_buried vias.
virtual const wxString getDrillFileName(DRILL_LAYER_PAIR aPair, bool aNPTH, bool aMerge_PTH_NPTH) const
void SetMapFileFormat(PLOT_FORMAT aMapFmt)
Initialize the format for the drill map file.
void buildHolesList(DRILL_LAYER_PAIR aLayerPair, bool aGenerateNPTH_list)
Create the list of holes and tools for a given board.
void CreateMapFilesSet(const wxString &aPlotDirectory, REPORTER *aReporter=nullptr)
Create the full set of map files for the board, in PS, PDF ... format (use SetMapFileFormat() to sele...
const wxString BuildFileFunctionAttributeString(DRILL_LAYER_PAIR aLayerPair, TYPE_FILE aHoleType, bool aCompatNCdrill=false) const
unsigned printToolSummary(OUTPUTFORMATTER &aOut, bool aSummaryNPTH) const
Print m_toolListBuffer[] tools to aOut and returns total hole count.
std::vector< HOLE_INFO > m_holeListBuffer
bool genDrillMapFile(const wxString &aFullFileName, PLOT_FORMAT aFormat)
Plot a map of drill marks for holes.
VECTOR2I GetOffset()
Return the plot offset (usually the position of the drill/place origin).
std::vector< DRILL_TOOL > m_toolListBuffer
bool GenDrillReportFile(const wxString &aFullFileName)
Create a plain text report file giving a list of drill values and drill count for through holes,...
const std::string layerPairName(DRILL_LAYER_PAIR aPair) const
void SetMergeOption(bool aMerge)
Set the option to make separate drill files for PTH and NPTH.
const std::string layerName(PCB_LAYER_ID aLayer) const
bool plotDrillMarks(PLOTTER *aPlotter)
Write the drill marks in HPGL, POSTSCRIPT or other supported formats/.
void SetPageInfo(const PAGE_INFO *aPageInfo)
Set the page info used to plot drill maps.
Handle hole which must be drilled (diameter, position and layers).
PCB_LAYER_ID m_Hole_Bottom_Layer
PCB_LAYER_ID m_Hole_Top_Layer
HOLE_ATTRIBUTE m_HoleAttribute
BOARD_ITEM * m_ItemParent
An interface used to output 8 bit text in a convenient way.
Definition: richio.h:310
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:54
Base plotter engine class.
Definition: plotter.h:110
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:71
static constexpr EDA_ANGLE & ANGLE_0
Definition: eda_angle.h:412
E_SERIE r
Definition: eserie.cpp:41
std::pair< PCB_LAYER_ID, PCB_LAYER_ID > DRILL_LAYER_PAIR
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ B_Cu
Definition: layer_ids.h:95
@ F_Cu
Definition: layer_ids.h:64
PLOT_FORMAT
The set of supported output plot formats.
Definition: plotter.h:70