KiCad PCB EDA Suite
pcb_plot_params.cpp
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-2018 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <pcb_plot_params_parser.h>
25 #include <pcb_plot_params.h>
27 #include <plotter.h>
28 #include <macros.h>
29 #include <convert_to_biu.h>
30 #include <board_design_settings.h>
31 #include <math/util.h> // for KiROUND
32 
33 
34 #define PLOT_LINEWIDTH_MIN ( 0.02 * IU_PER_MM ) // min value for default line thickness
35 #define PLOT_LINEWIDTH_MAX ( 2 * IU_PER_MM ) // max value for default line thickness
36 #define PLOT_LINEWIDTH_DEFAULT ( DEFAULT_TEXT_WIDTH * IU_PER_MM )
37 #define HPGL_PEN_DIAMETER_MIN 0
38 #define HPGL_PEN_DIAMETER_MAX 100.0 // Unit = mil
39 #define HPGL_PEN_SPEED_MIN 1 // this param is always in cm/s
40 #define HPGL_PEN_SPEED_MAX 99 // this param is always in cm/s
41 #define HPGL_PEN_NUMBER_MIN 1
42 #define HPGL_PEN_NUMBER_MAX 16
43 
44 
50 
51 // default trailing digits in Gerber coordinates, when units are mm
52 // This is also the max usable precision (i.e. internal Pcbnew Units)
53 static const int gbrDefaultPrecision = 6;
54 
55 
56 using namespace PCBPLOTPARAMS_T;
57 
58 
59 static const char* getTokenName( T aTok )
60 {
61  return PCB_PLOT_PARAMS_LEXER::TokenName( aTok );
62 }
63 
64 
65 static bool setInt( int* aTarget, int aValue, int aMin, int aMax )
66 {
67  int temp = aValue;
68 
69  if( aValue < aMin )
70  temp = aMin;
71  else if( aValue > aMax )
72  temp = aMax;
73 
74  *aTarget = temp;
75  return (temp == aValue);
76 }
77 
78 
79 static bool setDouble( double* aTarget, double aValue, double aMin, double aMax )
80 {
81  double temp = aValue;
82 
83  if( aValue < aMin )
84  temp = aMin;
85  else if( aValue > aMax )
86  temp = aMax;
87 
88  *aTarget = temp;
89  return (temp == aValue);
90 }
91 
92 // PCB_PLOT_PARAMS
93 
95 {
96  m_useGerberProtelExtensions = false;
97  m_useGerberX2format = false;
98  m_includeGerberNetlistInfo = false;
99  m_createGerberJobFile = false;
100  m_gerberPrecision = gbrDefaultPrecision;
101  m_excludeEdgeLayer = true;
102  m_lineWidth = g_DrawDefaultLineThickness;
103  m_plotFrameRef = false;
104  m_plotViaOnMaskLayer = false;
105  m_plotMode = FILLED;
106  m_DXFplotPolygonMode = true;
107  m_DXFplotUnits = DXF_PLOTTER::DXF_UNITS::INCHES;
108  m_useAuxOrigin = false;
109  m_HPGLPenNum = 1;
110  m_HPGLPenSpeed = 20; // this param is always in cm/s
111  m_HPGLPenDiam = 15; // in mils
112  m_negative = false;
113  m_A4Output = false;
114  m_plotReference = true;
115  m_plotValue = true;
116  m_plotInvisibleText = false;
117  m_plotPadsOnSilkLayer = false;
118  m_subtractMaskFromSilk = false;
119  m_format = PLOT_FORMAT::GERBER;
120  m_mirror = false;
121  m_drillMarks = SMALL_DRILL_SHAPE;
122  m_autoScale = false;
123  m_scale = 1.0;
124  m_scaleSelection = 1;
125  m_fineScaleAdjustX = 1.0;
126  m_fineScaleAdjustY = 1.0;
127  m_widthAdjust = 0.;
128  m_color = BLACK;
129  m_textMode = PLOT_TEXT_MODE::DEFAULT;
130  m_outputDirectory.clear();
131  m_layerSelection = LSET( 7, F_SilkS, B_SilkS, F_Mask, B_Mask,
133  | LSET::AllCuMask();
134  // This parameter controls if the NPTH pads will be plotted or not
135  // it is a "local" parameter
136  m_skipNPTH_Pads = false;
137 }
138 
140 {
141  // Currently geber files use mm.
142  // accepted precision is only 6 (max value, this is the resolution of Pcbnew)
143  // or 5, min value for professional boards, when 6 creates problems
144  // to board makers.
145 
146  m_gerberPrecision = aPrecision == gbrDefaultPrecision-1 ? gbrDefaultPrecision-1 :
148 }
149 
150 
151 // PLEASE NOTE: only plot dialog options are processed
153  int aNestLevel, int aControl ) const
154 {
155  const char* falseStr = getTokenName( T_false );
156  const char* trueStr = getTokenName( T_true );
157 
158  aFormatter->Print( aNestLevel, "(%s\n", getTokenName( T_pcbplotparams ) );
159 
160  aFormatter->Print( aNestLevel+1, "(%s 0x%s)\n", getTokenName( T_layerselection ),
161  m_layerSelection.FmtHex().c_str() );
162 
163  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberextensions ),
164  m_useGerberProtelExtensions ? trueStr : falseStr );
165 
166  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberattributes ),
167  GetUseGerberX2format() ? trueStr : falseStr );
168 
169  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberadvancedattributes ),
170  GetIncludeGerberNetlistInfo() ? trueStr : falseStr );
171 
172  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_creategerberjobfile ),
173  GetCreateGerberJobFile() ? trueStr : falseStr );
174 
175  if( m_gerberPrecision != gbrDefaultPrecision ) // save this option only if it is not the default value,
176  // to avoid incompatibility with older Pcbnew version
177  aFormatter->Print( aNestLevel+1, "(%s %d)\n",
178  getTokenName( T_gerberprecision ), m_gerberPrecision );
179 
180  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_excludeedgelayer ),
181  m_excludeEdgeLayer ? trueStr : falseStr );
182  aFormatter->Print( aNestLevel+1, "(%s %f)\n", getTokenName( T_linewidth ),
183  m_lineWidth / IU_PER_MM );
184  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotframeref ),
185  m_plotFrameRef ? trueStr : falseStr );
186  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_viasonmask ),
187  m_plotViaOnMaskLayer ? trueStr : falseStr );
188  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_mode ),
189  GetPlotMode() == SKETCH ? 2 : 1 ); // Value 0 (LINE mode) no more used
190  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_useauxorigin ),
191  m_useAuxOrigin ? trueStr : falseStr );
192  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpennumber ),
193  m_HPGLPenNum );
194 
195  // Obsolete parameter, pen speed is no more managed, because hpgl format
196  // is now an export format, and for this, pen speed has no meaning
197  // aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenspeed ),
198  // m_HPGLPenSpeed );
199 
200  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenspeed ),
201  m_HPGLPenSpeed );
202  aFormatter->Print( aNestLevel+1, "(%s %f)\n", getTokenName( T_hpglpendiameter ),
203  m_HPGLPenDiam );
204  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psnegative ),
205  m_negative ? trueStr : falseStr );
206  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psa4output ),
207  m_A4Output ? trueStr : falseStr );
208  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotreference ),
209  m_plotReference ? trueStr : falseStr );
210  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotvalue ),
211  m_plotValue ? trueStr : falseStr );
212  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotinvisibletext ),
213  m_plotInvisibleText ? trueStr : falseStr );
214  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_padsonsilk ),
215  m_plotPadsOnSilkLayer ? trueStr : falseStr );
216  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_subtractmaskfromsilk ),
217  m_subtractMaskFromSilk ? trueStr : falseStr );
218  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_outputformat ),
219  static_cast<int>( m_format ) );
220  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_mirror ),
221  m_mirror ? trueStr : falseStr );
222  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_drillshape ),
223  m_drillMarks );
224  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_scaleselection ),
225  m_scaleSelection );
226  aFormatter->Print( aNestLevel+1, "(%s \"%s\")", getTokenName( T_outputdirectory ),
227  (const char*) m_outputDirectory.utf8_str() );
228  aFormatter->Print( 0, "\n" );
229  aFormatter->Print( aNestLevel, ")\n" );
230 }
231 
232 
234 {
235  aParser->Parse( this );
236 }
237 
238 
239 bool PCB_PLOT_PARAMS::IsSameAs( const PCB_PLOT_PARAMS &aPcbPlotParams, bool aCompareOnlySavedPrms ) const
240 {
241  if( m_layerSelection != aPcbPlotParams.m_layerSelection )
242  return false;
243  if( m_useGerberProtelExtensions != aPcbPlotParams.m_useGerberProtelExtensions )
244  return false;
245  if( m_useGerberX2format != aPcbPlotParams.m_useGerberX2format )
246  return false;
247  if( m_includeGerberNetlistInfo != aPcbPlotParams.m_includeGerberNetlistInfo )
248  return false;
249  if( m_createGerberJobFile != aPcbPlotParams.m_createGerberJobFile )
250  return false;
251  if( m_gerberPrecision != aPcbPlotParams.m_gerberPrecision )
252  return false;
253  if( m_excludeEdgeLayer != aPcbPlotParams.m_excludeEdgeLayer )
254  return false;
255  if( m_lineWidth != aPcbPlotParams.m_lineWidth )
256  return false;
257  if( m_plotFrameRef != aPcbPlotParams.m_plotFrameRef )
258  return false;
259  if( m_plotViaOnMaskLayer != aPcbPlotParams.m_plotViaOnMaskLayer )
260  return false;
261  if( m_plotMode != aPcbPlotParams.m_plotMode )
262  return false;
263  if( !aCompareOnlySavedPrms )
264  {
265  if( m_DXFplotPolygonMode != aPcbPlotParams.m_DXFplotPolygonMode )
266  return false;
267  if( m_DXFplotUnits != aPcbPlotParams.m_DXFplotUnits )
268  return false;
269  }
270  if( m_useAuxOrigin != aPcbPlotParams.m_useAuxOrigin )
271  return false;
272  if( m_HPGLPenNum != aPcbPlotParams.m_HPGLPenNum )
273  return false;
274  if( m_HPGLPenSpeed != aPcbPlotParams.m_HPGLPenSpeed )
275  return false;
276  if( m_HPGLPenDiam != aPcbPlotParams.m_HPGLPenDiam )
277  return false;
278  if( m_negative != aPcbPlotParams.m_negative )
279  return false;
280  if( m_A4Output != aPcbPlotParams.m_A4Output )
281  return false;
282  if( m_plotReference != aPcbPlotParams.m_plotReference )
283  return false;
284  if( m_plotValue != aPcbPlotParams.m_plotValue )
285  return false;
286  if( m_plotInvisibleText != aPcbPlotParams.m_plotInvisibleText )
287  return false;
288  if( m_plotPadsOnSilkLayer != aPcbPlotParams.m_plotPadsOnSilkLayer )
289  return false;
290  if( m_subtractMaskFromSilk != aPcbPlotParams.m_subtractMaskFromSilk )
291  return false;
292  if( m_format != aPcbPlotParams.m_format )
293  return false;
294  if( m_mirror != aPcbPlotParams.m_mirror )
295  return false;
296  if( m_drillMarks != aPcbPlotParams.m_drillMarks )
297  return false;
298  if( m_scaleSelection != aPcbPlotParams.m_scaleSelection )
299  return false;
300  if( m_autoScale != aPcbPlotParams.m_autoScale )
301  return false;
302  if( m_scale != aPcbPlotParams.m_scale )
303  return false;
304  if( m_fineScaleAdjustX != aPcbPlotParams.m_fineScaleAdjustX )
305  return false;
306  if( m_fineScaleAdjustY != aPcbPlotParams.m_fineScaleAdjustY )
307  return false;
308  if( m_widthAdjust != aPcbPlotParams.m_widthAdjust )
309  return false;
310  if( !aCompareOnlySavedPrms )
311  {
312  if( m_color != aPcbPlotParams.m_color )
313  return false;
314  }
315  if( m_textMode != aPcbPlotParams.m_textMode )
316  return false;
317  if( !m_outputDirectory.IsSameAs( aPcbPlotParams.m_outputDirectory ) )
318  return false;
319 
320  return true;
321 }
322 
323 
325 {
326  return setDouble( &m_HPGLPenDiam, aValue, HPGL_PEN_DIAMETER_MIN, HPGL_PEN_DIAMETER_MAX );
327 }
328 
329 
331 {
332  return setInt( &m_HPGLPenSpeed, aValue, HPGL_PEN_SPEED_MIN, HPGL_PEN_SPEED_MAX );
333 }
334 
335 
337 {
338  return setInt( &m_lineWidth, aValue, PLOT_LINEWIDTH_MIN, PLOT_LINEWIDTH_MAX );
339 }
340 
341 // PCB_PLOT_PARAMS_PARSER
342 
344  PCB_PLOT_PARAMS_LEXER( aReader )
345 {
346 }
347 
348 
349 PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER( char* aLine, const wxString& aSource ) :
350  PCB_PLOT_PARAMS_LEXER( aLine, aSource )
351 {
352 }
353 
354 
356 {
357  T token;
358 
359  while( ( token = NextTok() ) != T_RIGHT )
360  {
361  if( token == T_EOF)
362  Unexpected( T_EOF );
363 
364  if( token == T_LEFT )
365  token = NextTok();
366 
367  if( token == T_pcbplotparams )
368  continue;
369 
370  bool skip_right = false;
371 
372  switch( token )
373  {
374  case T_layerselection:
375  {
376  token = NeedSYMBOLorNUMBER();
377 
378  const std::string& cur = CurStr();
379 
380  if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
381  {
382  // unsigned legacy_mask = atol( cur.c_str() );
383 
384  /* It's not possible to convert a legacy Cu layer number to a new
385  Cu layer number without knowing the number or total Cu layers
386  in the legacy board. We do not have that information here.
387  So simply set all layers ON. User can turn them off in the UI.
388  This is one of the superiorities of the new Cu sequence.
389  aPcbPlotParams->m_layerSelection = LEGACY_PLUGIN::leg_mask2new( cu_count, legacy_mask );
390  */
391 
392  // sorry, use the UI once to fix:
393  aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS) | LSET::AllCuMask();
394  }
395  else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
396  {
397  // skip the leading 2 0x bytes.
398  aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str()+2, cur.size()-2 );
399  }
400  else
401  Expecting( "integer or hex layerSelection" );
402  }
403  break;
404 
405  case T_usegerberextensions:
406  aPcbPlotParams->m_useGerberProtelExtensions = parseBool();
407  break;
408 
409  case T_usegerberattributes:
410  aPcbPlotParams->m_useGerberX2format = parseBool();
411  break;
412 
413  case T_usegerberadvancedattributes:
414  aPcbPlotParams->m_includeGerberNetlistInfo = parseBool();
415  break;
416 
417  case T_creategerberjobfile:
418  aPcbPlotParams->m_createGerberJobFile = parseBool();
419  break;
420 
421  case T_gerberprecision:
422  aPcbPlotParams->m_gerberPrecision =
424  break;
425 
426  case T_psa4output:
427  aPcbPlotParams->m_A4Output = parseBool();
428  break;
429 
430  case T_excludeedgelayer:
431  aPcbPlotParams->m_excludeEdgeLayer = parseBool();
432  break;
433 
434  case T_linewidth:
435  {
436  // Due to a bug, this (minor) parameter was saved in biu
437  // and now is saved in mm
438  // If the read value is outside bounds, force a default value
439  double tmp = parseDouble();
440  if( !aPcbPlotParams->SetLineWidth( KiROUND( tmp * IU_PER_MM ) ) )
441  aPcbPlotParams->SetLineWidth( PLOT_LINEWIDTH_DEFAULT );
442  }
443  break;
444 
445  case T_plotframeref:
446  aPcbPlotParams->m_plotFrameRef = parseBool();
447  break;
448 
449  case T_viasonmask:
450  aPcbPlotParams->m_plotViaOnMaskLayer = parseBool();
451  break;
452 
453  case T_mode:
454  aPcbPlotParams->SetPlotMode( parseInt( 0, 2 ) > 1 ? SKETCH : FILLED );
455  break;
456 
457  case T_useauxorigin:
458  aPcbPlotParams->m_useAuxOrigin = parseBool();
459  break;
460 
461  case T_hpglpennumber:
462  aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN,
464  break;
465 
466  case T_hpglpenspeed:
467  aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN,
469  break;
470 
471  case T_hpglpendiameter:
472  aPcbPlotParams->m_HPGLPenDiam = parseDouble();
473  break;
474 
475  case T_hpglpenoverlay:
476  // No more used. juste here for compatibility with old versions
478  break;
479 
480  case T_pscolor:
481  NeedSYMBOL(); // This actually was never used...
482  break;
483 
484  case T_psnegative:
485  aPcbPlotParams->m_negative = parseBool();
486  break;
487 
488  case T_plotreference:
489  aPcbPlotParams->m_plotReference = parseBool();
490  break;
491 
492  case T_plotvalue:
493  aPcbPlotParams->m_plotValue = parseBool();
494  break;
495 
496  case T_plotinvisibletext:
497  aPcbPlotParams->m_plotInvisibleText = parseBool();
498  break;
499 
500  case T_padsonsilk:
501  aPcbPlotParams->m_plotPadsOnSilkLayer= parseBool();
502  break;
503 
504  case T_subtractmaskfromsilk:
505  aPcbPlotParams->m_subtractMaskFromSilk = parseBool();
506  break;
507 
508  case T_outputformat:
509  aPcbPlotParams->m_format = static_cast<PLOT_FORMAT>(
510  parseInt( static_cast<int>( PLOT_FORMAT::FIRST_FORMAT ),
511  static_cast<int>( PLOT_FORMAT::LAST_FORMAT ) ) );
512  break;
513 
514  case T_mirror:
515  aPcbPlotParams->m_mirror = parseBool();
516  break;
517 
518  case T_drillshape:
519  aPcbPlotParams->m_drillMarks = static_cast<PCB_PLOT_PARAMS::DrillMarksType>
520  ( parseInt( 0, 2 ) );
521  break;
522 
523  case T_scaleselection:
524  aPcbPlotParams->m_scaleSelection = parseInt( 0, 4 );
525  break;
526 
527  case T_outputdirectory:
528  NeedSYMBOLorNUMBER(); // a dir name can be like a number
529  aPcbPlotParams->m_outputDirectory = FROM_UTF8( CurText() );
530  break;
531 
532  default:
533  skipCurrent(); // skip unknown or outdated plot parameter
534  skip_right = true; // the closing right token is already read.
535  break;
536  }
537 
538  if( ! skip_right )
539  NeedRIGHT();
540  }
541 }
542 
543 
545 {
546  T token = NeedSYMBOL();
547 
548  if( token != T_false && token != T_true )
549  Expecting( "true|false" );
550 
551  return token == T_true;
552 }
553 
554 
555 int PCB_PLOT_PARAMS_PARSER::parseInt( int aMin, int aMax )
556 {
557  T token = NextTok();
558 
559  if( token != T_NUMBER )
560  Expecting( T_NUMBER );
561 
562  int val = atoi( CurText() );
563 
564  if( val < aMin )
565  val = aMin;
566  else if( val > aMax )
567  val = aMax;
568 
569  return val;
570 }
571 
572 
574 {
575  T token = NextTok();
576 
577  if( token != T_NUMBER )
578  Expecting( T_NUMBER );
579 
580  double val = strtod( CurText(), NULL );
581 
582  return val;
583 }
584 
585 
587 {
588  int curr_level = 0;
589  T token;
590 
591  while( ( token = NextTok() ) != T_EOF )
592  {
593  if( token == T_LEFT )
594  curr_level--;
595 
596  if( token == T_RIGHT )
597  {
598  curr_level++;
599 
600  if( curr_level > 0 )
601  return;
602  }
603  }
604 }
double m_fineScaleAdjustX
fine scale adjust X axis
DXF_PLOTTER::DXF_UNITS m_DXFplotUnits
DXF format: Units to use when plotting the DXF.
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
#define HPGL_PEN_NUMBER_MAX
bool m_plotValue
Enable plotting of part values.
#define HPGL_PEN_SPEED_MAX
static bool setDouble(double *aTarget, double aValue, double aMin, double aMax)
LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived to re...
Definition: richio.h:81
double parseDouble()
Function parseDouble parses a double.
#define PLOT_LINEWIDTH_DEFAULT
void SetGerberPrecision(int aPrecision)
wxString m_outputDirectory
Output directory for plot files (usually relative to the board file)
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
bool m_mirror
Mirror the plot around the X axis.
PCB_PLOT_PARAMS_PARSER is the parser class for PCB_PLOT_PARAMS.
bool m_excludeEdgeLayer
If false always plot (merge) the pcb edge layer on other layers.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
static const int gbrDefaultPrecision
bool m_plotPadsOnSilkLayer
Allows pads outlines on silkscreen layer (when pads are also on silk screen)
#define PLOT_LINEWIDTH_MAX
bool m_useGerberX2format
Include attributes from the Gerber X2 format (chapter 5 in revision J2)
double m_scale
Global scale factor, 1.0 plots a board with its actual size.
bool m_plotReference
Enable plotting of part references.
OUTPUTFORMATTER is an important interface (abstract class) used to output 8 bit text in a convenient ...
Definition: richio.h:327
bool m_useGerberProtelExtensions
When plotting gerber files, use a conventional set of Protel extensions instead of ....
bool SetHPGLPenSpeed(int aValue)
int m_scaleSelection
Scale ratio index (UI only)
bool m_negative
Plot in negative color (supported only by some drivers)
bool m_plotFrameRef
True to plot/print frame references.
double m_HPGLPenDiam
HPGL only: pen diameter in MILS, useful to fill areas However, it is in mm in hpgl files.
bool SetLineWidth(int aValue)
This file contains miscellaneous commonly used macros and functions.
bool m_includeGerberNetlistInfo
Include netlist info (only in Gerber X2 format) (chapter ? in revision ?)
bool m_plotInvisibleText
Force plotting of fields marked invisible.
bool m_DXFplotPolygonMode
DXF format: Plot items in outline (polygon) mode In polygon mode, each item to plot is converted to a...
bool m_autoScale
When true set the scale to fit the board in the page.
bool m_A4Output
Autoscale the plot to fit an A4 (landscape?) sheet.
LSET is a set of PCB_LAYER_IDs.
#define NULL
PCB_PLOT_PARAMS_PARSER(LINE_READER *aReader)
bool m_subtractMaskFromSilk
On gerbers 'scrape' away the solder mask from silkscreen (trim silks)
#define HPGL_PEN_DIAMETER_MAX
double m_fineScaleAdjustY
fine scale adjust Y axis
int g_DrawDefaultLineThickness
Default line thickness in internal units used to draw or plot items using a default thickness line va...
static bool setInt(int *aTarget, int aValue, int aMin, int aMax)
#define HPGL_PEN_DIAMETER_MIN
bool m_plotViaOnMaskLayer
True if vias are drawn on Mask layer (ie untented, exposed by mask)
static const char * getTokenName(T aTok)
PCB_PLOT_PARAMS handles plot parameters and options when plotting/printing a board.
int m_widthAdjust
This width factor is intended to compensate PS printers/ plotters that do not strictly obey line widt...
bool m_useAuxOrigin
Plot gerbers using auxiliary (drill) origin instead of absolue coordinates.
PLOT_FORMAT m_format
Plot format type (chooses the driver to be used)
bool m_createGerberJobFile
generate the auxiliary "job file" in gerber format
void SetPlotMode(EDA_DRAW_MODE_T aPlotMode)
bool SetHPGLPenDiameter(double aValue)
int m_HPGLPenNum
HPGL only: pen number selection(1 to 9)
COLOR4D m_color
Color for plotting the current layer. Provided, but not really used.
LSET m_layerSelection
Set of layers to plot.
void skipCurrent()
Function skipCurrent Skip the current token level, i.e search for the RIGHT parenthesis which closes ...
Board layer functions and definitions.
EDA_DRAW_MODE_T m_plotMode
FILLED or SKETCH selects how to plot filled objects.
#define HPGL_PEN_NUMBER_MIN
#define PLOT_LINEWIDTH_MIN
#define HPGL_PEN_SPEED_MIN
bool IsSameAs(const PCB_PLOT_PARAMS &aPcbPlotParams, bool aCompareOnlySavedPrms) const
Compare current settings to aPcbPlotParams, including not saved parameters in brd file.
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
PLOT_TEXT_MODE m_textMode
Choose how represent text with PS, PDF and DXF drivers.
int m_HPGLPenSpeed
HPGL only: pen speed, always in cm/s (1 to 99 cm/s)
Definition: colors.h:45
int parseInt(int aMin, int aMax)
Function parseInt parses an integer and constrains it between two values.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void Parse(PCB_PLOT_PARAMS *aPcbPlotParams)
void Parse(PCB_PLOT_PARAMS_PARSER *aParser)
int ParseHex(const char *aStart, int aCount)
Function ParseHex understands the output of FmtHex() and replaces this set's values with those given ...
Definition: lset.cpp:325
DrillMarksType m_drillMarks
Holes can be not plotted, have a small mark or plotted in actual size.
int m_lineWidth
The default line width (used to draw items having no defined width)
int m_gerberPrecision
precision of coordinates in Gerber files: accepted 5 or 6 when units are in mm (6 or 7 in inches,...