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::PCB_PLOT_PARAMS_PARSER ( LINE_READER aReader)

Definition at line 323 of file pcb_plot_params.cpp.

323  :
324  PCB_PLOT_PARAMS_LEXER( aReader )
325 {
326 }
PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER ( char *  aLine,
const wxString &  aSource 
)

Definition at line 329 of file pcb_plot_params.cpp.

329  :
330  PCB_PLOT_PARAMS_LEXER( aLine, aSource )
331 {
332 }

Member Function Documentation

LINE_READER* PCB_PLOT_PARAMS_PARSER::GetReader ( )
inline

Definition at line 42 of file pcb_plot_params_parser.h.

References Parse(), parseBool(), parseDouble(), parseInt(), and skipCurrent().

42 { return reader; };
void PCB_PLOT_PARAMS_PARSER::Parse ( PCB_PLOT_PARAMS aPcbPlotParams)

Definition at line 335 of file pcb_plot_params.cpp.

References LSET::AllCuMask(), B_SilkS, F_SilkS, FILLED, FROM_UTF8(), gbrDefaultPrecision, HPGL_PEN_DIAMETER_MAX, HPGL_PEN_DIAMETER_MIN, 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_useGerberAttributes, PCB_PLOT_PARAMS::m_useGerberProtelExtensions, 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 GetReader(), and PCB_PLOT_PARAMS::Parse().

336 {
337  T token;
338 
339  while( ( token = NextTok() ) != T_RIGHT )
340  {
341  if( token == T_EOF)
342  Unexpected( T_EOF );
343 
344  if( token == T_LEFT )
345  token = NextTok();
346 
347  if( token == T_pcbplotparams )
348  continue;
349 
350  bool skip_right = false;
351 
352  switch( token )
353  {
354  case T_layerselection:
355  {
356  token = NeedSYMBOLorNUMBER();
357 
358  const std::string& cur = CurStr();
359 
360  if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
361  {
362  // unsigned legacy_mask = atol( cur.c_str() );
363 
364  /* It's not possible to convert a legacy Cu layer number to a new
365  Cu layer number without knowing the number or total Cu layers
366  in the legacy board. We do not have that information here.
367  So simply set all layers ON. User can turn them off in the UI.
368  This is one of the superiorities of the new Cu sequence.
369  aPcbPlotParams->m_layerSelection = LEGACY_PLUGIN::leg_mask2new( cu_count, legacy_mask );
370  */
371 
372  // sorry, use the UI once to fix:
373  aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS) | LSET::AllCuMask();
374  }
375  else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
376  {
377  // skip the leading 2 0x bytes.
378  aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str()+2, cur.size()-2 );
379  }
380  else
381  Expecting( "integer or hex layerSelection" );
382  }
383  break;
384 
385  case T_usegerberextensions:
386  aPcbPlotParams->m_useGerberProtelExtensions = parseBool();
387  break;
388 
389  case T_usegerberattributes:
390  aPcbPlotParams->m_useGerberAttributes = parseBool();
391  break;
392 
393  case T_usegerberadvancedattributes:
394  aPcbPlotParams->m_includeGerberNetlistInfo = parseBool();
395  break;
396 
397  case T_creategerberjobfile:
398  aPcbPlotParams->m_createGerberJobFile = parseBool();
399  break;
400 
401  case T_gerberprecision:
402  aPcbPlotParams->m_gerberPrecision =
404  break;
405 
406  case T_psa4output:
407  aPcbPlotParams->m_A4Output = parseBool();
408  break;
409 
410  case T_excludeedgelayer:
411  aPcbPlotParams->m_excludeEdgeLayer = parseBool();
412  break;
413 
414  case T_linewidth:
415  {
416  // Due to a bug, this (minor) parameter was saved in biu
417  // and now is saved in mm
418  // If the read value is outside bounds, force a default value
419  double tmp = parseDouble();
420  if( !aPcbPlotParams->SetLineWidth( KiROUND( tmp * IU_PER_MM ) ) )
421  aPcbPlotParams->SetLineWidth( PLOT_LINEWIDTH_DEFAULT );
422  }
423  break;
424 
425  case T_plotframeref:
426  aPcbPlotParams->m_plotFrameRef = parseBool();
427  break;
428 
429  case T_viasonmask:
430  aPcbPlotParams->m_plotViaOnMaskLayer = parseBool();
431  break;
432 
433  case T_mode:
434  aPcbPlotParams->SetPlotMode( parseInt( 0, 2 ) > 1 ? SKETCH : FILLED );
435  break;
436 
437  case T_useauxorigin:
438  aPcbPlotParams->m_useAuxOrigin = parseBool();
439  break;
440 
441  case T_hpglpennumber:
442  aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN,
444  break;
445 
446  case T_hpglpenspeed:
447  aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN,
449  break;
450 
451  case T_hpglpendiameter:
452  aPcbPlotParams->m_HPGLPenDiam = parseInt( HPGL_PEN_DIAMETER_MIN,
454  break;
455 
456  case T_hpglpenoverlay:
457  // No more used. juste here for compatibility with old versions
459  break;
460 
461  case T_pscolor:
462  NeedSYMBOL(); // This actually was never used...
463  break;
464 
465  case T_psnegative:
466  aPcbPlotParams->m_negative = parseBool();
467  break;
468 
469  case T_plotreference:
470  aPcbPlotParams->m_plotReference = parseBool();
471  break;
472 
473  case T_plotvalue:
474  aPcbPlotParams->m_plotValue = parseBool();
475  break;
476 
477  case T_plotinvisibletext:
478  aPcbPlotParams->m_plotInvisibleText = parseBool();
479  break;
480 
481  case T_padsonsilk:
482  aPcbPlotParams->m_plotPadsOnSilkLayer= parseBool();
483  break;
484 
485  case T_subtractmaskfromsilk:
486  aPcbPlotParams->m_subtractMaskFromSilk = parseBool();
487  break;
488 
489  case T_outputformat:
490  aPcbPlotParams->m_format = static_cast<PlotFormat>(
492  break;
493 
494  case T_mirror:
495  aPcbPlotParams->m_mirror = parseBool();
496  break;
497 
498  case T_drillshape:
499  aPcbPlotParams->m_drillMarks = static_cast<PCB_PLOT_PARAMS::DrillMarksType>
500  ( parseInt( 0, 2 ) );
501  break;
502 
503  case T_scaleselection:
504  aPcbPlotParams->m_scaleSelection = parseInt( 0, 4 );
505  break;
506 
507  case T_outputdirectory:
508  NeedSYMBOL();
509  aPcbPlotParams->m_outputDirectory = FROM_UTF8( CurText() );
510  break;
511 
512  default:
513  skipCurrent(); // skip unknown or outdated plot parameter
514  skip_right = true; // the closing right token is already read.
515  break;
516  }
517 
518  if( ! skip_right )
519  NeedRIGHT();
520  }
521 }
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:673
#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:53
bool m_mirror
Mirror the plot around the X axis.
static int KiROUND(double v)
KiROUND rounds a floating point number to an int using "round halfway cases away from zero"...
Definition: common.h:107
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_plotReference
Enable plotting of part references.
PlotFormat
Enum PlotFormat is the set of supported output plot formats.
Definition: plotter.h:50
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.
bool SetLineWidth(int aValue)
bool m_includeGerberNetlistInfo
Include netlist info (only in Gerber X2 format) (chapter ? in revision ?)
bool m_useGerberAttributes
Include attributes from the Gerber X2 format (chapter 5 in revision J2)
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 &#39;scrape&#39; away the solder mask from silkscreen (trim silks)
#define HPGL_PEN_DIAMETER_MAX
#define HPGL_PEN_DIAMETER_MIN
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&#39;s values with those given ...
Definition: lset.cpp:312
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_HPGLPenDiam
HPGL only: pen diameter in MILS, useful to fill areas.
int m_gerberPrecision
precision of coordinates in Gerber files: accepted 5 or 6 when units are in mm (6 or 7 in inches...
bool PCB_PLOT_PARAMS_PARSER::parseBool ( )
private

Definition at line 524 of file pcb_plot_params.cpp.

Referenced by GetReader(), and Parse().

525 {
526  T token = NeedSYMBOL();
527 
528  if( token != T_false && token != T_true )
529  Expecting( "true|false" );
530 
531  return token == T_true;
532 }
double PCB_PLOT_PARAMS_PARSER::parseDouble ( )
private

Function parseDouble parses a double.

Returns
double - the parsed double.

Definition at line 553 of file pcb_plot_params.cpp.

Referenced by GetReader(), and Parse().

554 {
555  T token = NextTok();
556 
557  if( token != T_NUMBER )
558  Expecting( T_NUMBER );
559 
560  double val = strtod( CurText(), NULL );
561 
562  return val;
563 }
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 535 of file pcb_plot_params.cpp.

Referenced by GetReader(), and Parse().

536 {
537  T token = NextTok();
538 
539  if( token != T_NUMBER )
540  Expecting( T_NUMBER );
541 
542  int val = atoi( CurText() );
543 
544  if( val < aMin )
545  val = aMin;
546  else if( val > aMax )
547  val = aMax;
548 
549  return val;
550 }
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 566 of file pcb_plot_params.cpp.

Referenced by GetReader(), and Parse().

567 {
568  int curr_level = 0;
569  T token;
570 
571  while( ( token = NextTok() ) != T_EOF )
572  {
573  if( token == T_LEFT )
574  curr_level--;
575 
576  if( token == T_RIGHT )
577  {
578  curr_level++;
579 
580  if( curr_level > 0 )
581  return;
582  }
583  }
584 }

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