KiCad PCB EDA Suite
GERBER_PLOTTER Class Reference

#include <plotter.h>

Inheritance diagram for GERBER_PLOTTER:
PLOTTER

Public Member Functions

 GERBER_PLOTTER ()
 
virtual PLOT_FORMAT 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 SetDash (PLOT_DASH_TYPE 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
 
void SetRenderSettings (RENDER_SETTINGS *aSettings)
 
RENDER_SETTINGSRenderSettings ()
 
virtual void SetPageSettings (const PAGE_INFO &aPageSettings)
 
PAGE_INFOPageSettings ()
 
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 (PLOT_TEXT_MODE mode)
 Change the current text mode. More...
 
virtual void SetSvgCoordinatesFormat (unsigned aResolution, bool aUseInches=false)
 

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 plotRoundRectAsRegion (const wxPoint &aRectCenter, const wxSize &aSize, int aCornerRadius, double aOrient)
 Plot a round rect (a round rect shape in fact) as a Gerber region using lines and arcs for corners. More...
 
void plotArc (const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, bool aPlotInRegion)
 Plot a Gerber arc. More...
 
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
 
int currentPenWidth
 
char penState
 
wxPoint penLastpos
 
wxString creator
 
wxString filename
 
wxString title
 
PAGE_INFO pageInfo
 
wxSize paperSize
 
wxArrayString m_headerExtraLines
 
RENDER_SETTINGSm_renderSettings
 

Detailed Description

Definition at line 1169 of file plotter.h.

Constructor & Destructor Documentation

◆ GERBER_PLOTTER()

GERBER_PLOTTER::GERBER_PLOTTER ( )

Definition at line 47 of file GERBER_plotter.cpp.

48 {
49  workFile = NULL;
50  finalFile = NULL;
53 
54  // number of digits after the point (number of digits of the mantissa
55  // Be carefull: the Gerber coordinates are stored in an integer
56  // so 6 digits (inches) or 5 digits (mm) is a good value
57  // To avoid overflow, 7 digits (inches) or 6 digits is a max.
58  // with lower values than 6 digits (inches) or 5 digits (mm),
59  // Creating self-intersecting polygons from non-intersecting polygons
60  // happen easily.
61  m_gerberUnitInch = false;
62  m_gerberUnitFmt = 6;
63  m_useX2format = true;
64  m_useNetAttributes = true;
65 }
bool m_useNetAttributes
Definition: plotter.h:1435
bool m_gerberUnitInch
Definition: plotter.h:1430
#define NULL
int m_gerberUnitFmt
Definition: plotter.h:1431
FILE * finalFile
Definition: plotter.h:1419
bool m_useX2format
Definition: plotter.h:1433
int m_apertureAttribute
Definition: plotter.h:1416
FILE * workFile
Definition: plotter.h:1418
int m_currentApertureIdx
Definition: plotter.h:1428

References finalFile, m_apertureAttribute, m_currentApertureIdx, m_gerberUnitFmt, m_gerberUnitInch, m_useNetAttributes, m_useX2format, NULL, 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 179 of file plotter.h.

180  {
181  m_headerExtraLines.Add( aExtraString );
182  }
wxArrayString m_headerExtraLines
Definition: plotter.h:601

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 507 of file GERBER_plotter.cpp.

509 {
510  SetCurrentLineWidth( aWidth );
511 
512  // aFill is not used here.
513  plotArc( aCenter, aStAngle, aEndAngle, aRadius, false );
514 }
void plotArc(const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, bool aPlotInRegion)
Plot a Gerber arc.
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.

References plotArc(), and SetCurrentLineWidth().

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 204 of file plotter.cpp.

207 {
208  // Generic fallback: Quadratic Bezier curve plotted as a polyline
209  int minSegLen = aLineThickness; // The segment min length to approximate a bezier curve
210 
211  std::vector<wxPoint> ctrlPoints;
212  ctrlPoints.push_back( aStart );
213  ctrlPoints.push_back( aControl1 );
214  ctrlPoints.push_back( aControl2 );
215  ctrlPoints.push_back( aEnd );
216 
217  BEZIER_POLY bezier_converter( ctrlPoints );
218 
219  std::vector<wxPoint> approxPoints;
220  bezier_converter.GetPoly( approxPoints, minSegLen );
221 
222  SetCurrentLineWidth( aLineThickness );
223  MoveTo( aStart );
224 
225  for( unsigned ii = 1; ii < approxPoints.size()-1; ii++ )
226  LineTo( approxPoints[ii] );
227 
228  FinishTo( aEnd );
229 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void LineTo(const wxPoint &pos)
Definition: plotter.h:262
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
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::PlotDrawSegment(), and BRDITEMS_PLOTTER::PlotFootprintGraphicItem().

◆ 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 501 of file GERBER_plotter.cpp.

502 {
503  Arc( aCenter, 0, 3600, aDiameter / 2, aFill, aWidth );
504 }
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:1433
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
std::string m_objectAttributesDictionnary
Definition: plotter.h:1413

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 188 of file plotter.h.

189  {
190  m_headerExtraLines.Clear();
191  }
wxArrayString m_headerExtraLines
Definition: plotter.h:601

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:1433
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
std::string m_objectAttributesDictionnary
Definition: plotter.h:1413

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:586
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68

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 246 of file GERBER_plotter.cpp.

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

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 731 of file GERBER_plotter.cpp.

732 {
733  wxSize size( diametre, diametre );
734  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
735 
736  if( trace_mode == SKETCH )
737  {
738  if( gbr_metadata )
739  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
740 
742  }
743  else
744  {
745  DPOINT pos_dev = userToDeviceCoordinates( pos );
746 
747  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
748  selectAperture( size, APERTURE::AT_CIRCLE, aperture_attrib );
749 
750  if( gbr_metadata )
751  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
752 
753  emitDcode( pos_dev, 3 );
754  }
755 }
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.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:165
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:94
int currentPenWidth
Definition: plotter.h:591
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
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:118

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(), SKETCH, 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 1070 of file GERBER_plotter.cpp.

1074 {
1075  // A Pad custom is plotted as polygon (a region in Gerber language).
1076 
1077  GBR_METADATA gbr_metadata;
1078 
1079  if( aData )
1080  gbr_metadata = *static_cast<GBR_METADATA*>( aData );
1081 
1082  SHAPE_POLY_SET polyshape = *aPolygons;
1083 
1084  if( aTraceMode != FILLED )
1085  {
1086  SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH, &gbr_metadata );
1087  polyshape.Inflate( -GetCurrentLineWidth()/2, 16 );
1088  }
1089 
1090  std::vector< wxPoint > cornerList;
1091 
1092  for( int cnt = 0; cnt < polyshape.OutlineCount(); ++cnt )
1093  {
1094  SHAPE_LINE_CHAIN& poly = polyshape.Outline( cnt );
1095 
1096  cornerList.clear();
1097 
1098  for( int ii = 0; ii < poly.PointCount(); ++ii )
1099  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
1100 
1101  // Close polygon
1102  cornerList.push_back( cornerList[0] );
1103 
1104  if( aTraceMode == SKETCH )
1105  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), &gbr_metadata );
1106  else
1107  PlotGerberRegion( cornerList, &gbr_metadata );
1108  }
1109 }
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:158
const VECTOR2I & CPoint(int aIndex) const
Function Point()
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:119
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.
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....
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 758 of file GERBER_plotter.cpp.

