KiCad PCB EDA Suite
PCB_PLOT_PARAMS_PARSER Class Reference

Class PCB_PLOT_PARAMS_PARSER is the parser class for PCB_PLOT_PARAMS. More...

#include <pcb_plot_params_parser.h>

Inheritance diagram for PCB_PLOT_PARAMS_PARSER:

Public Member Functions

 PCB_PLOT_PARAMS_PARSER (LINE_READER *aReader)
 
 PCB_PLOT_PARAMS_PARSER (char *aLine, const wxString &aSource)
 
LINE_READERGetReader ()
 
void Parse (PCB_PLOT_PARAMS *aPcbPlotParams)
 

Private Member Functions

bool parseBool ()
 
int parseInt (int aMin, int aMax)
 Function parseInt parses an integer and constrains it between two values. More...
 
double parseDouble ()
 Function parseDouble parses a double. More...
 
void skipCurrent ()
 Function skipCurrent Skip the current token level, i.e search for the RIGHT parenthesis which closes the current description. More...
 

Detailed Description

Class PCB_PLOT_PARAMS_PARSER is the parser class for PCB_PLOT_PARAMS.

Definition at line 36 of file pcb_plot_params_parser.h.

Constructor & Destructor Documentation

◆ PCB_PLOT_PARAMS_PARSER() [1/2]

PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER ( LINE_READER aReader)

Definition at line 341 of file pcb_plot_params.cpp.

341  :
342  PCB_PLOT_PARAMS_LEXER( aReader )
343 {
344 }

◆ PCB_PLOT_PARAMS_PARSER() [2/2]

PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER ( char *  aLine,
const wxString &  aSource 
)

Definition at line 347 of file pcb_plot_params.cpp.

347  :
348  PCB_PLOT_PARAMS_LEXER( aLine, aSource )
349 {
350 }

Member Function Documentation

◆ GetReader()

LINE_READER* PCB_PLOT_PARAMS_PARSER::GetReader ( )
inline

Definition at line 42 of file pcb_plot_params_parser.h.

42 { return reader; };

◆ Parse()

void PCB_PLOT_PARAMS_PARSER::Parse ( PCB_PLOT_PARAMS aPcbPlotParams)

Definition at line 353 of file pcb_plot_params.cpp.

