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 342 of file pcb_plot_params.cpp.

342  :
343  PCB_PLOT_PARAMS_LEXER( aReader )
344 {
345 }

◆ PCB_PLOT_PARAMS_PARSER() [2/2]

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

Definition at line 348 of file pcb_plot_params.cpp.

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

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 354 of file pcb_plot_params.cpp.

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

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 542 of file pcb_plot_params.cpp.

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

Referenced by Parse().

◆ parseDouble()

double PCB_PLOT_PARAMS_PARSER::parseDouble ( )
private

Function parseDouble parses a double.

Returns
double - the parsed double.

Definition at line 571 of file pcb_plot_params.cpp.

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

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 553 of file pcb_plot_params.cpp.

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

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 584 of file pcb_plot_params.cpp.

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

Referenced by Parse().


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