760 {
761  wxASSERT( outputFile );
762  wxSize size( aSize );
763  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
764 
765  // Flash a vertical or horizontal shape (this is a basic aperture).
766  if( ( orient == 0 || orient == 900 || orient == 1800 || orient == 2700 )
767  && trace_mode == FILLED )
768  {
769  if( orient == 900 || orient == 2700 ) /* orientation turned 90 deg. */
770  std::swap( size.x, size.y );
771 
772  DPOINT pos_dev = userToDeviceCoordinates( pos );
773  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
774  selectAperture( size, APERTURE::AT_OVAL, aperture_attrib );
775 
776  if( gbr_metadata )
777  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
778 
779  emitDcode( pos_dev, 3 );
780  }
781  else // Plot pad as region.
782  // Only regions and flashed items accept a object attribute TO.P for the pin name
783  {
784  if( trace_mode == FILLED )
785  {
786  // Draw the oval as round rect pad with a radius = 50% min size)
787  // In gerber file, it will be drawn as a region with arcs, and can be
788  // detected as pads (similar to a flashed pad)
789  FlashPadRoundRect( pos, aSize, std::min( aSize.x, aSize.y ) /2,
790  orient, FILLED, aData );
791  }
792  else // Non filled shape: plot outlines:
793  {
794  if( size.x > size.y )
795  {
796  std::swap( size.x, size.y );
797 
798  if( orient < 2700 )
799  orient += 900;
800  else
801  orient -= 2700;
802  }
803 
804  sketchOval( pos, size, orient, -1 );
805  }
806  }
807 }
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: alw...
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.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:165
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:94
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
void sketchOval(const wxPoint &pos, const wxSize &size, double orient, int width)
Definition: plotter.cpp:459

References APERTURE::AT_OVAL, emitDcode(), FILLED, FlashPadRoundRect(), formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), GBR_METADATA::m_NetlistMetadata, PLOTTER::outputFile, selectAperture(), PLOTTER::sketchOval(), 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 810 of file GERBER_plotter.cpp.

813 {
814  wxASSERT( outputFile );
815  wxSize size( aSize );
816  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
817 
818  // Plot as an aperture flash
819  switch( int( orient ) )
820  {
821  case 900:
822  case 2700: // rotation of 90 degrees or 270 swaps sizes
823  std::swap( size.x, size.y );
825 
826  case 0:
827  case 1800:
828  if( trace_mode == SKETCH )
829  {
830  if( gbr_metadata )
831  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
832 
833  Rect( wxPoint( pos.x - (size.x - currentPenWidth) / 2,
834  pos.y - (size.y - currentPenWidth) / 2 ),
835  wxPoint( pos.x + (size.x - currentPenWidth) / 2,
836  pos.y + (size.y - currentPenWidth) / 2 ),
838  }
839  else
840  {
841  DPOINT pos_dev = userToDeviceCoordinates( pos );
842  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
843  selectAperture( size, APERTURE::AT_RECT, aperture_attrib );
844 
845  if( gbr_metadata )
846  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
847 
848  emitDcode( pos_dev, 3 );
849  }
850  break;
851 
852  default: // plot pad shape as Gerber region
853  {
854  wxPoint coord[4];
855  // coord[0] is assumed the lower left
856  // coord[1] is assumed the upper left
857  // coord[2] is assumed the upper right
858  // coord[3] is assumed the lower right
859 
860  coord[0].x = -size.x/2; // lower left
861  coord[0].y = size.y/2;
862  coord[1].x = -size.x/2; // upper left
863  coord[1].y = -size.y/2;
864  coord[2].x = size.x/2; // upper right
865  coord[2].y = -size.y/2;
866  coord[3].x = size.x/2; // lower right
867  coord[3].y = size.y/2;
868 
869  FlashPadTrapez( pos, coord, orient, trace_mode, aData );
870  }
871  break;
872  }
873 }
#define KI_FALLTHROUGH
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:158
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH) override
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:165
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:94
int currentPenWidth
Definition: plotter.h:591
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212

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

◆ 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 875 of file GERBER_plotter.cpp.

879 {
880  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
881 
882  if( aTraceMode != FILLED )
883  {
884  SHAPE_POLY_SET outline;
885  TransformRoundChamferedRectToPolygon( outline, aPadPos, aSize, aOrient,
886  aCornerRadius, 0.0, 0, GetPlotterArcHighDef() );
887 
889  outline.Inflate( -GetCurrentLineWidth()/2, 16 );
890 
891  std::vector< wxPoint > cornerList;
892  // TransformRoundRectToPolygon creates only one convex polygon
893  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
894  cornerList.reserve( poly.PointCount() + 1 );
895 
896  for( int ii = 0; ii < poly.PointCount(); ++ii )
897  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
898 
899  // Close polygon
900  cornerList.push_back( cornerList[0] );
901 
902  // plot outlines
903  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), gbr_metadata );
904  }
905  else
906  {
907  // A Pad RoundRect is plotted as a Gerber region.
908  // Initialize region metadata:
909  bool clearTA_AperFunction = false; // true if a TA.AperFunction is used
910 
911  if( gbr_metadata )
912  {
913  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
914  std::string attrib = gbr_metadata->m_ApertureMetadata.FormatAttribute( !m_useX2format );
915 
916  if( !attrib.empty() )
917  {
918  fputs( attrib.c_str(), outputFile );
919  clearTA_AperFunction = true;
920  }
921  }
922 
923  // Plot the region using arcs in corners.
924  plotRoundRectAsRegion( aPadPos, aSize, aCornerRadius, aOrient );
925 
926  // Clear the TA attribute, to avoid the next item to inherit it:
927  if( clearTA_AperFunction )
928  {
929  if( m_useX2format )
930  {
931  fputs( "%TD.AperFunction*%\n", outputFile );
932  }
933  else
934  {
935  fputs( "G04 #@! TD.AperFunction*\n", outputFile );
936  }
937  }
938  }
939 }
void plotRoundRectAsRegion(const wxPoint &aRectCenter, const wxSize &aSize, int aCornerRadius, double aOrient)
Plot a round rect (a round rect shape in fact) as a Gerber region using lines and arcs for corners.
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
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:158
const VECTOR2I & CPoint(int aIndex) const
Function Point()
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:119
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.
SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
bool m_useX2format
Definition: plotter.h:1433
static std::string FormatAttribute(GBR_APERTURE_ATTRIB aAttribute, bool aUseX1StructuredComment)
SHAPE_LINE_CHAIN.
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
int GetPlotterArcHighDef() const
Definition: plotter.h:223
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aCornerBuffer, const wxPoint &aPosition, const wxSize &aSize, double aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aError)
convert a rectangle with rounded corners and/or chamfered corners to a polygon Convert rounded corner...
GBR_APERTURE_METADATA m_ApertureMetadata
a item to handle aperture attribute:
Definition: gbr_metadata.h:207

References SHAPE_LINE_CHAIN::CPoint(), FILLED, GBR_APERTURE_METADATA::FormatAttribute(), formatNetAttribute(), PLOTTER::GetCurrentLineWidth(), PLOTTER::GetPlotterArcHighDef(), SHAPE_POLY_SET::Inflate(), GBR_METADATA::m_ApertureMetadata, GBR_METADATA::m_NetlistMetadata, m_useX2format, NO_FILL, SHAPE_POLY_SET::Outline(), PLOTTER::outputFile, PlotPoly(), plotRoundRectAsRegion(), SHAPE_LINE_CHAIN::PointCount(), SetCurrentLineWidth(), TransformRoundChamferedRectToPolygon(), PLOTTER::USE_DEFAULT_LINE_WIDTH, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by FlashPadOval().