354 {
355  T token;
356 
357  while( ( token = NextTok() ) != T_RIGHT )
358  {
359  if( token == T_EOF)
360  Unexpected( T_EOF );
361 
362  if( token == T_LEFT )
363  token = NextTok();
364 
365  if( token == T_pcbplotparams )
366  continue;
367 
368  bool skip_right = false;
369 
370  switch( token )
371  {
372  case T_layerselection:
373  {
374  token = NeedSYMBOLorNUMBER();
375 
376  const std::string& cur = CurStr();
377 
378  if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
379  {
380  // unsigned legacy_mask = atol( cur.c_str() );
381 
382  /* It's not possible to convert a legacy Cu layer number to a new
383  Cu layer number without knowing the number or total Cu layers
384  in the legacy board. We do not have that information here.
385  So simply set all layers ON. User can turn them off in the UI.
386  This is one of the superiorities of the new Cu sequence.
387  aPcbPlotParams->m_layerSelection = LEGACY_PLUGIN::leg_mask2new( cu_count, legacy_mask );
388  */
389 
390  // sorry, use the UI once to fix:
391  aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS) | LSET::AllCuMask();
392  }
393  else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
394  {
395  // skip the leading 2 0x bytes.
396  aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str()+2, cur.size()-2 );
397  }
398  else
399  Expecting( "integer or hex layerSelection" );
400  }
401  break;
402 
403  case T_usegerberextensions:
404  aPcbPlotParams->m_useGerberProtelExtensions = parseBool();
405  break;
406 
407  case T_usegerberattributes:
408  aPcbPlotParams->m_useGerberX2format = parseBool();
409  break;
410 
411  case T_usegerberadvancedattributes:
412  aPcbPlotParams->m_includeGerberNetlistInfo = parseBool();
413  break;
414 
415  case T_creategerberjobfile:
416  aPcbPlotParams->m_createGerberJobFile = parseBool();
417  break;
418 
419  case T_gerberprecision:
420  aPcbPlotParams->m_gerberPrecision =
422  break;
423 
424  case T_psa4output:
425  aPcbPlotParams->m_A4Output = parseBool();
426  break;
427 
428  case T_excludeedgelayer:
429  aPcbPlotParams->m_excludeEdgeLayer = parseBool();
430  break;
431 
432  case T_linewidth:
433  {
434  // Due to a bug, this (minor) parameter was saved in biu
435  // and now is saved in mm
436  // If the read value is outside bounds, force a default value
437  double tmp = parseDouble();
438  if( !aPcbPlotParams->SetLineWidth( KiROUND( tmp * IU_PER_MM ) ) )
439  aPcbPlotParams->SetLineWidth( PLOT_LINEWIDTH_DEFAULT );
440  }
441  break;
442 
443  case T_plotframeref:
444  aPcbPlotParams->m_plotFrameRef = parseBool();
445  break;
446 
447  case T_viasonmask:
448  aPcbPlotParams->m_plotViaOnMaskLayer = parseBool();
449  break;
450 
451  case T_mode:
452  aPcbPlotParams->SetPlotMode( parseInt( 0, 2 ) > 1 ? SKETCH : FILLED );
453  break;
454 
455  case T_useauxorigin:
456  aPcbPlotParams->m_useAuxOrigin = parseBool();
457  break;
458 
459  case T_hpglpennumber:
460  aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN,
462  break;
463 
464  case T_hpglpenspeed:
465  aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN,
467  break;
468 
469  case T_hpglpendiameter:
470  aPcbPlotParams->m_HPGLPenDiam = parseDouble();
471  break;
472 
473  case T_hpglpenoverlay:
474  // No more used. juste here for compatibility with old versions
476  break;
477 
478  case T_pscolor:
479  NeedSYMBOL(); // This actually was never used...
480  break;
481 
482  case T_psnegative:
483  aPcbPlotParams->m_negative = parseBool();
484  break;
485 
486  case T_plotreference:
487  aPcbPlotParams->m_plotReference = parseBool();
488  break;
489 
490  case T_plotvalue:
491  aPcbPlotParams->m_plotValue = parseBool();
492  break;
493 
494  case T_plotinvisibletext:
495  aPcbPlotParams->m_plotInvisibleText = parseBool();
496  break;
497 
498  case T_padsonsilk:
499  aPcbPlotParams->m_plotPadsOnSilkLayer= parseBool();
500  break;
501 
502  case T_subtractmaskfromsilk:
503  aPcbPlotParams->m_subtractMaskFromSilk = parseBool();
504  break;
505 
506  case T_outputformat:
507  aPcbPlotParams->m_format = static_cast<PlotFormat>(
509  break;
510 
511  case T_mirror:
512  aPcbPlotParams->m_mirror = parseBool();
513  break;
514 
515  case T_drillshape:
516  aPcbPlotParams->m_drillMarks = static_cast<PCB_PLOT_PARAMS::DrillMarksType>
517  ( parseInt( 0, 2 ) );
518  break;
519 
520  case T_scaleselection:
521  aPcbPlotParams->m_scaleSelection = parseInt( 0, 4 );
522  break;
523 
524  case T_outputdirectory:
525  NeedSYMBOLorNUMBER(); // a dir name can be like a number
526  aPcbPlotParams->m_outputDirectory = FROM_UTF8( CurText() );
527  break;
528 
529  default:
530  skipCurrent(); // skip unknown or outdated plot parameter
531  skip_right = true; // the closing right token is already read.
532  break;
533  }
534 
535  if( ! skip_right )
536  NeedRIGHT();
537  }
538 }
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:676
#define HPGL_PEN_NUMBER_MAX
bool m_plotValue
Enable plotting of part values.
#define HPGL_PEN_SPEED_MAX
double parseDouble()
Function parseDouble parses a double.
#define PLOT_LINEWIDTH_DEFAULT
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.
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:115
bool m_excludeEdgeLayer
If false always plot (merge) the pcb edge layer on other layers.
static const int gbrDefaultPrecision
bool m_plotPadsOnSilkLayer
Allows pads outlines on silkscreen layer (when pads are also on silk screen)
bool m_useGerberX2format
Include attributes from the Gerber X2 format (chapter 5 in revision J2)
bool m_plotReference
Enable plotting of part references.
bool m_useGerberProtelExtensions
When plotting gerber files, use a conventional set of Protel extensions instead of ....
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)
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_A4Output
Autoscale the plot to fit an A4 (landscape?) sheet.
Class LSET is a set of PCB_LAYER_IDs.
bool m_subtractMaskFromSilk
On gerbers 'scrape' away the solder mask from silkscreen (trim silks)
#define HPGL_PEN_DIAMETER_MAX
bool m_plotViaOnMaskLayer
True if vias are drawn on Mask layer (ie untented, exposed by mask)
bool m_useAuxOrigin
Plot gerbers using auxiliary (drill) origin instead of absolue coordinates.
bool m_createGerberJobFile
generate the auxiliary "job file" in gerber format
void SetPlotMode(EDA_DRAW_MODE_T aPlotMode)
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 ...
#define HPGL_PEN_NUMBER_MIN
#define HPGL_PEN_SPEED_MIN
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 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:315
PlotFormat m_format
Plot format type (chooses the driver to be used)
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,...

