KiCad PCB EDA Suite
HPGL_PLOTTER Class Reference

#include <plotter_hpgl.h>

Inheritance diagram for HPGL_PLOTTER:
PLOTTER

Classes

struct  HPGL_ITEM
 

Public Member Functions

 HPGL_PLOTTER ()
 
virtual PLOT_FORMAT GetPlotterType () const override
 Returns the effective plot engine in use. More...
 
void SetTargetChordLength (double chord_len)
 Set the target length of chords used to draw approximated circles and arcs. More...
 
void SetUserCoords (bool user_coords)
 Switch to the user coordinate system. More...
 
void SetUserCoordsFit (bool user_coords_fit)
 Set whether the user coordinate system is fit to content. More...
 
virtual bool StartPlot () override
 At the start of the HPGL plot pen speed and number are requested. More...
 
virtual bool EndPlot () override
 HPGL end of plot: sort and emit graphics, pen return and release. More...
 
virtual void SetCurrentLineWidth (int width, void *aData=NULL) override
 HPGL doesn't handle line thickness or color. More...
 
virtual void SetDash (PLOT_DASH_TYPE dashed) override
 HPGL supports dashed lines. More...
 
virtual void SetColor (COLOR4D color) override
 
virtual void SetPenSpeed (int speed)
 
virtual void SetPenNumber (int number)
 
virtual void SetPenDiameter (double diameter)
 
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_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH) override
 
virtual void Circle (const wxPoint &pos, int diametre, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH) override
 
virtual void PlotPoly (const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL) override
 HPGL polygon: More...
 
virtual void ThickSegment (const wxPoint &start, const wxPoint &end, int width, OUTLINE_MODE tracemode, void *aData) override
 
virtual void Arc (const wxPoint &centre, double StAngle, double EndAngle, int rayon, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH) override
 Generic fallback: arc rendered as a polyline. More...
 
virtual void PenTo (const wxPoint &pos, char plume) override
 moveto/lineto primitive, moves the 'pen' to the specified direction More...
 
virtual void FlashPadCircle (const wxPoint &aPadPos, int aDiameter, OUTLINE_MODE aTraceMode, void *aData) override
 
virtual void FlashPadOval (const wxPoint &aPadPos, const wxSize &aSize, double aPadOrient, OUTLINE_MODE aTraceMode, void *aData) override
 
virtual void FlashPadRect (const wxPoint &aPadPos, const wxSize &aSize, double aOrient, OUTLINE_MODE aTraceMode, void *aData) override
 
virtual void FlashPadRoundRect (const wxPoint &aPadPos, const wxSize &aSize, int aCornerRadius, double aOrient, OUTLINE_MODE aTraceMode, void *aData) override
 
virtual void FlashPadCustom (const wxPoint &aPadPos, const wxSize &aSize, double aOrient, SHAPE_POLY_SET *aPolygons, OUTLINE_MODE aTraceMode, void *aData) override
 
virtual void FlashPadTrapez (const wxPoint &aPadPos, const wxPoint *aCorners, double aPadOrient, OUTLINE_MODE aTraceMode, void *aData) override
 Flash a trapezoidal pad. More...
 
virtual void FlashRegularPolygon (const wxPoint &aShapePos, int aDiameter, int aCornerCount, double aOrient, OUTLINE_MODE aTraceMode, void *aData) override
 Flash a regular polygon. More...
 
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)
 Add a line to the list of free lines to print at the beginning of the file. More...
 
void 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_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)
 Draw a polygon ( filled or not ) More...
 
virtual void PlotImage (const wxImage &aImage, const wxPoint &aPos, double aScaleFactor)
 Only PostScript plotters can plot bitmaps. More...
 
virtual void ThickArc (const wxPoint &centre, double StAngle, double EndAngle, int rayon, int width, OUTLINE_MODE tracemode, void *aData)
 
virtual void ThickRect (const wxPoint &p1, const wxPoint &p2, int width, OUTLINE_MODE tracemode, void *aData)
 
virtual void ThickCircle (const wxPoint &pos, int diametre, int width, OUTLINE_MODE tracemode, void *aData)
 
virtual void FilledCircle (const wxPoint &pos, int diametre, OUTLINE_MODE tracemode, void *aData)
 
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. More...
 
void Marker (const wxPoint &position, int diametre, unsigned aShapeId)
 Draw a pattern shape number aShapeId, to coord position. More...
 
virtual void SetLayerPolarity (bool aPositive)
 Set the current Gerber layer polarity to positive or negative by writing %LPD*% or %LPC*% to the Gerber file, respectively. More...
 
virtual void SetTextMode (PLOT_TEXT_MODE mode)
 Change the current text mode. More...
 
virtual void SetGerberCoordinatesFormat (int aResolution, bool aUseInches=false)
 
virtual void SetSvgCoordinatesFormat (unsigned aResolution, bool aUseInches=false)
 
virtual void StartBlock (void *aData)
 calling this function allows one to define the beginning of a group of drawing items, for instance in SVG or Gerber format. More...
 
virtual void EndBlock (void *aData)
 calling this function allows one to define the end of a group of drawing items for instance in SVG or Gerber format. More...
 

Static Public Member Functions

static wxString GetDefaultFileExtension ()
 

Static Public Attributes

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

Protected Member Functions

bool startItem (DPOINT location)
 Start a new HPGL_ITEM if necessary, keeping the current one if it exists. More...
 
void flushItem ()
 Flush the current HPGL_ITEM and clear out the current item pointer. More...
 
bool startOrAppendItem (DPOINT location, wxString const &content)
 Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item. 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, OUTLINE_MODE tracemode)
 Convert 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
 

Static Protected Member Functions

static void sortItems (std::list< HPGL_ITEM > &items)
 Sort a list of HPGL items to improve plotting speed on mechanical plotters. More...
 
static const char * lineTypeCommand (PLOT_DASH_TYPE linetype)
 Return the plot command corresponding to a line type. More...
 

Protected Attributes

int penSpeed
 
int penNumber
 
double penDiameter
 
double arcTargetChordLength
 
double arcMinChordDegrees
 
PLOT_DASH_TYPE dashType
 
bool useUserCoords
 
bool fitUserCoords
 
std::list< HPGL_ITEMm_items
 
HPGL_ITEMm_current_item
 
double m_plotScale
 Plot scale - chosen by the user (even implicitly with 'fit in a4') More...
 
double m_IUsPerDecimil
 
double m_iuPerDeviceUnit
 
wxPoint m_plotOffset
 
bool m_plotMirror
 
bool m_mirrorIsHorizontal
 
bool m_yaxisReversed
 
FILE * m_outputFile
 Output file. More...
 
bool m_colorMode
 
bool m_negativeMode
 
int m_currentPenWidth
 
char m_penState
 
wxPoint m_penLastpos
 
wxString m_creator
 
wxString m_filename
 
wxString m_title
 
PAGE_INFO m_pageInfo
 
wxSize m_paperSize
 
wxArrayString m_headerExtraLines
 
RENDER_SETTINGSm_renderSettings
 

Detailed Description

Definition at line 36 of file plotter_hpgl.h.

Constructor & Destructor Documentation

◆ HPGL_PLOTTER()

HPGL_PLOTTER::HPGL_PLOTTER ( )

Definition at line 222 of file HPGL_plotter.cpp.

223  : arcTargetChordLength( 0 ),
224  arcMinChordDegrees( 5.0 ),
226  useUserCoords( false ),
227  fitUserCoords( false ),
228  m_current_item( nullptr )
229 {
230  SetPenSpeed( 40 ); // Default pen speed = 40 cm/s; Pen speed is *always* in cm
231  SetPenNumber( 1 ); // Default pen num = 1
232  SetPenDiameter( 0.0 );
233 }
virtual void SetPenDiameter(double diameter)
bool useUserCoords
Definition: plotter_hpgl.h:149
virtual void SetPenSpeed(int speed)
Definition: plotter_hpgl.h:77
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
PLOT_DASH_TYPE dashType
Definition: plotter_hpgl.h:148
virtual void SetPenNumber(int number)
Definition: plotter_hpgl.h:82
double arcMinChordDegrees
Definition: plotter_hpgl.h:147
double arcTargetChordLength
Definition: plotter_hpgl.h:146
bool fitUserCoords
Definition: plotter_hpgl.h:150

References SetPenDiameter(), SetPenNumber(), and SetPenSpeed().

Member Function Documentation

◆ AddLineToHeader()

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

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

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

References PLOTTER::m_headerExtraLines.

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

◆ Arc()

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

Generic fallback: arc rendered as a polyline.

Reimplemented from PLOTTER.

Definition at line 590 of file HPGL_plotter.cpp.