◆ 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 1112 of file GERBER_plotter.cpp.

1115 {
1116  // TODO: use Aperture macro and flash it
1117 
1118  // polygon corners list
1119  std::vector<wxPoint> cornerList = { aCorners[0], aCorners[1], aCorners[2], aCorners[3] };
1120 
1121  // Draw the polygon and fill the interior as required
1122  for( unsigned ii = 0; ii < 4; ii++ )
1123  {
1124  RotatePoint( &cornerList[ii], aPadOrient );
1125  cornerList[ii] += aPadPos;
1126  }
1127 
1128  // Close the polygon
1129  cornerList.push_back( cornerList[0] );
1130  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
1131 
1132  GBR_METADATA metadata;
1133 
1134  if( gbr_metadata )
1135  metadata = *gbr_metadata;
1136 
1137  if( aTrace_Mode == SKETCH )
1138  PlotPoly( cornerList, NO_FILL, DO_NOT_SET_LINE_WIDTH, &metadata );
1139  else
1140  PlotGerberRegion( cornerList, &metadata );
1141 }
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
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....
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:118

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

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 1144 of file GERBER_plotter.cpp.

1148 {
1149  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
1150 
1151  if( aTraceMode == SKETCH )
1152  {
1153  // Build the polygon:
1154  std::vector< wxPoint > cornerList;
1155 
1156  double angle_delta = 3600.0 / aCornerCount; // in 0.1 degree
1157 
1158  for( int ii = 0; ii < aCornerCount; ii++ )
1159  {
1160  double rot = aOrient + (angle_delta*ii);
1161  wxPoint vertice( aDiameter/2, 0 );
1162  RotatePoint( &vertice, rot );
1163  vertice += aShapePos;
1164  cornerList.push_back( vertice );
1165  }
1166 
1167  cornerList.push_back( cornerList[0] ); // Close the shape
1168 
1169  PlotPoly( cornerList, NO_FILL, GetCurrentLineWidth(), gbr_metadata );
1170  }
1171  else
1172  {
1173  DPOINT pos_dev = userToDeviceCoordinates( aShapePos );
1174 
1175  int aperture_attrib = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
1176 
1177  APERTURE::APERTURE_TYPE apert_type =
1179  selectAperture( aDiameter, aOrient, apert_type, aperture_attrib );
1180 
1181  if( gbr_metadata )
1182  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
1183 
1184  emitDcode( pos_dev, 3 );
1185  }
1186 }
APERTURE_TYPE
Definition: plotter.h:1086
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:208
virtual int GetCurrentLineWidth() const
Definition: plotter.h:158
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.
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:165
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:94
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212

References APERTURE::AT_REGULAR_POLY3, emitDcode(), formatNetAttribute(), GBR_METADATA::GetApertureAttrib(), PLOTTER::GetCurrentLineWidth(), GBR_METADATA::m_NetlistMetadata, NO_FILL, PlotPoly(), RotatePoint(), selectAperture(), 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:1435
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.
wxString m_ExtraData
a string to print after TO object attributes, if not empty it is printed "as this"
#define NULL
bool m_useX2format
Definition: plotter.h:1433
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
std::string m_objectAttributesDictionnary
Definition: plotter.h:1413
#define TO_UTF8(wxstring)

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

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

◆ GetColorMode()

◆ GetCurrentLineWidth()

◆ GetDashGapLenIU()

double PLOTTER::GetDashGapLenIU ( ) const
protectedinherited

Definition at line 152 of file plotter.cpp.