References LSET::AllCuMask(), B_SilkS, F_SilkS, FILLED, FROM_UTF8(), gbrDefaultPrecision, HPGL_PEN_DIAMETER_MAX, HPGL_PEN_NUMBER_MAX, HPGL_PEN_NUMBER_MIN, HPGL_PEN_SPEED_MAX, HPGL_PEN_SPEED_MIN, KiROUND(), PCB_PLOT_PARAMS::m_A4Output, PCB_PLOT_PARAMS::m_createGerberJobFile, PCB_PLOT_PARAMS::m_drillMarks, PCB_PLOT_PARAMS::m_excludeEdgeLayer, PCB_PLOT_PARAMS::m_format, PCB_PLOT_PARAMS::m_gerberPrecision, PCB_PLOT_PARAMS::m_HPGLPenDiam, PCB_PLOT_PARAMS::m_HPGLPenNum, PCB_PLOT_PARAMS::m_HPGLPenSpeed, PCB_PLOT_PARAMS::m_includeGerberNetlistInfo, PCB_PLOT_PARAMS::m_layerSelection, PCB_PLOT_PARAMS::m_mirror, PCB_PLOT_PARAMS::m_negative, PCB_PLOT_PARAMS::m_outputDirectory, PCB_PLOT_PARAMS::m_plotFrameRef, PCB_PLOT_PARAMS::m_plotInvisibleText, PCB_PLOT_PARAMS::m_plotPadsOnSilkLayer, PCB_PLOT_PARAMS::m_plotReference, PCB_PLOT_PARAMS::m_plotValue, PCB_PLOT_PARAMS::m_plotViaOnMaskLayer, PCB_PLOT_PARAMS::m_scaleSelection, PCB_PLOT_PARAMS::m_subtractMaskFromSilk, PCB_PLOT_PARAMS::m_useAuxOrigin, PCB_PLOT_PARAMS::m_useGerberProtelExtensions, PCB_PLOT_PARAMS::m_useGerberX2format, parseBool(), parseDouble(), LSET::ParseHex(), parseInt(), PLOT_FIRST_FORMAT, PLOT_LAST_FORMAT, PLOT_LINEWIDTH_DEFAULT, PCB_PLOT_PARAMS::SetLineWidth(), PCB_PLOT_PARAMS::SetPlotMode(), SKETCH, and skipCurrent().

Referenced by PCB_PLOT_PARAMS::Parse().

◆ parseBool()

bool PCB_PLOT_PARAMS_PARSER::parseBool ( )
private

Definition at line 541 of file pcb_plot_params.cpp.

542 {
543  T token = NeedSYMBOL();
544 
545  if( token != T_false && token != T_true )
546  Expecting( "true|false" );
547 
548  return token == T_true;
549 }

Referenced by Parse().

◆ parseDouble()

double PCB_PLOT_PARAMS_PARSER::parseDouble ( )
private

Function parseDouble parses a double.

Returns
double - the parsed double.

Definition at line 570 of file pcb_plot_params.cpp.

571 {
572  T token = NextTok();
573 
574  if( token != T_NUMBER )
575  Expecting( T_NUMBER );
576 
577  double val = strtod( CurText(), NULL );
578 
579  return val;
580 }

Referenced by Parse().

◆ parseInt()

int PCB_PLOT_PARAMS_PARSER::parseInt ( int  aMin,
int  aMax 
)
private

Function parseInt parses an integer and constrains it between two values.

Parameters
aMinis the smallest return value.
aMaxis the largest return value.
Returns
int - the parsed integer.

Definition at line 552 of file pcb_plot_params.cpp.

553 {
554  T token = NextTok();
555 
556  if( token != T_NUMBER )
557  Expecting( T_NUMBER );
558 
559  int val = atoi( CurText() );
560 
561  if( val < aMin )
562  val = aMin;
563  else if( val > aMax )
564  val = aMax;
565 
566  return val;
567 }

Referenced by Parse().

◆ skipCurrent()

void PCB_PLOT_PARAMS_PARSER::skipCurrent ( )
private

Function skipCurrent Skip the current token level, i.e search for the RIGHT parenthesis which closes the current description.

Definition at line 583 of file pcb_plot_params.cpp.

584 {
585  int curr_level = 0;
586  T token;
587 
588  while( ( token = NextTok() ) != T_EOF )
589  {
590  if( token == T_LEFT )
591  curr_level--;
592 
593  if( token == T_RIGHT )
594  {
595  curr_level++;
596 
597  if( curr_level > 0 )
598  return;
599  }
600  }
601 }

Referenced by Parse().


The documentation for this class was generated from the following files: