KiCad PCB EDA Suite
GERBER_PLOTTER Class Reference

#include <plotter.h>

Inheritance diagram for GERBER_PLOTTER:
PLOTTER

Public Member Functions

 GERBER_PLOTTER ()
 
virtual PlotFormat GetPlotterType () const override
 Returns the effective plot engine in use. More...
 
virtual bool StartPlot () override
 Function StartPlot Write GERBER header to file initialize global variable g_Plot_PlotOutputFile. More...
 
virtual bool EndPlot () override
 
virtual void SetCurrentLineWidth (int width, void *aData=NULL) override
 Set the line width for the next drawing. More...
 
virtual void SetDefaultLineWidth (int width) override
 Set the default line width. More...
 
virtual void SetDash (int dashed) override
 
virtual void SetColor (COLOR4D color) override
 
virtual void SetViewport (const wxPoint &aOffset, double aIusPerDecimil, double aScale, bool aMirror) override
 Set the plot offset and scaling for the current plot. More...
 
virtual void Rect (const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
 
virtual void Circle (const wxPoint &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
 
virtual void Arc (const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH) override
 Generic fallback: arc rendered as a polyline. More...
 
virtual void ThickSegment (const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode, void *aData) override
 
virtual void ThickArc (const wxPoint &centre, double StAngle, double EndAngle, int rayon, int width, EDA_DRAW_MODE_T tracemode, void *aData) override
 
virtual void ThickRect (const wxPoint &p1, const wxPoint &p2, int width, EDA_DRAW_MODE_T tracemode, void *aData) override
 
virtual void ThickCircle (const wxPoint &pos, int diametre, int width, EDA_DRAW_MODE_T tracemode, void *aData) override
 
virtual void PlotPoly (const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
 Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence. More...
 
virtual void PenTo (const wxPoint &pos, char plume) override
 moveto/lineto primitive, moves the 'pen' to the specified direction More...
 
virtual void Text (const wxPoint &aPos, const COLOR4D aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed=false, void *aData=NULL) override
 Draws text with the plotter. More...
 
virtual void FlashPadCircle (const wxPoint &pos, int diametre, EDA_DRAW_MODE_T trace_mode, void *aData) override
 Filled circular flashes are stored as apertures. More...
 
virtual void FlashPadOval (const wxPoint &pos, const wxSize &size, double orient, EDA_DRAW_MODE_T trace_mode, void *aData) override
 Filled oval flashes are handled as aperture in the 90 degree positions only. More...
 
virtual void FlashPadRect (const wxPoint &pos, const wxSize &size, double orient, EDA_DRAW_MODE_T trace_mode, void *aData) override
 Filled rect flashes are handled as aperture in the 0 90 180 or 270 degree orientation only and as polygon for other orientations TODO: always use flashed shapes (aperture macros) More...
 
virtual void FlashPadRoundRect (const wxPoint &aPadPos, const wxSize &aSize, int aCornerRadius, double aOrient, EDA_DRAW_MODE_T aTraceMode, void *aData) override
 Roundrect pad at the moment are not handled as aperture, since they require aperture macros TODO: always use flashed shapes (aperture macros) More...
 
virtual void FlashPadCustom (const wxPoint &aPadPos, const wxSize &aSize, SHAPE_POLY_SET *aPolygons, EDA_DRAW_MODE_T aTraceMode, void *aData) override
 virtual function FlashPadCustom More...
 
virtual void FlashPadTrapez (const wxPoint &aPadPos, const wxPoint *aCorners, double aPadOrient, EDA_DRAW_MODE_T aTraceMode, void *aData) override
 Trapezoidal pad at the moment are never handled as aperture, since they require aperture macros TODO: always use flashed shapes (aperture macros) More...
 
virtual void FlashRegularPolygon (const wxPoint &aShapePos, int aDiameter, int aCornerCount, double aOrient, EDA_DRAW_MODE_T aTraceMode, void *aData) override
 Flash a regular polygon. More...
 
void PlotGerberRegion (const std::vector< wxPoint > &aCornerList, void *aData=NULL)
 Plot a Gerber region: similar to PlotPoly but plot only filled polygon, and add the TA.AperFunction if aData contains this attribute, and clear it after plotting. More...
 
virtual void SetLayerPolarity (bool aPositive) override
 Change the plot polarity and begin a new layer Used to 'scratch off' silk screen away from solder mask. More...
 
virtual void SetGerberCoordinatesFormat (int aResolution, bool aUseInches=false) override
 Function SetGerberCoordinatesFormat selection of Gerber units and resolution (number of digits in mantissa) More...
 
void UseX2format (bool aEnable)
 
void UseX2NetAttributes (bool aEnable)
 
virtual void StartBlock (void *aData) override
 calling this function allows one to define the beginning of a group of drawing items (used in X2 format with netlist attributes) More...
 
virtual void EndBlock (void *aData) override
 calling this function allows one to define the end of a group of drawing items the group is started by StartBlock() (used in X2 format with netlist attributes) More...
 
void ClearAllAttributes ()
 Remove (clear) all attributes from object attributes dictionary (TO. More...
 
int GetOrCreateAperture (const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
 
virtual void SetNegative (bool aNegative)
 
virtual void SetColorMode (bool aColorMode)
 Plot in B/W or color. More...
 
bool GetColorMode () const
 
virtual void SetPageSettings (const PAGE_INFO &aPageSettings)
 
virtual int GetCurrentLineWidth () const
 
virtual void SetCreator (const wxString &aCreator)
 
virtual void SetTitle (const wxString &aTitle)
 
void AddLineToHeader (const wxString &aExtraString)
 Function AddLineToHeader Add a line to the list of free lines to print at the beginning of the file. More...
 
void ClearHeaderLinesList ()
 Function ClearHeaderLinesList remove all lines from the list of free lines to print at the beginning of the file. More...
 
virtual bool OpenFile (const wxString &aFullFilename)
 Open or create the plot file aFullFilename. More...
 
double GetIUsPerDecimil () const
 The IUs per decimil are an essential scaling factor when plotting; they are set and saved when establishing the viewport. More...
 
int GetPlotterArcLowDef () const
 
int GetPlotterArcHighDef () const
 
virtual void BezierCurve (const wxPoint &aStart, const wxPoint &aControl1, const wxPoint &aControl2, const wxPoint &aEnd, int aTolerance, int aLineThickness=USE_DEFAULT_LINE_WIDTH)
 Generic fallback: Cubic Bezier curve rendered as a polyline In Kicad the bezier curves have 4 control points: start ctrl1 ctrl2 end. More...
 
void MoveTo (const wxPoint &pos)
 
void LineTo (const wxPoint &pos)
 
void FinishTo (const wxPoint &pos)
 
void PenFinish ()
 
virtual void PlotPoly (const SHAPE_LINE_CHAIN &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)
 Function PlotPoly. More...
 
virtual void PlotImage (const wxImage &aImage, const wxPoint &aPos, double aScaleFactor)
 Function PlotImage Only Postscript plotters can plot bitmaps for plotters that cannot plot a bitmap, a rectangle is plotted. More...
 
void Marker (const wxPoint &position, int diametre, unsigned aShapeId)
 Draw a pattern shape number aShapeId, to coord position. More...
 
virtual void SetTextMode (PlotTextMode mode)
 Change the current text mode. More...
 

Static Public Member Functions

static wxString GetDefaultFileExtension ()
 

Static Public Attributes

static const int DO_NOT_SET_LINE_WIDTH = -2
 
static const int USE_DEFAULT_LINE_WIDTH = -1
 
static const unsigned MARKER_COUNT = 58
 Draw a marker (used for the drill map) More...
 

Protected Member Functions

void selectAperture (const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
 Pick an existing aperture or create a new one, matching the size, type and attributes. More...
 
void selectAperture (int aDiameter, double aPolygonRotation, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
 Pick an existing aperture or create a new one, matching the aDiameter, aPolygonRotation, type and attributes. More...
 
void emitDcode (const DPOINT &pt, int dcode)
 Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (for n decimal positions, see header generation in start_plot. More...
 
void formatNetAttribute (GBR_NETLIST_METADATA *aData)
 print a Gerber net attribute object record. More...
 
void clearNetAttribute ()
 clear a Gerber net attribute record (clear object attribute dictionary) and output the clear object attribute dictionary command to gerber file has effect only if a net attribute is stored in m_objectAttributesDictionnary More...
 
void writeApertureList ()
 Generate the table of D codes. More...
 
void markerCircle (const wxPoint &pos, int radius)
 Plot a circle centered on the position. More...
 
void markerHBar (const wxPoint &pos, int radius)
 Plot a - bar centered on the position. More...
 
void markerSlash (const wxPoint &pos, int radius)
 Plot a / bar centered on the position. More...
 
void markerBackSlash (const wxPoint &pos, int radius)
 Plot a \ bar centered on the position. More...
 
void markerVBar (const wxPoint &pos, int radius)
 Plot a | bar centered on the position. More...
 
void markerSquare (const wxPoint &position, int radius)
 Plot a square centered on the position. More...
 
void markerLozenge (const wxPoint &position, int radius)
 Plot a lozenge centered on the position. More...
 
void segmentAsOval (const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode)
 Cdonvert a thick segment and plot it as an oval. More...
 
void sketchOval (const wxPoint &pos, const wxSize &size, double orient, int width)
 
virtual DPOINT userToDeviceCoordinates (const wxPoint &aCoordinate)
 Modifies coordinates according to the orientation, scale factor, and offsets trace. More...
 
virtual DPOINT userToDeviceSize (const wxSize &size)
 Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT) More...
 
virtual double userToDeviceSize (double size) const
 Modifies size according to the plotter scale factors (simple double version) More...
 
double GetDotMarkLenIU () const
 
double GetDashMarkLenIU () const
 
double GetDashGapLenIU () const
 

Protected Attributes

std::string m_objectAttributesDictionnary
 
int m_apertureAttribute
 
FILE * workFile
 
FILE * finalFile
 
wxString m_workFilename
 
std::vector< APERTUREm_apertures
 
int m_currentApertureIdx
 
bool m_gerberUnitInch
 
int m_gerberUnitFmt
 
bool m_useX2format
 
bool m_useNetAttributes
 
double plotScale
 Plot scale - chosen by the user (even implicitly with 'fit in a4') More...
 
double m_IUsPerDecimil
 
double iuPerDeviceUnit
 Device scale (from IUs to plotter device units - usually decimils) More...
 
wxPoint plotOffset
 Plot offset (in IUs) More...
 
bool m_plotMirror
 X axis orientation (SVG) and plot mirrored (only for PS, PDF HPGL and SVG) More...
 
bool m_mirrorIsHorizontal
 
bool m_yaxisReversed
 true to mirror horizontally (else vertically) More...
 
FILE * outputFile
 true if the Y axis is top to bottom (SVG) More...
 
bool colorMode
 
bool negativeMode
 true to plot in color, false to plot in black and white More...
 
int defaultPenWidth
 true to generate a negative image (PS mode mainly) More...
 
int currentPenWidth
 
char penState
 Current pen state: 'U', 'D' or 'Z' (see PenTo) More...
 
wxPoint penLastpos
 Last pen positions; set to -1,-1 when the pen is at rest. More...
 
wxString creator
 
wxString filename
 
wxString title
 
PAGE_INFO pageInfo
 
wxSize paperSize
 Paper size in IU - not in mils. More...
 
wxArrayString m_headerExtraLines
 

Detailed Description

Definition at line 1139 of file plotter.h.

Constructor & Destructor Documentation

◆ GERBER_PLOTTER()

GERBER_PLOTTER::GERBER_PLOTTER ( )

Definition at line 46 of file GERBER_plotter.cpp.

47 {
48  workFile = NULL;
49  finalFile = NULL;
52 
53  // number of digits after the point (number of digits of the mantissa
54  // Be carefull: the Gerber coordinates are stored in an integer
55  // so 6 digits (inches) or 5 digits (mm) is a good value
56  // To avoid overflow, 7 digits (inches) or 6 digits is a max.
57  // with lower values than 6 digits (inches) or 5 digits (mm),
58  // Creating self-intersecting polygons from non-intersecting polygons
59  // happen easily.
60  m_gerberUnitInch = false;
61  m_gerberUnitFmt = 6;
62  m_useX2format = true;
63  m_useNetAttributes = true;
64 }
bool m_useNetAttributes
Definition: plotter.h:1380
bool m_gerberUnitInch
Definition: plotter.h:1374
int m_gerberUnitFmt
Definition: plotter.h:1375
FILE * finalFile
Definition: plotter.h:1363
bool m_useX2format
Definition: plotter.h:1377
int m_apertureAttribute
Definition: plotter.h:1360
FILE * workFile
Definition: plotter.h:1362
int m_currentApertureIdx
Definition: plotter.h:1372

References finalFile, m_apertureAttribute, m_currentApertureIdx, m_gerberUnitFmt, m_gerberUnitInch, m_useNetAttributes, m_useX2format, and workFile.

Member Function Documentation

◆ AddLineToHeader()

void PLOTTER::AddLineToHeader ( const wxString &  aExtraString)
inlineinherited

Function AddLineToHeader Add a line to the list of free lines to print at the beginning of the file.

Parameters
aExtraStringis the string to print

Definition at line 176 of file plotter.h.

177  {
178  m_headerExtraLines.Add( aExtraString );
179  }
wxArrayString m_headerExtraLines
Definition: plotter.h:596

References PLOTTER::m_headerExtraLines.

Referenced by AddGerberX2Attribute(), AddGerberX2Header(), GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ Arc()

void GERBER_PLOTTER::Arc ( const wxPoint &  centre,
double  StAngle,
double  EndAngle,
int  rayon,
FILL_T  fill,
int  width = USE_DEFAULT_LINE_WIDTH 
)
overridevirtual

Generic fallback: arc rendered as a polyline.

Reimplemented from PLOTTER.

Definition at line 515 of file GERBER_plotter.cpp.

517 {
518  SetCurrentLineWidth( aWidth );
519 
520  wxPoint start, end;
521  start.x = aCenter.x + KiROUND( cosdecideg( aRadius, aStAngle ) );
522  start.y = aCenter.y - KiROUND( sindecideg( aRadius, aStAngle ) );
523  MoveTo( start );
524  end.x = aCenter.x + KiROUND( cosdecideg( aRadius, aEndAngle ) );
525  end.y = aCenter.y - KiROUND( sindecideg( aRadius, aEndAngle ) );
526  DPOINT devEnd = userToDeviceCoordinates( end );
527  DPOINT devCenter = userToDeviceCoordinates( aCenter ) - userToDeviceCoordinates( start );
528 
529  fprintf( outputFile, "G75*\n" ); // Multiquadrant (360 degrees) mode
530 
531  if( aStAngle < aEndAngle )
532  fprintf( outputFile, "G03*\n" ); // Active circular interpolation, CCW
533  else
534  fprintf( outputFile, "G02*\n" ); // Active circular interpolation, CW
535 
536  fprintf( outputFile, "X%dY%dI%dJ%dD01*\n",
537  KiROUND( devEnd.x ), KiROUND( devEnd.y ),
538  KiROUND( devCenter.x ), KiROUND( devCenter.y ) );
539 
540  fprintf( outputFile, "G01*\n" ); // Back to linear interpol (perhaps useless here).
541 }
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
double cosdecideg(double r, double a)
Circle generation utility: computes r * cos(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:365
double sindecideg(double r, double a)
Circle generation utility: computes r * sin(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:356
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
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 cosdecideg(), KiROUND(), PLOTTER::MoveTo(), PLOTTER::outputFile, SetCurrentLineWidth(), sindecideg(), PLOTTER::userToDeviceCoordinates(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Circle(), and ThickArc().

◆ BezierCurve()

void PLOTTER::BezierCurve ( const wxPoint &  aStart,
const wxPoint &  aControl1,
const wxPoint &  aControl2,
const wxPoint &  aEnd,
int  aTolerance,
int  aLineThickness = USE_DEFAULT_LINE_WIDTH 
)
virtualinherited

Generic fallback: Cubic Bezier curve rendered as a polyline In Kicad the bezier curves have 4 control points: start ctrl1 ctrl2 end.

Reimplemented in SVG_PLOTTER.

Definition at line 202 of file plotter.cpp.

205 {
206  // Generic fallback: Quadratic Bezier curve plotted as a polyline
207  int minSegLen = aLineThickness; // The segment min length to approximate a bezier curve
208 
209  std::vector<wxPoint> ctrlPoints;
210  ctrlPoints.push_back( aStart );
211  ctrlPoints.push_back( aControl1 );
212  ctrlPoints.push_back( aControl2 );
213  ctrlPoints.push_back( aEnd );
214 
215  BEZIER_POLY bezier_converter( ctrlPoints );
216 
217  std::vector<wxPoint> approxPoints;
218  bezier_converter.GetPoly( approxPoints, minSegLen );
219 
220  SetCurrentLineWidth( aLineThickness );
221  MoveTo( aStart );
222 
223  for( unsigned ii = 1; ii < approxPoints.size()-1; ii++ )
224  LineTo( approxPoints[ii] );
225 
226  FinishTo( aEnd );
227 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void LineTo(const wxPoint &pos)
Definition: plotter.h:259
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254
Bezier curves to polygon converter.
Definition: bezier_curves.h:35
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References PLOTTER::FinishTo(), BEZIER_POLY::GetPoly(), PLOTTER::LineTo(), PLOTTER::MoveTo(), and PLOTTER::SetCurrentLineWidth().

Referenced by SVG_PLOTTER::BezierCurve(), BRDITEMS_PLOTTER::Plot_1_EdgeModule(), and BRDITEMS_PLOTTER::PlotDrawSegment().

◆ Circle()

void GERBER_PLOTTER::Circle ( const wxPoint &  pos,
int  diametre,
FILL_T  fill,
int  width = USE_DEFAULT_LINE_WIDTH 
)
overridevirtual

Implements PLOTTER.

Definition at line 509 of file GERBER_plotter.cpp.

510 {
511  Arc( aCenter, 0, 3600, aDiameter / 2, aFill, aWidth );
512 }
virtual void Arc(const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH) override
Generic fallback: arc rendered as a polyline.

References Arc().

Referenced by FlashPadCircle(), and ThickCircle().

◆ ClearAllAttributes()

void GERBER_PLOTTER::ClearAllAttributes ( )

Remove (clear) all attributes from object attributes dictionary (TO.

and TA commands) similar to clearNetAttribute(), this is an unconditional reset of TO. and TA. attributes

Definition at line 107 of file GERBER_plotter.cpp.

108 {
109  // Remove all attributes from object attributes dictionary (TO. and TA commands)
110  if( m_useX2format )
111  fputs( "%TD*%\n", outputFile );
112  else
113  fputs( "G04 #@! TD*\n", outputFile );
114 
116 }
bool m_useX2format
Definition: plotter.h:1377
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
std::string m_objectAttributesDictionnary
Definition: plotter.h:1357

References m_objectAttributesDictionnary, m_useX2format, and PLOTTER::outputFile.

Referenced by PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ ClearHeaderLinesList()

void PLOTTER::ClearHeaderLinesList ( )
inlineinherited

Function ClearHeaderLinesList remove all lines from the list of free lines to print at the beginning of the file.

Definition at line 185 of file plotter.h.

186  {
187  m_headerExtraLines.Clear();
188  }
wxArrayString m_headerExtraLines
Definition: plotter.h:596

References PLOTTER::m_headerExtraLines.

Referenced by StartPlotBoard().

◆ clearNetAttribute()

void GERBER_PLOTTER::clearNetAttribute ( )
protected

clear a Gerber net attribute record (clear object attribute dictionary) and output the clear object attribute dictionary command to gerber file has effect only if a net attribute is stored in m_objectAttributesDictionnary

Definition at line 119 of file GERBER_plotter.cpp.

120 {
121  // disable a Gerber net attribute (exists only in X2 with net attributes mode).
122  if( m_objectAttributesDictionnary.empty() ) // No net attribute or not X2 mode
123  return;
124 
125  // Remove all net attributes from object attributes dictionary
126  if( m_useX2format )
127  fputs( "%TD*%\n", outputFile );
128  else
129  fputs( "G04 #@! TD*\n", outputFile );
130 
132 }
bool m_useX2format
Definition: plotter.h:1377
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
std::string m_objectAttributesDictionnary
Definition: plotter.h:1357

References m_objectAttributesDictionnary, m_useX2format, and PLOTTER::outputFile.

Referenced by EndBlock(), and formatNetAttribute().

◆ emitDcode()

void GERBER_PLOTTER::emitDcode ( const DPOINT pt,
int  dcode 
)
protected

Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (for n decimal positions, see header generation in start_plot.

Definition at line 101 of file GERBER_plotter.cpp.

102 {
103 
104  fprintf( outputFile, "X%dY%dD%02d*\n", KiROUND( pt.x ), KiROUND( pt.y ), dcode );
105 }
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
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 KiROUND(), PLOTTER::outputFile, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by FlashPadCircle(), FlashPadOval(), FlashPadRect(), FlashRegularPolygon(), and PenTo().

◆ EndBlock()

void GERBER_PLOTTER::EndBlock ( void *  aData)
overridevirtual

calling this function allows one to define the end of a group of drawing items the group is started by StartBlock() (used in X2 format with netlist attributes)

Parameters
aDatacan define any parameter

Reimplemented from PLOTTER.

Definition at line 142 of file GERBER_plotter.cpp.

143 {
144  // Remove all net attributes from object attributes dictionary
146 }
void clearNetAttribute()
clear a Gerber net attribute record (clear object attribute dictionary) and output the clear object a...

References clearNetAttribute().

Referenced by GERBER_WRITER::createDrillFile(), and StartBlock().

◆ EndPlot()

bool GERBER_PLOTTER::EndPlot ( )
overridevirtual

Implements PLOTTER.

Definition at line 242 of file GERBER_plotter.cpp.

243 {
244  char line[1024];
245  wxString msg;
246 
247  wxASSERT( outputFile );
248 
249  /* Outfile is actually a temporary file i.e. workFile */
250  fputs( "M02*\n", outputFile );
251  fflush( outputFile );
252 
253  fclose( workFile );
254  workFile = wxFopen( m_workFilename, wxT( "rt" ));
255  wxASSERT( workFile );
257 
258  // Placement of apertures in RS274X
259  while( fgets( line, 1024, workFile ) )
260  {
261  fputs( line, outputFile );
262 
263  char* substr = strtok( line, "\n\r" );
264 
265  if( substr && strcmp( substr, "G04 APERTURE LIST*" ) == 0 )
266  {
268  fputs( "G04 APERTURE END LIST*\n", outputFile );
269  }
270  }
271 
272  fclose( workFile );
273  fclose( finalFile );
274  ::wxRemoveFile( m_workFilename );
275  outputFile = 0;
276 
277  return true;
278 }
void writeApertureList()
Generate the table of D codes.
FILE * finalFile
Definition: plotter.h:1363
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
wxString m_workFilename
Definition: plotter.h:1364
FILE * workFile
Definition: plotter.h:1362

References finalFile, m_workFilename, PLOTTER::outputFile, workFile, and writeApertureList().

Referenced by GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ FinishTo()

◆ FlashPadCircle()

void GERBER_PLOTTER::FlashPadCircle ( const wxPoint &  pos,
int  diametre,
EDA_DRAW_MODE_T  trace_mode,
void *  aData 
)
overridevirtual

Filled circular flashes are stored as apertures.

Implements PLOTTER.

Definition at line 726 of file GERBER_plotter.cpp.

727 {
728  wxSize size( diametre, diametre );
729  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
730 
731  if( trace_mode == SKETCH )
732  {
734 
735  if( gbr_metadata )
736  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
737 
739  }
740  else
741  {
742  DPOINT pos_dev = userToDeviceCoordinates( pos );
743 
744  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
745  selectAperture( size, APERTURE::AT_CIRCLE, aperture_attrib );
746 
747  if( gbr_metadata )
748  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
749 
750  emitDcode( pos_dev, 3 );
751  }
752 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:158
void emitDcode(const DPOINT &pt, int dcode)
Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (fo...
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
int currentPenWidth
Definition: plotter.h:584
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
virtual void Circle(const wxPoint &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:101

References APERTURE::AT_CIRCLE, Circle(), PLOTTER::currentPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, emitDcode(), formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), GBR_METADATA::m_NetlistMetadata, NO_FILL, selectAperture(), SetCurrentLineWidth(), SKETCH, PLOTTER::USE_DEFAULT_LINE_WIDTH, and PLOTTER::userToDeviceCoordinates().

Referenced by GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ FlashPadCustom()

void GERBER_PLOTTER::FlashPadCustom ( const wxPoint &  aPadPos,
const wxSize &  aSize,
SHAPE_POLY_SET aPolygons,
EDA_DRAW_MODE_T  aTraceMode,
void *  aData 
)
overridevirtual

virtual function FlashPadCustom

Parameters
aPadPosPosition of the shape (center of the rectangle
aSize= size of round reference pad
aPolygonsthe shape as polygon set
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 916 of file GERBER_plotter.cpp.

920 {
921  // A Pad custom is plotted as polygon (a region in Gerber language).
922 
923  GBR_METADATA gbr_metadata;
924 
925  if( aData )
926  gbr_metadata = *static_cast<GBR_METADATA*>( aData );
927 
928  SHAPE_POLY_SET polyshape = *aPolygons;
929 
930  if( aTraceMode != FILLED )
931  {
933  polyshape.Inflate( -GetCurrentLineWidth()/2, 16 );
934  }
935 
936  std::vector< wxPoint > cornerList;
937 
938  for( int cnt = 0; cnt < polyshape.OutlineCount(); ++cnt )
939  {
940  SHAPE_LINE_CHAIN& poly = polyshape.Outline( cnt );
941 
942  cornerList.clear();
943 
944  for( int ii = 0; ii < poly.PointCount(); ++ii )
945  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
946 
947  // Close polygon
948  cornerList.push_back( cornerList[0] );
949 
950  if( aTraceMode == SKETCH )
951  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), &gbr_metadata );
952  else
953  PlotGerberRegion( cornerList, &gbr_metadata );
954  }
955 }
int OutlineCount() const
Returns the number of outlines in the set
void Inflate(int aAmount, int aCircleSegmentsCount, CORNER_STRATEGY aCornerStrategy=ROUND_ALL_CORNERS)
Performs outline inflation/deflation.
int PointCount() const
Function PointCount()
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
const VECTOR2I & CPoint(int aIndex) const
Function Point()
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
void PlotGerberRegion(const std::vector< wxPoint > &aCornerList, void *aData=NULL)
Plot a Gerber region: similar to PlotPoly but plot only filled polygon, and add the TA....
Class SHAPE_LINE_CHAIN.

References SHAPE_LINE_CHAIN::CPoint(), FILLED, PLOTTER::GetCurrentLineWidth(), SHAPE_POLY_SET::Inflate(), NO_FILL, SHAPE_POLY_SET::Outline(), SHAPE_POLY_SET::OutlineCount(), PlotGerberRegion(), PlotPoly(), SHAPE_LINE_CHAIN::PointCount(), SetCurrentLineWidth(), SKETCH, PLOTTER::USE_DEFAULT_LINE_WIDTH, VECTOR2< T >::x, and VECTOR2< T >::y.

◆ FlashPadOval()

void GERBER_PLOTTER::FlashPadOval ( const wxPoint &  pos,
const wxSize &  size,
double  orient,
EDA_DRAW_MODE_T  trace_mode,
void *  aData 
)
overridevirtual

Filled oval flashes are handled as aperture in the 90 degree positions only.

Implements PLOTTER.

Definition at line 755 of file GERBER_plotter.cpp.

757 {
758  wxASSERT( outputFile );
759  wxSize size( aSize );
760  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
761 
762  // Flash a vertical or horizontal shape (this is a basic aperture).
763  if( ( orient == 0 || orient == 900 || orient == 1800 || orient == 2700 )
764  && trace_mode == FILLED )
765  {
766  if( orient == 900 || orient == 2700 ) /* orientation turned 90 deg. */
767  std::swap( size.x, size.y );
768 
769  DPOINT pos_dev = userToDeviceCoordinates( pos );
770  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
771  selectAperture( size, APERTURE::AT_OVAL, aperture_attrib );
772 
773  if( gbr_metadata )
774  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
775 
776  emitDcode( pos_dev, 3 );
777  }
778  else // Plot pad as region.
779  // Only regions and flashed items accept a object attribute TO.P for the pin name
780  {
781  if( size.x > size.y )
782  {
783  std::swap( size.x, size.y );
784 
785  if( orient < 2700 )
786  orient += 900;
787  else
788  orient -= 2700;
789  }
790 
791  if( trace_mode == FILLED )
792  {
793  // TODO: use an aperture macro to declare the rotated pad
794  // to be able to flash the shape
795  // For now, the pad is drawn as thick segment (painted with only one segment)
796 
797  // The pad is reduced to an segment with dy > dx
798  int delta = size.y - size.x;
799  wxPoint p0( 0, -delta / 2 );
800  wxPoint p1( 0, delta / 2 );
801  RotatePoint( &p0.x, &p0.y, orient );
802  RotatePoint( &p1.x, &p1.y, orient );
803 
804  ThickSegment( pos + p0, pos + p1, size.x, trace_mode, gbr_metadata );
805  }
806  else
807  sketchOval( pos, size, orient, -1 );
808  }
809 }
virtual void ThickSegment(const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode, void *aData) override
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:158
void emitDcode(const DPOINT &pt, int dcode)
Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (fo...
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
void sketchOval(const wxPoint &pos, const wxSize &size, double orient, int width)
Definition: plotter.cpp:457

References APERTURE::AT_OVAL, emitDcode(), FILLED, formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), GBR_METADATA::m_NetlistMetadata, PLOTTER::outputFile, RotatePoint(), selectAperture(), PLOTTER::sketchOval(), ThickSegment(), and PLOTTER::userToDeviceCoordinates().

Referenced by GERBER_WRITER::createDrillFile().

◆ FlashPadRect()

void GERBER_PLOTTER::FlashPadRect ( const wxPoint &  pos,
const wxSize &  size,
double  orient,
EDA_DRAW_MODE_T  trace_mode,
void *  aData 
)
overridevirtual

Filled rect flashes are handled as aperture in the 0 90 180 or 270 degree orientation only and as polygon for other orientations TODO: always use flashed shapes (aperture macros)

Implements PLOTTER.

Definition at line 812 of file GERBER_plotter.cpp.

815 {
816  wxASSERT( outputFile );
817  wxSize size( aSize );
818  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
819 
820  // Plot as an aperture flash
821  switch( int( orient ) )
822  {
823  case 900:
824  case 2700: // rotation of 90 degrees or 270 swaps sizes
825  std::swap( size.x, size.y );
826  // Pass through
827  case 0:
828  case 1800:
829  if( trace_mode == SKETCH )
830  {
832 
833  if( gbr_metadata )
834  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
835 
836  Rect( wxPoint( pos.x - (size.x - currentPenWidth) / 2,
837  pos.y - (size.y - currentPenWidth) / 2 ),
838  wxPoint( pos.x + (size.x - currentPenWidth) / 2,
839  pos.y + (size.y - currentPenWidth) / 2 ),
841  }
842  else
843  {
844  DPOINT pos_dev = userToDeviceCoordinates( pos );
845  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
846  selectAperture( size, APERTURE::AT_RECT, aperture_attrib );
847 
848  if( gbr_metadata )
849  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
850 
851  emitDcode( pos_dev, 3 );
852  }
853  break;
854 
855  default: // plot pad shape as polygon
856  {
857  // XXX to do: use an aperture macro to declare the rotated pad
858  wxPoint coord[4];
859  // coord[0] is assumed the lower left
860  // coord[1] is assumed the upper left
861  // coord[2] is assumed the upper right
862  // coord[3] is assumed the lower right
863 
864  /* Trace the outline. */
865  coord[0].x = -size.x/2; // lower left
866  coord[0].y = size.y/2;
867  coord[1].x = -size.x/2; // upper left
868  coord[1].y = -size.y/2;
869  coord[2].x = size.x/2; // upper right
870  coord[2].y = -size.y/2;
871  coord[3].x = size.x/2; // lower right
872  coord[3].y = size.y/2;
873 
874  FlashPadTrapez( pos, coord, orient, trace_mode, aData );
875  }
876  break;
877  }
878 }
virtual void FlashPadTrapez(const wxPoint &aPadPos, const wxPoint *aCorners, double aPadOrient, EDA_DRAW_MODE_T aTraceMode, void *aData) override
Trapezoidal pad at the moment are never handled as aperture, since they require aperture macros TODO:...
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:158
void emitDcode(const DPOINT &pt, int dcode)
Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (fo...
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
int currentPenWidth
Definition: plotter.h:584
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205

References APERTURE::AT_RECT, PLOTTER::currentPenWidth, emitDcode(), FlashPadTrapez(), formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), PLOTTER::GetCurrentLineWidth(), GBR_METADATA::m_NetlistMetadata, NO_FILL, PLOTTER::outputFile, Rect(), selectAperture(), SetCurrentLineWidth(), SKETCH, PLOTTER::USE_DEFAULT_LINE_WIDTH, and PLOTTER::userToDeviceCoordinates().

◆ FlashPadRoundRect()

void GERBER_PLOTTER::FlashPadRoundRect ( const wxPoint &  aPadPos,
const wxSize &  aSize,
int  aCornerRadius,
double  aOrient,
EDA_DRAW_MODE_T  aTraceMode,
void *  aData 
)
overridevirtual

Roundrect pad at the moment are not handled as aperture, since they require aperture macros TODO: always use flashed shapes (aperture macros)

Implements PLOTTER.

Definition at line 880 of file GERBER_plotter.cpp.

884 {
885  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
886 
887  // Currently, a Pad RoundRect is plotted as polygon.
888  // TODO: use Aperture macro and flash it
889  SHAPE_POLY_SET outline;
890  TransformRoundChamferedRectToPolygon( outline, aPadPos, aSize, aOrient,
891  aCornerRadius, 0.0, 0, GetPlotterArcHighDef() );
892 
893  if( aTraceMode != FILLED )
894  {
896  outline.Inflate( -GetCurrentLineWidth()/2, 16 );
897  }
898 
899  std::vector< wxPoint > cornerList;
900  // TransformRoundRectToPolygon creates only one convex polygon
901  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
902  cornerList.reserve( poly.PointCount() + 1 );
903 
904  for( int ii = 0; ii < poly.PointCount(); ++ii )
905  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
906 
907  // Close polygon
908  cornerList.push_back( cornerList[0] );
909 
910  if( aTraceMode == SKETCH )
911  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), gbr_metadata );
912  else
913  PlotGerberRegion( cornerList, gbr_metadata );
914 }
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aCornerBuffer, const wxPoint &aPosition, const wxSize &aSize, double aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aApproxErrorMax, int aMinSegPerCircleCount)
convert a rectangle with rounded corners and/or chamfered corners to a polygon Convert rounded corner...
void Inflate(int aAmount, int aCircleSegmentsCount, CORNER_STRATEGY aCornerStrategy=ROUND_ALL_CORNERS)
Performs outline inflation/deflation.
int PointCount() const
Function PointCount()
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
const VECTOR2I & CPoint(int aIndex) const
Function Point()
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
void PlotGerberRegion(const std::vector< wxPoint > &aCornerList, void *aData=NULL)
Plot a Gerber region: similar to PlotPoly but plot only filled polygon, and add the TA....
Class SHAPE_LINE_CHAIN.
int GetPlotterArcHighDef() const
Definition: plotter.h:220

References SHAPE_LINE_CHAIN::CPoint(), FILLED, PLOTTER::GetCurrentLineWidth(), PLOTTER::GetPlotterArcHighDef(), SHAPE_POLY_SET::Inflate(), NO_FILL, SHAPE_POLY_SET::Outline(), PlotGerberRegion(), PlotPoly(), SHAPE_LINE_CHAIN::PointCount(), SetCurrentLineWidth(), SKETCH, TransformRoundChamferedRectToPolygon(), PLOTTER::USE_DEFAULT_LINE_WIDTH, VECTOR2< T >::x, and VECTOR2< T >::y.

◆ FlashPadTrapez()

void GERBER_PLOTTER::FlashPadTrapez ( const wxPoint &  aPadPos,
const wxPoint *  aCorners,
double  aPadOrient,
EDA_DRAW_MODE_T  aTraceMode,
void *  aData 
)
overridevirtual

Trapezoidal pad at the moment are never handled as aperture, since they require aperture macros TODO: always use flashed shapes (aperture macros)

Implements PLOTTER.

Definition at line 958 of file GERBER_plotter.cpp.

961 {
962  // TODO: use Aperture macro and flash it
963 
964  // polygon corners list
965  std::vector<wxPoint> cornerList = { aCorners[0], aCorners[1], aCorners[2], aCorners[3] };
966 
967  // Draw the polygon and fill the interior as required
968  for( unsigned ii = 0; ii < 4; ii++ )
969  {
970  RotatePoint( &cornerList[ii], aPadOrient );
971  cornerList[ii] += aPadPos;
972  }
973 
974  // Close the polygon
975  cornerList.push_back( cornerList[0] );
976  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
977 
978  GBR_METADATA metadata;
979 
980  if( gbr_metadata )
981  metadata = *gbr_metadata;
982 
983  if( aTrace_Mode == SKETCH )
985  &metadata );
986  else
987  PlotGerberRegion( cornerList, &metadata );
988 }
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.
void PlotGerberRegion(const std::vector< wxPoint > &aCornerList, void *aData=NULL)
Plot a Gerber region: similar to PlotPoly but plot only filled polygon, and add the TA....

References NO_FILL, PlotGerberRegion(), PlotPoly(), RotatePoint(), SKETCH, and PLOTTER::USE_DEFAULT_LINE_WIDTH.

Referenced by FlashPadRect().

◆ FlashRegularPolygon()

void GERBER_PLOTTER::FlashRegularPolygon ( const wxPoint &  aShapePos,
int  aDiameter,
int  aCornerCount,
double  aOrient,
EDA_DRAW_MODE_T  aTraceMode,
void *  aData 
)
overridevirtual

Flash a regular polygon.

Usefull only in Gerber files to flash a regular polygon

Parameters
aShapePosis the center of the circle containing the polygon
aRadiusis the radius of the circle containing the polygon
aCornerCountis the number of vertices
aOrientis the polygon rotation in degrees
aDatais a auxiliary parameter used (if needed) to handle extra info specific to the plotter

Implements PLOTTER.

Definition at line 991 of file GERBER_plotter.cpp.

995 {
996  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
997 
998  if( aTraceMode == SKETCH )
999  {
1000  // Build the polygon:
1001  std::vector< wxPoint > cornerList;
1002 
1003  double angle_delta = 3600.0 / aCornerCount; // in 0.1 degree
1004 
1005  for( int ii = 0; ii < aCornerCount; ii++ )
1006  {
1007  double rot = aOrient + (angle_delta*ii);
1008  wxPoint vertice( aDiameter/2, 0 );
1009  RotatePoint( &vertice, rot );
1010  vertice += aShapePos;
1011  cornerList.push_back( vertice );
1012  }
1013 
1014  cornerList.push_back( cornerList[0] ); // Close the shape
1015 
1016  SetCurrentLineWidth( aDiameter/8, gbr_metadata );
1017  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), gbr_metadata );
1018  }
1019  else
1020  {
1021  DPOINT pos_dev = userToDeviceCoordinates( aShapePos );
1022 
1023  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
1024 
1025  APERTURE::APERTURE_TYPE apert_type =
1027  selectAperture( aDiameter, aOrient, apert_type, aperture_attrib );
1028 
1029  if( gbr_metadata )
1030  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
1031 
1032  emitDcode( pos_dev, 3 );
1033  }
1034 }
APERTURE_TYPE
Definition: plotter.h:1056
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:158
void emitDcode(const DPOINT &pt, int dcode)
Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (fo...
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205

References APERTURE::AT_REGULAR_POLY3, emitDcode(), formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), PLOTTER::GetCurrentLineWidth(), GBR_METADATA::m_NetlistMetadata, NO_FILL, PlotPoly(), RotatePoint(), selectAperture(), SetCurrentLineWidth(), SKETCH, and PLOTTER::userToDeviceCoordinates().

Referenced by PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ formatNetAttribute()

void GERBER_PLOTTER::formatNetAttribute ( GBR_NETLIST_METADATA aData)
protected

print a Gerber net attribute object record.

In a gerber file, a net attribute is owned by a graphic object formatNetAttribute must be called before creating the object

Parameters
aDatacontains the dato to format. the generated string depends on the type of netlist info

Definition at line 149 of file GERBER_plotter.cpp.

150 {
151  // print a Gerber net attribute record.
152  // it is added to the object attributes dictionary
153  // On file, only modified or new attributes are printed.
154  if( aData == NULL )
155  return;
156 
157  if( !m_useNetAttributes )
158  return;
159 
160  bool useX1StructuredComment = !m_useX2format;
161 
162  bool clearDict;
163  std::string short_attribute_string;
164 
165  if( !FormatNetAttribute( short_attribute_string, m_objectAttributesDictionnary,
166  aData, clearDict, useX1StructuredComment ) )
167  return;
168 
169  if( clearDict )
171 
172  if( !short_attribute_string.empty() )
173  fputs( short_attribute_string.c_str(), outputFile );
174 
175  if( m_useX2format && !aData->m_ExtraData.IsEmpty() )
176  {
177  std::string extra_data = TO_UTF8( aData->m_ExtraData );
178  fputs( extra_data.c_str(), outputFile );
179  }
180 }
void clearNetAttribute()
clear a Gerber net attribute record (clear object attribute dictionary) and output the clear object a...
bool m_useNetAttributes
Definition: plotter.h:1380
bool FormatNetAttribute(std::string &aPrintedText, std::string &aLastNetAttributes, GBR_NETLIST_METADATA *aData, bool &aClearPreviousAttributes, bool aUseX1StructuredComment)
Generates the string to print to a gerber file, to set a net attribute for a graphic object.
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
wxString m_ExtraData
a string to print after TO object attributes, if not empty it is printed "as this"
bool m_useX2format
Definition: plotter.h:1377
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
std::string m_objectAttributesDictionnary
Definition: plotter.h:1357

References clearNetAttribute(), FormatNetAttribute(), GBR_NETLIST_METADATA::m_ExtraData, m_objectAttributesDictionnary, m_useNetAttributes, m_useX2format, PLOTTER::outputFile, and TO_UTF8.

Referenced by FlashPadCircle(), FlashPadOval(), FlashPadRect(), FlashRegularPolygon(), PlotPoly(), Text(), ThickArc(), ThickCircle(), ThickRect(), and ThickSegment().

◆ GetColorMode()

bool PLOTTER::GetColorMode ( ) const
inlineinherited

◆ GetCurrentLineWidth()

◆ GetDashGapLenIU()

double PLOTTER::GetDashGapLenIU ( ) const
protectedinherited

Definition at line 150 of file plotter.cpp.

151 {
153 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:123
#define DASH_GAP_LEN(aLineWidth)

References DASH_GAP_LEN, PLOTTER::GetCurrentLineWidth(), and PLOTTER::userToDeviceSize().

Referenced by PS_PLOTTER::SetDash(), PDF_PLOTTER::SetDash(), and SVG_PLOTTER::setSVGPlotStyle().

◆ GetDashMarkLenIU()

double PLOTTER::GetDashMarkLenIU ( ) const
protectedinherited

Definition at line 144 of file plotter.cpp.

145 {
147 }
#define DASH_MARK_LEN(aLineWidth)
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:123

References DASH_MARK_LEN, PLOTTER::GetCurrentLineWidth(), and PLOTTER::userToDeviceSize().

Referenced by PS_PLOTTER::SetDash(), PDF_PLOTTER::SetDash(), and SVG_PLOTTER::setSVGPlotStyle().

◆ GetDefaultFileExtension()

static wxString GERBER_PLOTTER::GetDefaultFileExtension ( )
inlinestatic

Definition at line 1149 of file plotter.h.

1150  {
1151  return wxString( wxT( "gbr" ) );
1152  }

Referenced by GetDefaultPlotExtension().

◆ GetDotMarkLenIU()

double PLOTTER::GetDotMarkLenIU ( ) const
protectedinherited

Definition at line 138 of file plotter.cpp.

139 {
141 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
#define DOT_MARK_LEN(aLineWidth)
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:123

References DOT_MARK_LEN, PLOTTER::GetCurrentLineWidth(), and PLOTTER::userToDeviceSize().

Referenced by PS_PLOTTER::SetDash(), PDF_PLOTTER::SetDash(), and SVG_PLOTTER::setSVGPlotStyle().

◆ GetIUsPerDecimil()

double PLOTTER::GetIUsPerDecimil ( ) const
inlineinherited

The IUs per decimil are an essential scaling factor when plotting; they are set and saved when establishing the viewport.

Here they can be get back again

Definition at line 217 of file plotter.h.

217 { return m_IUsPerDecimil; }
double m_IUsPerDecimil
Definition: plotter.h:563

References PLOTTER::m_IUsPerDecimil.

Referenced by PlotWorkSheet().

◆ GetOrCreateAperture()

int GERBER_PLOTTER::GetOrCreateAperture ( const wxSize &  aSize,
APERTURE::APERTURE_TYPE  aType,
int  aApertureAttribute 
)
Returns
a index to the aperture in aperture list which meets the size and type of tool if the aperture does not exist, it is created and entered in aperture list
Parameters
aSize= the size of tool
aType= the type ( shape ) of tool
aApertureAttribute= an aperture attribute of the tool (a tool can have onlu one attribute) 0 = no specific attribute

Definition at line 308 of file GERBER_plotter.cpp.

310 {
311  int last_D_code = 9;
312 
313  // Search an existing aperture
314  for( int idx = 0; idx < (int)m_apertures.size(); ++idx )
315  {
316  APERTURE* tool = &m_apertures[idx];
317  last_D_code = tool->m_DCode;
318 
319  if( (tool->m_Type == aType) && (tool->m_Size == aSize) &&
320  (tool->m_ApertureAttribute == aApertureAttribute) )
321  return idx;
322  }
323 
324  // Allocate a new aperture
325  APERTURE new_tool;
326  new_tool.m_Size = aSize;
327  new_tool.m_Type = aType;
328  new_tool.m_DCode = last_D_code + 1;
329  new_tool.m_ApertureAttribute = aApertureAttribute;
330 
331  m_apertures.push_back( new_tool );
332 
333  return m_apertures.size() - 1;
334 }
APERTURE_TYPE m_Type
Definition: plotter.h:1122
wxSize m_Size
Definition: plotter.h:1127
std::vector< APERTURE > m_apertures
Definition: plotter.h:1371
int m_DCode
Definition: plotter.h:1130
int m_ApertureAttribute
Definition: plotter.h:1135

References APERTURE::m_ApertureAttribute, m_apertures, APERTURE::m_DCode, APERTURE::m_Size, and APERTURE::m_Type.

Referenced by selectAperture().

◆ GetPlotterArcHighDef()

int PLOTTER::GetPlotterArcHighDef ( ) const
inlineinherited

◆ GetPlotterArcLowDef()

int PLOTTER::GetPlotterArcLowDef ( ) const
inlineinherited

Definition at line 219 of file plotter.h.

219 { return m_IUsPerDecimil * 8; }
double m_IUsPerDecimil
Definition: plotter.h:563

References PLOTTER::m_IUsPerDecimil.

◆ GetPlotterType()

virtual PlotFormat GERBER_PLOTTER::GetPlotterType ( ) const
inlineoverridevirtual

Returns the effective plot engine in use.

It's not very OO but for now is required since some things are only done with some output devices (like drill marks, emitted only for postscript

Implements PLOTTER.

Definition at line 1144 of file plotter.h.

1145  {
1146  return PLOT_FORMAT_GERBER;
1147  }

References PLOT_FORMAT_GERBER.

◆ LineTo()

void PLOTTER::LineTo ( const wxPoint &  pos)
inlineinherited

Definition at line 259 of file plotter.h.

260  {
261  PenTo( pos, 'D' );
262  }
virtual void PenTo(const wxPoint &pos, char plume)=0
moveto/lineto primitive, moves the 'pen' to the specified direction

References PLOTTER::PenTo().

Referenced by PLOTTER::Arc(), PLOTTER::BezierCurve(), DXF_PLOTTER::FlashPadCustom(), DXF_PLOTTER::FlashPadRect(), DXF_PLOTTER::FlashPadRoundRect(), DXF_PLOTTER::FlashPadTrapez(), SCH_SHEET::Plot(), HPGL_PLOTTER::PlotPoly(), PlotPoly(), DXF_PLOTTER::PlotPoly(), LIB_PIN::PlotSymbol(), and DXF_PLOTTER::Rect().

◆ Marker()

void PLOTTER::Marker ( const wxPoint &  position,
int  diametre,
unsigned  aShapeId 
)
inherited

Draw a pattern shape number aShapeId, to coord position.

Diameter diameter = (coord table) hole AShapeId = index (used to generate forms characters)

Definition at line 330 of file plotter.cpp.

331 {
332  int radius = diametre / 2;
333  /* Marker are composed by a series of 'parts' superimposed; not every
334  combination make sense, obviously. Since they are used in order I
335  tried to keep the uglier/more complex constructions at the end.
336  Also I avoided the |/ |\ -/ -\ construction because they're *very*
337  ugly... if needed they could be added anyway... I'd like to see
338  a board with more than 58 drilling/slotting tools!
339  If Visual C++ supported the 0b literals they would be optimally
340  and easily encoded as an integer array. We have to do with octal */
341  static const unsigned char marker_patterns[MARKER_COUNT] = {
342  // Bit order: O Square Lozenge - | \ /
343  // First choice: simple shapes
344  0003, // X
345  0100, // O
346  0014, // +
347  0040, // Sq
348  0020, // Lz
349  // Two simple shapes
350  0103, // X O
351  0017, // X +
352  0043, // X Sq
353  0023, // X Lz
354  0114, // O +
355  0140, // O Sq
356  0120, // O Lz
357  0054, // + Sq
358  0034, // + Lz
359  0060, // Sq Lz
360  // Three simple shapes
361  0117, // X O +
362  0143, // X O Sq
363  0123, // X O Lz
364  0057, // X + Sq
365  0037, // X + Lz
366  0063, // X Sq Lz
367  0154, // O + Sq
368  0134, // O + Lz
369  0074, // + Sq Lz
370  // Four simple shapes
371  0174, // O Sq Lz +
372  0163, // X O Sq Lz
373  0157, // X O Sq +
374  0137, // X O Lz +
375  0077, // X Sq Lz +
376  // This draws *everything *
377  0177, // X O Sq Lz +
378  // Here we use the single bars... so the cross is forbidden
379  0110, // O -
380  0104, // O |
381  0101, // O /
382  0050, // Sq -
383  0044, // Sq |
384  0041, // Sq /
385  0030, // Lz -
386  0024, // Lz |
387  0021, // Lz /
388  0150, // O Sq -
389  0144, // O Sq |
390  0141, // O Sq /
391  0130, // O Lz -
392  0124, // O Lz |
393  0121, // O Lz /
394  0070, // Sq Lz -
395  0064, // Sq Lz |
396  0061, // Sq Lz /
397  0170, // O Sq Lz -
398  0164, // O Sq Lz |
399  0161, // O Sq Lz /
400  // Last resort: the backlash component (easy to confound)
401  0102, // \ O
402  0042, // \ Sq
403  0022, // \ Lz
404  0142, // \ O Sq
405  0122, // \ O Lz
406  0062, // \ Sq Lz
407  0162 // \ O Sq Lz
408  };
409  if( aShapeId >= MARKER_COUNT )
410  {
411  // Fallback shape
412  markerCircle( position, radius );
413  }
414  else
415  {
416  // Decode the pattern and draw the corresponding parts
417  unsigned char pat = marker_patterns[aShapeId];
418  if( pat & 0001 )
419  markerSlash( position, radius );
420  if( pat & 0002 )
421  markerBackSlash( position, radius );
422  if( pat & 0004 )
423  markerVBar( position, radius );
424  if( pat & 0010 )
425  markerHBar( position, radius );
426  if( pat & 0020 )
427  markerLozenge( position, radius );
428  if( pat & 0040 )
429  markerSquare( position, radius );
430  if( pat & 0100 )
431  markerCircle( position, radius );
432  }
433 }
void markerHBar(const wxPoint &pos, int radius)
Plot a - bar centered on the position.
Definition: plotter.cpp:302
static const unsigned MARKER_COUNT
Draw a marker (used for the drill map)
Definition: plotter.h:425
void markerSlash(const wxPoint &pos, int radius)
Plot a / bar centered on the position.
Definition: plotter.cpp:309
void markerLozenge(const wxPoint &position, int radius)
Plot a lozenge centered on the position.
Definition: plotter.cpp:278
void markerCircle(const wxPoint &pos, int radius)
Plot a circle centered on the position.
Definition: plotter.cpp:272
void markerVBar(const wxPoint &pos, int radius)
Plot a | bar centered on the position.
Definition: plotter.cpp:323
void markerSquare(const wxPoint &position, int radius)
Plot a square centered on the position.
Definition: plotter.cpp:247
void markerBackSlash(const wxPoint &pos, int radius)
Plot a \ bar centered on the position.
Definition: plotter.cpp:316

References PLOTTER::MARKER_COUNT, PLOTTER::markerBackSlash(), PLOTTER::markerCircle(), PLOTTER::markerHBar(), PLOTTER::markerLozenge(), PLOTTER::markerSlash(), PLOTTER::markerSquare(), and PLOTTER::markerVBar().

Referenced by GENDRILL_WRITER_BASE::genDrillMapFile(), and GENDRILL_WRITER_BASE::plotDrillMarks().

◆ markerBackSlash()

void PLOTTER::markerBackSlash ( const wxPoint &  pos,
int  radius 
)
protectedinherited

Plot a \ bar centered on the position.

Building block for markers

Definition at line 316 of file plotter.cpp.

317 {
318  MoveTo( wxPoint( pos.x + radius, pos.y - radius ) );
319  FinishTo( wxPoint( pos.x - radius, pos.y + radius ) );
320 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254

References PLOTTER::FinishTo(), and PLOTTER::MoveTo().

Referenced by PLOTTER::Marker().

◆ markerCircle()

void PLOTTER::markerCircle ( const wxPoint &  pos,
int  radius 
)
protectedinherited

Plot a circle centered on the position.

Building block for markers

Definition at line 272 of file plotter.cpp.

273 {
274  Circle( position, radius * 2, NO_FILL, GetCurrentLineWidth() );
275 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
virtual void Circle(const wxPoint &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0

References PLOTTER::Circle(), PLOTTER::GetCurrentLineWidth(), and NO_FILL.

Referenced by PLOTTER::Marker().

◆ markerHBar()

void PLOTTER::markerHBar ( const wxPoint &  pos,
int  radius 
)
protectedinherited

Plot a - bar centered on the position.

Building block for markers

Definition at line 302 of file plotter.cpp.

303 {
304  MoveTo( wxPoint( pos.x - radius, pos.y ) );
305  FinishTo( wxPoint( pos.x + radius, pos.y ) );
306 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254

References PLOTTER::FinishTo(), and PLOTTER::MoveTo().

Referenced by PLOTTER::Marker().

◆ markerLozenge()

void PLOTTER::markerLozenge ( const wxPoint &  position,
int  radius 
)
protectedinherited

Plot a lozenge centered on the position.

Building block for markers

Definition at line 278 of file plotter.cpp.

279 {
280  std::vector< wxPoint > corner_list;
281  wxPoint corner;
282  corner.x = position.x;
283  corner.y = position.y + radius;
284  corner_list.push_back( corner );
285  corner.x = position.x + radius;
286  corner.y = position.y,
287  corner_list.push_back( corner );
288  corner.x = position.x;
289  corner.y = position.y - radius;
290  corner_list.push_back( corner );
291  corner.x = position.x - radius;
292  corner.y = position.y;
293  corner_list.push_back( corner );
294  corner.x = position.x;
295  corner.y = position.y + radius;
296  corner_list.push_back( corner );
297 
298  PlotPoly( corner_list, NO_FILL, GetCurrentLineWidth() );
299 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Function PlotPoly.
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152

References PLOTTER::GetCurrentLineWidth(), NO_FILL, and PLOTTER::PlotPoly().

Referenced by PLOTTER::Marker().

◆ markerSlash()

void PLOTTER::markerSlash ( const wxPoint &  pos,
int  radius 
)
protectedinherited

Plot a / bar centered on the position.

Building block for markers

Definition at line 309 of file plotter.cpp.

310 {
311  MoveTo( wxPoint( pos.x - radius, pos.y - radius ) );
312  FinishTo( wxPoint( pos.x + radius, pos.y + radius ) );
313 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254

References PLOTTER::FinishTo(), and PLOTTER::MoveTo().

Referenced by PLOTTER::Marker().

◆ markerSquare()

void PLOTTER::markerSquare ( const wxPoint &  position,
int  radius 
)
protectedinherited

Plot a square centered on the position.

Building block for markers

Definition at line 247 of file plotter.cpp.

248 {
249  double r = KiROUND( radius / 1.4142 );
250  std::vector< wxPoint > corner_list;
251  wxPoint corner;
252  corner.x = position.x + r;
253  corner.y = position.y + r;
254  corner_list.push_back( corner );
255  corner.x = position.x + r;
256  corner.y = position.y - r;
257  corner_list.push_back( corner );
258  corner.x = position.x - r;
259  corner.y = position.y - r;
260  corner_list.push_back( corner );
261  corner.x = position.x - r;
262  corner.y = position.y + r;
263  corner_list.push_back( corner );
264  corner.x = position.x + r;
265  corner.y = position.y + r;
266  corner_list.push_back( corner );
267 
268  PlotPoly( corner_list, NO_FILL, GetCurrentLineWidth() );
269 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Function PlotPoly.
virtual int GetCurrentLineWidth() const
Definition: plotter.h:152
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 PLOTTER::GetCurrentLineWidth(), KiROUND(), NO_FILL, and PLOTTER::PlotPoly().

Referenced by PLOTTER::Marker().

◆ markerVBar()

void PLOTTER::markerVBar ( const wxPoint &  pos,
int  radius 
)
protectedinherited

Plot a | bar centered on the position.

Building block for markers

Definition at line 323 of file plotter.cpp.

324 {
325  MoveTo( wxPoint( pos.x, pos.y - radius ) );
326  FinishTo( wxPoint( pos.x, pos.y + radius ) );
327 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254

References PLOTTER::FinishTo(), and PLOTTER::MoveTo().

Referenced by PLOTTER::Marker().

◆ MoveTo()

◆ OpenFile()

bool PLOTTER::OpenFile ( const wxString &  aFullFilename)
virtualinherited

Open or create the plot file aFullFilename.

Parameters
aFullFilename= the full file name of the file to create
Returns
true if success, false if the file cannot be created/opened

Virtual because some plotters use ascii files, some others binary files (PDF) The base class open the file in text mode

Reimplemented in PDF_PLOTTER.

Definition at line 81 of file plotter.cpp.

82 {
83  filename = aFullFilename;
84 
85  wxASSERT( !outputFile );
86 
87  // Open the file in text mode (not suitable for all plotters
88  // but only for most of them
89  outputFile = wxFopen( filename, wxT( "wt" ) );
90 
91  if( outputFile == NULL )
92  return false ;
93 
94  return true;
95 }
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
wxString filename
Definition: plotter.h:590

References PLOTTER::filename, and PLOTTER::outputFile.

Referenced by GERBER_WRITER::createDrillFile(), PLACEFILE_GERBER_WRITER::CreatePlaceFile(), GENDRILL_WRITER_BASE::genDrillMapFile(), DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL(), DIALOG_PLOT_SCHEMATIC::PlotOneSheetDXF(), DIALOG_PLOT_SCHEMATIC::plotOneSheetPS(), DIALOG_PLOT_SCHEMATIC::plotOneSheetSVG(), StartPlotBoard(), and LIB_EDIT_FRAME::SVG_PlotComponent().

◆ PenFinish()

void PLOTTER::PenFinish ( )
inlineinherited

Definition at line 270 of file plotter.h.

271  {
272  // The point is not important with Z motion
273  PenTo( wxPoint( 0, 0 ), 'Z' );
274  }
virtual void PenTo(const wxPoint &pos, char plume)=0
moveto/lineto primitive, moves the 'pen' to the specified direction

References PLOTTER::PenTo().

Referenced by HPGL_PLOTTER::Arc(), HPGL_PLOTTER::Circle(), HPGL_PLOTTER::FlashPadCircle(), HPGL_PLOTTER::PlotPoly(), PlotPoly(), DXF_PLOTTER::PlotPoly(), and HPGL_PLOTTER::Rect().

◆ PenTo()

void GERBER_PLOTTER::PenTo ( const wxPoint &  pos,
char  plume 
)
overridevirtual

moveto/lineto primitive, moves the 'pen' to the specified direction

Parameters
posis the target position
plumespecifies the kind of motion: 'U' only moves the pen, 'D' draw a line from the current position and 'Z' finish the drawing and returns the 'pen' to rest (flushes the trace)

Implements PLOTTER.

Definition at line 469 of file GERBER_plotter.cpp.

470 {
471  wxASSERT( outputFile );
472  DPOINT pos_dev = userToDeviceCoordinates( aPos );
473 
474  switch( plume )
475  {
476  case 'Z':
477  break;
478 
479  case 'U':
480  emitDcode( pos_dev, 2 );
481  break;
482 
483  case 'D':
484  emitDcode( pos_dev, 1 );
485  }
486 
487  penState = plume;
488 }
char penState
Current pen state: 'U', 'D' or 'Z' (see PenTo)
Definition: plotter.h:586
void emitDcode(const DPOINT &pt, int dcode)
Emit a D-Code record, using proper conversions to format a leading zero omitted gerber coordinate (fo...
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:98
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578

References emitDcode(), PLOTTER::outputFile, PLOTTER::penState, and PLOTTER::userToDeviceCoordinates().

◆ PlotGerberRegion()

void GERBER_PLOTTER::PlotGerberRegion ( const std::vector< wxPoint > &  aCornerList,
void *  aData = NULL 
)

Plot a Gerber region: similar to PlotPoly but plot only filled polygon, and add the TA.AperFunction if aData contains this attribute, and clear it after plotting.

Definition at line 544 of file GERBER_plotter.cpp.

546 {
547  if( aCornerList.size() <= 2 )
548  return;
549 
550  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
551 
552  bool clearTA_AperFunction = false; // true if a TA.AperFunction is used
553 
554  if( gbr_metadata )
555  {
556  std::string attrib = gbr_metadata->m_ApertureMetadata.FormatAttribute( !m_useX2format );
557 
558  if( !attrib.empty() )
559  {
560  fputs( attrib.c_str(), outputFile );
561  clearTA_AperFunction = true;
562  }
563  }
564 
565  PlotPoly( aCornerList, FILLED_SHAPE, 0 , gbr_metadata );
566 
567  // Clear the TA attribute, to avoid the next item to inherit it:
568  if( clearTA_AperFunction )
569  {
570  if( m_useX2format )
571  {
572  fputs( "%TD.AperFunction*%\n", outputFile );
573  }
574  else
575  {
576  fputs( "G04 #@! TD.AperFunction*\n", outputFile );
577  }
578  }
579 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.
bool m_useX2format
Definition: plotter.h:1377
static std::string FormatAttribute(GBR_APERTURE_ATTRIB aAttribute, bool aUseX1StructuredComment)
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
GBR_APERTURE_METADATA m_ApertureMetadata
a item to handle aperture attribute:
Definition: gbr_metadata.h:200

References FILLED_SHAPE, GBR_APERTURE_METADATA::FormatAttribute(), GBR_METADATA::m_ApertureMetadata, m_useX2format, PLOTTER::outputFile, and PlotPoly().

Referenced by FlashPadCustom(), FlashPadRoundRect(), and FlashPadTrapez().

◆ PlotImage()

void PLOTTER::PlotImage ( const wxImage &  aImage,
const wxPoint &  aPos,
double  aScaleFactor 
)
virtualinherited

Function PlotImage Only Postscript plotters can plot bitmaps for plotters that cannot plot a bitmap, a rectangle is plotted.

Draw an image bitmap

Parameters
aImage= the bitmap
aPos= position of the center of the bitmap
aScaleFactor= the scale factor to apply to the bitmap size (this is not the plot scale factor)

Reimplemented in SVG_PLOTTER, PDF_PLOTTER, and PS_PLOTTER.

Definition at line 230 of file plotter.cpp.

231 {
232  wxSize size( aImage.GetWidth() * aScaleFactor,
233  aImage.GetHeight() * aScaleFactor );
234 
235  wxPoint start = aPos;
236  start.x -= size.x / 2;
237  start.y -= size.y / 2;
238 
239  wxPoint end = start;
240  end.x += size.x;
241  end.y += size.y;
242 
243  Rect( start, end, NO_FILL );
244 }
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0

References NO_FILL, and PLOTTER::Rect().

Referenced by BITMAP_BASE::PlotImage(), and SVG_PLOTTER::PlotImage().

◆ PlotPoly() [1/2]

void PLOTTER::PlotPoly ( const SHAPE_LINE_CHAIN aCornerList,
FILL_T  aFill,
int  aWidth = USE_DEFAULT_LINE_WIDTH,
void *  aData = NULL 
)
virtualinherited

Function PlotPoly.

Draw a polygon ( filled or not )

Parameters
aCornerList= corners list (a SHAPE_LINE_CHAIN). must be closed (IsClosed() == true) for a polygon. Otherwise this is a polyline
aFill= type of fill
aWidth= line width
aDataan auxiliary info (mainly for gerber format)

Definition at line 574 of file plotter.cpp.

576 {
577  std::vector<wxPoint> cornerList;
578  cornerList.reserve( aCornerList.PointCount() );
579 
580  for( int ii = 0; ii < aCornerList.PointCount(); ii++ )
581  cornerList.emplace_back( aCornerList.CPoint( ii ) );
582 
583  if( aCornerList.IsClosed() && cornerList.front() != cornerList.back() )
584  cornerList.emplace_back( aCornerList.CPoint( 0 ) );
585 
586  PlotPoly( cornerList, aFill, aWidth, aData );
587 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Function PlotPoly.
int PointCount() const
Function PointCount()
const VECTOR2I & CPoint(int aIndex) const
Function Point()
bool IsClosed() const
Function IsClosed()

References SHAPE_LINE_CHAIN::CPoint(), SHAPE_LINE_CHAIN::IsClosed(), PLOTTER::PlotPoly(), and SHAPE_LINE_CHAIN::PointCount().

◆ PlotPoly() [2/2]

void GERBER_PLOTTER::PlotPoly ( const std::vector< wxPoint > &  aCornerList,
FILL_T  aFill,
int  aWidth = USE_DEFAULT_LINE_WIDTH,
void *  aData = nullptr 
)
overridevirtual

Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.

Implements PLOTTER.

Definition at line 581 of file GERBER_plotter.cpp.

583 {
584  if( aCornerList.size() <= 1 )
585  return;
586 
587  // Gerber format does not know filled polygons with thick outline
588  // Therefore, to plot a filled polygon with outline having a thickness,
589  // one should plot outline as thick segments
590  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
591 
592  if( gbr_metadata )
593  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
594 
595  if( aFill )
596  {
597  fputs( "G36*\n", outputFile );
598 
599  MoveTo( aCornerList[0] );
600  fputs( "G01*\n", outputFile ); // Set linear interpolation.
601 
602  for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
603  LineTo( aCornerList[ii] );
604 
605  // If the polygon is not closed, close it:
606  if( aCornerList[0] != aCornerList[aCornerList.size()-1] )
607  FinishTo( aCornerList[0] );
608 
609  fputs( "G37*\n", outputFile );
610  }
611 
612  if( aWidth > 0 ) // Draw the polyline/polygon outline
613  {
614  SetCurrentLineWidth( aWidth, gbr_metadata );
615 
616  MoveTo( aCornerList[0] );
617 
618  for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
619  LineTo( aCornerList[ii] );
620 
621  // Ensure the thick outline is closed for filled polygons
622  // (if not filled, could be only a polyline)
623  if( aFill && ( aCornerList[aCornerList.size()-1] != aCornerList[0] ) )
624  LineTo( aCornerList[0] );
625 
626  PenFinish();
627  }
628 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void PenFinish()
Definition: plotter.h:270
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
void LineTo(const wxPoint &pos)
Definition: plotter.h:259
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205

References PLOTTER::FinishTo(), formatNetAttribute(), PLOTTER::LineTo(), GBR_METADATA::m_NetlistMetadata, PLOTTER::MoveTo(), PLOTTER::outputFile, PLOTTER::PenFinish(), and SetCurrentLineWidth().

Referenced by FlashPadCustom(), FlashPadRoundRect(), FlashPadTrapez(), FlashRegularPolygon(), PlotGerberRegion(), and Rect().

◆ Rect()

void GERBER_PLOTTER::Rect ( const wxPoint &  p1,
const wxPoint &  p2,
FILL_T  fill,
int  width = USE_DEFAULT_LINE_WIDTH 
)
overridevirtual

Implements PLOTTER.

Definition at line 491 of file GERBER_plotter.cpp.

492 {
493  std::vector< wxPoint > cornerList;
494 
495  // Build corners list
496  cornerList.push_back( p1 );
497  wxPoint corner(p1.x, p2.y);
498  cornerList.push_back( corner );
499  cornerList.push_back( p2 );
500  corner.x = p2.x;
501  corner.y = p1.y;
502  cornerList.push_back( corner );
503  cornerList.push_back( p1 );
504 
505  PlotPoly( cornerList, fill, width );
506 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Gerber polygon: they can (and should) be filled with the appropriate G36/G37 sequence.

References PlotPoly().

Referenced by FlashPadRect(), and ThickRect().

◆ segmentAsOval()

void PLOTTER::segmentAsOval ( const wxPoint &  start,
const wxPoint &  end,
int  width,
EDA_DRAW_MODE_T  tracemode 
)
protectedinherited

Cdonvert a thick segment and plot it as an oval.

Definition at line 436 of file plotter.cpp.

438 {
439  wxPoint center( (start.x + end.x) / 2, (start.y + end.y) / 2 );
440  wxSize size( end.x - start.x, end.y - start.y );
441  double orient;
442 
443  if( size.y == 0 )
444  orient = 0;
445  else if( size.x == 0 )
446  orient = 900;
447  else
448  orient = -ArcTangente( size.y, size.x );
449 
450  size.x = KiROUND( EuclideanNorm( size ) ) + width;
451  size.y = width;
452 
453  FlashPadOval( center, size, orient, tracemode, NULL );
454 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:123
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:160
virtual void FlashPadOval(const wxPoint &aPadPos, const wxSize &aSize, double aPadOrient, EDA_DRAW_MODE_T aTraceMode, void *aData)=0
virtual function FlashPadOval
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 ArcTangente(), EuclideanNorm(), PLOTTER::FlashPadOval(), and KiROUND().

Referenced by PLOTTER::ThickSegment(), HPGL_PLOTTER::ThickSegment(), and ThickSegment().

◆ selectAperture() [1/2]

void GERBER_PLOTTER::selectAperture ( const wxSize &  aSize,
APERTURE::APERTURE_TYPE  aType,
int  aApertureAttribute 
)
protected

Pick an existing aperture or create a new one, matching the size, type and attributes.

write the DCode selection on gerber file

Definition at line 337 of file GERBER_plotter.cpp.

340 {
341  bool change = ( m_currentApertureIdx < 0 ) ||
342  ( m_apertures[m_currentApertureIdx].m_Type != aType ) ||
343  ( m_apertures[m_currentApertureIdx].m_Size != aSize );
344 
345  if( !m_useNetAttributes )
346  aApertureAttribute = 0;
347  else if( !change )
348  change = m_apertures[m_currentApertureIdx].m_ApertureAttribute != aApertureAttribute;
349 
350  if( change )
351  {
352  // Pick an existing aperture or create a new one
353  m_currentApertureIdx = GetOrCreateAperture( aSize, aType, aApertureAttribute );
354  fprintf( outputFile, "D%d*\n", m_apertures[m_currentApertureIdx].m_DCode );
355  }
356 }
int GetOrCreateAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
bool m_useNetAttributes
Definition: plotter.h:1380
std::vector< APERTURE > m_apertures
Definition: plotter.h:1371
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
int m_currentApertureIdx
Definition: plotter.h:1372

References GetOrCreateAperture(), m_apertures, m_currentApertureIdx, m_useNetAttributes, and PLOTTER::outputFile.

Referenced by FlashPadCircle(), FlashPadOval(), FlashPadRect(), FlashRegularPolygon(), selectAperture(), and SetCurrentLineWidth().

◆ selectAperture() [2/2]

void GERBER_PLOTTER::selectAperture ( int  aDiameter,
double  aPolygonRotation,
APERTURE::APERTURE_TYPE  aType,
int  aApertureAttribute 
)
protected

Pick an existing aperture or create a new one, matching the aDiameter, aPolygonRotation, type and attributes.

It apply only to apertures with type = AT_REGULAR_POLY3 to AT_REGULAR_POLY12 write the DCode selection on gerber file

Definition at line 358 of file GERBER_plotter.cpp.

360 {
361  // Pick an existing aperture or create a new one, matching the
362  // aDiameter, aPolygonRotation, type and attributes for type =
363  // AT_REGULAR_POLY3 to AT_REGULAR_POLY12
364 
365  wxASSERT( aType>= APERTURE::APERTURE_TYPE::AT_REGULAR_POLY3 &&
366  aType <= APERTURE::APERTURE_TYPE::AT_REGULAR_POLY12 );
367 
368  // To use selectAperture( size, ... ) calculate a equivalent aperture size:
369  // for AT_REGULAR_POLYxx the parameter APERTURE::m_Size contains
370  // aDiameter (in m_Size.x) and aPolygonRotation in 1/1000 degree (in m_Size.y)
371  wxSize size( aDiameter, (int)( aPolygonRotation * 1000.0 ) );
372  selectAperture( size, aType, aApertureAttribute );
373 }
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.

References selectAperture().

◆ SetColor()

virtual void GERBER_PLOTTER::SetColor ( COLOR4D  color)
inlineoverridevirtual

Implements PLOTTER.

Definition at line 1166 of file plotter.h.

1166 {}

◆ SetColorMode()

virtual void PLOTTER::SetColorMode ( bool  aColorMode)
inlinevirtualinherited

◆ SetCreator()

◆ SetCurrentLineWidth()

void GERBER_PLOTTER::SetCurrentLineWidth ( int  width,
void *  aData = NULL 
)
overridevirtual

Set the line width for the next drawing.

Parameters
widthis specified in IUs
aDatais an auxiliary parameter, mainly used in gerber plotter

Implements PLOTTER.

Definition at line 288 of file GERBER_plotter.cpp.

289 {
290  if( width == DO_NOT_SET_LINE_WIDTH )
291  return;
292 
293  int pen_width;
294 
295  if( width > 0 )
296  pen_width = width;
297  else
298  pen_width = defaultPenWidth;
299 
300  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
301  int aperture_attribute = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
302 
303  selectAperture( wxSize( pen_width, pen_width ), APERTURE::AT_PLOTTING, aperture_attribute );
304  currentPenWidth = pen_width;
305 }
void selectAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
Pick an existing aperture or create a new one, matching the size, type and attributes.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:158
int currentPenWidth
Definition: plotter.h:584
int defaultPenWidth
true to generate a negative image (PS mode mainly)
Definition: plotter.h:583
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:101

References APERTURE::AT_PLOTTING, PLOTTER::currentPenWidth, PLOTTER::defaultPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, GBR_METADATA::GetApertureAttrib(), and selectAperture().

Referenced by Arc(), FlashPadCircle(), FlashPadCustom(), FlashPadRect(), FlashPadRoundRect(), FlashRegularPolygon(), PlotPoly(), ThickArc(), ThickCircle(), ThickRect(), and ThickSegment().

◆ SetDash()

virtual void GERBER_PLOTTER::SetDash ( int  dashed)
inlineoverridevirtual

Implements PLOTTER.

Definition at line 1165 of file plotter.h.

1165 {}

◆ SetDefaultLineWidth()

void GERBER_PLOTTER::SetDefaultLineWidth ( int  width)
overridevirtual

Set the default line width.

Used at the beginning and when a width of -1 (USE_DEFAULT_LINE_WIDTH) is requested.

Parameters
widthis specified in IUs

Implements PLOTTER.

Definition at line 281 of file GERBER_plotter.cpp.

282 {
283  defaultPenWidth = width;
285 }
int defaultPenWidth
true to generate a negative image (PS mode mainly)
Definition: plotter.h:583
int m_currentApertureIdx
Definition: plotter.h:1372

References PLOTTER::defaultPenWidth, and m_currentApertureIdx.

Referenced by SetViewport().

◆ SetGerberCoordinatesFormat()

void GERBER_PLOTTER::SetGerberCoordinatesFormat ( int  aResolution,
bool  aUseInches = false 
)
overridevirtual

Function SetGerberCoordinatesFormat selection of Gerber units and resolution (number of digits in mantissa)

Parameters
aResolution= number of digits in mantissa of coordinate use 5 or 6 for mm and 6 or 7 for inches do not use value > 6 (mm) or > 7 (in) to avoid overflow
aUseInches= true to use inches, false to use mm (default)

Should be called only after SetViewport() is called

Reimplemented from PLOTTER.

Definition at line 89 of file GERBER_plotter.cpp.

90 {
91  m_gerberUnitInch = aUseInches;
92  m_gerberUnitFmt = aResolution;
93 
94  iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
95 
96  if( ! m_gerberUnitInch )
97  iuPerDeviceUnit *= 25.4; // gerber output in mm
98 }
double m_IUsPerDecimil
Definition: plotter.h:563
bool m_gerberUnitInch
Definition: plotter.h:1374
int m_gerberUnitFmt
Definition: plotter.h:1375
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:566

References PLOTTER::iuPerDeviceUnit, m_gerberUnitFmt, m_gerberUnitInch, and PLOTTER::m_IUsPerDecimil.

Referenced by GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ SetLayerPolarity()

void GERBER_PLOTTER::SetLayerPolarity ( bool  aPositive)
overridevirtual

Change the plot polarity and begin a new layer Used to 'scratch off' silk screen away from solder mask.

Reimplemented from PLOTTER.

Definition at line 1053 of file GERBER_plotter.cpp.

1054 {
1055  if( aPositive )
1056  fprintf( outputFile, "%%LPD*%%\n" );
1057  else
1058  fprintf( outputFile, "%%LPC*%%\n" );
1059 }
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578

References PLOTTER::outputFile.

◆ SetNegative()

virtual void PLOTTER::SetNegative ( bool  aNegative)
inlinevirtualinherited

Definition at line 118 of file plotter.h.

119  {
120  negativeMode = aNegative;
121  }
bool negativeMode
true to plot in color, false to plot in black and white
Definition: plotter.h:582

References PLOTTER::negativeMode.

Referenced by FillNegativeKnockout().

◆ SetPageSettings()

◆ SetTextMode()

virtual void PLOTTER::SetTextMode ( PlotTextMode  mode)
inlinevirtualinherited

Change the current text mode.

See the PlotTextMode explanation at the beginning of the file

Reimplemented in DXF_PLOTTER, and PSLIKE_PLOTTER.

Definition at line 452 of file plotter.h.

453  {
454  // NOP for most plotters.
455  }

Referenced by initializePlotter(), and PlotOneBoardLayer().

◆ SetTitle()

virtual void PLOTTER::SetTitle ( const wxString &  aTitle)
inlinevirtualinherited

Definition at line 166 of file plotter.h.

167  {
168  title = aTitle;
169  }
wxString title
Definition: plotter.h:591

References PLOTTER::title.

Referenced by DIALOG_PLOT_SCHEMATIC::createPDFFile().

◆ SetViewport()

void GERBER_PLOTTER::SetViewport ( const wxPoint &  aOffset,
double  aIusPerDecimil,
double  aScale,
bool  aMirror 
)
overridevirtual

Set the plot offset and scaling for the current plot.

Parameters
aOffsetis the plot offset
aIusPerDecimilgives the scaling factor from IUs to device units
aScaleis the user set plot scaling factor (either explicitly or using 'fit to A4')
aMirrorflips the plot in the Y direction (useful for toner transfers or some kind of film)

Implements PLOTTER.

Definition at line 67 of file GERBER_plotter.cpp.

69 {
70  wxASSERT( aMirror == false );
71  m_plotMirror = false;
72  plotOffset = aOffset;
73  wxASSERT( aScale == 1 ); // aScale parameter is not used in Gerber
74  plotScale = 1; // Plot scale is *always* 1.0
75 
76  m_IUsPerDecimil = aIusPerDecimil;
77  // gives now a default value to iuPerDeviceUnit (because the units of the caller is now known)
78  // which could be modified later by calling SetGerberCoordinatesFormat()
79  iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
80 
81  // We don't handle the filmbox, and it's more useful to keep the
82  // origin at the origin
83  paperSize.x = 0;
84  paperSize.y = 0;
85  SetDefaultLineWidth( 100 * aIusPerDecimil ); // Arbitrary default
86 }
virtual void SetDefaultLineWidth(int width) override
Set the default line width.
double m_IUsPerDecimil
Definition: plotter.h:563
wxPoint plotOffset
Plot offset (in IUs)
Definition: plotter.h:569
bool m_plotMirror
X axis orientation (SVG) and plot mirrored (only for PS, PDF HPGL and SVG)
Definition: plotter.h:573
int m_gerberUnitFmt
Definition: plotter.h:1375
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:557
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:566
wxSize paperSize
Paper size in IU - not in mils.
Definition: plotter.h:594

References PLOTTER::iuPerDeviceUnit, m_gerberUnitFmt, PLOTTER::m_IUsPerDecimil, PLOTTER::m_plotMirror, PLOTTER::paperSize, PLOTTER::plotOffset, PLOTTER::plotScale, and SetDefaultLineWidth().

Referenced by GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ sketchOval()

void PLOTTER::sketchOval ( const wxPoint &  pos,
const wxSize &  size,
double  orient,
int  width 
)
protectedinherited

Definition at line 457 of file plotter.cpp.

458 {
459  SetCurrentLineWidth( width );
460  width = currentPenWidth;
461  int radius, deltaxy, cx, cy;
462  wxSize size( aSize );
463 
464  if( size.x > size.y )
465  {
466  std::swap( size.x, size.y );
467  orient = AddAngles( orient, 900 );
468  }
469 
470  deltaxy = size.y - size.x; /* distance between centers of the oval */
471  radius = ( size.x - width ) / 2;
472  cx = -radius;
473  cy = -deltaxy / 2;
474  RotatePoint( &cx, &cy, orient );
475  MoveTo( wxPoint( cx + pos.x, cy + pos.y ) );
476  cx = -radius;
477  cy = deltaxy / 2;
478  RotatePoint( &cx, &cy, orient );
479  FinishTo( wxPoint( cx + pos.x, cy + pos.y ) );
480 
481  cx = radius;
482  cy = -deltaxy / 2;
483  RotatePoint( &cx, &cy, orient );
484  MoveTo( wxPoint( cx + pos.x, cy + pos.y ) );
485  cx = radius;
486  cy = deltaxy / 2;
487  RotatePoint( &cx, &cy, orient );
488  FinishTo( wxPoint( cx + pos.x, cy + pos.y ) );
489 
490  cx = 0;
491  cy = deltaxy / 2;
492  RotatePoint( &cx, &cy, orient );
493  Arc( wxPoint( cx + pos.x, cy + pos.y ),
494  orient + 1800, orient + 3600,
495  radius, NO_FILL );
496  cx = 0;
497  cy = -deltaxy / 2;
498  RotatePoint( &cx, &cy, orient );
499  Arc( wxPoint( cx + pos.x, cy + pos.y ),
500  orient, orient + 1800,
501  radius, NO_FILL );
502 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
T AddAngles(T a1, T2 a2)
Add two angles (keeping the result normalized). T2 is here.
Definition: trigo.h:299
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254
int currentPenWidth
Definition: plotter.h:584
virtual void Arc(const wxPoint &centre, double StAngle, double EndAngle, int rayon, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)
Generic fallback: arc rendered as a polyline.
Definition: plotter.cpp:156
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References AddAngles(), PLOTTER::Arc(), PLOTTER::currentPenWidth, PLOTTER::FinishTo(), PLOTTER::MoveTo(), NO_FILL, RotatePoint(), and PLOTTER::SetCurrentLineWidth().

Referenced by HPGL_PLOTTER::FlashPadOval(), PSLIKE_PLOTTER::FlashPadOval(), FlashPadOval(), and DXF_PLOTTER::FlashPadOval().

◆ StartBlock()

void GERBER_PLOTTER::StartBlock ( void *  aData)
overridevirtual

calling this function allows one to define the beginning of a group of drawing items (used in X2 format with netlist attributes)

Parameters
aDatacan define any parameter

Reimplemented from PLOTTER.

Definition at line 135 of file GERBER_plotter.cpp.

136 {
137  // Currently, it is the same as EndBlock(): clear all aperture net attributes
138  EndBlock( aData );
139 }
virtual void EndBlock(void *aData) override
calling this function allows one to define the end of a group of drawing items the group is started b...

References EndBlock().

◆ StartPlot()

bool GERBER_PLOTTER::StartPlot ( )
overridevirtual

Function StartPlot Write GERBER header to file initialize global variable g_Plot_PlotOutputFile.

Implements PLOTTER.

Definition at line 183 of file GERBER_plotter.cpp.

184 {
185  wxASSERT( outputFile );
186 
187  finalFile = outputFile; // the actual gerber file will be created later
188 
189  // Create a temporary filename to store gerber file
190  // note tmpfile() does not work under Vista and W7 in user mode
191  m_workFilename = filename + wxT(".tmp");
192  workFile = wxFopen( m_workFilename, wxT( "wt" ));
194  wxASSERT( outputFile );
195 
196  if( outputFile == NULL )
197  return false;
198 
199  for( unsigned ii = 0; ii < m_headerExtraLines.GetCount(); ii++ )
200  {
201  if( ! m_headerExtraLines[ii].IsEmpty() )
202  fprintf( outputFile, "%s\n", TO_UTF8( m_headerExtraLines[ii] ) );
203  }
204 
205  // Set coordinate format to 3.6 or 4.5 absolute, leading zero omitted
206  // the number of digits for the integer part of coordinates is needed
207  // in gerber format, but is not very important when omitting leading zeros
208  // It is fixed here to 3 (inch) or 4 (mm), but is not actually used
209  int leadingDigitCount = m_gerberUnitInch ? 3 : 4;
210 
211  fprintf( outputFile, "%%FSLAX%d%dY%d%d*%%\n",
212  leadingDigitCount, m_gerberUnitFmt,
213  leadingDigitCount, m_gerberUnitFmt );
214  fprintf( outputFile,
215  "G04 Gerber Fmt %d.%d, Leading zero omitted, Abs format (unit %s)*\n",
216  leadingDigitCount, m_gerberUnitFmt,
217  m_gerberUnitInch ? "inch" : "mm" );
218 
219  wxString Title = creator + wxT( " " ) + GetBuildVersion();
220  // In gerber files, ASCII7 chars only are allowed.
221  // So use a ISO date format (using a space as separator between date and time),
222  // not a localized date format
223  wxDateTime date = wxDateTime::Now();
224  fprintf( outputFile, "G04 Created by KiCad (%s) date %s*\n",
225  TO_UTF8( Title ), TO_UTF8( date.FormatISOCombined( ' ') ) );
226 
227  /* Mass parameter: unit = INCHES/MM */
228  if( m_gerberUnitInch )
229  fputs( "%MOIN*%\n", outputFile );
230  else
231  fputs( "%MOMM*%\n", outputFile );
232 
233  // Be sure the usual dark polarity is selected:
234  fputs( "%LPD*%\n", outputFile );
235 
236  fputs( "G04 APERTURE LIST*\n", outputFile );
237 
238  return true;
239 }
bool m_gerberUnitInch
Definition: plotter.h:1374
wxArrayString m_headerExtraLines
Definition: plotter.h:596
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
int m_gerberUnitFmt
Definition: plotter.h:1375
FILE * finalFile
Definition: plotter.h:1363
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
wxString m_workFilename
Definition: plotter.h:1364
FILE * workFile
Definition: plotter.h:1362
wxString filename
Definition: plotter.h:590
wxString creator
Definition: plotter.h:589

References PLOTTER::creator, PLOTTER::filename, finalFile, GetBuildVersion(), m_gerberUnitFmt, m_gerberUnitInch, PLOTTER::m_headerExtraLines, m_workFilename, PLOTTER::outputFile, TO_UTF8, and workFile.

Referenced by GERBER_WRITER::createDrillFile(), and PLACEFILE_GERBER_WRITER::CreatePlaceFile().

◆ Text()

void GERBER_PLOTTER::Text ( const wxPoint &  aPos,
const COLOR4D  aColor,
const wxString &  aText,
double  aOrient,
const wxSize &  aSize,
enum EDA_TEXT_HJUSTIFY_T  aH_justify,
enum EDA_TEXT_VJUSTIFY_T  aV_justify,
int  aWidth,
bool  aItalic,
bool  aBold,
bool  aMultilineAllowed = false,
void *  aData = NULL 
)
overridevirtual

Draws text with the plotter.

Function PLOTTER::Text same as GRText, but plot graphic text insteed of draw it.

For convenience it accept the color to use for specific plotters (GERBER) aData is used to pass extra parameters

Parameters
aPos= text position (according to aH_justify, aV_justify)
aColor(COLOR4D) = text color
aText= text to draw
aOrient= angle in 0.1 degree
aSize= text size (size.x or size.y can be < 0 for mirrored texts)
aH_justify= horizontal justification (Left, center, right)
aV_justify= vertical justification (bottom, center, top)
aWidth= line width (pen width) (default = 0) if width < 0 : draw segments in sketch mode, width = abs(width) Use a value min(aSize.x, aSize.y) / 5 for a bold text
aItalic= true to simulate an italic font
aBold= true to use a bold font Useful only with default width value (aWidth = 0)
aMultilineAllowed= true to plot text as multiline, otherwise single line
aData= a parameter used by some plotters in SetCurrentLineWidth(), not directly used here.

Reimplemented from PLOTTER.

Definition at line 1037 of file GERBER_plotter.cpp.

1042 {
1043  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
1044 
1045  if( gbr_metadata )
1046  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
1047 
1048  PLOTTER::Text( aPos, aColor, aText, aOrient, aSize,
1049  aH_justify, aV_justify, aWidth, aItalic, aBold, aMultilineAllowed, aData );
1050 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
virtual void Text(const wxPoint &aPos, const COLOR4D aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed=false, void *aData=NULL)
Draws text with the plotter.
Definition: gr_text.cpp:215
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205

References formatNetAttribute(), GBR_METADATA::m_NetlistMetadata, and PLOTTER::Text().

◆ ThickArc()

void GERBER_PLOTTER::ThickArc ( const wxPoint &  centre,
double  StAngle,
double  EndAngle,
int  rayon,
int  width,
EDA_DRAW_MODE_T  tracemode,
void *  aData 
)
overridevirtual

Reimplemented from PLOTTER.

Definition at line 652 of file GERBER_plotter.cpp.

654 {
655  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
656  SetCurrentLineWidth( width, gbr_metadata );
657 
658  if( gbr_metadata )
659  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
660 
661  if( tracemode == FILLED )
662  Arc( centre, StAngle, EndAngle, radius, NO_FILL, DO_NOT_SET_LINE_WIDTH );
663  else
664  {
666  Arc( centre, StAngle, EndAngle,
667  radius - ( width - currentPenWidth ) / 2,
669  Arc( centre, StAngle, EndAngle,
670  radius + ( width - currentPenWidth ) / 2, NO_FILL,
672  }
673 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:584
virtual void Arc(const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH) override
Generic fallback: arc rendered as a polyline.
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:101

References Arc(), PLOTTER::currentPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, FILLED, formatNetAttribute(), GBR_METADATA::m_NetlistMetadata, NO_FILL, SetCurrentLineWidth(), and PLOTTER::USE_DEFAULT_LINE_WIDTH.

◆ ThickCircle()

void GERBER_PLOTTER::ThickCircle ( const wxPoint &  pos,
int  diametre,
int  width,
EDA_DRAW_MODE_T  tracemode,
void *  aData 
)
overridevirtual

Reimplemented from PLOTTER.

Definition at line 704 of file GERBER_plotter.cpp.

706 {
707  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
708  SetCurrentLineWidth( width, gbr_metadata );
709 
710  if( gbr_metadata )
711  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
712 
713  if( tracemode == FILLED )
714  Circle( pos, diametre, NO_FILL, DO_NOT_SET_LINE_WIDTH );
715  else
716  {
718  Circle( pos, diametre - (width - currentPenWidth),
720  Circle( pos, diametre + (width - currentPenWidth),
722  }
723 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:584
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
virtual void Circle(const wxPoint &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:101

References Circle(), PLOTTER::currentPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, FILLED, formatNetAttribute(), GBR_METADATA::m_NetlistMetadata, NO_FILL, SetCurrentLineWidth(), and PLOTTER::USE_DEFAULT_LINE_WIDTH.

◆ ThickRect()

void GERBER_PLOTTER::ThickRect ( const wxPoint &  p1,
const wxPoint &  p2,
int  width,
EDA_DRAW_MODE_T  tracemode,
void *  aData 
)
overridevirtual

Reimplemented from PLOTTER.

Definition at line 676 of file GERBER_plotter.cpp.

678 {
679  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
680  SetCurrentLineWidth( width, gbr_metadata );
681 
682  if( gbr_metadata )
683  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
684 
685  if( tracemode == FILLED )
686  Rect( p1, p2, NO_FILL, DO_NOT_SET_LINE_WIDTH );
687  else
688  {
690  wxPoint offsetp1( p1.x - (width - currentPenWidth) / 2,
691  p1.y - (width - currentPenWidth) / 2 );
692  wxPoint offsetp2( p2.x + (width - currentPenWidth) / 2,
693  p2.y + (width - currentPenWidth) / 2 );
694  Rect( offsetp1, offsetp2, NO_FILL, -1 );
695  offsetp1.x += (width - currentPenWidth);
696  offsetp1.y += (width - currentPenWidth);
697  offsetp2.x -= (width - currentPenWidth);
698  offsetp2.y -= (width - currentPenWidth);
699  Rect( offsetp1, offsetp2, NO_FILL, DO_NOT_SET_LINE_WIDTH );
700  }
701 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:584
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:101

References PLOTTER::currentPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, FILLED, formatNetAttribute(), GBR_METADATA::m_NetlistMetadata, NO_FILL, Rect(), SetCurrentLineWidth(), and PLOTTER::USE_DEFAULT_LINE_WIDTH.

◆ ThickSegment()

void GERBER_PLOTTER::ThickSegment ( const wxPoint &  start,
const wxPoint &  end,
int  width,
EDA_DRAW_MODE_T  tracemode,
void *  aData 
)
overridevirtual

Reimplemented from PLOTTER.

Definition at line 631 of file GERBER_plotter.cpp.

633 {
634  if( tracemode == FILLED )
635  {
636  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
637  SetCurrentLineWidth( width, gbr_metadata );
638 
639  if( gbr_metadata )
640  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
641 
642  MoveTo( start );
643  FinishTo( end );
644  }
645  else
646  {
648  segmentAsOval( start, end, width, tracemode );
649  }
650 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:264
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:102
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
void MoveTo(const wxPoint &pos)
Definition: plotter.h:254
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:205
void segmentAsOval(const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode)
Cdonvert a thick segment and plot it as an oval.
Definition: plotter.cpp:436

References FILLED, PLOTTER::FinishTo(), formatNetAttribute(), GBR_METADATA::m_NetlistMetadata, PLOTTER::MoveTo(), PLOTTER::segmentAsOval(), SetCurrentLineWidth(), and PLOTTER::USE_DEFAULT_LINE_WIDTH.

Referenced by GERBER_WRITER::createDrillFile(), and FlashPadOval().

◆ userToDeviceCoordinates()

DPOINT PLOTTER::userToDeviceCoordinates ( const wxPoint &  aCoordinate)
protectedvirtualinherited

Modifies coordinates according to the orientation, scale factor, and offsets trace.

Also convert from a wxPoint to DPOINT, since some output engines needs floating point coordinates.

Definition at line 98 of file plotter.cpp.

99 {
100  wxPoint pos = aCoordinate - plotOffset;
101 
102  double x = pos.x * plotScale;
103  double y = ( paperSize.y - pos.y * plotScale );
104 
105  if( m_plotMirror )
106  {
108  x = ( paperSize.x - pos.x * plotScale );
109  else
110  y = pos.y * plotScale;
111  }
112 
113  if( m_yaxisReversed )
114  y = paperSize.y - y;
115 
116  x *= iuPerDeviceUnit;
117  y *= iuPerDeviceUnit;
118 
119  return DPOINT( x, y );
120 }
wxPoint plotOffset
Plot offset (in IUs)
Definition: plotter.h:569
bool m_yaxisReversed
true to mirror horizontally (else vertically)
Definition: plotter.h:575
bool m_plotMirror
X axis orientation (SVG) and plot mirrored (only for PS, PDF HPGL and SVG)
Definition: plotter.h:573
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:557
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:566
VECTOR2< double > DPOINT
Definition: vector2d.h:592
wxSize paperSize
Paper size in IU - not in mils.
Definition: plotter.h:594
bool m_mirrorIsHorizontal
Definition: plotter.h:574

References PLOTTER::iuPerDeviceUnit, PLOTTER::m_mirrorIsHorizontal, PLOTTER::m_plotMirror, PLOTTER::m_yaxisReversed, PLOTTER::paperSize, PLOTTER::plotOffset, and PLOTTER::plotScale.

Referenced by HPGL_PLOTTER::Arc(), PS_PLOTTER::Arc(), PDF_PLOTTER::Arc(), SVG_PLOTTER::Arc(), Arc(), DXF_PLOTTER::Arc(), SVG_PLOTTER::BezierCurve(), PS_PLOTTER::Circle(), PDF_PLOTTER::Circle(), SVG_PLOTTER::Circle(), DXF_PLOTTER::Circle(), PSLIKE_PLOTTER::computeTextParameters(), HPGL_PLOTTER::FlashPadCircle(), FlashPadCircle(), FlashPadOval(), FlashPadRect(), FlashRegularPolygon(), HPGL_PLOTTER::PenTo(), PS_PLOTTER::PenTo(), PDF_PLOTTER::PenTo(), SVG_PLOTTER::PenTo(), PenTo(), DXF_PLOTTER::PenTo(), PS_PLOTTER::PlotImage(), PDF_PLOTTER::PlotImage(), PS_PLOTTER::PlotPoly(), PDF_PLOTTER::PlotPoly(), SVG_PLOTTER::PlotPoly(), HPGL_PLOTTER::Rect(), PS_PLOTTER::Rect(), PDF_PLOTTER::Rect(), SVG_PLOTTER::Rect(), PS_PLOTTER::Text(), SVG_PLOTTER::Text(), and DXF_PLOTTER::Text().

◆ userToDeviceSize() [1/2]

DPOINT PLOTTER::userToDeviceSize ( const wxSize &  size)
protectedvirtualinherited

◆ userToDeviceSize() [2/2]

double PLOTTER::userToDeviceSize ( double  size) const
protectedvirtualinherited

Modifies size according to the plotter scale factors (simple double version)

Definition at line 130 of file plotter.cpp.

131 {
132  return size * plotScale * iuPerDeviceUnit;
133 }
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:557
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:566

References PLOTTER::iuPerDeviceUnit, and PLOTTER::plotScale.

◆ UseX2format()

void GERBER_PLOTTER::UseX2format ( bool  aEnable)
inline

Definition at line 1276 of file plotter.h.

1276 { m_useX2format = aEnable; }
bool m_useX2format
Definition: plotter.h:1377

References m_useX2format.

Referenced by GERBER_WRITER::createDrillFile(), PLACEFILE_GERBER_WRITER::CreatePlaceFile(), and StartPlotBoard().

◆ UseX2NetAttributes()

void GERBER_PLOTTER::UseX2NetAttributes ( bool  aEnable)
inline

Definition at line 1277 of file plotter.h.

1277 { m_useNetAttributes = aEnable; }
bool m_useNetAttributes
Definition: plotter.h:1380

References m_useNetAttributes.

Referenced by GERBER_WRITER::createDrillFile(), PLACEFILE_GERBER_WRITER::CreatePlaceFile(), and StartPlotBoard().

◆ writeApertureList()

void GERBER_PLOTTER::writeApertureList ( )
protected

Generate the table of D codes.

Definition at line 375 of file GERBER_plotter.cpp.

376 {
377  wxASSERT( outputFile );
378  char cbuf[1024];
379 
380  bool useX1StructuredComment = false;
381 
382  if( !m_useX2format )
383  useX1StructuredComment = true;
384 
385  // Init
386  for( APERTURE& tool : m_apertures )
387  {
388  // apertude sizes are in inch or mm, regardless the
389  // coordinates format
390  double fscale = 0.0001 * plotScale / m_IUsPerDecimil; // inches
391 
392  if(! m_gerberUnitInch )
393  fscale *= 25.4; // size in mm
394 
395  int attribute = tool.m_ApertureAttribute;
396 
397  if( attribute != m_apertureAttribute )
398  {
401  useX1StructuredComment ).c_str(), outputFile );
402  }
403 
404  char* text = cbuf + sprintf( cbuf, "%%ADD%d", tool.m_DCode );
405 
406  /* Please note: the Gerber specs for mass parameters say that
407  exponential syntax is *not* allowed and the decimal point should
408  also be always inserted. So the %g format is ruled out, but %f is fine
409  (the # modifier forces the decimal point). Sadly the %f formatter
410  can't remove trailing zeros but thats not a problem, since nothing
411  forbid it (the file is only slightly longer) */
412 
413  switch( tool.m_Type )
414  {
415  case APERTURE::AT_CIRCLE:
416  sprintf( text, "C,%#f*%%\n", tool.GetDiameter() * fscale );
417  break;
418 
419  case APERTURE::AT_RECT:
420  sprintf( text, "R,%#fX%#f*%%\n", tool.m_Size.x * fscale,
421  tool.m_Size.y * fscale );
422  break;
423 
425  sprintf( text, "C,%#f*%%\n", tool.m_Size.x * fscale );
426  break;
427 
428  case APERTURE::AT_OVAL:
429  sprintf( text, "O,%#fX%#f*%%\n", tool.m_Size.x * fscale,
430  tool.m_Size.y * fscale );
431  break;
432 
444  sprintf( text, "P,%#fX%dX%#f*%%\n", tool.GetDiameter() * fscale,
445  tool.GetVerticeCount(), tool.GetRotation() );
446  break;
447  }
448 
449  fputs( cbuf, outputFile );
450 
451  m_apertureAttribute = attribute;
452 
453  // Currently reset the aperture attribute. Perhaps a better optimization
454  // is to store the last attribute
455  if( attribute )
456  {
457  if( m_useX2format )
458  fputs( "%TD*%\n", outputFile );
459  else
460  fputs( "G04 #@! TD*\n", outputFile );
461 
463  }
464 
465  }
466 }
double m_IUsPerDecimil
Definition: plotter.h:563
bool m_gerberUnitInch
Definition: plotter.h:1374
std::vector< APERTURE > m_apertures
Definition: plotter.h:1371
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:557
bool m_useX2format
Definition: plotter.h:1377
static std::string FormatAttribute(GBR_APERTURE_ATTRIB aAttribute, bool aUseX1StructuredComment)
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:578
int m_apertureAttribute
Definition: plotter.h:1360

References APERTURE::AT_CIRCLE, APERTURE::AT_OVAL, APERTURE::AT_PLOTTING, APERTURE::AT_RECT, APERTURE::AT_REGULAR_POLY, APERTURE::AT_REGULAR_POLY10, APERTURE::AT_REGULAR_POLY11, APERTURE::AT_REGULAR_POLY12, APERTURE::AT_REGULAR_POLY3, APERTURE::AT_REGULAR_POLY4, APERTURE::AT_REGULAR_POLY5, APERTURE::AT_REGULAR_POLY6, APERTURE::AT_REGULAR_POLY7, APERTURE::AT_REGULAR_POLY8, APERTURE::AT_REGULAR_POLY9, GBR_APERTURE_METADATA::FormatAttribute(), m_apertureAttribute, m_apertures, m_gerberUnitInch, PLOTTER::m_IUsPerDecimil, m_useX2format, PLOTTER::outputFile, and PLOTTER::plotScale.

Referenced by EndPlot().

Member Data Documentation

◆ colorMode

◆ creator

wxString PLOTTER::creator
protectedinherited

◆ currentPenWidth

◆ defaultPenWidth

◆ DO_NOT_SET_LINE_WIDTH

const int PLOTTER::DO_NOT_SET_LINE_WIDTH = -2
staticinherited

Definition at line 101 of file plotter.h.

Referenced by FlashPadCircle(), SetCurrentLineWidth(), ThickArc(), ThickCircle(), and ThickRect().

◆ filename

wxString PLOTTER::filename
protectedinherited

◆ finalFile

FILE* GERBER_PLOTTER::finalFile
protected

Definition at line 1363 of file plotter.h.

Referenced by EndPlot(), GERBER_PLOTTER(), and StartPlot().

◆ iuPerDeviceUnit

◆ m_apertureAttribute

int GERBER_PLOTTER::m_apertureAttribute
protected

Definition at line 1360 of file plotter.h.

Referenced by GERBER_PLOTTER(), and writeApertureList().

◆ m_apertures

std::vector<APERTURE> GERBER_PLOTTER::m_apertures
protected

Definition at line 1371 of file plotter.h.

Referenced by GetOrCreateAperture(), selectAperture(), and writeApertureList().

◆ m_currentApertureIdx

int GERBER_PLOTTER::m_currentApertureIdx
protected

Definition at line 1372 of file plotter.h.

Referenced by GERBER_PLOTTER(), selectAperture(), and SetDefaultLineWidth().

◆ m_gerberUnitFmt

int GERBER_PLOTTER::m_gerberUnitFmt
protected

Definition at line 1375 of file plotter.h.

Referenced by GERBER_PLOTTER(), SetGerberCoordinatesFormat(), SetViewport(), and StartPlot().

◆ m_gerberUnitInch

bool GERBER_PLOTTER::m_gerberUnitInch
protected

◆ m_headerExtraLines

wxArrayString PLOTTER::m_headerExtraLines
protectedinherited

Definition at line 596 of file plotter.h.

Referenced by PLOTTER::AddLineToHeader(), PLOTTER::ClearHeaderLinesList(), and StartPlot().

◆ m_IUsPerDecimil

◆ m_mirrorIsHorizontal

bool PLOTTER::m_mirrorIsHorizontal
protectedinherited

◆ m_objectAttributesDictionnary

std::string GERBER_PLOTTER::m_objectAttributesDictionnary
protected

Definition at line 1357 of file plotter.h.

Referenced by ClearAllAttributes(), clearNetAttribute(), and formatNetAttribute().

◆ m_plotMirror

◆ m_useNetAttributes

bool GERBER_PLOTTER::m_useNetAttributes
protected

Definition at line 1380 of file plotter.h.

Referenced by formatNetAttribute(), GERBER_PLOTTER(), selectAperture(), and UseX2NetAttributes().

◆ m_useX2format

bool GERBER_PLOTTER::m_useX2format
protected

◆ m_workFilename

wxString GERBER_PLOTTER::m_workFilename
protected

Definition at line 1364 of file plotter.h.

Referenced by EndPlot(), and StartPlot().

◆ m_yaxisReversed

bool PLOTTER::m_yaxisReversed
protectedinherited

true to mirror horizontally (else vertically)

Definition at line 575 of file plotter.h.

Referenced by SVG_PLOTTER::Arc(), PLOTTER::PLOTTER(), SVG_PLOTTER::SetViewport(), and PLOTTER::userToDeviceCoordinates().

◆ MARKER_COUNT

const unsigned PLOTTER::MARKER_COUNT = 58
staticinherited

Draw a marker (used for the drill map)

Definition at line 425 of file plotter.h.

Referenced by PLOTTER::Marker().

◆ negativeMode

bool PLOTTER::negativeMode
protectedinherited

true to plot in color, false to plot in black and white

Definition at line 582 of file plotter.h.

Referenced by PLOTTER::PLOTTER(), PSLIKE_PLOTTER::SetColor(), and PLOTTER::SetNegative().

◆ outputFile

FILE* PLOTTER::outputFile
protectedinherited

true if the Y axis is top to bottom (SVG)

Output file

Definition at line 578 of file plotter.h.

Referenced by HPGL_PLOTTER::Arc(), PS_PLOTTER::Arc(), SVG_PLOTTER::Arc(), Arc(), DXF_PLOTTER::Arc(), SVG_PLOTTER::BezierCurve(), HPGL_PLOTTER::Circle(), PS_PLOTTER::Circle(), SVG_PLOTTER::Circle(), DXF_PLOTTER::Circle(), ClearAllAttributes(), clearNetAttribute(), PDF_PLOTTER::ClosePage(), PDF_PLOTTER::closePdfObject(), PDF_PLOTTER::closePdfStream(), emitDcode(), PS_PLOTTER::emitSetRGBColor(), SVG_PLOTTER::EndBlock(), HPGL_PLOTTER::EndPlot(), PS_PLOTTER::EndPlot(), PDF_PLOTTER::EndPlot(), SVG_PLOTTER::EndPlot(), EndPlot(), DXF_PLOTTER::EndPlot(), HPGL_PLOTTER::FlashPadCircle(), DXF_PLOTTER::FlashPadCircle(), HPGL_PLOTTER::FlashPadOval(), PSLIKE_PLOTTER::FlashPadOval(), FlashPadOval(), DXF_PLOTTER::FlashPadOval(), FlashPadRect(), DXF_PLOTTER::FlashPadRect(), DXF_PLOTTER::FlashPadTrapez(), formatNetAttribute(), PLOTTER::OpenFile(), PDF_PLOTTER::OpenFile(), HPGL_PLOTTER::penControl(), HPGL_PLOTTER::PenTo(), PS_PLOTTER::PenTo(), SVG_PLOTTER::PenTo(), PenTo(), DXF_PLOTTER::PenTo(), PlotGerberRegion(), PS_PLOTTER::PlotImage(), SVG_PLOTTER::PlotImage(), HPGL_PLOTTER::PlotPoly(), PS_PLOTTER::PlotPoly(), SVG_PLOTTER::PlotPoly(), PlotPoly(), PLOTTER::PLOTTER(), HPGL_PLOTTER::Rect(), PS_PLOTTER::Rect(), SVG_PLOTTER::Rect(), DXF_PLOTTER::Rect(), selectAperture(), PS_PLOTTER::SetCurrentLineWidth(), HPGL_PLOTTER::SetDash(), PS_PLOTTER::SetDash(), SetLayerPolarity(), SVG_PLOTTER::setSVGPlotStyle(), PS_PLOTTER::SetViewport(), SVG_PLOTTER::StartBlock(), PDF_PLOTTER::StartPage(), PDF_PLOTTER::startPdfObject(), PDF_PLOTTER::startPdfStream(), HPGL_PLOTTER::StartPlot(), PS_PLOTTER::StartPlot(), PDF_PLOTTER::StartPlot(), SVG_PLOTTER::StartPlot(), StartPlot(), DXF_PLOTTER::StartPlot(), PS_PLOTTER::Text(), SVG_PLOTTER::Text(), DXF_PLOTTER::Text(), HPGL_PLOTTER::ThickSegment(), writeApertureList(), and PLOTTER::~PLOTTER().

◆ pageInfo

◆ paperSize

wxSize PLOTTER::paperSize
protectedinherited

◆ penLastpos

wxPoint PLOTTER::penLastpos
protectedinherited

Last pen positions; set to -1,-1 when the pen is at rest.

Definition at line 588 of file plotter.h.

Referenced by HPGL_PLOTTER::penControl(), HPGL_PLOTTER::PenTo(), PS_PLOTTER::PenTo(), PDF_PLOTTER::PenTo(), SVG_PLOTTER::PenTo(), and DXF_PLOTTER::PenTo().

◆ penState

char PLOTTER::penState
protectedinherited

Current pen state: 'U', 'D' or 'Z' (see PenTo)

Definition at line 586 of file plotter.h.

Referenced by HPGL_PLOTTER::penControl(), PS_PLOTTER::PenTo(), PDF_PLOTTER::PenTo(), SVG_PLOTTER::PenTo(), PenTo(), and PLOTTER::PLOTTER().

◆ plotOffset

wxPoint PLOTTER::plotOffset
protectedinherited

◆ plotScale

double PLOTTER::plotScale
protectedinherited

◆ title

wxString PLOTTER::title
protectedinherited

Definition at line 591 of file plotter.h.

Referenced by PDF_PLOTTER::EndPlot(), and PLOTTER::SetTitle().

◆ USE_DEFAULT_LINE_WIDTH

◆ workFile

FILE* GERBER_PLOTTER::workFile
protected

Definition at line 1362 of file plotter.h.

Referenced by EndPlot(), GERBER_PLOTTER(), and StartPlot().


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