KiCad PCB EDA Suite
gen_drill_report_files.cpp
Go to the documentation of this file.
1 
6 /*
7  * This program source code file is part of KiCad, a free EDA CAD application.
8  *
9  * Copyright (C) 1992-2017 Jean_Pierre Charras <jp.charras at wanadoo.fr>
10  * Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, you may find one here:
24  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
25  * or you may search the http://www.gnu.org website for the version 2 license,
26  * or you may write to the Free Software Foundation, Inc.,
27  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
28  */
29 
30 #include <fctsys.h>
31 #include <common.h>
32 #include <plotter.h>
33 #include <base_struct.h>
34 #include <gr_text.h>
35 #include <confirm.h>
36 #include <kicad_string.h>
37 #include <macros.h>
38 #include <math/util.h> // for KiROUND
39 
40 #include <class_board.h>
41 
42 #include <pcbnew.h>
43 #include <pcbplot.h>
45 
46 /* Conversion utilities - these will be used often in there... */
47 inline double diameter_in_inches( double ius )
48 {
49  return ius * 0.001 / IU_PER_MILS;
50 }
51 
52 
53 inline double diameter_in_mm( double ius )
54 {
55  return ius / IU_PER_MM;
56 }
57 
58 
59 bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_FORMAT aFormat )
60 {
61  // Remark:
62  // Hole list must be created before calling this function, by buildHolesList(),
63  // for the right holes set (PTH, NPTH, buried/blind vias ...)
64 
65  double scale = 1.0;
66  wxPoint offset;
67  PLOTTER* plotter = NULL;
68  PAGE_INFO dummy( PAGE_INFO::A4, false );
69 
70  PCB_PLOT_PARAMS plot_opts; // starts plotting with default options
71 
72  LOCALE_IO toggle; // use standard C notation for float numbers
73 
74  const PAGE_INFO& page_info = m_pageInfo ? *m_pageInfo : dummy;
75 
76  // Calculate dimensions and center of PCB
78 
79  // Calculate the scale for the format type, scale 1 in HPGL, drawing on
80  // an A4 sheet in PS, + text description of symbols
81  switch( aFormat )
82  {
84  offset = GetOffset();
85  plotter = new GERBER_PLOTTER();
86  plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
87  plotter->SetGerberCoordinatesFormat( 5 ); // format x.5 unit = mm
88  break;
89 
90  case PLOT_FORMAT::HPGL: // Scale for HPGL format.
91  {
92  HPGL_PLOTTER* hpgl_plotter = new HPGL_PLOTTER;
93  plotter = hpgl_plotter;
94  hpgl_plotter->SetPenNumber( plot_opts.GetHPGLPenNum() );
95  hpgl_plotter->SetPenSpeed( plot_opts.GetHPGLPenSpeed() );
96  plotter->SetPageSettings( page_info );
97  plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
98  }
99  break;
100 
101 
102  default:
103  wxASSERT( false );
104  // fall through
105  case PLOT_FORMAT::PDF:
106  case PLOT_FORMAT::POST:
107  {
108  PAGE_INFO pageA4( wxT( "A4" ) );
109  wxSize pageSizeIU = pageA4.GetSizeIU();
110 
111  // Reserve a margin around the page.
112  int margin = KiROUND( 20 * IU_PER_MM );
113 
114  // Calculate a scaling factor to print the board on the sheet
115  double Xscale = double( pageSizeIU.x - ( 2 * margin ) ) / bbbox.GetWidth();
116 
117  // We should print the list of drill sizes, so reserve room for it
118  // 60% height for board 40% height for list
119  int ypagesize_for_board = KiROUND( pageSizeIU.y * 0.6 );
120  double Yscale = double( ypagesize_for_board - margin ) / bbbox.GetHeight();
121 
122  scale = std::min( Xscale, Yscale );
123 
124  // Experience shows the scale should not to large, because texts
125  // create problem (can be to big or too small).
126  // So the scale is clipped at 3.0;
127  scale = std::min( scale, 3.0 );
128 
129  offset.x = KiROUND( double( bbbox.Centre().x ) - ( pageSizeIU.x / 2.0 ) / scale );
130  offset.y = KiROUND( double( bbbox.Centre().y ) - ( ypagesize_for_board / 2.0 ) / scale );
131 
132  if( aFormat == PLOT_FORMAT::PDF )
133  plotter = new PDF_PLOTTER;
134  else
135  plotter = new PS_PLOTTER;
136 
137  plotter->SetPageSettings( pageA4 );
138  plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
139  }
140  break;
141 
142  case PLOT_FORMAT::DXF:
143  {
144  DXF_PLOTTER* dxf_plotter = new DXF_PLOTTER;
145 
146  if( m_unitsMetric )
148  else
150 
151  plotter = dxf_plotter;
152  plotter->SetPageSettings( page_info );
153  plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
154  }
155  break;
156 
157  case PLOT_FORMAT::SVG:
158  {
159  SVG_PLOTTER* svg_plotter = new SVG_PLOTTER;
160  plotter = svg_plotter;
161  plotter->SetPageSettings( page_info );
162  plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
163  }
164  break;
165  }
166 
167  plotter->SetCreator( wxT( "PCBNEW" ) );
168  plotter->SetDefaultLineWidth( 5 * IU_PER_MILS );
169  plotter->SetColorMode( false );
170 
171  if( !plotter->OpenFile( aFullFileName ) )
172  {
173  delete plotter;
174  return false;
175  }
176 
177  plotter->StartPlot();
178 
179  // Draw items on edge layer (not all, only items useful for drill map
180  BRDITEMS_PLOTTER itemplotter( plotter, m_pcb, plot_opts );
181  itemplotter.SetLayerSet( Edge_Cuts );
182 
183  for( auto PtStruct : m_pcb->Drawings() )
184  {
185  switch( PtStruct->Type() )
186  {
187  case PCB_LINE_T:
188  itemplotter.PlotDrawSegment( (DRAWSEGMENT*) PtStruct );
189  break;
190 
191  case PCB_TEXT_T:
192  itemplotter.PlotTextePcb( (TEXTE_PCB*) PtStruct );
193  break;
194 
195  case PCB_DIMENSION_T:
196  case PCB_TARGET_T:
197  case PCB_MARKER_T: // do not draw
198  default:
199  break;
200  }
201  }
202 
203  int x, y;
204  int plotX, plotY, TextWidth;
205  int intervalle = 0;
206  char line[1024];
207  wxString msg;
208  int textmarginaftersymbol = KiROUND( 2 * IU_PER_MM );
209 
210  // Set Drill Symbols width
211  plotter->SetDefaultLineWidth( 0.2 * IU_PER_MM / scale );
212  plotter->SetCurrentLineWidth( -1 );
213 
214  // Plot board outlines and drill map
215  plotDrillMarks( plotter );
216 
217  // Print a list of symbols used.
218  int charSize = 3 * IU_PER_MM; // text size in IUs
219  double charScale = 1.0 / scale; // real scale will be 1/scale,
220  // because the global plot scale is scale
221  TextWidth = KiROUND( ( charSize * charScale ) / 10.0 ); // Set text width (thickness)
222  intervalle = KiROUND( charSize * charScale ) + TextWidth;
223 
224  // Trace information.
225  plotX = KiROUND( bbbox.GetX() + textmarginaftersymbol * charScale );
226  plotY = bbbox.GetBottom() + intervalle;
227 
228  // Plot title "Info"
229  wxString Text = wxT( "Drill Map:" );
230  plotter->Text( wxPoint( plotX, plotY ), COLOR4D::UNSPECIFIED, Text, 0,
231  wxSize( KiROUND( charSize * charScale ), KiROUND( charSize * charScale ) ),
232  GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, TextWidth, false, false );
233 
234  for( unsigned ii = 0; ii < m_toolListBuffer.size(); ii++ )
235  {
236  DRILL_TOOL& tool = m_toolListBuffer[ii];
237 
238  if( tool.m_TotalCount == 0 )
239  continue;
240 
241  plotY += intervalle;
242 
243  int plot_diam = KiROUND( tool.m_Diameter );
244  x = KiROUND( plotX - textmarginaftersymbol * charScale - plot_diam / 2.0 );
245  y = KiROUND( plotY + charSize * charScale );
246  plotter->Marker( wxPoint( x, y ), plot_diam, ii );
247 
248  // List the diameter of each drill in mm and inches.
249  sprintf( line, "%2.2fmm / %2.3f\" ", diameter_in_mm( tool.m_Diameter ),
250  diameter_in_inches( tool.m_Diameter ) );
251 
252  msg = FROM_UTF8( line );
253 
254  // Now list how many holes and ovals are associated with each drill.
255  if( ( tool.m_TotalCount == 1 ) && ( tool.m_OvalCount == 0 ) )
256  sprintf( line, "(1 hole)" );
257  else if( tool.m_TotalCount == 1 ) // && ( toolm_OvalCount == 1 )
258  sprintf( line, "(1 slot)" );
259  else if( tool.m_OvalCount == 0 )
260  sprintf( line, "(%d holes)", tool.m_TotalCount );
261  else if( tool.m_OvalCount == 1 )
262  sprintf( line, "(%d holes + 1 slot)", tool.m_TotalCount - 1 );
263  else // if ( toolm_OvalCount > 1 )
264  sprintf( line, "(%d holes + %d slots)", tool.m_TotalCount - tool.m_OvalCount,
265  tool.m_OvalCount );
266 
267  msg += FROM_UTF8( line );
268 
269  if( tool.m_Hole_NotPlated )
270  msg += wxT( " (not plated)" );
271 
272  plotter->Text( wxPoint( plotX, y ), COLOR4D::UNSPECIFIED, msg, 0,
273  wxSize( KiROUND( charSize * charScale ), KiROUND( charSize * charScale ) ),
274  GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, TextWidth, false, false );
275 
276  intervalle = KiROUND( ( ( charSize * charScale ) + TextWidth ) * 1.2 );
277 
278  if( intervalle < ( plot_diam + ( 1 * IU_PER_MM / scale ) + TextWidth ) )
279  intervalle = plot_diam + ( 1 * IU_PER_MM / scale ) + TextWidth;
280  }
281 
282  plotter->EndPlot();
283  delete plotter;
284 
285  return true;
286 }
287 
288 
289 bool GENDRILL_WRITER_BASE::GenDrillReportFile( const wxString& aFullFileName )
290 {
291  FILE_OUTPUTFORMATTER out( aFullFileName );
292 
293  static const char separator[] =
294  " =============================================================\n";
295 
296  wxASSERT( m_pcb );
297 
298  unsigned totalHoleCount;
299  wxString brdFilename = m_pcb->GetFileName();
300 
301  std::vector<DRILL_LAYER_PAIR> hole_sets = getUniqueLayerPairs();
302 
303  out.Print( 0, "Drill report for %s\n", TO_UTF8( brdFilename ) );
304  out.Print( 0, "Created on %s\n\n", TO_UTF8( DateAndTime() ) );
305 
306  // Output the cu layer stackup, so layer name references make sense.
307  out.Print( 0, "Copper Layer Stackup:\n" );
308  out.Print( 0, separator );
309 
311 
312  int conventional_layer_num = 1;
313 
314  for( LSEQ seq = cu.Seq(); seq; ++seq, ++conventional_layer_num )
315  {
316  out.Print( 0, " L%-2d: %-25s %s\n",
317  conventional_layer_num,
318  TO_UTF8( m_pcb->GetLayerName( *seq ) ),
319  layerName( *seq ).c_str() // generic layer name
320  );
321  }
322 
323  out.Print( 0, "\n\n" );
324 
325  /* output hole lists:
326  * 1 - through holes
327  * 2 - for partial holes only: by layer starting and ending pair
328  * 3 - Non Plated through holes
329  */
330 
331  bool buildNPTHlist = false; // First pass: build PTH list only
332 
333  // in this loop are plated only:
334  for( unsigned pair_ndx = 0; pair_ndx < hole_sets.size(); ++pair_ndx )
335  {
336  DRILL_LAYER_PAIR pair = hole_sets[pair_ndx];
337 
338  buildHolesList( pair, buildNPTHlist );
339 
340  if( pair == DRILL_LAYER_PAIR( F_Cu, B_Cu ) )
341  {
342  out.Print( 0, "Drill file '%s' contains\n",
343  TO_UTF8( getDrillFileName( pair, false, m_merge_PTH_NPTH ) ) );
344 
345  out.Print( 0, " plated through holes:\n" );
346  out.Print( 0, separator );
347  totalHoleCount = printToolSummary( out, false );
348  out.Print( 0, " Total plated holes count %u\n", totalHoleCount );
349  }
350  else // blind/buried
351  {
352  out.Print( 0, "Drill file '%s' contains\n",
353  TO_UTF8( getDrillFileName( pair, false, m_merge_PTH_NPTH ) ) );
354 
355  out.Print( 0, " holes connecting layer pair: '%s and %s' (%s vias):\n",
356  TO_UTF8( m_pcb->GetLayerName( ToLAYER_ID( pair.first ) ) ),
357  TO_UTF8( m_pcb->GetLayerName( ToLAYER_ID( pair.second ) ) ),
358  pair.first == F_Cu || pair.second == B_Cu ? "blind" : "buried"
359  );
360 
361  out.Print( 0, separator );
362  totalHoleCount = printToolSummary( out, false );
363  out.Print( 0, " Total plated holes count %u\n", totalHoleCount );
364  }
365 
366  out.Print( 0, "\n\n" );
367  }
368 
369  // NPTHoles. Generate the full list (pads+vias) if PTH and NPTH are merged,
370  // or only the NPTH list (which never has vias)
371  if( !m_merge_PTH_NPTH )
372  buildNPTHlist = true;
373 
374  buildHolesList( DRILL_LAYER_PAIR( F_Cu, B_Cu ), buildNPTHlist );
375 
376  // nothing wrong with an empty NPTH file in report.
377  if( m_merge_PTH_NPTH )
378  out.Print( 0, "Not plated through holes are merged with plated holes\n" );
379  else
380  out.Print( 0, "Drill file '%s' contains\n",
382  true, m_merge_PTH_NPTH ) ) );
383 
384  out.Print( 0, " unplated through holes:\n" );
385  out.Print( 0, separator );
386  totalHoleCount = printToolSummary( out, true );
387  out.Print( 0, " Total unplated holes count %u\n", totalHoleCount );
388 
389  return true;
390 }
391 
392 
394 {
395  // Plot the drill map:
396  wxPoint pos;
397 
398  for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ )
399  {
400  const HOLE_INFO& hole = m_holeListBuffer[ii];
401  pos = hole.m_Hole_Pos;
402 
403  // Always plot the drill symbol (for slots identifies the needed cutter!
404  aPlotter->Marker( pos, hole.m_Hole_Diameter, hole.m_Tool_Reference - 1 );
405 
406  if( hole.m_Hole_Shape != 0 )
407  {
408  wxSize oblong_size = hole.m_Hole_Size;
409  aPlotter->FlashPadOval( pos, oblong_size, hole.m_Hole_Orient, SKETCH, NULL );
410  }
411  }
412 
413  return true;
414 }
415 
416 
417 unsigned GENDRILL_WRITER_BASE::printToolSummary( OUTPUTFORMATTER& out, bool aSummaryNPTH ) const
418 {
419  unsigned totalHoleCount = 0;
420 
421  for( unsigned ii = 0; ii < m_toolListBuffer.size(); ii++ )
422  {
423  const DRILL_TOOL& tool = m_toolListBuffer[ii];
424 
425  if( aSummaryNPTH && !tool.m_Hole_NotPlated )
426  continue;
427 
428  if( !aSummaryNPTH && tool.m_Hole_NotPlated )
429  continue;
430 
431  // List the tool number assigned to each drill,
432  // in mm then in inches.
433  int tool_number = ii+1;
434  out.Print( 0, " T%d %2.2fmm %2.3f\" ", tool_number,
435  diameter_in_mm( tool.m_Diameter ),
436  diameter_in_inches( tool.m_Diameter ) );
437 
438  // Now list how many holes and ovals are associated with each drill.
439  if( ( tool.m_TotalCount == 1 ) && ( tool.m_OvalCount == 0 ) )
440  out.Print( 0, "(1 hole)\n" );
441  else if( tool.m_TotalCount == 1 )
442  out.Print( 0, "(1 hole) (with 1 slot)\n" );
443  else if( tool.m_OvalCount == 0 )
444  out.Print( 0, "(%d holes)\n", tool.m_TotalCount );
445  else if( tool.m_OvalCount == 1 )
446  out.Print( 0, "(%d holes) (with 1 slot)\n", tool.m_TotalCount );
447  else // tool.m_OvalCount > 1
448  out.Print( 0, "(%d holes) (with %d slots)\n",
449  tool.m_TotalCount, tool.m_OvalCount );
450 
451  totalHoleCount += tool.m_TotalCount;
452  }
453 
454  out.Print( 0, "\n" );
455 
456  return totalHoleCount;
457 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:686
double diameter_in_inches(double ius)
unsigned printToolSummary(OUTPUTFORMATTER &aOut, bool aSummaryNPTH) const
Function printToolSummary prints m_toolListBuffer[] tools to aOut and returns total hole count.
virtual const wxString getDrillFileName(DRILL_LAYER_PAIR aPair, bool aNPTH, bool aMerge_PTH_NPTH) const
double diameter_in_mm(double ius)
virtual void SetCreator(const wxString &aCreator)
Definition: plotter.h:180
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:62
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
virtual bool StartPlot()=0
This file is part of the common library.
int GetX() const
Definition: eda_rect.h:111
const EDA_RECT GetBoardEdgesBoundingBox() const
Function GetBoardEdgesBoundingBox Returns the board bounding box calculated using exclusively the boa...
Definition: class_board.h:767
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
Definition: plotter.cpp:82
virtual void SetColorMode(bool aColorMode)
Plot in B/W or color.
Definition: plotter.h:133
int GetWidth() const
Definition: eda_rect.h:119
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
OUTPUTFORMATTER is an important interface (abstract class) used to output 8 bit text in a convenient ...
Definition: richio.h:327
int GetHPGLPenSpeed() const
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
void SetUnits(DXF_UNITS aUnit)
Set the units to use for plotting the DXF file.
std::vector< DRILL_LAYER_PAIR > getUniqueLayerPairs() const
Get unique layer pairs by examining the micro and blind_buried vias.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:377
const wxString & GetFileName() const
Definition: class_board.h:218
virtual void SetGerberCoordinatesFormat(int aResolution, bool aUseInches=false)
Definition: plotter.h:476
This file contains miscellaneous commonly used macros and functions.
int GetBottom() const
Definition: eda_rect.h:124
virtual void Text(const wxPoint &aPos, const COLOR4D aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed=false, void *aData=NULL)
Draws text with the plotter.
Definition: gr_text.cpp:232
Board plot function definition file.
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
std::vector< DRILL_TOOL > m_toolListBuffer
virtual bool EndPlot()=0
LSET is a set of PCB_LAYER_IDs.
bool GenDrillReportFile(const wxString &aFullFileName)
Function GenDrillReportFile Create a plain text report file giving a list of drill values and drill c...
void SetLayerSet(LSET aLayerMask)
Definition: pcbplot.h:98
#define NULL
PLOT_FORMAT
Enum PlotFormat is the set of supported output plot formats.
Definition: plotter.h:51
PAGE_INFO describes the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:54
virtual void SetPenSpeed(int speed)
Definition: plotter.h:652
helper classes to handle hole info for drill files generators.
static const wxChar A4[]
Definition: page_info.h:64
std::pair< PCB_LAYER_ID, PCB_LAYER_ID > DRILL_LAYER_PAIR
PCB_PLOT_PARAMS handles plot parameters and options when plotting/printing a board.
class DIMENSION, a dimension (graphic item)
Definition: typeinfo.h:100
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
int GetHeight() const
Definition: eda_rect.h:120
virtual void SetViewport(const wxPoint &aOffset, double aIusPerDecimil, double aScale, bool aMirror)=0
Set the plot offset and scaling for the current plot.
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:101
void buildHolesList(DRILL_LAYER_PAIR aLayerPair, bool aGenerateNPTH_list)
Function BuildHolesList Create the list of holes and tools for a given board The list is sorted by in...
void Marker(const wxPoint &position, int diametre, unsigned aShapeId)
Draw a pattern shape number aShapeId, to coord position.
Definition: plotter.cpp:331
virtual void SetDefaultLineWidth(int width)=0
Set the default line width.
int GetHPGLPenNum() const
Base plotter engine class.
Definition: plotter.h:104
const wxPoint GetOffset()
Return the plot offset (usually the position of the auxiliary axis.
class MARKER_PCB, a marker used to show something
Definition: typeinfo.h:99
const int scale
const std::string layerName(PCB_LAYER_ID aLayer) const
minor helper function.
static LIB_PART * dummy()
Used to draw a dummy shape when a LIB_PART is not found in library.
virtual void FlashPadOval(const wxPoint &aPadPos, const wxSize &aSize, double aPadOrient, EDA_DRAW_MODE_T aTraceMode, void *aData)=0
virtual function FlashPadOval
virtual void SetPenNumber(int number)
Definition: plotter.h:657
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
bool genDrillMapFile(const wxString &aFullFileName, PLOT_FORMAT aFormat)
Function GenDrillMapFile Plot a map of drill marks for holes.
#define IU_PER_MILS
Definition: plotter.cpp:137
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:61
The common library.
wxPoint Centre() const
Definition: eda_rect.h:62
void PlotTextePcb(TEXTE_PCB *pt_texte)
FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
bool plotDrillMarks(PLOTTER *aPlotter)
Helper function.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
std::vector< HOLE_INFO > m_holeListBuffer
DRAWINGS & Drawings()
Definition: class_board.h:238
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:823
wxString DateAndTime()
Definition: string.cpp:345
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: plotter.h:147
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.
void PlotDrawSegment(DRAWSEGMENT *PtSegm)