153 {
155 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:158
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:125
#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 146 of file plotter.cpp.

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

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 1179 of file plotter.h.

1180  {
1181  return wxString( wxT( "gbr" ) );
1182  }

Referenced by GetDefaultPlotExtension().

◆ GetDotMarkLenIU()

double PLOTTER::GetDotMarkLenIU ( ) const
protectedinherited

Definition at line 140 of file plotter.cpp.

141 {
143 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:158
#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:125

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 220 of file plotter.h.

220 { return m_IUsPerDecimil; }
double m_IUsPerDecimil
Definition: plotter.h:571

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 302 of file GERBER_plotter.cpp.

304 {
305  int last_D_code = 9;
306 
307  // Search an existing aperture
308  for( int idx = 0; idx < (int)m_apertures.size(); ++idx )
309  {
310  APERTURE* tool = &m_apertures[idx];
311  last_D_code = tool->m_DCode;
312 
313  if( (tool->m_Type == aType) && (tool->m_Size == aSize) &&
314  (tool->m_ApertureAttribute == aApertureAttribute) )
315  return idx;
316  }
317 
318  // Allocate a new aperture
319  APERTURE new_tool;
320  new_tool.m_Size = aSize;
321  new_tool.m_Type = aType;
322  new_tool.m_DCode = last_D_code + 1;
323  new_tool.m_ApertureAttribute = aApertureAttribute;
324 
325  m_apertures.push_back( new_tool );
326 
327  return m_apertures.size() - 1;
328 }
APERTURE_TYPE m_Type
Definition: plotter.h:1152
wxSize m_Size
Definition: plotter.h:1157
std::vector< APERTURE > m_apertures
Definition: plotter.h:1427
int m_DCode
Definition: plotter.h:1160
int m_ApertureAttribute
Definition: plotter.h:1165

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 222 of file plotter.h.

222 { return m_IUsPerDecimil * 8; }
double m_IUsPerDecimil
Definition: plotter.h:571

References PLOTTER::m_IUsPerDecimil.

◆ GetPlotterType()

virtual PLOT_FORMAT 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 1174 of file plotter.h.

1175  {
1176  return PLOT_FORMAT::GERBER;
1177  }

References GERBER.

◆ LineTo()

void PLOTTER::LineTo ( const wxPoint pos)
inlineinherited

Definition at line 262 of file plotter.h.

263  {
264  PenTo( pos, 'D' );
265  }
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(), plotArc(), HPGL_PLOTTER::PlotPoly(), PlotPoly(), DXF_PLOTTER::PlotPoly(), plotRoundRectAsRegion(), 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 332 of file plotter.cpp.

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

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 318 of file plotter.cpp.

319 {
320  MoveTo( wxPoint( pos.x + radius, pos.y - radius ) );
321  FinishTo( wxPoint( pos.x - radius, pos.y + radius ) );
322 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257

References PLOTTER::FinishTo(), PLOTTER::MoveTo(), wxPoint::x, and wxPoint::y.

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 274 of file plotter.cpp.

275 {
276  Circle( position, radius * 2, NO_FILL, GetCurrentLineWidth() );
277 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:158
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 304 of file plotter.cpp.

305 {
306  MoveTo( wxPoint( pos.x - radius, pos.y ) );
307  FinishTo( wxPoint( pos.x + radius, pos.y ) );
308 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257

References PLOTTER::FinishTo(), PLOTTER::MoveTo(), wxPoint::x, and wxPoint::y.

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 280 of file plotter.cpp.

281 {
282  std::vector< wxPoint > corner_list;
283  wxPoint corner;
284  corner.x = position.x;
285  corner.y = position.y + radius;
286  corner_list.push_back( corner );
287  corner.x = position.x + radius;
288  corner.y = position.y,
289  corner_list.push_back( corner );
290  corner.x = position.x;
291  corner.y = position.y - radius;
292  corner_list.push_back( corner );
293  corner.x = position.x - radius;
294  corner.y = position.y;
295  corner_list.push_back( corner );
296  corner.x = position.x;
297  corner.y = position.y + radius;
298  corner_list.push_back( corner );
299 
300  PlotPoly( corner_list, NO_FILL, GetCurrentLineWidth() );
301 }
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:158

References PLOTTER::GetCurrentLineWidth(), NO_FILL, PLOTTER::PlotPoly(), wxPoint::x, and wxPoint::y.

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 311 of file plotter.cpp.

312 {
313  MoveTo( wxPoint( pos.x - radius, pos.y - radius ) );
314  FinishTo( wxPoint( pos.x + radius, pos.y + radius ) );
315 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257

References PLOTTER::FinishTo(), PLOTTER::MoveTo(), wxPoint::x, and wxPoint::y.

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 249 of file plotter.cpp.

250 {
251  double r = KiROUND( radius / 1.4142 );
252  std::vector< wxPoint > corner_list;
253  wxPoint corner;
254  corner.x = position.x + r;
255  corner.y = position.y + r;
256  corner_list.push_back( corner );
257  corner.x = position.x + r;
258  corner.y = position.y - r;
259  corner_list.push_back( corner );
260  corner.x = position.x - r;
261  corner.y = position.y - r;
262  corner_list.push_back( corner );
263  corner.x = position.x - r;
264  corner.y = position.y + r;
265  corner_list.push_back( corner );
266  corner.x = position.x + r;
267  corner.y = position.y + r;
268  corner_list.push_back( corner );
269 
270  PlotPoly( corner_list, NO_FILL, GetCurrentLineWidth() );
271 }
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:158
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68

References PLOTTER::GetCurrentLineWidth(), KiROUND(), NO_FILL, PLOTTER::PlotPoly(), wxPoint::x, and wxPoint::y.

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 325 of file plotter.cpp.

326 {
327  MoveTo( wxPoint( pos.x, pos.y - radius ) );
328  FinishTo( wxPoint( pos.x, pos.y + radius ) );
329 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257

References PLOTTER::FinishTo(), PLOTTER::MoveTo(), wxPoint::x, and wxPoint::y.

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 77 of file plotter.cpp.

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

References PLOTTER::filename, NULL, 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().

◆ PageSettings()

PAGE_INFO& PLOTTER::PageSettings ( )
inlineinherited

◆ PenFinish()

void PLOTTER::PenFinish ( )
inlineinherited

Definition at line 273 of file plotter.h.

274  {
275  // The point is not important with Z motion
276  PenTo( wxPoint( 0, 0 ), 'Z' );
277  }
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 461 of file GERBER_plotter.cpp.

462 {
463  wxASSERT( outputFile );
464  DPOINT pos_dev = userToDeviceCoordinates( aPos );
465 
466  switch( plume )
467  {
468  case 'Z':
469  break;
470 
471  case 'U':
472  emitDcode( pos_dev, 2 );
473  break;
474 
475  case 'D':
476  emitDcode( pos_dev, 1 );
477  }
478 
479  penState = plume;
480 }
char penState
Definition: plotter.h:592
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:94
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586

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

◆ plotArc()

void GERBER_PLOTTER::plotArc ( const wxPoint aCenter,
double  aStAngle,
double  aEndAngle,
int  aRadius,
bool  aPlotInRegion 
)
protected

Plot a Gerber arc.

if aPlotInRegion = true, the current pen position will not be initialized to the arc start position, and therefore the arc can be used to define a region outline item a line will be created from current ^position to arc start point if aPlotInRegion = false, the current pen position will be initialized to the arc start position, to plot an usual arc item The line thickness is not initialized in plotArc, and must be initialized before calling it if needed.

Definition at line 517 of file GERBER_plotter.cpp.

519 {
520  wxPoint start, end;
521  start.x = aCenter.x + KiROUND( cosdecideg( aRadius, aStAngle ) );
522  start.y = aCenter.y - KiROUND( sindecideg( aRadius, aStAngle ) );
523 
524  if( !aPlotInRegion )
525  MoveTo( start );
526  else
527  LineTo( start );
528 
529  end.x = aCenter.x + KiROUND( cosdecideg( aRadius, aEndAngle ) );
530  end.y = aCenter.y - KiROUND( sindecideg( aRadius, aEndAngle ) );
531  DPOINT devEnd = userToDeviceCoordinates( end );
532  DPOINT devCenter = userToDeviceCoordinates( aCenter ) - userToDeviceCoordinates( start );
533 
534  fprintf( outputFile, "G75*\n" ); // Multiquadrant (360 degrees) mode
535 
536  if( aStAngle < aEndAngle )
537  fprintf( outputFile, "G03*\n" ); // Active circular interpolation, CCW
538  else
539  fprintf( outputFile, "G02*\n" ); // Active circular interpolation, CW
540 
541  fprintf( outputFile, "X%dY%dI%dJ%dD01*\n",
542  KiROUND( devEnd.x ), KiROUND( devEnd.y ),
543  KiROUND( devCenter.x ), KiROUND( devCenter.y ) );
544 
545  fprintf( outputFile, "G01*\n" ); // Back to linear interpol (perhaps useless here).
546 }
void LineTo(const wxPoint &pos)
Definition: plotter.h:262
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:94
double cosdecideg(double r, double a)
Circle generation utility: computes r * cos(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:408
double sindecideg(double r, double a)
Circle generation utility: computes r * sin(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:399
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68

References cosdecideg(), KiROUND(), PLOTTER::LineTo(), PLOTTER::MoveTo(), PLOTTER::outputFile, sindecideg(), PLOTTER::userToDeviceCoordinates(), wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by Arc(), and plotRoundRectAsRegion().

◆ 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 549 of file GERBER_plotter.cpp.

551 {
552  if( aCornerList.size() <= 2 )
553  return;
554 
555  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
556 
557  bool clearTA_AperFunction = false; // true if a TA.AperFunction is used
558 
559  if( gbr_metadata )
560  {
561  std::string attrib = gbr_metadata->m_ApertureMetadata.FormatAttribute( !m_useX2format );
562 
563  if( !attrib.empty() )
564  {
565  fputs( attrib.c_str(), outputFile );
566  clearTA_AperFunction = true;
567  }
568  }
569 
570  PlotPoly( aCornerList, FILLED_SHAPE, 0 , gbr_metadata );
571 
572  // Clear the TA attribute, to avoid the next item to inherit it:
573  if( clearTA_AperFunction )
574  {
575  if( m_useX2format )
576  {
577  fputs( "%TD.AperFunction*%\n", outputFile );
578  }
579  else
580  {
581  fputs( "G04 #@! TD.AperFunction*\n", outputFile );
582  }
583  }
584 }
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:1433
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:586
GBR_APERTURE_METADATA m_ApertureMetadata
a item to handle aperture attribute:
Definition: gbr_metadata.h:207

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

Referenced by FlashPadCustom(), 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 232 of file plotter.cpp.

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

References NO_FILL, PLOTTER::Rect(), wxPoint::x, and wxPoint::y.

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 583 of file plotter.cpp.

585 {
586  std::vector<wxPoint> cornerList;
587  cornerList.reserve( aCornerList.PointCount() );
588 
589  for( int ii = 0; ii < aCornerList.PointCount(); ii++ )
590  cornerList.emplace_back( aCornerList.CPoint( ii ) );
591 
592  if( aCornerList.IsClosed() && cornerList.front() != cornerList.back() )
593  cornerList.emplace_back( aCornerList.CPoint( 0 ) );
594 
595  PlotPoly( cornerList, aFill, aWidth, aData );
596 }
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 586 of file GERBER_plotter.cpp.

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

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().

◆ plotRoundRectAsRegion()

void GERBER_PLOTTER::plotRoundRectAsRegion ( const wxPoint aRectCenter,
const wxSize &  aSize,
int  aCornerRadius,
double  aOrient 
)
protected

Plot a round rect (a round rect shape in fact) as a Gerber region using lines and arcs for corners.

Parameters
aRectCenteris the center of the rectangle
aSizeis the size of the rectangle
aCornerRadiusis the radius of the corners
aOrientis the rotation of the rectangle Note: only the G36 ... G37 region is created.

Definition at line 942 of file GERBER_plotter.cpp.

944 {
945  // The region outline is generated by 4 sides and 4 90 deg arcs
946  // 1 --- 2
947  // | c |
948  // 4 --- 3
949 
950  // Note also in user coordinates the Y axis is from top to bottom
951  // for historical reasons.
952 
953  // A helper structure to handle outlines coordinates (segments and arcs)
954  // in user coordinates
955  struct RR_EDGE
956  {
957  wxPoint m_start;
958  wxPoint m_end;
959  wxPoint m_center;
960  // in decidegrees: angle start. angle end = m_arc_angle_start+arc_angle
961  double m_arc_angle_start;
962  };
963 
964  const double arc_angle = -900.0; // in decidegrees
965  int hsizeX = aSize.x/2;
966  int hsizeY = aSize.y/2;
967 
968  RR_EDGE curr_edge;
969  std::vector<RR_EDGE> rr_outline;
970 
971  // Build outline coordinates, relative to rectangle center, rotation 0:
972 
973  // Top left corner 1 (and 4 to 1 left vertical side @ x=-hsizeX)
974  curr_edge.m_start.x = -hsizeX;
975  curr_edge.m_start.y = hsizeY - aCornerRadius;
976  curr_edge.m_end.x = curr_edge.m_start.x;
977  curr_edge.m_end.y = -hsizeY + aCornerRadius;
978  curr_edge.m_center.x = -hsizeX + aCornerRadius;
979  curr_edge.m_center.y = curr_edge.m_end.y;
980  curr_edge.m_arc_angle_start = aOrient + 1800.0; // En decidegree
981 
982  rr_outline.push_back( curr_edge );
983 
984  // Top right corner 2 (and 1 to 2 top horizontal side @ y=-hsizeY)
985  curr_edge.m_start.x = -hsizeX + aCornerRadius;
986  curr_edge.m_start.y = -hsizeY;
987  curr_edge.m_end.x = hsizeX - aCornerRadius;
988  curr_edge.m_end.y = curr_edge.m_start.y;
989  curr_edge.m_center.x = curr_edge.m_end.x;
990  curr_edge.m_center.y = -hsizeY + aCornerRadius;
991  curr_edge.m_arc_angle_start = aOrient + 900.0; // En decidegree
992 
993  rr_outline.push_back( curr_edge );
994 
995  // bottom right corner 3 (and 2 to 3 right vertical side @ x=hsizeX)
996  curr_edge.m_start.x = hsizeX;
997  curr_edge.m_start.y = -hsizeY + aCornerRadius;
998  curr_edge.m_end.x = curr_edge.m_start.x;
999  curr_edge.m_end.y = hsizeY - aCornerRadius;
1000  curr_edge.m_center.x = hsizeX - aCornerRadius;
1001  curr_edge.m_center.y = curr_edge.m_end.y;
1002  curr_edge.m_arc_angle_start = aOrient + 0.0; // En decidegree
1003 
1004  rr_outline.push_back( curr_edge );
1005 
1006  // bottom left corner 4 (and 3 to 4 bottom horizontal side @ y=hsizeY)
1007  curr_edge.m_start.x = hsizeX - aCornerRadius;
1008  curr_edge.m_start.y = hsizeY;
1009  curr_edge.m_end.x = -hsizeX + aCornerRadius;
1010  curr_edge.m_end.y = curr_edge.m_start.y;
1011  curr_edge.m_center.x = curr_edge.m_end.x;
1012  curr_edge.m_center.y = hsizeY - aCornerRadius;
1013  curr_edge.m_arc_angle_start = aOrient - 900.0; // En decidegree
1014 
1015  rr_outline.push_back( curr_edge );
1016 
1017  // Move relative coordinates to the actual location and rotation:
1018  wxPoint arc_last_center;
1019  int arc_last_angle = curr_edge.m_arc_angle_start+arc_angle;
1020 
1021  for( RR_EDGE& rr_edge: rr_outline )
1022  {
1023  RotatePoint( &rr_edge.m_start, aOrient );
1024  RotatePoint( &rr_edge.m_end, aOrient );
1025  RotatePoint( &rr_edge.m_center, aOrient );
1026  rr_edge.m_start += aRectCenter;
1027  rr_edge.m_end += aRectCenter;
1028  rr_edge.m_center += aRectCenter;
1029  arc_last_center = rr_edge.m_center;
1030  }
1031 
1032  // Ensure the region is a closed polygon, i.e. the end point of last segment
1033  // (end of arc) is the same as the first point. Rounding issues can create a
1034  // small difference, mainly for rotated pads.
1035  // calculate last point (end of last arc):
1036  wxPoint last_pt;
1037  last_pt.x = arc_last_center.x + KiROUND( cosdecideg( aCornerRadius, arc_last_angle ) );
1038  last_pt.y = arc_last_center.y - KiROUND( sindecideg( aCornerRadius, arc_last_angle ) );
1039 
1040  wxPoint first_pt = rr_outline[0].m_start;
1041 
1042 #if 0 // For test only:
1043  if( last_pt != first_pt )
1044  wxLogMessage( "first pt %d %d last pt %d %d",
1045  first_pt.x, first_pt.y, last_pt.x, last_pt.y );
1046 #endif
1047 
1048  fputs( "G36*\n", outputFile ); // Start region
1049  fputs( "G01*\n", outputFile ); // Set linear interpolation.
1050  first_pt = last_pt;
1051  MoveTo( first_pt ); // Start point of region, must be same as end point
1052 
1053  for( RR_EDGE& rr_edge: rr_outline )
1054  {
1055  if( aCornerRadius ) // Guard: ensure we do not create arcs with radius = 0
1056  {
1057  // LineTo( rr_edge.m_end ); // made in plotArc()
1058  plotArc( rr_edge.m_center,
1059  rr_edge.m_arc_angle_start, rr_edge.m_arc_angle_start+arc_angle,
1060  aCornerRadius, true );
1061  }
1062  else
1063  LineTo( rr_edge.m_end );
1064  }
1065 
1066  fputs( "G37*\n", outputFile ); // Close region
1067 }
void plotArc(const wxPoint &aCenter, double aStAngle, double aEndAngle, int aRadius, bool aPlotInRegion)
Plot a Gerber arc.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
void LineTo(const wxPoint &pos)
Definition: plotter.h:262
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
double cosdecideg(double r, double a)
Circle generation utility: computes r * cos(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:408
double sindecideg(double r, double a)
Circle generation utility: computes r * sin(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:399
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68

References cosdecideg(), KiROUND(), PLOTTER::LineTo(), PLOTTER::MoveTo(), PLOTTER::outputFile, plotArc(), RotatePoint(), sindecideg(), wxPoint::x, and wxPoint::y.

Referenced by FlashPadRoundRect().

◆ 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 483 of file GERBER_plotter.cpp.

484 {
485  std::vector< wxPoint > cornerList;
486 
487  // Build corners list
488  cornerList.push_back( p1 );
489  wxPoint corner(p1.x, p2.y);
490  cornerList.push_back( corner );
491  cornerList.push_back( p2 );
492  corner.x = p2.x;
493  corner.y = p1.y;
494  cornerList.push_back( corner );
495  cornerList.push_back( p1 );
496 
497  PlotPoly( cornerList, fill, width );
498 }
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(), wxPoint::x, and wxPoint::y.

Referenced by FlashPadRect(), and ThickRect().

◆ RenderSettings()

◆ 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 438 of file plotter.cpp.

440 {
441  wxPoint center( (start.x + end.x) / 2, (start.y + end.y) / 2 );
442  wxSize size( end.x - start.x, end.y - start.y );
443  double orient;
444 
445  if( size.y == 0 )
446  orient = 0;
447  else if( size.x == 0 )
448  orient = 900;
449  else
450  orient = -ArcTangente( size.y, size.x );
451 
452  size.x = KiROUND( EuclideanNorm( size ) ) + width;
453  size.y = width;
454 
455  FlashPadOval( center, size, orient, tracemode, NULL );
456 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:128
#define NULL
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: util.h:68
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:162

References ArcTangente(), EuclideanNorm(), PLOTTER::FlashPadOval(), KiROUND(), NULL, wxPoint::x, and wxPoint::y.

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 331 of file GERBER_plotter.cpp.

334 {
335  bool change = ( m_currentApertureIdx < 0 ) ||
336  ( m_apertures[m_currentApertureIdx].m_Type != aType ) ||
337  ( m_apertures[m_currentApertureIdx].m_Size != aSize );
338 
339  if( !change )
340  change = m_apertures[m_currentApertureIdx].m_ApertureAttribute != aApertureAttribute;
341 
342  if( change )
343  {
344  // Pick an existing aperture or create a new one
345  m_currentApertureIdx = GetOrCreateAperture( aSize, aType, aApertureAttribute );
346  fprintf( outputFile, "D%d*\n", m_apertures[m_currentApertureIdx].m_DCode );
347  }
348 }
int GetOrCreateAperture(const wxSize &aSize, APERTURE::APERTURE_TYPE aType, int aApertureAttribute)
std::vector< APERTURE > m_apertures
Definition: plotter.h:1427
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
int m_currentApertureIdx
Definition: plotter.h:1428

References GetOrCreateAperture(), m_apertures, m_currentApertureIdx, 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 350 of file GERBER_plotter.cpp.

352 {
353  // Pick an existing aperture or create a new one, matching the
354  // aDiameter, aPolygonRotation, type and attributes for type =
355  // AT_REGULAR_POLY3 to AT_REGULAR_POLY12
356 
357  wxASSERT( aType>= APERTURE::APERTURE_TYPE::AT_REGULAR_POLY3 &&
358  aType <= APERTURE::APERTURE_TYPE::AT_REGULAR_POLY12 );
359 
360  // To use selectAperture( size, ... ) calculate a equivalent aperture size:
361  // for AT_REGULAR_POLYxx the parameter APERTURE::m_Size contains
362  // aDiameter (in m_Size.x) and aPolygonRotation in 1/1000 degree (in m_Size.y)
363  wxSize size( aDiameter, (int)( aPolygonRotation * 1000.0 ) );
364  selectAperture( size, aType, aApertureAttribute );
365 }
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 1198 of file plotter.h.

1198 {}

◆ 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 285 of file GERBER_plotter.cpp.

286 {
287  if( aWidth == DO_NOT_SET_LINE_WIDTH )
288  return;
289  else if( aWidth == USE_DEFAULT_LINE_WIDTH )
291 
292  wxASSERT_MSG( aWidth >= 0, "Plotter called to set negative pen width" );
293 
294  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
295  int aperture_attribute = gbr_metadata ? gbr_metadata->GetApertureAttrib() : 0;
296 
297  selectAperture( wxSize( aWidth, aWidth ), APERTURE::AT_PLOTTING, aperture_attribute );
298  currentPenWidth = aWidth;
299 }
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:119
GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB GetApertureAttrib()
Definition: gbr_metadata.h:165
RENDER_SETTINGS * m_renderSettings
Definition: plotter.h:603
int currentPenWidth
Definition: plotter.h:591
int GetDefaultPenWidth() const
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:118

References APERTURE::AT_PLOTTING, PLOTTER::currentPenWidth, PLOTTER::DO_NOT_SET_LINE_WIDTH, GBR_METADATA::GetApertureAttrib(), KIGFX::RENDER_SETTINGS::GetDefaultPenWidth(), PLOTTER::m_renderSettings, selectAperture(), and PLOTTER::USE_DEFAULT_LINE_WIDTH.

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

◆ SetDash()

virtual void GERBER_PLOTTER::SetDash ( PLOT_DASH_TYPE  dashed)
inlineoverridevirtual

Implements PLOTTER.

Definition at line 1194 of file plotter.h.

1195  {
1196  }

◆ 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:571
bool m_gerberUnitInch
Definition: plotter.h:1430
int m_gerberUnitFmt
Definition: plotter.h:1431
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:574

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 1205 of file GERBER_plotter.cpp.

1206 {
1207  if( aPositive )
1208  fprintf( outputFile, "%%LPD*%%\n" );
1209  else
1210  fprintf( outputFile, "%%LPC*%%\n" );
1211 }
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586

References PLOTTER::outputFile.

◆ SetNegative()

virtual void PLOTTER::SetNegative ( bool  aNegative)
inlinevirtualinherited

Definition at line 135 of file plotter.h.

136  {
137  negativeMode = aNegative;
138  }
bool negativeMode
Definition: plotter.h:590

References PLOTTER::negativeMode.

Referenced by FillNegativeKnockout().

◆ SetPageSettings()

◆ SetRenderSettings()

◆ SetSvgCoordinatesFormat()

virtual void PLOTTER::SetSvgCoordinatesFormat ( unsigned  aResolution,
bool  aUseInches = false 
)
inlinevirtualinherited

Reimplemented in SVG_PLOTTER.

Definition at line 465 of file plotter.h.

466  {
467  // NOP for most plotters. Only for SVG plotter
468  }

Referenced by initializePlotter().

◆ SetTextMode()

virtual void PLOTTER::SetTextMode ( PLOT_TEXT_MODE  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 455 of file plotter.h.

456  {
457  // NOP for most plotters.
458  }

Referenced by initializePlotter(), and PlotOneBoardLayer().

◆ SetTitle()

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

Definition at line 169 of file plotter.h.

170  {
171  title = aTitle;
172  }
wxString title
Definition: plotter.h:597

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 68 of file GERBER_plotter.cpp.

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

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

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 459 of file plotter.cpp.

460 {
461  SetCurrentLineWidth( width );
462  width = currentPenWidth;
463  int radius, deltaxy, cx, cy;
464  wxSize size( aSize );
465 
466  if( size.x > size.y )
467  {
468  std::swap( size.x, size.y );
469  orient = AddAngles( orient, 900 );
470  }
471 
472  deltaxy = size.y - size.x; /* distance between centers of the oval */
473  radius = ( size.x - width ) / 2;
474  cx = -radius;
475  cy = -deltaxy / 2;
476  RotatePoint( &cx, &cy, orient );
477  MoveTo( wxPoint( cx + pos.x, cy + pos.y ) );
478  cx = -radius;
479  cy = deltaxy / 2;
480  RotatePoint( &cx, &cy, orient );
481  FinishTo( wxPoint( cx + pos.x, cy + pos.y ) );
482 
483  cx = radius;
484  cy = -deltaxy / 2;
485  RotatePoint( &cx, &cy, orient );
486  MoveTo( wxPoint( cx + pos.x, cy + pos.y ) );
487  cx = radius;
488  cy = deltaxy / 2;
489  RotatePoint( &cx, &cy, orient );
490  FinishTo( wxPoint( cx + pos.x, cy + pos.y ) );
491 
492  cx = 0;
493  cy = deltaxy / 2;
494  RotatePoint( &cx, &cy, orient );
495  Arc( wxPoint( cx + pos.x, cy + pos.y ),
496  orient + 1800, orient + 3600,
497  radius, NO_FILL );
498  cx = 0;
499  cy = -deltaxy / 2;
500  RotatePoint( &cx, &cy, orient );
501  Arc( wxPoint( cx + pos.x, cy + pos.y ),
502  orient, orient + 1800,
503  radius, NO_FILL );
504 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
T AddAngles(T a1, T2 a2)
Add two angles (keeping the result normalized). T2 is here.
Definition: trigo.h:304
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
int currentPenWidth
Definition: plotter.h:591
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:158
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(), PLOTTER::SetCurrentLineWidth(), wxPoint::x, and wxPoint::y.

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  // Set initial interpolation mode: always G01 (linear):
237  fputs( "G01*\n", outputFile );
238 
239  // Set aperture list starting point:
240  fputs( "G04 APERTURE LIST*\n", outputFile );
241 
242  return true;
243 }
bool m_gerberUnitInch
Definition: plotter.h:1430
wxArrayString m_headerExtraLines
Definition: plotter.h:601
#define NULL
wxString GetBuildVersion()
Get the full KiCad version string.
int m_gerberUnitFmt
Definition: plotter.h:1431
FILE * finalFile
Definition: plotter.h:1419
FILE * outputFile
true if the Y axis is top to bottom (SVG)
Definition: plotter.h:586
#define TO_UTF8(wxstring)
wxString m_workFilename
Definition: plotter.h:1420
FILE * workFile
Definition: plotter.h:1418
wxString filename
Definition: plotter.h:596
wxString creator
Definition: plotter.h:595

References PLOTTER::creator, PLOTTER::filename, finalFile, GetBuildVersion(), m_gerberUnitFmt, m_gerberUnitInch, PLOTTER::m_headerExtraLines, m_workFilename, NULL, 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  aPenWidth,
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)
aPenWidth= line width (if = 0, use plot default line width)
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 1189 of file GERBER_plotter.cpp.

1194 {
1195  GBR_METADATA* gbr_metadata = static_cast<GBR_METADATA*>( aData );
1196 
1197  if( gbr_metadata )
1198  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
1199 
1200  PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify, aWidth, aItalic,
1201  aBold, aMultilineAllowed, aData );
1202 }
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:222
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212

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 657 of file GERBER_plotter.cpp.

659 {
660  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
661  SetCurrentLineWidth( width, gbr_metadata );
662 
663  if( gbr_metadata )
664  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
665 
666  if( tracemode == FILLED )
667  Arc( centre, StAngle, EndAngle, radius, NO_FILL, DO_NOT_SET_LINE_WIDTH );
668  else
669  {
671  Arc( centre, StAngle, EndAngle,
672  radius - ( width - currentPenWidth ) / 2,
674  Arc( centre, StAngle, EndAngle,
675  radius + ( width - currentPenWidth ) / 2, NO_FILL,
677  }
678 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:119
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:591
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:212
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:118

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 709 of file GERBER_plotter.cpp.

711 {
712  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
713  SetCurrentLineWidth( width, gbr_metadata );
714 
715  if( gbr_metadata )
716  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
717 
718  if( tracemode == FILLED )
719  Circle( pos, diametre, NO_FILL, DO_NOT_SET_LINE_WIDTH );
720  else
721  {
723  Circle( pos, diametre - (width - currentPenWidth),
725  Circle( pos, diametre + (width - currentPenWidth),
727  }
728 }
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:119
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:591
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
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:118

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 681 of file GERBER_plotter.cpp.

683 {
684  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
685  SetCurrentLineWidth( width, gbr_metadata );
686 
687  if( gbr_metadata )
688  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
689 
690  if( tracemode == FILLED )
691  Rect( p1, p2, NO_FILL, DO_NOT_SET_LINE_WIDTH );
692  else
693  {
695  wxPoint offsetp1( p1.x - (width - currentPenWidth) / 2,
696  p1.y - (width - currentPenWidth) / 2 );
697  wxPoint offsetp2( p2.x + (width - currentPenWidth) / 2,
698  p2.y + (width - currentPenWidth) / 2 );
699  Rect( offsetp1, offsetp2, NO_FILL, -1 );
700  offsetp1.x += (width - currentPenWidth);
701  offsetp1.y += (width - currentPenWidth);
702  offsetp2.x -= (width - currentPenWidth);
703  offsetp2.y -= (width - currentPenWidth);
704  Rect( offsetp1, offsetp2, NO_FILL, DO_NOT_SET_LINE_WIDTH );
705  }
706 }
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:119
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
Set the line width for the next drawing.
int currentPenWidth
Definition: plotter.h:591
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
static const int DO_NOT_SET_LINE_WIDTH
Definition: plotter.h:118

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

◆ 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 636 of file GERBER_plotter.cpp.

638 {
639  if( tracemode == FILLED )
640  {
641  GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
642  SetCurrentLineWidth( width, gbr_metadata );
643 
644  if( gbr_metadata )
645  formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
646 
647  MoveTo( start );
648  FinishTo( end );
649  }
650  else
651  {
653  segmentAsOval( start, end, width, tracemode );
654  }
655 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
void formatNetAttribute(GBR_NETLIST_METADATA *aData)
print a Gerber net attribute object record.
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:119
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:257
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:212
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:438

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().

◆ 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 94 of file plotter.cpp.

95 {
96  wxPoint pos = aCoordinate - plotOffset;
97 
98  // Don't allow overflows; they can cause rendering failures in some file viewers
99  // (such as Acrobat)
100  int clampSize = MAX_PAGE_SIZE_MILS * m_IUsPerDecimil * 10 / 2;
101  pos.x = std::max( -clampSize, std::min( pos.x, clampSize ) );
102  pos.y = std::max( -clampSize, std::min( pos.y, clampSize ) );
103 
104  double x = pos.x * plotScale;
105  double y = ( paperSize.y - pos.y * plotScale );
106 
107  if( m_plotMirror )
108  {
110  x = ( paperSize.x - pos.x * plotScale );
111  else
112  y = pos.y * plotScale;
113  }
114 
115  if( m_yaxisReversed )
116  y = paperSize.y - y;
117 
118  x *= iuPerDeviceUnit;
119  y *= iuPerDeviceUnit;
120 
121  return DPOINT( x, y );
122 }
double m_IUsPerDecimil
Definition: plotter.h:571
wxPoint plotOffset
Plot offset (in IUs)
Definition: plotter.h:577
bool m_yaxisReversed
true to mirror horizontally (else vertically)
Definition: plotter.h:583
bool m_plotMirror
X axis orientation (SVG) and plot mirrored (only for PS, PDF HPGL and SVG)
Definition: plotter.h:581
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:565
#define MAX_PAGE_SIZE_MILS
Definition: page_info.h:41
double iuPerDeviceUnit
Device scale (from IUs to plotter device units - usually decimils)
Definition: plotter.h:574
VECTOR2< double > DPOINT
Definition: vector2d.h:599
wxSize paperSize
Definition: plotter.h:599
bool m_mirrorIsHorizontal
Definition: plotter.h:582

References PLOTTER::iuPerDeviceUnit, PLOTTER::m_IUsPerDecimil, PLOTTER::m_mirrorIsHorizontal, PLOTTER::m_plotMirror, PLOTTER::m_yaxisReversed, MAX_PAGE_SIZE_MILS, PLOTTER::paperSize, PLOTTER::plotOffset, PLOTTER::plotScale, wxPoint::x, and wxPoint::y.

Referenced by HPGL_PLOTTER::Arc(), PS_PLOTTER::Arc(), PDF_PLOTTER::Arc(), SVG_PLOTTER::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(), plotArc(), 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 132 of file plotter.cpp.

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

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

◆ UseX2format()

void GERBER_PLOTTER::UseX2format ( bool  aEnable)
inline

Definition at line 1308 of file plotter.h.

1308 { m_useX2format = aEnable; }
bool m_useX2format
Definition: plotter.h:1433

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 1309 of file plotter.h.

1309 { m_useNetAttributes = aEnable; }
bool m_useNetAttributes
Definition: plotter.h:1435

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 367 of file GERBER_plotter.cpp.

368 {
369  wxASSERT( outputFile );
370  char cbuf[1024];
371 
372  bool useX1StructuredComment = false;
373 
374  if( !m_useX2format )
375  useX1StructuredComment = true;
376 
377  // Init
378  for( APERTURE& tool : m_apertures )
379  {
380  // apertude sizes are in inch or mm, regardless the
381  // coordinates format
382  double fscale = 0.0001 * plotScale / m_IUsPerDecimil; // inches
383 
384  if(! m_gerberUnitInch )
385  fscale *= 25.4; // size in mm
386 
387  int attribute = tool.m_ApertureAttribute;
388 
389  if( attribute != m_apertureAttribute )
390  {
393  useX1StructuredComment ).c_str(), outputFile );
394  }
395 
396  char* text = cbuf + sprintf( cbuf, "%%ADD%d", tool.m_DCode );
397 
398  /* Please note: the Gerber specs for mass parameters say that
399  exponential syntax is *not* allowed and the decimal point should
400  also be always inserted. So the %g format is ruled out, but %f is fine
401  (the # modifier forces the decimal point). Sadly the %f formatter
402  can't remove trailing zeros but thats not a problem, since nothing
403  forbid it (the file is only slightly longer) */
404 
405  switch( tool.m_Type )
406  {
407  case APERTURE::AT_CIRCLE:
408  sprintf( text, "C,%#f*%%\n", tool.GetDiameter() * fscale );
409  break;
410 
411  case APERTURE::AT_RECT:
412  sprintf( text, "R,%#fX%#f*%%\n", tool.m_Size.x * fscale,
413  tool.m_Size.y * fscale );
414  break;
415 
417  sprintf( text, "C,%#f*%%\n", tool.m_Size.x * fscale );
418  break;
419 
420  case APERTURE::AT_OVAL:
421  sprintf( text, "O,%#fX%#f*%%\n", tool.m_Size.x * fscale,
422  tool.m_Size.y * fscale );
423  break;
424 
436  sprintf( text, "P,%#fX%dX%#f*%%\n", tool.GetDiameter() * fscale,
437  tool.GetVerticeCount(), tool.GetRotation() );
438  break;
439  }
440 
441  fputs( cbuf, outputFile );
442 
443  m_apertureAttribute = attribute;
444 
445  // Currently reset the aperture attribute. Perhaps a better optimization
446  // is to store the last attribute
447  if( attribute )
448  {
449  if( m_useX2format )
450  fputs( "%TD*%\n", outputFile );
451  else
452  fputs( "G04 #@! TD*\n", outputFile );
453 
455  }
456 
457  }
458 }
double m_IUsPerDecimil
Definition: plotter.h:571
bool m_gerberUnitInch
Definition: plotter.h:1430
std::vector< APERTURE > m_apertures
Definition: plotter.h:1427
double plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:565
bool m_useX2format
Definition: plotter.h:1433
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:586
int m_apertureAttribute
Definition: plotter.h:1416

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

◆ DO_NOT_SET_LINE_WIDTH

◆ filename

wxString PLOTTER::filename
protectedinherited

◆ finalFile

FILE* GERBER_PLOTTER::finalFile
protected

Definition at line 1419 of file plotter.h.

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

◆ iuPerDeviceUnit

◆ m_apertureAttribute

int GERBER_PLOTTER::m_apertureAttribute
protected

Definition at line 1416 of file plotter.h.

Referenced by GERBER_PLOTTER(), and writeApertureList().

◆ m_apertures

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

Definition at line 1427 of file plotter.h.

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

◆ m_currentApertureIdx

int GERBER_PLOTTER::m_currentApertureIdx
protected

Definition at line 1428 of file plotter.h.

Referenced by GERBER_PLOTTER(), and selectAperture().

◆ m_gerberUnitFmt

int GERBER_PLOTTER::m_gerberUnitFmt
protected

Definition at line 1431 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 601 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 1413 of file plotter.h.

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

◆ m_plotMirror

◆ m_renderSettings

◆ m_useNetAttributes

bool GERBER_PLOTTER::m_useNetAttributes
protected

Definition at line 1435 of file plotter.h.

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

◆ m_useX2format

bool GERBER_PLOTTER::m_useX2format
protected

◆ m_workFilename

wxString GERBER_PLOTTER::m_workFilename
protected

Definition at line 1420 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 583 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 428 of file plotter.h.

Referenced by PLOTTER::Marker().

◆ negativeMode

bool PLOTTER::negativeMode
protectedinherited

Definition at line 590 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 586 of file plotter.h.

Referenced by HPGL_PLOTTER::Arc(), PS_PLOTTER::Arc(), SVG_PLOTTER::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(), FlashPadRoundRect(), 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(), plotArc(), PlotGerberRegion(), PS_PLOTTER::PlotImage(), SVG_PLOTTER::PlotImage(), HPGL_PLOTTER::PlotPoly(), PS_PLOTTER::PlotPoly(), SVG_PLOTTER::PlotPoly(), PlotPoly(), plotRoundRectAsRegion(), 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

◆ penLastpos

wxPoint PLOTTER::penLastpos
protectedinherited

◆ penState

char PLOTTER::penState
protectedinherited

◆ plotOffset

◆ plotScale

double PLOTTER::plotScale
protectedinherited

◆ title

wxString PLOTTER::title
protectedinherited

Definition at line 597 of file plotter.h.

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

◆ USE_DEFAULT_LINE_WIDTH

◆ workFile

FILE* GERBER_PLOTTER::workFile
protected

Definition at line 1418 of file plotter.h.

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


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