592 {
593  wxASSERT( m_outputFile );
594  double angle;
595 
596  if( radius <= 0 )
597  return;
598 
599  double const radius_dev = userToDeviceSize( radius );
600  double const circumf_dev = 2.0 * M_PI * radius_dev;
601  double const target_chord_length = arcTargetChordLength;
602  double chord_degrees = 360.0 * target_chord_length / circumf_dev;
603 
604  if( chord_degrees < arcMinChordDegrees )
605  {
606  chord_degrees = arcMinChordDegrees;
607  }
608  else if( chord_degrees > 45 )
609  {
610  chord_degrees = 45;
611  }
612 
613  DPOINT centre_dev = userToDeviceCoordinates( centre );
614 
615  if( m_plotMirror )
616  angle = StAngle - EndAngle;
617  else
618  angle = EndAngle - StAngle;
619 
621  angle /= 10;
622 
623  // Calculate arc start point:
624  wxPoint cmap;
625  cmap.x = centre.x + KiROUND( cosdecideg( radius, StAngle ) );
626  cmap.y = centre.y - KiROUND( sindecideg( radius, StAngle ) );
627  DPOINT cmap_dev = userToDeviceCoordinates( cmap );
628 
629  startOrAppendItem( cmap_dev, wxString::Format( "AA %.0f,%.0f,%.0f,%g", centre_dev.x,
630  centre_dev.y, angle, chord_degrees ) );
631 
632  // TODO We could compute the final position and full bounding box instead...
634  BOX2D( centre_dev - radius_dev, VECTOR2D( radius_dev * 2, radius_dev * 2 ) ) );
635  m_current_item->lift_after = true;
636  flushItem();
637 }
void flushItem()
Flush the current HPGL_ITEM and clear out the current item pointer.
BOX2D bbox
Bounding box of this item.
Definition: plotter_hpgl.h:169
BOX2< VECTOR2D > BOX2D
Definition: box2.h:523
FILE * m_outputFile
Output file.
Definition: plotter.h:580
void NORMALIZE_ANGLE_180(T &Angle)
Definition: trigo.h:385
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.
bool m_plotMirror
Definition: plotter.h:574
VECTOR2< double > VECTOR2D
Definition: vector2d.h:622
bool lift_after
Whether the pen must be lifted after the command.
Definition: plotter_hpgl.h:177
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:386
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
double cosdecideg(double r, double a)
Circle generation utility: computes r * cos(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:439
double sindecideg(double r, double a)
Circle generation utility: computes r * sin(a) Where a is in decidegrees, not in radians.
Definition: trigo.h:430
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
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 arcMinChordDegrees
Definition: plotter_hpgl.h:147
double arcTargetChordLength
Definition: plotter_hpgl.h:146

References PNS::angle(), arcMinChordDegrees, arcTargetChordLength, HPGL_PLOTTER::HPGL_ITEM::bbox, cosdecideg(), flushItem(), Format(), KiROUND(), HPGL_PLOTTER::HPGL_ITEM::lift_after, m_current_item, PLOTTER::m_outputFile, PLOTTER::m_plotMirror, BOX2< Vec >::Merge(), NORMALIZE_ANGLE_180(), sindecideg(), startOrAppendItem(), PLOTTER::userToDeviceCoordinates(), PLOTTER::userToDeviceSize(), VECTOR2< T >::x, and VECTOR2< T >::y.

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

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

◆ Circle()

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

Implements PLOTTER.

Definition at line 410 of file HPGL_plotter.cpp.

412 {
413  wxASSERT( m_outputFile );
414  double radius = userToDeviceSize( diameter / 2 );
415  DPOINT center_dev = userToDeviceCoordinates( centre );
416  SetCurrentLineWidth( width );
417 
418  double const circumf = 2.0 * M_PI * radius;
419  double const target_chord_length = arcTargetChordLength;
420  double chord_degrees = 360.0 * target_chord_length / circumf;
421 
422  if( chord_degrees < arcMinChordDegrees )
423  {
424  chord_degrees = arcMinChordDegrees;
425  }
426  else if( chord_degrees > 45 )
427  {
428  chord_degrees = 45;
429  }
430 
431  if( fill == FILL_TYPE::FILLED_SHAPE )
432  {
433  // Draw the filled area
434  MoveTo( centre );
435  startOrAppendItem( center_dev, wxString::Format( "PM 0;CI %g,%g;%s", radius, chord_degrees,
437  m_current_item->lift_before = true;
438  m_current_item->pen_returns = true;
440  BOX2D( center_dev - radius, VECTOR2D( 2 * radius, 2 * radius ) ) );
441  PenFinish();
442  }
443 
444  if( radius > 0 )
445  {
446  MoveTo( centre );
447  startOrAppendItem( center_dev, wxString::Format( "CI %g,%g;", radius, chord_degrees ) );
448  m_current_item->lift_before = true;
449  m_current_item->pen_returns = true;
451  BOX2D( center_dev - radius, VECTOR2D( 2 * radius, 2 * radius ) ) );
452  PenFinish();
453  }
454 }
bool pen_returns
Whether the pen returns to its original state after the command.
Definition: plotter_hpgl.h:181
void PenFinish()
Definition: plotter.h:273
BOX2D bbox
Bounding box of this item.
Definition: plotter_hpgl.h:169
BOX2< VECTOR2D > BOX2D
Definition: box2.h:523
FILE * m_outputFile
Output file.
Definition: plotter.h:580
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:622
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
HPGL doesn't handle line thickness or color.
Definition: plotter_hpgl.h:67
static const char hpgl_end_polygon_cmd[]
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:386
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
double arcMinChordDegrees
Definition: plotter_hpgl.h:147
bool lift_before
Whether the command should be executed with the pen lifted.
Definition: plotter_hpgl.h:172
double arcTargetChordLength
Definition: plotter_hpgl.h:146

References arcMinChordDegrees, arcTargetChordLength, HPGL_PLOTTER::HPGL_ITEM::bbox, FILLED_SHAPE, Format(), hpgl_end_polygon_cmd, HPGL_PLOTTER::HPGL_ITEM::lift_before, m_current_item, PLOTTER::m_outputFile, BOX2< Vec >::Merge(), PLOTTER::MoveTo(), HPGL_PLOTTER::HPGL_ITEM::pen_returns, PLOTTER::PenFinish(), SetCurrentLineWidth(), startOrAppendItem(), PLOTTER::userToDeviceCoordinates(), and PLOTTER::userToDeviceSize().

◆ ClearHeaderLinesList()

void PLOTTER::ClearHeaderLinesList ( )
inlineinherited

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:595

References PLOTTER::m_headerExtraLines.

Referenced by StartPlotBoard().

◆ EndBlock()

virtual void PLOTTER::EndBlock ( void *  aData)
inlinevirtualinherited

calling this function allows one to define the end of a group of drawing items for instance in SVG or Gerber format.

the group is started by StartBlock()

Parameters
aDatacan define any parameter for most of plotters: do nothing

Reimplemented in SVG_PLOTTER, and GERBER_PLOTTER.

Definition at line 484 of file plotter.h.

484 {}

Referenced by SCH_COMPONENT::Plot(), BRDITEMS_PLOTTER::PlotFilledAreas(), and PlotStandardLayer().

◆ EndPlot()

bool HPGL_PLOTTER::EndPlot ( )
overridevirtual

HPGL end of plot: sort and emit graphics, pen return and release.

Implements PLOTTER.

Definition at line 275 of file HPGL_plotter.cpp.

276 {
277  wxASSERT( m_outputFile );
278 
279  fputs( "PU;\n", m_outputFile );
280 
281  flushItem();
282  sortItems( m_items );
283 
284  if( m_items.size() > 0 )
285  {
286  if( useUserCoords )
287  {
288  if( fitUserCoords )
289  {
290  BOX2D bbox = m_items.front().bbox;
291  for( HPGL_ITEM const& item : m_items )
292  {
293  bbox.Merge( item.bbox );
294  }
295 
296  fprintf( m_outputFile, "SC%.0f,%.0f,%.0f,%.0f;\n", bbox.GetX(),
297  bbox.GetX() + bbox.GetWidth(), bbox.GetY(),
298  bbox.GetY() + bbox.GetHeight() );
299  }
300  else
301  {
302  DPOINT pagesize_dev( m_paperSize * m_iuPerDeviceUnit );
303  fprintf( m_outputFile, "SC%.0f,%.0f,%.0f,%.0f;\n", 0., pagesize_dev.x, 0.,
304  pagesize_dev.y );
305  }
306  }
307 
308  DPOINT loc = m_items.begin()->loc_start;
309  bool pen_up = true;
310  PLOT_DASH_TYPE current_dash = PLOT_DASH_TYPE::SOLID;
311  int current_pen = penNumber;
312 
313  for( HPGL_ITEM const& item : m_items )
314  {
315  if( item.loc_start != loc || pen_up )
316  {
317  if( !pen_up )
318  {
319  fputs( "PU;", m_outputFile );
320  pen_up = true;
321  }
322 
323  fprintf( m_outputFile, "PA %.0f,%.0f;", item.loc_start.x, item.loc_start.y );
324  }
325 
326  if( item.dashType != current_dash )
327  {
328  current_dash = item.dashType;
329  fputs( lineTypeCommand( item.dashType ), m_outputFile );
330  }
331 
332  if( item.pen != current_pen )
333  {
334  if( !pen_up )
335  {
336  fputs( "PU;", m_outputFile );
337  pen_up = true;
338  }
339  fprintf( m_outputFile, "SP%d;", item.pen );
340  current_pen = item.pen;
341  }
342 
343  if( pen_up && !item.lift_before )
344  {
345  fputs( "PD;", m_outputFile );
346  pen_up = false;
347  }
348  else if( !pen_up && item.lift_before )
349  {
350  fputs( "PU;", m_outputFile );
351  pen_up = true;
352  }
353 
354  fputs( static_cast<const char*>( item.content.utf8_str() ), m_outputFile );
355 
356  if( !item.pen_returns )
357  {
358  // Assume commands drop the pen
359  pen_up = false;
360  }
361 
362  if( item.lift_after )
363  {
364  fputs( "PU;", m_outputFile );
365  pen_up = true;
366  }
367  else
368  {
369  loc = item.loc_end;
370  }
371  fputs( "\n", m_outputFile );
372  }
373  }
374 
375  fputs( "PU;PA;SP0;\n", m_outputFile );
376  fclose( m_outputFile );
377  m_outputFile = NULL;
378  return true;
379 }
void flushItem()
Flush the current HPGL_ITEM and clear out the current item pointer.
coord_type GetX() const
Definition: box2.h:190
FILE * m_outputFile
Output file.
Definition: plotter.h:580
static void sortItems(std::list< HPGL_ITEM > &items)
Sort a list of HPGL items to improve plotting speed on mechanical plotters.
double m_iuPerDeviceUnit
Definition: plotter.h:571
bool useUserCoords
Definition: plotter_hpgl.h:149
std::list< HPGL_ITEM > m_items
Definition: plotter_hpgl.h:201
#define NULL
coord_type GetWidth() const
Definition: box2.h:197
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:386
PLOT_DASH_TYPE
Dashed line types.
Definition: plotter.h:104
coord_type GetY() const
Definition: box2.h:191
static const char * lineTypeCommand(PLOT_DASH_TYPE linetype)
Return the plot command corresponding to a line type.
coord_type GetHeight() const
Definition: box2.h:198
wxSize m_paperSize
Definition: plotter.h:593
bool fitUserCoords
Definition: plotter_hpgl.h:150

References fitUserCoords, flushItem(), BOX2< Vec >::GetHeight(), BOX2< Vec >::GetWidth(), BOX2< Vec >::GetX(), BOX2< Vec >::GetY(), lineTypeCommand(), m_items, PLOTTER::m_iuPerDeviceUnit, PLOTTER::m_outputFile, PLOTTER::m_paperSize, BOX2< Vec >::Merge(), NULL, penNumber, SOLID, sortItems(), useUserCoords, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ FilledCircle()

void PLOTTER::FilledCircle ( const wxPoint &  pos,
int  diametre,
OUTLINE_MODE  tracemode,
void *  aData 
)
virtualinherited

Reimplemented in GERBER_PLOTTER.

Definition at line 584 of file plotter.cpp.

585 {
586  if( tracemode == FILLED )
587  {
588  Circle( pos, diametre, FILL_TYPE::FILLED_SHAPE, 0 );
589  }
590  else
591  {
592  SetCurrentLineWidth( -1 );
593  Circle( pos, diametre, FILL_TYPE::NO_FILL, -1 );
594  }
595 }
virtual void Circle(const wxPoint &pos, int diametre, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References PLOTTER::Circle(), FILLED, FILLED_SHAPE, NO_FILL, and PLOTTER::SetCurrentLineWidth().

Referenced by BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), and BRDITEMS_PLOTTER::PlotPcbShape().

◆ FinishTo()

◆ FlashPadCircle()

void HPGL_PLOTTER::FlashPadCircle ( const wxPoint &  aPadPos,
int  aDiameter,
OUTLINE_MODE  aTraceMode,
void *  aData 
)
overridevirtual
Parameters
aPadPosPosition of the shape (center of the rectangle
aDiameterdiameter of round pad
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 680 of file HPGL_plotter.cpp.

682 {
683  wxASSERT( m_outputFile );
684  DPOINT pos_dev = userToDeviceCoordinates( pos );
685 
686  int radius = diametre / 2;
687 
688  if( trace_mode == FILLED )
689  {
690  // if filled mode, the pen diameter is removed from diameter
691  // to keep the pad size
692  radius -= KiROUND( penDiameter ) / 2;
693  }
694 
695  if( radius < 0 )
696  radius = 0;
697 
698  double rsize = userToDeviceSize( radius );
699 
700  if( trace_mode == FILLED ) // Plot in filled mode.
701  {
702  // A filled polygon uses always the current point to start the polygon.
703  // Gives a correct current starting point for the circle
704  MoveTo( wxPoint( pos.x+radius, pos.y ) );
705  // Plot filled area and its outline
706  startOrAppendItem( userToDeviceCoordinates( wxPoint( pos.x + radius, pos.y ) ),
707  wxString::Format( "PM 0; PA %.0f,%.0f;CI %.0f;%s", pos_dev.x, pos_dev.y, rsize,
709  m_current_item->lift_before = true;
710  m_current_item->pen_returns = true;
711  }
712  else
713  {
714  // Draw outline only:
715  startOrAppendItem( pos_dev, wxString::Format( "CI %.0f;", rsize ) );
716  m_current_item->lift_before = true;
717  m_current_item->pen_returns = true;
718  }
719 
720  PenFinish();
721 }
bool pen_returns
Whether the pen returns to its original state after the command.
Definition: plotter_hpgl.h:181
void PenFinish()
Definition: plotter.h:273
FILE * m_outputFile
Output file.
Definition: plotter.h:580
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.
static const char hpgl_end_polygon_cmd[]
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
double penDiameter
Definition: plotter_hpgl.h:145
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
bool lift_before
Whether the command should be executed with the pen lifted.
Definition: plotter_hpgl.h:172

References FILLED, Format(), hpgl_end_polygon_cmd, KiROUND(), HPGL_PLOTTER::HPGL_ITEM::lift_before, m_current_item, PLOTTER::m_outputFile, PLOTTER::MoveTo(), HPGL_PLOTTER::HPGL_ITEM::pen_returns, penDiameter, PLOTTER::PenFinish(), startOrAppendItem(), PLOTTER::userToDeviceCoordinates(), PLOTTER::userToDeviceSize(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by FlashPadOval().

◆ FlashPadCustom()

void HPGL_PLOTTER::FlashPadCustom ( const wxPoint &  aPadPos,
const wxSize &  aSize,
double  aPadOrient,
SHAPE_POLY_SET aPolygons,
OUTLINE_MODE  aTraceMode,
void *  aData 
)
overridevirtual
Parameters
aPadPosPosition of the shape
aSize= size of round reference pad
aPadOrient= pad rotation, used only with aperture macros (Gerber plotter)
aPolygonsthe shape as polygon set
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 799 of file HPGL_plotter.cpp.

802 {
803  std::vector< wxPoint > cornerList;
804 
805  for( int cnt = 0; cnt < aPolygons->OutlineCount(); ++cnt )
806  {
807  SHAPE_LINE_CHAIN& poly = aPolygons->Outline( cnt );
808 
809  cornerList.clear();
810  cornerList.reserve( poly.PointCount() );
811 
812  for( int ii = 0; ii < poly.PointCount(); ++ii )
813  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
814 
815  if( cornerList.back() != cornerList.front() )
816  cornerList.push_back( cornerList.front() );
817 
818  PlotPoly( cornerList, aTraceMode == FILLED ? FILL_TYPE::FILLED_SHAPE : FILL_TYPE::NO_FILL );
819  }
820 }
int OutlineCount() const
Return the number of vertices in a given outline/hole.
int PointCount() const
Function PointCount()
const VECTOR2I & CPoint(int aIndex) const
Function Point()
SHAPE_LINE_CHAIN & Outline(int aIndex)
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL) override
HPGL polygon:
SHAPE_LINE_CHAIN.

References SHAPE_LINE_CHAIN::CPoint(), FILLED, FILLED_SHAPE, NO_FILL, SHAPE_POLY_SET::Outline(), SHAPE_POLY_SET::OutlineCount(), PlotPoly(), SHAPE_LINE_CHAIN::PointCount(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ FlashPadOval()

void HPGL_PLOTTER::FlashPadOval ( const wxPoint &  aPadPos,
const wxSize &  aSize,
double  aPadOrient,
OUTLINE_MODE  aTraceMode,
void *  aData 
)
overridevirtual
Parameters
aPadPosPosition of the shape (center of the rectangle
aSize= size of oblong shape
aPadOrientThe rotation of the shape
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 642 of file HPGL_plotter.cpp.

644 {
645  wxASSERT( m_outputFile );
646  int deltaxy, cx, cy;
647  wxSize size( aSize );
648 
649  /* The pad will be drawn as an oblong shape with size.y > size.x
650  * (Oval vertical orientation 0)
651  */
652  if( size.x > size.y )
653  {
654  std::swap( size.x, size.y );
655  orient = AddAngles( orient, 900 );
656  }
657 
658  deltaxy = size.y - size.x; // distance between centers of the oval
659 
660  if( trace_mode == FILLED )
661  {
662  FlashPadRect( pos, wxSize( size.x, deltaxy + KiROUND( penDiameter ) ),
663  orient, trace_mode, aData );
664  cx = 0; cy = deltaxy / 2;
665  RotatePoint( &cx, &cy, orient );
666  FlashPadCircle( wxPoint( cx + pos.x, cy + pos.y ), size.x, trace_mode, aData );
667  cx = 0; cy = -deltaxy / 2;
668  RotatePoint( &cx, &cy, orient );
669  FlashPadCircle( wxPoint( cx + pos.x, cy + pos.y ), size.x, trace_mode, aData );
670  }
671  else // Plot in outline mode.
672  {
673  sketchOval( pos, size, orient, KiROUND( penDiameter ) );
674  }
675 }
virtual void FlashPadCircle(const wxPoint &aPadPos, int aDiameter, OUTLINE_MODE aTraceMode, void *aData) override
FILE * m_outputFile
Output file.
Definition: plotter.h:580
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:228
T AddAngles(T a1, T2 a2)
Add two angles (keeping the result normalized). T2 is here.
Definition: trigo.h:335
double penDiameter
Definition: plotter_hpgl.h:145
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
virtual void FlashPadRect(const wxPoint &aPadPos, const wxSize &aSize, double aOrient, OUTLINE_MODE aTraceMode, void *aData) override
void sketchOval(const wxPoint &pos, const wxSize &size, double orient, int width)
Definition: plotter.cpp:458

References AddAngles(), FILLED, FlashPadCircle(), FlashPadRect(), KiROUND(), PLOTTER::m_outputFile, penDiameter, RotatePoint(), and PLOTTER::sketchOval().

◆ FlashPadRect()

void HPGL_PLOTTER::FlashPadRect ( const wxPoint &  aPadPos,
const wxSize &  aSize,
double  aPadOrient,
OUTLINE_MODE  aTraceMode,
void *  aData 
)
overridevirtual
Parameters
aPadPosPosition of the shape (center of the rectangle
aSize= size of rounded rect
aPadOrientThe rotation of the shape
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 724 of file HPGL_plotter.cpp.

726 {
727  // Build rect polygon:
728  std::vector<wxPoint> corners;
729 
730  int dx = padsize.x / 2;
731  int dy = padsize.y / 2;
732 
733  if( trace_mode == FILLED )
734  {
735  // in filled mode, the pen diameter is removed from size
736  // to compensate the extra size due to this pen size
737  dx -= KiROUND( penDiameter ) / 2;
738  dx = std::max( dx, 0);
739  dy -= KiROUND( penDiameter ) / 2;
740  dy = std::max( dy, 0);
741  }
742 
743 
744  corners.emplace_back( - dx, - dy );
745  corners.emplace_back( - dx, + dy );
746  corners.emplace_back( + dx, + dy );
747  corners.emplace_back( + dx, - dy );
748  // Close polygon
749  corners.emplace_back( - dx, - dy );
750 
751  for( unsigned ii = 0; ii < corners.size(); ii++ )
752  {
753  RotatePoint( &corners[ii], orient );
754  corners[ii] += pos;
755  }
756 
757  PlotPoly( corners, trace_mode == FILLED ? FILL_TYPE::FILLED_SHAPE : FILL_TYPE::NO_FILL );
758 }
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:228
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL) override
HPGL polygon:
double penDiameter
Definition: plotter_hpgl.h:145
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 FILLED, FILLED_SHAPE, KiROUND(), NO_FILL, penDiameter, PlotPoly(), and RotatePoint().

Referenced by FlashPadOval().

◆ FlashPadRoundRect()

void HPGL_PLOTTER::FlashPadRoundRect ( const wxPoint &  aPadPos,
const wxSize &  aSize,
int  aCornerRadius,
double  aOrient,
OUTLINE_MODE  aTraceMode,
void *  aData 
)
overridevirtual
Parameters
aPadPosPosition of the shape (center of the rectangle
aSize= size of rounded rect
aCornerRadiusRadius of the rounded corners
aOrientThe rotation of the shape
aTraceModeFILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 761 of file HPGL_plotter.cpp.

764 {
765  SHAPE_POLY_SET outline;
766 
767  wxSize size = aSize;
768 
769  if( aTraceMode == FILLED )
770  {
771  // in filled mode, the pen diameter is removed from size
772  // to keep the pad size
773  size.x -= KiROUND( penDiameter ) / 2;
774  size.x = std::max( size.x, 0);
775  size.y -= KiROUND( penDiameter ) / 2;
776  size.y = std::max( size.y, 0);
777 
778  // keep aCornerRadius to a value < min size x,y < 2:
779  aCornerRadius = std::min( aCornerRadius, std::min( size.x, size.y ) /2 );
780  }
781 
782  TransformRoundChamferedRectToPolygon( outline, aPadPos, size, aOrient, aCornerRadius,
783  0.0, 0, GetPlotterArcHighDef(), ERROR_INSIDE );
784 
785  // TransformRoundRectToPolygon creates only one convex polygon
786  std::vector<wxPoint> cornerList;
787  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
788  cornerList.reserve( poly.PointCount() );
789 
790  for( int ii = 0; ii < poly.PointCount(); ++ii )
791  cornerList.emplace_back( poly.CPoint( ii ).x, poly.CPoint( ii ).y );
792 
793  if( cornerList.back() != cornerList.front() )
794  cornerList.push_back( cornerList.front() );
795 
796  PlotPoly( cornerList, aTraceMode == FILLED ? FILL_TYPE::FILLED_SHAPE : FILL_TYPE::NO_FILL );
797 }
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aCornerBuffer, const wxPoint &aPosition, const wxSize &aSize, double aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aError, ERROR_LOC aErrorLoc)
convert a rectangle with rounded corners and/or chamfered corners to a polygon Convert rounded corner...
int PointCount() const
Function PointCount()
const VECTOR2I & CPoint(int aIndex) const
Function Point()
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL) override
HPGL polygon:
SHAPE_LINE_CHAIN.
double penDiameter
Definition: plotter_hpgl.h:145
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
int GetPlotterArcHighDef() const
Definition: plotter.h:223

References SHAPE_LINE_CHAIN::CPoint(), ERROR_INSIDE, FILLED, FILLED_SHAPE, PLOTTER::GetPlotterArcHighDef(), KiROUND(), NO_FILL, SHAPE_POLY_SET::Outline(), penDiameter, PlotPoly(), SHAPE_LINE_CHAIN::PointCount(), TransformRoundChamferedRectToPolygon(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ FlashPadTrapez()

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

Flash a trapezoidal pad.

Parameters
aPadPos= the position of the shape
aCorners= the list of 4 corners positions, relative to the shape position, pad orientation 0
aPadOrient= the rotation of the shape
aTraceMode= FILLED or SKETCH
aDataan auxiliary info (mainly for gerber format attributes)

Implements PLOTTER.

Definition at line 823 of file HPGL_plotter.cpp.

825 {
826  std::vector< wxPoint > cornerList;
827  cornerList.reserve( 5 );
828 
829  for( int ii = 0; ii < 4; ii++ )
830  {
831  wxPoint coord( aCorners[ii] );
832  RotatePoint( &coord, aPadOrient );
833  coord += aPadPos;
834  cornerList.push_back( coord );
835  }
836 
837  // Close polygon
838  cornerList.push_back( cornerList.front() );
839 
840  PlotPoly( cornerList, aTraceMode == FILLED ? FILL_TYPE::FILLED_SHAPE : FILL_TYPE::NO_FILL );
841 }
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:228
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL) override
HPGL polygon:

References FILLED, FILLED_SHAPE, NO_FILL, PlotPoly(), and RotatePoint().

◆ FlashRegularPolygon()

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

Flash a regular polygon.

Useful 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 844 of file HPGL_plotter.cpp.

847 {
848  // Do nothing
849  wxASSERT( 0 );
850 }

◆ flushItem()

void HPGL_PLOTTER::flushItem ( )
protected

Flush the current HPGL_ITEM and clear out the current item pointer.

Definition at line 859 of file HPGL_plotter.cpp.

860 {
861  m_current_item = nullptr;
862 }
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202

References m_current_item.

Referenced by Arc(), EndPlot(), PenTo(), and SetDash().

◆ GetColorMode()

◆ GetCurrentLineWidth()

◆ GetDashGapLenIU()

double PLOTTER::GetDashGapLenIU ( ) const
protectedinherited

Definition at line 151 of file plotter.cpp.

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

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

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

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

◆ GetDefaultFileExtension()

static wxString HPGL_PLOTTER::GetDefaultFileExtension ( )
inlinestatic

Definition at line 46 of file plotter_hpgl.h.

47  {
48  return wxString( wxT( "plt" ) );
49  }

Referenced by DIALOG_PLOT_SCHEMATIC::createHPGLFile(), and GetDefaultPlotExtension().

◆ GetDotMarkLenIU()

double PLOTTER::GetDotMarkLenIU ( ) const
protectedinherited

Definition at line 139 of file plotter.cpp.

140 {
142 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:166
#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:124

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:569

References PLOTTER::m_IUsPerDecimil.

Referenced by PlotDrawingSheet().

◆ GetPlotterArcHighDef()

◆ 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:569

References PLOTTER::m_IUsPerDecimil.

◆ GetPlotterType()

virtual PLOT_FORMAT HPGL_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 41 of file plotter_hpgl.h.

42  {
43  return PLOT_FORMAT::HPGL;
44  }

References HPGL.

◆ LineTo()

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

◆ lineTypeCommand()

const char * HPGL_PLOTTER::lineTypeCommand ( PLOT_DASH_TYPE  linetype)
staticprotected

Return the plot command corresponding to a line type.

Definition at line 951 of file HPGL_plotter.cpp.

952 {
953  switch( linetype )
954  {
956  return "LT -2 4 1;";
957  break;
958  case PLOT_DASH_TYPE::DOT:
959  return "LT -1 2 1;";
960  break;
962  return "LT -4 6 1;";
963  break;
964  default:
965  return "LT;";
966  break;
967  }
968 }

References DASH, DASHDOT, and DOT.

Referenced by EndPlot().

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

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

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

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

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

Referenced by PLOTTER::Marker().

◆ markerCircle()

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

Plot a circle centered on the position.

Building block for markers

Definition at line 273 of file plotter.cpp.

274 {
275  Circle( position, radius * 2, FILL_TYPE::NO_FILL, GetCurrentLineWidth() );
276 }
virtual int GetCurrentLineWidth() const
Definition: plotter.h:166
virtual void Circle(const wxPoint &pos, int diametre, FILL_TYPE 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 303 of file plotter.cpp.

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

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

Referenced by PLOTTER::Marker().

◆ markerLozenge()

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

Plot a lozenge centered on the position.

Building block for markers

Definition at line 279 of file plotter.cpp.

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

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

Referenced by PLOTTER::Marker().

◆ markerSlash()

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

Plot a / bar centered on the position.

Building block for markers

Definition at line 310 of file plotter.cpp.

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

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

Referenced by PLOTTER::Marker().

◆ markerSquare()

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

Plot a square centered on the position.

Building block for markers

Definition at line 248 of file plotter.cpp.

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

Referenced by PLOTTER::Marker().

◆ markerVBar()

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

Plot a | bar centered on the position.

Building block for markers

Definition at line 324 of file plotter.cpp.

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

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

Referenced by PLOTTER::Marker().

◆ MoveTo()

◆ OpenFile()

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

Open or create the plot file aFullFilename.

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

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

Reimplemented in PDF_PLOTTER.

Definition at line 76 of file plotter.cpp.

77 {
78  m_filename = aFullFilename;
79 
80  wxASSERT( !m_outputFile );
81 
82  // Open the file in text mode (not suitable for all plotters
83  // but only for most of them
84  m_outputFile = wxFopen( m_filename, wxT( "wt" ) );
85 
86  if( m_outputFile == NULL )
87  return false ;
88 
89  return true;
90 }
wxString m_filename
Definition: plotter.h:590
FILE * m_outputFile
Output file.
Definition: plotter.h:580
#define NULL

References PLOTTER::m_filename, PLOTTER::m_outputFile, and NULL.

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 SYMBOL_EDIT_FRAME::SVGPlotSymbol().

◆ 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 Circle(), FlashPadCircle(), DXF_PLOTTER::PlotPoly(), PlotPoly(), GERBER_PLOTTER::PlotPoly(), and Rect().

◆ PenTo()

void HPGL_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 516 of file HPGL_plotter.cpp.

517 {
518  wxASSERT( m_outputFile );
519 
520  if( plume == 'Z' )
521  {
522  m_penState = 'Z';
523  flushItem();
524  return;
525  }
526 
527  DPOINT pos_dev = userToDeviceCoordinates( pos );
529 
530  if( plume == 'U' )
531  {
532  m_penState = 'U';
533  flushItem();
534  }
535  else if( plume == 'D' )
536  {
537  m_penState = 'D';
539  lastpos_dev,
541  "PA %.0f,%.0f;",
542  pos_dev.x,
543  pos_dev.y
544  )
545  );
546  m_current_item->loc_end = pos_dev;
547  m_current_item->bbox.Merge( pos_dev );
548  }
549 
550  m_penLastpos = pos;
551 }
void flushItem()
Flush the current HPGL_ITEM and clear out the current item pointer.
BOX2D bbox
Bounding box of this item.
Definition: plotter_hpgl.h:169
FILE * m_outputFile
Output file.
Definition: plotter.h:580
DPOINT loc_end
Location the pen will be at when it finishes.
Definition: plotter_hpgl.h:166
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.
wxPoint m_penLastpos
Definition: plotter.h:587
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:386
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
char m_penState
Definition: plotter.h:586

References HPGL_PLOTTER::HPGL_ITEM::bbox, flushItem(), Format(), HPGL_PLOTTER::HPGL_ITEM::loc_end, m_current_item, PLOTTER::m_outputFile, PLOTTER::m_penLastpos, PLOTTER::m_penState, BOX2< Vec >::Merge(), startOrAppendItem(), PLOTTER::userToDeviceCoordinates(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ PlotImage()

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

Only PostScript plotters can plot bitmaps.

A rectangle is plotted for plotters that cannot plot a bitmap.

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

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

References NO_FILL, and PLOTTER::Rect().

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

◆ PlotPoly() [1/2]

void HPGL_PLOTTER::PlotPoly ( const std::vector< wxPoint > &  aCornerList,
FILL_TYPE  aFill,
int  aWidth = USE_DEFAULT_LINE_WIDTH,
void *  aData = NULL 
)
overridevirtual

HPGL polygon:

Implements PLOTTER.

Definition at line 461 of file HPGL_plotter.cpp.

463 {
464  if( aCornerList.size() <= 1 )
465  return;
466 
467  // Width less than zero is occasionally used to create background-only
468  // polygons. Don't set that as the plotter line width, that'll cause
469  // trouble. Also, later, skip plotting the outline if this is the case.
470  if( aWidth > 0 )
471  {
472  SetCurrentLineWidth( aWidth );
473  }
474 
475  MoveTo( aCornerList[0] );
476  startItem( userToDeviceCoordinates( aCornerList[0] ) );
477 
478  if( aFill == FILL_TYPE::FILLED_SHAPE )
479  {
480  // Draw the filled area
482 
483  m_current_item->content << wxString( "PM 0;\n" ); // Start polygon
484 
485  for( unsigned ii = 1; ii < aCornerList.size(); ++ii )
486  LineTo( aCornerList[ii] );
487 
488  int ii = aCornerList.size() - 1;
489 
490  if( aCornerList[ii] != aCornerList[0] )
491  LineTo( aCornerList[0] );
492 
493  m_current_item->content << hpgl_end_polygon_cmd; // Close, fill polygon and draw outlines
494  m_current_item->pen_returns = true;
495  }
496  else if( aWidth > 0 )
497  {
498  // Plot only the polygon outline.
499  for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
500  LineTo( aCornerList[ii] );
501 
502  // Always close polygon if filled.
503  if( aFill != FILL_TYPE::NO_FILL )
504  {
505  int ii = aCornerList.size() - 1;
506 
507  if( aCornerList[ii] != aCornerList[0] )
508  LineTo( aCornerList[0] );
509  }
510  }
511 
512  PenFinish();
513 }
bool pen_returns
Whether the pen returns to its original state after the command.
Definition: plotter_hpgl.h:181
void PenFinish()
Definition: plotter.h:273
bool startItem(DPOINT location)
Start a new HPGL_ITEM if necessary, keeping the current one if it exists.
wxString content
Text of the command.
Definition: plotter_hpgl.h:190
void LineTo(const wxPoint &pos)
Definition: plotter.h:262
static const int USE_DEFAULT_LINE_WIDTH
Definition: plotter.h:126
virtual void SetCurrentLineWidth(int width, void *aData=NULL) override
HPGL doesn't handle line thickness or color.
Definition: plotter_hpgl.h:67
static const char hpgl_end_polygon_cmd[]
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:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202

References HPGL_PLOTTER::HPGL_ITEM::content, FILLED_SHAPE, hpgl_end_polygon_cmd, PLOTTER::LineTo(), m_current_item, PLOTTER::MoveTo(), NO_FILL, HPGL_PLOTTER::HPGL_ITEM::pen_returns, PLOTTER::PenFinish(), SetCurrentLineWidth(), startItem(), PLOTTER::USE_DEFAULT_LINE_WIDTH, and PLOTTER::userToDeviceCoordinates().

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

◆ PlotPoly() [2/2]

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

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

600 {
601  std::vector<wxPoint> cornerList;
602  cornerList.reserve( aCornerList.PointCount() );
603 
604  for( int ii = 0; ii < aCornerList.PointCount(); ii++ )
605  cornerList.emplace_back( aCornerList.CPoint( ii ) );
606 
607  if( aCornerList.IsClosed() && cornerList.front() != cornerList.back() )
608  cornerList.emplace_back( aCornerList.CPoint( 0 ) );
609 
610  PlotPoly( cornerList, aFill, aWidth, aData );
611 }
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_TYPE aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Draw a polygon ( filled or not )
int PointCount() const
Function PointCount()
const VECTOR2I & CPoint(int aIndex) const
Function Point()
bool IsClosed() const override
Function IsClosed()

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

◆ Rect()

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

Implements PLOTTER.

Definition at line 387 of file HPGL_plotter.cpp.

388 {
389  wxASSERT( m_outputFile );
390 
391  DPOINT p1dev = userToDeviceCoordinates( p1 );
392  DPOINT p2dev = userToDeviceCoordinates( p2 );
393 
394  MoveTo( p1 );
395 
396  if( fill == FILL_TYPE::FILLED_SHAPE )
397  {
398  startOrAppendItem( p1dev, wxString::Format( "RA %.0f,%.0f;", p2dev.x, p2dev.y ) );
399  }
400 
401  startOrAppendItem( p1dev, wxString::Format( "EA %.0f,%.0f;", p2dev.x, p2dev.y ) );
402 
404  m_current_item->bbox.Merge( p2dev );
405  PenFinish();
406 }
void PenFinish()
Definition: plotter.h:273
BOX2D bbox
Bounding box of this item.
Definition: plotter_hpgl.h:169
FILE * m_outputFile
Output file.
Definition: plotter.h:580
DPOINT loc_end
Location the pen will be at when it finishes.
Definition: plotter_hpgl.h:166
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:386
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual DPOINT userToDeviceCoordinates(const wxPoint &aCoordinate)
Modifies coordinates according to the orientation, scale factor, and offsets trace.
Definition: plotter.cpp:93
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
DPOINT loc_start
Location the pen should start at.
Definition: plotter_hpgl.h:162

References HPGL_PLOTTER::HPGL_ITEM::bbox, FILLED_SHAPE, Format(), HPGL_PLOTTER::HPGL_ITEM::loc_end, HPGL_PLOTTER::HPGL_ITEM::loc_start, m_current_item, PLOTTER::m_outputFile, BOX2< Vec >::Merge(), PLOTTER::MoveTo(), PLOTTER::PenFinish(), startOrAppendItem(), PLOTTER::userToDeviceCoordinates(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ RenderSettings()

◆ segmentAsOval()

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

Convert a thick segment and plot it as an oval.

Definition at line 437 of file plotter.cpp.

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

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

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

◆ SetColor()

virtual void HPGL_PLOTTER::SetColor ( COLOR4D  color)
inlineoverridevirtual

Implements PLOTTER.

Definition at line 75 of file plotter_hpgl.h.

75 {}

◆ SetColorMode()

virtual void PLOTTER::SetColorMode ( bool  aColorMode)
inlinevirtualinherited

◆ SetCreator()

◆ SetCurrentLineWidth()

virtual void HPGL_PLOTTER::SetCurrentLineWidth ( int  width,
void *  aData = NULL 
)
inlineoverridevirtual

HPGL doesn't handle line thickness or color.

Implements PLOTTER.

Definition at line 67 of file plotter_hpgl.h.

68  {
69  // This is the truth
71  }
int m_currentPenWidth
Definition: plotter.h:585
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
double penDiameter
Definition: plotter_hpgl.h:145

References PLOTTER::m_currentPenWidth, penDiameter, and PLOTTER::userToDeviceSize().

Referenced by Circle(), and PlotPoly().

◆ SetDash()

void HPGL_PLOTTER::SetDash ( PLOT_DASH_TYPE  dashed)
overridevirtual

HPGL supports dashed lines.

Implements PLOTTER.

Definition at line 557 of file HPGL_plotter.cpp.

558 {
559  dashType = dashed;
560  flushItem();
561 }
void flushItem()
Flush the current HPGL_ITEM and clear out the current item pointer.
PLOT_DASH_TYPE dashType
Definition: plotter_hpgl.h:148

References dashType, and flushItem().

◆ SetGerberCoordinatesFormat()

virtual void PLOTTER::SetGerberCoordinatesFormat ( int  aResolution,
bool  aUseInches = false 
)
inlinevirtualinherited

Reimplemented in GERBER_PLOTTER.

Definition at line 458 of file plotter.h.

459  {
460  // NOP for most plotters. Only for Gerber plotter
461  }

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

◆ SetLayerPolarity()

virtual void PLOTTER::SetLayerPolarity ( bool  aPositive)
inlinevirtualinherited

Set the current Gerber layer polarity to positive or negative by writing %LPD*% or %LPC*% to the Gerber file, respectively.

(obviously starts a new Gerber layer, too)

Parameters
aPositiveis the layer polarity and true for positive. It's not useful with most other plotter since they can't 'scratch' the film like photoplotter imagers do

Reimplemented in GERBER_PLOTTER.

Definition at line 444 of file plotter.h.

445  {
446  // NOP for most plotters
447  }

Referenced by PlotOneBoardLayer().

◆ SetNegative()

virtual void PLOTTER::SetNegative ( bool  aNegative)
inlinevirtualinherited

Definition at line 142 of file plotter.h.

143  {
144  m_negativeMode = aNegative;
145  }
bool m_negativeMode
Definition: plotter.h:584

References PLOTTER::m_negativeMode.

Referenced by FillNegativeKnockout().

◆ SetPageSettings()

◆ SetPenDiameter()

void HPGL_PLOTTER::SetPenDiameter ( double  diameter)
virtual

Definition at line 382 of file HPGL_plotter.cpp.

383 {
384  penDiameter = diameter;
385 }
double penDiameter
Definition: plotter_hpgl.h:145

References penDiameter.

Referenced by ConfigureHPGLPenSizes(), HPGL_PLOTTER(), and DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ SetPenNumber()

virtual void HPGL_PLOTTER::SetPenNumber ( int  number)
inlinevirtual

Definition at line 82 of file plotter_hpgl.h.

83  {
84  penNumber = number;
85  }

References penNumber.

Referenced by ConfigureHPGLPenSizes(), GENDRILL_WRITER_BASE::genDrillMapFile(), and HPGL_PLOTTER().

◆ SetPenSpeed()

virtual void HPGL_PLOTTER::SetPenSpeed ( int  speed)
inlinevirtual

Definition at line 77 of file plotter_hpgl.h.

78  {
79  penSpeed = speed;
80  }

References penSpeed.

Referenced by ConfigureHPGLPenSizes(), GENDRILL_WRITER_BASE::genDrillMapFile(), and HPGL_PLOTTER().

◆ SetRenderSettings()

◆ SetSvgCoordinatesFormat()

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

Reimplemented in SVG_PLOTTER.

Definition at line 463 of file plotter.h.

464  {
465  // NOP for most plotters. Only for SVG plotter
466  }

Referenced by initializePlotter().

◆ SetTargetChordLength()

void HPGL_PLOTTER::SetTargetChordLength ( double  chord_len)

Set the target length of chords used to draw approximated circles and arcs.

Parameters
chord_len- chord length in IUs

Definition at line 250 of file HPGL_plotter.cpp.

251 {
252  arcTargetChordLength = userToDeviceSize( chord_len );
253 }
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
double arcTargetChordLength
Definition: plotter_hpgl.h:146

References arcTargetChordLength, and PLOTTER::userToDeviceSize().

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

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

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

Referenced by initializePlotter(), and PlotOneBoardLayer().

◆ SetTitle()

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

Definition at line 174 of file plotter.h.

174 { m_title = aTitle; }
wxString m_title
Definition: plotter.h:591

References PLOTTER::m_title.

Referenced by DIALOG_PLOT_SCHEMATIC::createPDFFile().

◆ SetUserCoords()

void HPGL_PLOTTER::SetUserCoords ( bool  user_coords)
inline

Switch to the user coordinate system.

Definition at line 58 of file plotter_hpgl.h.

58 { useUserCoords = user_coords; }
bool useUserCoords
Definition: plotter_hpgl.h:149

References useUserCoords.

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ SetUserCoordsFit()

void HPGL_PLOTTER::SetUserCoordsFit ( bool  user_coords_fit)
inline

Set whether the user coordinate system is fit to content.

Definition at line 61 of file plotter_hpgl.h.

61 { fitUserCoords = user_coords_fit; }
bool fitUserCoords
Definition: plotter_hpgl.h:150

References fitUserCoords.

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ SetViewport()

void HPGL_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 235 of file HPGL_plotter.cpp.

237 {
238  m_plotOffset = aOffset;
239  m_plotScale = aScale;
240  m_IUsPerDecimil = aIusPerDecimil;
241  m_iuPerDeviceUnit = PLUsPERDECIMIL / aIusPerDecimil;
242  /* Compute the paper size in IUs */
244  m_paperSize.x *= 10.0 * aIusPerDecimil;
245  m_paperSize.y *= 10.0 * aIusPerDecimil;
246  m_plotMirror = aMirror;
247 }
double m_iuPerDeviceUnit
Definition: plotter.h:571
double m_IUsPerDecimil
Definition: plotter.h:569
double m_plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:563
bool m_plotMirror
Definition: plotter.h:574
const wxSize & GetSizeMils() const
Definition: page_info.h:135
wxPoint m_plotOffset
Definition: plotter.h:573
PAGE_INFO m_pageInfo
Definition: plotter.h:592
static const double PLUsPERDECIMIL
wxSize m_paperSize
Definition: plotter.h:593

References PAGE_INFO::GetSizeMils(), PLOTTER::m_iuPerDeviceUnit, PLOTTER::m_IUsPerDecimil, PLOTTER::m_pageInfo, PLOTTER::m_paperSize, PLOTTER::m_plotMirror, PLOTTER::m_plotOffset, PLOTTER::m_plotScale, and PLUsPERDECIMIL.

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ sketchOval()

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

Definition at line 458 of file plotter.cpp.

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

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

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

◆ sortItems()

void HPGL_PLOTTER::sortItems ( std::list< HPGL_ITEM > &  items)
staticprotected

Sort a list of HPGL items to improve plotting speed on mechanical plotters.

Parameters
items- items to sort

Definition at line 887 of file HPGL_plotter.cpp.

888 {
889  if( items.size() < 2 )
890  {
891  return;
892  }
893 
894  std::list<HPGL_ITEM> target;
895 
896  // Plot items are sorted to improve print time on mechanical plotters. This
897  // means
898  // 1) Avoid excess pen-switching - once a pen is selected, keep printing
899  // with it until no more items using that pen remain.
900  // 2) Within the items for one pen, avoid bouncing back and forth around
901  // the page; items should be sequenced with nearby items.
902  //
903  // This is essentially a variant of the Travelling Salesman Problem where
904  // the cities are themselves edges that must be traversed. This is of course
905  // a famously NP-Hard problem and this particular variant has a monstrous
906  // number of "cities". For now, we're using a naive nearest-neighbor search,
907  // which is less than optimal but (usually!) better than nothing, very
908  // simple to implement, and fast enough.
909  //
910  // Items are moved one at a time from `items` into `target`, searching
911  // each time for the first one matching the above criteria. Then, all of
912  // `target` is moved back into `items`.
913 
914  // Get the first one started
915  HPGL_ITEM last_item = items.front();
916  items.pop_front();
917  target.emplace_back( last_item );
918 
919  while( !items.empty() )
920  {
921  auto best_it = items.begin();
922  double best_dist = dpoint_dist( last_item.loc_end, best_it->loc_start );
923 
924  for( auto search_it = best_it; search_it != items.end(); search_it++ )
925  {
926  // Immediately forget an item as "best" if another one is a better
927  // pen match
928  if( best_it->pen != last_item.pen && search_it->pen == last_item.pen )
929  {
930  best_it = search_it;
931  continue;
932  }
933 
934  double const dist = dpoint_dist( last_item.loc_end, search_it->loc_start );
935  if( dist < best_dist )
936  {
937  best_it = search_it;
938  best_dist = dist;
939  continue;
940  }
941  }
942 
943  target.emplace_back( *best_it );
944  last_item = *best_it;
945  items.erase( best_it );
946  }
947 
948  items.splice( items.begin(), target );
949 }
static double dpoint_dist(DPOINT a, DPOINT b)
Compute the distance between two DPOINT points.

References dpoint_dist(), HPGL_PLOTTER::HPGL_ITEM::loc_end, and HPGL_PLOTTER::HPGL_ITEM::pen.

Referenced by EndPlot().

◆ StartBlock()

virtual void PLOTTER::StartBlock ( void *  aData)
inlinevirtualinherited

calling this function allows one to define the beginning of a group of drawing items, for instance in SVG or Gerber format.

(example: group all segments of a letter or a text)

Parameters
aDatacan define any parameter for most of plotters: do nothing

Reimplemented in SVG_PLOTTER, and GERBER_PLOTTER.

Definition at line 475 of file plotter.h.

475 {}

Referenced by SCH_COMPONENT::Plot(), BRDITEMS_PLOTTER::PlotFilledAreas(), and PlotStandardLayer().

◆ startItem()

bool HPGL_PLOTTER::startItem ( DPOINT  location)
protected

Start a new HPGL_ITEM if necessary, keeping the current one if it exists.

Parameters
location- location of the item
Returns
whether a new item was made

Definition at line 853 of file HPGL_plotter.cpp.

854 {
855  return startOrAppendItem( location, wxEmptyString );
856 }
bool startOrAppendItem(DPOINT location, wxString const &content)
Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.

References startOrAppendItem().

Referenced by PlotPoly().

◆ startOrAppendItem()

bool HPGL_PLOTTER::startOrAppendItem ( DPOINT  location,
wxString const &  content 
)
protected

Start a new HPGL_ITEM with the given string if necessary, or append the string to the current item.

Parameters
location- location of the item, if a new one is made
content- content substring
Returns
whether a new item was made

Definition at line 865 of file HPGL_plotter.cpp.

866 {
867  if( m_current_item == nullptr )
868  {
869  HPGL_ITEM item;
870  item.loc_start = location;
871  item.loc_end = location;
872  item.bbox = BOX2D( location );
873  item.pen = penNumber;
874  item.dashType = dashType;
875  item.content = content;
876  m_items.push_back( item );
877  m_current_item = &m_items.back();
878  return true;
879  }
880  else
881  {
882  m_current_item->content << content;
883  return false;
884  }
885 }
BOX2< VECTOR2D > BOX2D
Definition: box2.h:523
wxString content
Text of the command.
Definition: plotter_hpgl.h:190
std::list< HPGL_ITEM > m_items
Definition: plotter_hpgl.h:201
HPGL_ITEM * m_current_item
Definition: plotter_hpgl.h:202
PLOT_DASH_TYPE dashType
Definition: plotter_hpgl.h:148

References HPGL_PLOTTER::HPGL_ITEM::bbox, HPGL_PLOTTER::HPGL_ITEM::content, dashType, HPGL_PLOTTER::HPGL_ITEM::dashType, HPGL_PLOTTER::HPGL_ITEM::loc_end, HPGL_PLOTTER::HPGL_ITEM::loc_start, m_current_item, m_items, HPGL_PLOTTER::HPGL_ITEM::pen, and penNumber.

Referenced by Arc(), Circle(), FlashPadCircle(), PenTo(), Rect(), and startItem().

◆ StartPlot()

bool HPGL_PLOTTER::StartPlot ( )
overridevirtual

At the start of the HPGL plot pen speed and number are requested.

Implements PLOTTER.

Definition at line 259 of file HPGL_plotter.cpp.

260 {
261  wxASSERT( m_outputFile );
262  fprintf( m_outputFile, "IN;VS%d;PU;PA;SP%d;\n", penSpeed, penNumber );
263 
264  // Set HPGL Pen Thickness (in mm) (usefull in polygon fill command)
265  double penThicknessMM = userToDeviceSize( penDiameter )/40;
266  fprintf( m_outputFile, "PT %.1f;\n", penThicknessMM );
267 
268  return true;
269 }
FILE * m_outputFile
Output file.
Definition: plotter.h:580
virtual DPOINT userToDeviceSize(const wxSize &size)
Modifies size according to the plotter scale factors (wxSize version, returns a DPOINT)
Definition: plotter.cpp:124
double penDiameter
Definition: plotter_hpgl.h:145

References PLOTTER::m_outputFile, penDiameter, penNumber, penSpeed, and PLOTTER::userToDeviceSize().

Referenced by DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL().

◆ Text()

void 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 
)
virtualinherited

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 in SVG_PLOTTER, PDF_PLOTTER, PS_PLOTTER, DXF_PLOTTER, and GERBER_PLOTTER.

Definition at line 219 of file gr_text.cpp.

231 {
232  SetColor( aColor );
233  SetCurrentLineWidth( aPenWidth );
234 
235  GRText( NULL, aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify, aPenWidth,
236  aItalic, aBold, nullptr, nullptr, this );
237 }
virtual void SetColor(COLOR4D color)=0
#define NULL
void GRText(wxDC *aDC, const wxPoint &aPos, 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, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
Function GRText Draw a graphic text (like footprint texts)
Definition: gr_text.cpp:131
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References GRText(), NULL, PLOTTER::SetColor(), and PLOTTER::SetCurrentLineWidth().

Referenced by GENDRILL_WRITER_BASE::genDrillMapFile(), LIB_TEXT::Plot(), LIB_FIELD::Plot(), SCH_FIELD::Plot(), SCH_TEXT::Plot(), PlotDrawingSheet(), BRDITEMS_PLOTTER::PlotFootprintTextItem(), BRDITEMS_PLOTTER::PlotPcbText(), LIB_PIN::PlotPinTexts(), GERBER_PLOTTER::Text(), DXF_PLOTTER::Text(), PS_PLOTTER::Text(), PDF_PLOTTER::Text(), and SVG_PLOTTER::Text().

◆ ThickArc()

void PLOTTER::ThickArc ( const wxPoint &  centre,
double  StAngle,
double  EndAngle,
int  rayon,
int  width,
OUTLINE_MODE  tracemode,
void *  aData 
)
virtualinherited

Reimplemented in GERBER_PLOTTER.

Definition at line 530 of file plotter.cpp.

532 {
533  if( tracemode == FILLED )
534  Arc( centre, StAngle, EndAngle, radius, FILL_TYPE::NO_FILL, width );
535  else
536  {
537  SetCurrentLineWidth( -1 );
538  Arc( centre, StAngle, EndAngle,
539  radius - ( width - m_currentPenWidth ) / 2, FILL_TYPE::NO_FILL, -1 );
540  Arc( centre, StAngle, EndAngle,
541  radius + ( width - m_currentPenWidth ) / 2, FILL_TYPE::NO_FILL, -1 );
542  }
543 }
virtual void Arc(const wxPoint &centre, double StAngle, double EndAngle, int rayon, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH)
Generic fallback: arc rendered as a polyline.
Definition: plotter.cpp:157
int m_currentPenWidth
Definition: plotter.h:585
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References PLOTTER::Arc(), FILLED, PLOTTER::m_currentPenWidth, NO_FILL, and PLOTTER::SetCurrentLineWidth().

Referenced by BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotPcbShape(), and PlotStandardLayer().

◆ ThickCircle()

void PLOTTER::ThickCircle ( const wxPoint &  pos,
int  diametre,
int  width,
OUTLINE_MODE  tracemode,
void *  aData 
)
virtualinherited

Reimplemented in GERBER_PLOTTER.

Definition at line 568 of file plotter.cpp.

570 {
571  if( tracemode == FILLED )
572  {
573  Circle( pos, diametre, FILL_TYPE::NO_FILL, width );
574  }
575  else
576  {
577  SetCurrentLineWidth( -1 );
578  Circle( pos, diametre - width + m_currentPenWidth, FILL_TYPE::NO_FILL, -1 );
579  Circle( pos, diametre + width - m_currentPenWidth, FILL_TYPE::NO_FILL, -1 );
580  }
581 }
int m_currentPenWidth
Definition: plotter.h:585
virtual void Circle(const wxPoint &pos, int diametre, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References PLOTTER::Circle(), FILLED, PLOTTER::m_currentPenWidth, NO_FILL, and PLOTTER::SetCurrentLineWidth().

Referenced by BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), and BRDITEMS_PLOTTER::PlotPcbShape().

◆ ThickRect()

void PLOTTER::ThickRect ( const wxPoint &  p1,
const wxPoint &  p2,
int  width,
OUTLINE_MODE  tracemode,
void *  aData 
)
virtualinherited

Reimplemented in GERBER_PLOTTER.

Definition at line 546 of file plotter.cpp.

548 {
549  if( tracemode == FILLED )
550  Rect( p1, p2, FILL_TYPE::NO_FILL, width );
551  else
552  {
553  SetCurrentLineWidth( -1 );
554  wxPoint offsetp1( p1.x - (width - m_currentPenWidth) / 2,
555  p1.y - (width - m_currentPenWidth) / 2 );
556  wxPoint offsetp2( p2.x + (width - m_currentPenWidth) / 2,
557  p2.y + (width - m_currentPenWidth) / 2 );
558  Rect( offsetp1, offsetp2, FILL_TYPE::NO_FILL, -1 );
559  offsetp1.x += (width - m_currentPenWidth);
560  offsetp1.y += (width - m_currentPenWidth);
561  offsetp2.x -= (width - m_currentPenWidth);
562  offsetp2.y -= (width - m_currentPenWidth);
563  Rect( offsetp1, offsetp2, FILL_TYPE::NO_FILL, -1 );
564  }
565 }
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_TYPE fill, int width=USE_DEFAULT_LINE_WIDTH)=0
int m_currentPenWidth
Definition: plotter.h:585
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.

References FILLED, PLOTTER::m_currentPenWidth, NO_FILL, PLOTTER::Rect(), and PLOTTER::SetCurrentLineWidth().

◆ ThickSegment()

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

Reimplemented from PLOTTER.

Definition at line 564 of file HPGL_plotter.cpp.

566 {
567  wxASSERT( m_outputFile );
568 
569  // Suppress overlap if pen is too big
570  if( penDiameter >= width )
571  {
572  MoveTo( start );
573  FinishTo( end );
574  }
575  else
576  {
577  segmentAsOval( start, end, width, tracemode );
578  }
579 }
void segmentAsOval(const wxPoint &start, const wxPoint &end, int width, OUTLINE_MODE tracemode)
Convert a thick segment and plot it as an oval.
Definition: plotter.cpp:437
void FinishTo(const wxPoint &pos)
Definition: plotter.h:267
FILE * m_outputFile
Output file.
Definition: plotter.h:580
void MoveTo(const wxPoint &pos)
Definition: plotter.h:257
double penDiameter
Definition: plotter_hpgl.h:145

References PLOTTER::FinishTo(), PLOTTER::m_outputFile, PLOTTER::MoveTo(), penDiameter, and PLOTTER::segmentAsOval().

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

94 {
95  wxPoint pos = aCoordinate - m_plotOffset;
96 
97  // Don't allow overflows; they can cause rendering failures in some file viewers
98  // (such as Acrobat)
99  int clampSize = MAX_PAGE_SIZE_MILS * m_IUsPerDecimil * 10 / 2;
100  pos.x = std::max( -clampSize, std::min( pos.x, clampSize ) );
101  pos.y = std::max( -clampSize, std::min( pos.y, clampSize ) );
102 
103  double x = pos.x * m_plotScale;
104  double y = ( m_paperSize.y - pos.y * m_plotScale );
105 
106  if( m_plotMirror )
107  {
109  x = ( m_paperSize.x - pos.x * m_plotScale );
110  else
111  y = pos.y * m_plotScale;
112  }
113 
114  if( m_yaxisReversed )
115  y = m_paperSize.y - y;
116 
117  x *= m_iuPerDeviceUnit;
118  y *= m_iuPerDeviceUnit;
119 
120  return DPOINT( x, y );
121 }
double m_iuPerDeviceUnit
Definition: plotter.h:571
double m_IUsPerDecimil
Definition: plotter.h:569
double m_plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:563
bool m_yaxisReversed
Definition: plotter.h:577
bool m_plotMirror
Definition: plotter.h:574
wxPoint m_plotOffset
Definition: plotter.h:573
#define MAX_PAGE_SIZE_MILS
Definition: page_info.h:41
VECTOR2< double > DPOINT
Definition: vector2d.h:628
wxSize m_paperSize
Definition: plotter.h:593
bool m_mirrorIsHorizontal
Definition: plotter.h:576

References PLOTTER::m_iuPerDeviceUnit, PLOTTER::m_IUsPerDecimil, PLOTTER::m_mirrorIsHorizontal, PLOTTER::m_paperSize, PLOTTER::m_plotMirror, PLOTTER::m_plotOffset, PLOTTER::m_plotScale, PLOTTER::m_yaxisReversed, and MAX_PAGE_SIZE_MILS.

Referenced by DXF_PLOTTER::Arc(), Arc(), PS_PLOTTER::Arc(), PDF_PLOTTER::Arc(), SVG_PLOTTER::Arc(), SVG_PLOTTER::BezierCurve(), DXF_PLOTTER::Circle(), Circle(), PS_PLOTTER::Circle(), PDF_PLOTTER::Circle(), SVG_PLOTTER::Circle(), PSLIKE_PLOTTER::computeTextParameters(), GERBER_PLOTTER::FlashPadChamferRoundRect(), FlashPadCircle(), GERBER_PLOTTER::FlashPadCircle(), GERBER_PLOTTER::FlashPadCustom(), GERBER_PLOTTER::FlashPadOval(), GERBER_PLOTTER::FlashPadRect(), GERBER_PLOTTER::FlashPadRoundRect(), GERBER_PLOTTER::FlashPadTrapez(), GERBER_PLOTTER::FlashRegularPolygon(), DXF_PLOTTER::PenTo(), GERBER_PLOTTER::PenTo(), PenTo(), PS_PLOTTER::PenTo(), PDF_PLOTTER::PenTo(), SVG_PLOTTER::PenTo(), GERBER_PLOTTER::plotArc(), PS_PLOTTER::PlotImage(), PDF_PLOTTER::PlotImage(), PlotPoly(), PS_PLOTTER::PlotPoly(), PDF_PLOTTER::PlotPoly(), SVG_PLOTTER::PlotPoly(), Rect(), PS_PLOTTER::Rect(), PDF_PLOTTER::Rect(), SVG_PLOTTER::Rect(), DXF_PLOTTER::Text(), PS_PLOTTER::Text(), and SVG_PLOTTER::Text().

◆ userToDeviceSize() [1/2]

◆ userToDeviceSize() [2/2]

double PLOTTER::userToDeviceSize ( double  size) const
protectedvirtualinherited

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

Definition at line 131 of file plotter.cpp.

132 {
133  return size * m_plotScale * m_iuPerDeviceUnit;
134 }
double m_iuPerDeviceUnit
Definition: plotter.h:571
double m_plotScale
Plot scale - chosen by the user (even implicitly with 'fit in a4')
Definition: plotter.h:563

References PLOTTER::m_iuPerDeviceUnit, and PLOTTER::m_plotScale.

Member Data Documentation

◆ arcMinChordDegrees

double HPGL_PLOTTER::arcMinChordDegrees
protected

Definition at line 147 of file plotter_hpgl.h.

Referenced by Arc(), and Circle().

◆ arcTargetChordLength

double HPGL_PLOTTER::arcTargetChordLength
protected

Definition at line 146 of file plotter_hpgl.h.

Referenced by Arc(), Circle(), and SetTargetChordLength().

◆ dashType

PLOT_DASH_TYPE HPGL_PLOTTER::dashType
protected

Definition at line 148 of file plotter_hpgl.h.

Referenced by SetDash(), and startOrAppendItem().

◆ DO_NOT_SET_LINE_WIDTH

◆ fitUserCoords

bool HPGL_PLOTTER::fitUserCoords
protected

Definition at line 150 of file plotter_hpgl.h.

Referenced by EndPlot(), and SetUserCoordsFit().

◆ m_colorMode

◆ m_creator

wxString PLOTTER::m_creator
protectedinherited

◆ m_current_item

HPGL_ITEM* HPGL_PLOTTER::m_current_item
protected

◆ m_currentPenWidth

◆ m_filename

wxString PLOTTER::m_filename
protectedinherited

◆ m_headerExtraLines

wxArrayString PLOTTER::m_headerExtraLines
protectedinherited

◆ m_items

std::list<HPGL_ITEM> HPGL_PLOTTER::m_items
protected

Definition at line 201 of file plotter_hpgl.h.

Referenced by EndPlot(), and startOrAppendItem().

◆ m_iuPerDeviceUnit

◆ m_IUsPerDecimil

◆ m_mirrorIsHorizontal

bool PLOTTER::m_mirrorIsHorizontal
protectedinherited

◆ m_negativeMode

bool PLOTTER::m_negativeMode
protectedinherited

Definition at line 584 of file plotter.h.

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

◆ m_outputFile

FILE* PLOTTER::m_outputFile
protectedinherited

Output file.

Definition at line 580 of file plotter.h.

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

◆ m_pageInfo

◆ m_paperSize

◆ m_penLastpos

wxPoint PLOTTER::m_penLastpos
protectedinherited

◆ m_penState

char PLOTTER::m_penState
protectedinherited

◆ m_plotMirror

◆ m_plotOffset

◆ m_plotScale

◆ m_renderSettings

◆ m_title

wxString PLOTTER::m_title
protectedinherited

Definition at line 591 of file plotter.h.

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

◆ m_yaxisReversed

bool PLOTTER::m_yaxisReversed
protectedinherited

◆ MARKER_COUNT

const unsigned PLOTTER::MARKER_COUNT = 58
staticinherited

Draw a marker (used for the drill map)

Definition at line 427 of file plotter.h.

Referenced by PLOTTER::Marker().

◆ penDiameter

double HPGL_PLOTTER::penDiameter
protected

◆ penNumber

int HPGL_PLOTTER::penNumber
protected

Definition at line 144 of file plotter_hpgl.h.

Referenced by EndPlot(), SetPenNumber(), startOrAppendItem(), and StartPlot().

◆ penSpeed

int HPGL_PLOTTER::penSpeed
protected

Definition at line 143 of file plotter_hpgl.h.

Referenced by SetPenSpeed(), and StartPlot().

◆ USE_DEFAULT_LINE_WIDTH

◆ useUserCoords

bool HPGL_PLOTTER::useUserCoords
protected

Definition at line 149 of file plotter_hpgl.h.

Referenced by EndPlot(), and SetUserCoords().


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