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