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 <board_design_settings.h>
25 #include <convert_to_biu.h>
27 #include <macros.h>
28 #include <math/util.h> // for KiROUND
29 #include <pcb_plot_params.h>
30 #include <pcb_plot_params_parser.h>
31 #include <plotter.h>
33 
34 
35 #define PLOT_LINEWIDTH_DEFAULT ( DEFAULT_TEXT_WIDTH * IU_PER_MM )
36 
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 #define SVG_PRECISION_MIN 3U
45 #define SVG_PRECISION_MAX 6U
46 #define SVG_PRECISION_DEFAULT 6
47 
48 
49 // default trailing digits in Gerber coordinates, when units are mm
50 // This is also the max usable precision (i.e. internal Pcbnew Units)
51 static const int gbrDefaultPrecision = 6;
52 
53 
54 using namespace PCBPLOTPARAMS_T;
55 
56 
57 static const char* getTokenName( T aTok )
58 {
59  return PCB_PLOT_PARAMS_LEXER::TokenName( aTok );
60 }
61 
62 
63 static bool setInt( int* aTarget, int aValue, int aMin, int aMax )
64 {
65  int temp = aValue;
66 
67  if( aValue < aMin )
68  temp = aMin;
69  else if( aValue > aMax )
70  temp = aMax;
71 
72  *aTarget = temp;
73  return (temp == aValue);
74 }
75 
76 
77 static bool setDouble( double* aTarget, double aValue, double aMin, double aMax )
78 {
79  double temp = aValue;
80 
81  if( aValue < aMin )
82  temp = aMin;
83  else if( aValue > aMax )
84  temp = aMax;
85 
86  *aTarget = temp;
87  return (temp == aValue);
88 }
89 
90 // PCB_PLOT_PARAMS
91 
93 {
94  m_useGerberProtelExtensions = false;
95  m_gerberDisableApertMacros = false;
96  m_useGerberX2format = true;
97  m_includeGerberNetlistInfo = true;
98  m_createGerberJobFile = true;
99  m_gerberPrecision = gbrDefaultPrecision;
100  // we used 0.1mils for SVG step before, but nm precision is more accurate, so we use nm
101  m_svgPrecision = SVG_PRECISION_DEFAULT;
102  m_svgUseInch = false;
103  m_excludeEdgeLayer = true;
104  m_plotFrameRef = false;
105  m_plotViaOnMaskLayer = false;
106  m_plotMode = FILLED;
107  m_DXFplotPolygonMode = true;
108  m_DXFplotUnits = DXF_UNITS::INCHES;
109  m_useAuxOrigin = false;
110  m_HPGLPenNum = 1;
111  m_HPGLPenSpeed = 20; // this param is always in cm/s
112  m_HPGLPenDiam = 15; // in mils
113  m_negative = false;
114  m_A4Output = false;
115  m_plotReference = true;
116  m_plotValue = true;
117  m_plotInvisibleText = false;
118  m_sketchPadsOnFabLayers = false;
119  m_subtractMaskFromSilk = false;
120  m_format = PLOT_FORMAT::GERBER;
121  m_mirror = false;
122  m_drillMarks = SMALL_DRILL_SHAPE;
123  m_autoScale = false;
124  m_scale = 1.0;
125  m_scaleSelection = 1;
126  m_fineScaleAdjustX = 1.0;
127  m_fineScaleAdjustY = 1.0;
128  m_widthAdjust = 0.;
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  m_sketchPadLineWidth = Millimeter2iu( 0.1 ); // line width to plot items in outline mode
139 
140  m_default_colors = std::make_shared<COLOR_SETTINGS>();
141  m_colors = m_default_colors.get();
142 }
143 
145 {
146  // Currently geber files use mm.
147  // accepted precision is only 6 (max value, this is the resolution of Pcbnew)
148  // or 5, min value for professional boards, when 6 creates problems
149  // to board makers.
150 
151  m_gerberPrecision = aPrecision == gbrDefaultPrecision-1 ? gbrDefaultPrecision-1 :
153 }
154 
155 void PCB_PLOT_PARAMS::SetSvgPrecision( unsigned aPrecision, bool aUseInch )
156 {
157  m_svgUseInch = aUseInch;
158  m_svgPrecision = Clamp( SVG_PRECISION_MIN, aPrecision, SVG_PRECISION_MAX );
159 }
160 
161 // PLEASE NOTE: only plot dialog options are processed
163  int aNestLevel, int aControl ) const
164 {
165  const char* falseStr = getTokenName( T_false );
166  const char* trueStr = getTokenName( T_true );
167 
168  aFormatter->Print( aNestLevel, "(%s\n", getTokenName( T_pcbplotparams ) );
169 
170  aFormatter->Print( aNestLevel+1, "(%s 0x%s)\n", getTokenName( T_layerselection ),
171  m_layerSelection.FmtHex().c_str() );
172 
173  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_disableapertmacros ),
174  m_gerberDisableApertMacros ? trueStr : falseStr );
175 
176  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberextensions ),
177  m_useGerberProtelExtensions ? trueStr : falseStr );
178 
179  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberattributes ),
180  GetUseGerberX2format() ? trueStr : falseStr );
181 
182  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberadvancedattributes ),
183  GetIncludeGerberNetlistInfo() ? trueStr : falseStr );
184 
185  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_creategerberjobfile ),
186  GetCreateGerberJobFile() ? trueStr : falseStr );
187 
188  if( m_gerberPrecision != gbrDefaultPrecision ) // save this option only if it is not the default value,
189  // to avoid incompatibility with older Pcbnew version
190  aFormatter->Print( aNestLevel+1, "(%s %d)\n",
191  getTokenName( T_gerberprecision ), m_gerberPrecision );
192 
193  // SVG options
194  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_svguseinch ),
195  m_svgUseInch ? trueStr : falseStr );
196  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_svgprecision ),
197  m_svgPrecision );
198 
199  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_excludeedgelayer ),
200  m_excludeEdgeLayer ? trueStr : falseStr );
201  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotframeref ),
202  m_plotFrameRef ? trueStr : falseStr );
203  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_viasonmask ),
204  m_plotViaOnMaskLayer ? trueStr : falseStr );
205  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_mode ),
206  GetPlotMode() == SKETCH ? 2 : 1 ); // Value 0 (LINE mode) no more used
207  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_useauxorigin ),
208  m_useAuxOrigin ? trueStr : falseStr );
209 
210  // HPGL options
211  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpennumber ),
212  m_HPGLPenNum );
213  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenspeed ),
214  m_HPGLPenSpeed );
215  aFormatter->Print( aNestLevel+1, "(%s %f)\n", getTokenName( T_hpglpendiameter ),
216  m_HPGLPenDiam );
217 
218  // DXF options
219  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_dxfpolygonmode ),
220  m_DXFplotPolygonMode ? trueStr : falseStr );
221  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_dxfimperialunits ),
222  m_DXFplotUnits == DXF_UNITS::INCHES ? trueStr : falseStr );
223  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_dxfusepcbnewfont ),
224  m_textMode == PLOT_TEXT_MODE::NATIVE ? falseStr : trueStr );
225 
226  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psnegative ),
227  m_negative ? trueStr : falseStr );
228  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psa4output ),
229  m_A4Output ? trueStr : falseStr );
230  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotreference ),
231  m_plotReference ? trueStr : falseStr );
232  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotvalue ),
233  m_plotValue ? trueStr : falseStr );
234  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotinvisibletext ),
235  m_plotInvisibleText ? trueStr : falseStr );
236  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_sketchpadsonfab ),
237  m_sketchPadsOnFabLayers ? trueStr : falseStr );
238  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_subtractmaskfromsilk ),
239  m_subtractMaskFromSilk ? trueStr : falseStr );
240  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_outputformat ),
241  static_cast<int>( m_format ) );
242  aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_mirror ),
243  m_mirror ? trueStr : falseStr );
244  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_drillshape ),
245  m_drillMarks );
246  aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_scaleselection ),
247  m_scaleSelection );
248  aFormatter->Print( aNestLevel+1, "(%s \"%s\")", getTokenName( T_outputdirectory ),
249  (const char*) m_outputDirectory.utf8_str() );
250  aFormatter->Print( 0, "\n" );
251  aFormatter->Print( aNestLevel, ")\n" );
252 }
253 
254 
256 {
257  aParser->Parse( this );
258 }
259 
260 
261 bool PCB_PLOT_PARAMS::IsSameAs( const PCB_PLOT_PARAMS &aPcbPlotParams ) const
262 {
263  if( m_layerSelection != aPcbPlotParams.m_layerSelection )
264  return false;
265  if( m_useGerberProtelExtensions != aPcbPlotParams.m_useGerberProtelExtensions )
266  return false;
267  if( m_gerberDisableApertMacros != aPcbPlotParams.m_gerberDisableApertMacros )
268  return false;
269  if( m_useGerberX2format != aPcbPlotParams.m_useGerberX2format )
270  return false;
271  if( m_includeGerberNetlistInfo != aPcbPlotParams.m_includeGerberNetlistInfo )
272  return false;
273  if( m_createGerberJobFile != aPcbPlotParams.m_createGerberJobFile )
274  return false;
275  if( m_gerberPrecision != aPcbPlotParams.m_gerberPrecision )
276  return false;
277  if( m_excludeEdgeLayer != aPcbPlotParams.m_excludeEdgeLayer )
278  return false;
279  if( m_plotFrameRef != aPcbPlotParams.m_plotFrameRef )
280  return false;
281  if( m_plotViaOnMaskLayer != aPcbPlotParams.m_plotViaOnMaskLayer )
282  return false;
283  if( m_plotMode != aPcbPlotParams.m_plotMode )
284  return false;
285  if( m_DXFplotPolygonMode != aPcbPlotParams.m_DXFplotPolygonMode )
286  return false;
287  if( m_DXFplotUnits != aPcbPlotParams.m_DXFplotUnits )
288  return false;
289  if( m_svgPrecision != aPcbPlotParams.m_svgPrecision )
290  return false;
291  if( m_svgUseInch != aPcbPlotParams.m_svgUseInch )
292  return false;
293  if( m_useAuxOrigin != aPcbPlotParams.m_useAuxOrigin )
294  return false;
295  if( m_HPGLPenNum != aPcbPlotParams.m_HPGLPenNum )
296  return false;
297  if( m_HPGLPenSpeed != aPcbPlotParams.m_HPGLPenSpeed )
298  return false;
299  if( m_HPGLPenDiam != aPcbPlotParams.m_HPGLPenDiam )
300  return false;
301  if( m_negative != aPcbPlotParams.m_negative )
302  return false;
303  if( m_A4Output != aPcbPlotParams.m_A4Output )
304  return false;
305  if( m_plotReference != aPcbPlotParams.m_plotReference )
306  return false;
307  if( m_plotValue != aPcbPlotParams.m_plotValue )
308  return false;
309  if( m_plotInvisibleText != aPcbPlotParams.m_plotInvisibleText )
310  return false;
311  if( m_sketchPadsOnFabLayers != aPcbPlotParams.m_sketchPadsOnFabLayers )
312  return false;
313  if( m_subtractMaskFromSilk != aPcbPlotParams.m_subtractMaskFromSilk )
314  return false;
315  if( m_format != aPcbPlotParams.m_format )
316  return false;
317  if( m_mirror != aPcbPlotParams.m_mirror )
318  return false;
319  if( m_drillMarks != aPcbPlotParams.m_drillMarks )
320  return false;
321  if( m_scaleSelection != aPcbPlotParams.m_scaleSelection )
322  return false;
323  if( m_autoScale != aPcbPlotParams.m_autoScale )
324  return false;
325  if( m_scale != aPcbPlotParams.m_scale )
326  return false;
327  if( m_fineScaleAdjustX != aPcbPlotParams.m_fineScaleAdjustX )
328  return false;
329  if( m_fineScaleAdjustY != aPcbPlotParams.m_fineScaleAdjustY )
330  return false;
331  if( m_widthAdjust != aPcbPlotParams.m_widthAdjust )
332  return false;
333  if( m_textMode != aPcbPlotParams.m_textMode )
334  return false;
335  if( !m_outputDirectory.IsSameAs( aPcbPlotParams.m_outputDirectory ) )
336  return false;
337 
338  return true;
339 }
340 
341 
343 {
344  return setDouble( &m_HPGLPenDiam, aValue, HPGL_PEN_DIAMETER_MIN, HPGL_PEN_DIAMETER_MAX );
345 }
346 
347 
349 {
350  return setInt( &m_HPGLPenSpeed, aValue, HPGL_PEN_SPEED_MIN, HPGL_PEN_SPEED_MAX );
351 }
352 
353 
354 // PCB_PLOT_PARAMS_PARSER
355 
357  PCB_PLOT_PARAMS_LEXER( aReader )
358 {
359 }
360 
361 
362 PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER( char* aLine, const wxString& aSource ) :
363  PCB_PLOT_PARAMS_LEXER( aLine, aSource )
364 {
365 }
366 
367 
369 {
370  T token;
371 
372  while( ( token = NextTok() ) != T_RIGHT )
373  {
374  if( token == T_EOF)
375  Unexpected( T_EOF );
376 
377  if( token == T_LEFT )
378  token = NextTok();
379 
380  if( token == T_pcbplotparams )
381  continue;
382 
383  bool skip_right = false;
384 
385  switch( token )
386  {
387  case T_layerselection:
388  {
389  token = NeedSYMBOLorNUMBER();
390 
391  const std::string& cur = CurStr();
392 
393  if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
394  {
395  // It's not possible to convert a legacy Cu layer number to a new Cu layer
396  // number without knowing the number or total Cu layers in the legacy board.
397  // We do not have that information here, so simply set all layers ON. User
398  // can turn them off in the UI.
399  aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS)
400  | LSET::AllCuMask();
401  }
402  else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
403  {
404  // skip the leading 2 0x bytes.
405  aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str()+2, cur.size()-2 );
406  }
407  else
408  Expecting( "integer or hex layerSelection" );
409  }
410  break;
411 
412  case T_disableapertmacros:
413  aPcbPlotParams->m_gerberDisableApertMacros = parseBool();
414  break;
415 
416  case T_usegerberextensions:
417  aPcbPlotParams->m_useGerberProtelExtensions = parseBool();
418  break;
419 
420  case T_usegerberattributes:
421  aPcbPlotParams->m_useGerberX2format = parseBool();
422  break;
423 
424  case T_usegerberadvancedattributes:
425  aPcbPlotParams->m_includeGerberNetlistInfo = parseBool();
426  break;
427 
428  case T_creategerberjobfile:
429  aPcbPlotParams->m_createGerberJobFile = parseBool();
430  break;
431 
432  case T_gerberprecision:
433  aPcbPlotParams->m_gerberPrecision = parseInt( gbrDefaultPrecision-1,
435  break;
436 
437  case T_svgprecision:
439  break;
440 
441  case T_svguseinch:
442  aPcbPlotParams->m_svgUseInch = parseBool();
443  break;
444 
445  case T_psa4output:
446  aPcbPlotParams->m_A4Output = parseBool();
447  break;
448 
449  case T_excludeedgelayer:
450  aPcbPlotParams->m_excludeEdgeLayer = parseBool();
451  break;
452 
453  case T_plotframeref:
454  aPcbPlotParams->m_plotFrameRef = parseBool();
455  break;
456 
457  case T_viasonmask:
458  aPcbPlotParams->m_plotViaOnMaskLayer = parseBool();
459  break;
460 
461  case T_mode:
462  aPcbPlotParams->SetPlotMode( parseInt( 0, 2 ) > 1 ? SKETCH : FILLED );
463  break;
464 
465  case T_useauxorigin:
466  aPcbPlotParams->m_useAuxOrigin = parseBool();
467  break;
468 
469  case T_hpglpennumber:
470  aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN,
472  break;
473 
474  case T_hpglpenspeed:
475  aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN,
477  break;
478 
479  case T_hpglpendiameter:
480  aPcbPlotParams->m_HPGLPenDiam = parseDouble();
481  break;
482 
483  case T_hpglpenoverlay:
484  // No more used. juste here for compatibility with old versions
486  break;
487 
488  case T_dxfpolygonmode:
489  aPcbPlotParams->m_DXFplotPolygonMode = parseBool();
490  break;
491 
492  case T_dxfimperialunits:
493  aPcbPlotParams->m_DXFplotUnits = parseBool() ? DXF_UNITS::INCHES
495  break;
496 
497  case T_dxfusepcbnewfont:
498  aPcbPlotParams->m_textMode = parseBool() ? PLOT_TEXT_MODE::DEFAULT
500  break;
501 
502  case T_pscolor:
503  NeedSYMBOL(); // This actually was never used...
504  break;
505 
506  case T_psnegative:
507  aPcbPlotParams->m_negative = parseBool();
508  break;
509 
510  case T_plotreference:
511  aPcbPlotParams->m_plotReference = parseBool();
512  break;
513 
514  case T_plotvalue:
515  aPcbPlotParams->m_plotValue = parseBool();
516  break;
517 
518  case T_plotinvisibletext:
519  aPcbPlotParams->m_plotInvisibleText = parseBool();
520  break;
521 
522  case T_sketchpadsonfab:
523  aPcbPlotParams->m_sketchPadsOnFabLayers= parseBool();
524  break;
525 
526  case T_subtractmaskfromsilk:
527  aPcbPlotParams->m_subtractMaskFromSilk = parseBool();
528  break;
529 
530  case T_outputformat:
531  aPcbPlotParams->m_format = static_cast<PLOT_FORMAT>(
532  parseInt( static_cast<int>( PLOT_FORMAT::FIRST_FORMAT ),
533  static_cast<int>( PLOT_FORMAT::LAST_FORMAT ) ) );
534  break;
535 
536  case T_mirror:
537  aPcbPlotParams->m_mirror = parseBool();
538  break;
539 
540  case T_drillshape:
541  aPcbPlotParams->m_drillMarks = static_cast<PCB_PLOT_PARAMS::DrillMarksType>
542  ( parseInt( 0, 2 ) );
543  break;
544 
545  case T_scaleselection:
546  aPcbPlotParams->m_scaleSelection = parseInt( 0, 4 );
547  break;
548 
549  case T_outputdirectory:
550  NeedSYMBOLorNUMBER(); // a dir name can be like a number
551  aPcbPlotParams->m_outputDirectory = FROM_UTF8( CurText() );
552  break;
553 
554  default:
555  skipCurrent(); // skip unknown or outdated plot parameter
556  skip_right = true; // the closing right token is already read.
557  break;
558  }
559 
560  if( ! skip_right )
561  NeedRIGHT();
562  }
563 }
564 
565 
567 {
568  T token = NeedSYMBOL();
569 
570  if( token != T_false && token != T_true )
571  Expecting( "true|false" );
572 
573  return token == T_true;
574 }
575 
576 
577 int PCB_PLOT_PARAMS_PARSER::parseInt( int aMin, int aMax )
578 {
579  T token = NextTok();
580 
581  if( token != T_NUMBER )
582  Expecting( T_NUMBER );
583 
584  int val = atoi( CurText() );
585 
586  if( val < aMin )
587  val = aMin;
588  else if( val > aMax )
589  val = aMax;
590 
591  return val;
592 }
593 
594 
596 {
597  T token = NextTok();
598 
599  if( token != T_NUMBER )
600  Expecting( T_NUMBER );
601 
602  double val = strtod( CurText(), NULL );
603 
604  return val;
605 }
606 
607 
609 {
610  int curr_level = 0;
611  T token;
612 
613  while( ( token = NextTok() ) != T_EOF )
614  {
615  if( token == T_LEFT )
616  curr_level--;
617 
618  if( token == T_RIGHT )
619  {
620  curr_level++;
621 
622  if( curr_level > 0 )
623  return;
624  }
625  }
626 }
double m_fineScaleAdjustX
fine scale adjust X axis
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:750
#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)
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:80
double parseDouble()
Function parseDouble parses a double.
Plot settings, and plotting engines (PostScript, Gerber, HPGL and DXF)
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)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
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
DXF_UNITS m_DXFplotUnits
DXF format: Units to use when plotting the DXF.
static const int gbrDefaultPrecision
bool m_svgUseInch
units for SVG plot false for metric, true for inch/mils
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.
An interface used to output 8 bit text in a convenient way.
Definition: richio.h:306
bool m_useGerberProtelExtensions
When plotting gerber files, use a conventional set of Protel extensions instead of ....
bool SetHPGLPenSpeed(int aValue)
OUTLINE_MODE m_plotMode
FILLED or SKETCH selects how to plot filled objects.
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.
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.
unsigned m_svgPrecision
precision of coordinates in SVG files: accepted 3 - 6 6 is the internal resolution of Pcbnew
LSET is a set of PCB_LAYER_IDs.
#define NULL
PCB_PLOT_PARAMS_PARSER(LINE_READER *aReader)
bool m_sketchPadsOnFabLayers
Plots pads outlines on fab layers.
bool IsSameAs(const PCB_PLOT_PARAMS &aPcbPlotParams) const
Compare current settings to aPcbPlotParams, including not saved parameters in brd file.
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
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.
void SetPlotMode(OUTLINE_MODE aPlotMode)
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)
void SetSvgPrecision(unsigned aPrecision, bool aUseInch)
#define SVG_PRECISION_MAX
bool m_createGerberJobFile
generate the auxiliary "job file" in gerber format
bool SetHPGLPenDiameter(double aValue)
bool m_gerberDisableApertMacros
Disable aperure macros in Gerber format (only for broken Gerber readers) Ideally, should be never sel...
int m_HPGLPenNum
HPGL only: pen number selection(1 to 9)
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.
#define HPGL_PEN_NUMBER_MIN
#define HPGL_PEN_SPEED_MIN
const T & Clamp(const T &lower, const T &value, const T &upper)
Function Clamp limits value within the range lower <= value <= upper.
Definition: util.h:46
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)
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,...)
Format and write text to the output stream.
Definition: richio.cpp:408
#define SVG_PRECISION_DEFAULT
void Parse(PCB_PLOT_PARAMS *aPcbPlotParams)
void Parse(PCB_PLOT_PARAMS_PARSER *aParser)
#define SVG_PRECISION_MIN
int ParseHex(const char *aStart, int aCount)
Convert the output of FmtHex() and replaces this set's values with those given in the input string.
Definition: lset.cpp:359
static constexpr int Millimeter2iu(double mm)
DrillMarksType m_drillMarks
Holes can be not plotted, have a small mark or plotted in actual size.
int m_gerberPrecision
precision of coordinates in Gerber files: accepted 5 or 6 when units are in mm (6 or 7 in inches,...