KiCad PCB EDA Suite
plot_board_layers.cpp File Reference

Functions to plot one board layer (silkscreen layers or other layers). More...

#include <fctsys.h>
#include <common.h>
#include <plotter.h>
#include <base_struct.h>
#include <draw_graphic_text.h>
#include <geometry/geometry_utils.h>
#include <trigo.h>
#include <pcb_base_frame.h>
#include <macros.h>
#include <class_board.h>
#include <class_module.h>
#include <class_track.h>
#include <class_edge_mod.h>
#include <class_pcb_text.h>
#include <class_zone.h>
#include <class_drawsegment.h>
#include <class_pcb_target.h>
#include <class_dimension.h>
#include <pcbnew.h>
#include <pcbplot.h>
#include <gbr_metadata.h>

Go to the source code of this file.

Functions

static void PlotSolderMaskLayer (BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt, int aMinThickness)
 
void PlotSilkScreen (BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
 Function PlotSilkScreen plot silkscreen layers which have specific requirements, mainly for pads. More...
 
void PlotOneBoardLayer (BOARD *aBoard, PLOTTER *aPlotter, PCB_LAYER_ID aLayer, const PCB_PLOT_PARAMS &aPlotOpt)
 Function PlotOneBoardLayer main function to plot one copper or technical layer. More...
 
void PlotStandardLayer (BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
 Function PlotStandardLayer plot copper or technical layers. More...
 
void PlotLayerOutlines (BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
 Function PlotLayerOutlines plot copper outline of a copper layer. More...
 
static void initializePlotter (PLOTTER *aPlotter, BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts)
 Set up most plot options for plotting a board (especially the viewport) Important thing: page size is the 'drawing' page size, paper size is the physical page size. More...
 
static void FillNegativeKnockout (PLOTTER *aPlotter, const EDA_RECT &aBbbox)
 Prefill in black an area a little bigger than the board to prepare for the negative plot. More...
 
static void ConfigureHPGLPenSizes (HPGL_PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts)
 Calculate the effective size of HPGL pens and set them in the plotter object. More...
 
PLOTTERStartPlotBoard (BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts, int aLayer, const wxString &aFullFileName, const wxString &aSheetDesc)
 Open a new plotfile using the options (and especially the format) specified in the options and prepare the page for plotting. More...
 

Variables

static const PCB_LAYER_ID plot_seq []
 

Detailed Description

Functions to plot one board layer (silkscreen layers or other layers).

Silkscreen layers have specific requirement for pads (not filled) and texts (with option to remove them from some copper areas (pads...)

Definition in file plot_board_layers.cpp.

Function Documentation

◆ ConfigureHPGLPenSizes()

static void ConfigureHPGLPenSizes ( HPGL_PLOTTER aPlotter,
PCB_PLOT_PARAMS aPlotOpts 
)
static

Calculate the effective size of HPGL pens and set them in the plotter object.

Definition at line 1009 of file plot_board_layers.cpp.

1011 {
1012  /* Compute pen_dim (the value is given in mils) in pcb units,
1013  with plot scale (if Scale is 2, pen diameter value is always m_HPGLPenDiam
1014  so apparent pen diam is actually pen diam / Scale */
1015  int pen_diam = KiROUND( aPlotOpts->GetHPGLPenDiameter() * IU_PER_MILS /
1016  aPlotOpts->GetScale() );
1017 
1018  // Set HPGL-specific options and start
1019  aPlotter->SetPenSpeed( aPlotOpts->GetHPGLPenSpeed() );
1020  aPlotter->SetPenNumber( aPlotOpts->GetHPGLPenNum() );
1021  aPlotter->SetPenDiameter( pen_diam );
1022 }
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:118
virtual void SetPenDiameter(double diameter)
int GetHPGLPenSpeed() const
double GetScale() const
virtual void SetPenSpeed(int speed)
Definition: plotter.h:606
int GetHPGLPenNum() const
virtual void SetPenNumber(int number)
Definition: plotter.h:611
double GetHPGLPenDiameter() const
#define IU_PER_MILS
Definition: plotter.cpp:134

References PCB_PLOT_PARAMS::GetHPGLPenDiameter(), PCB_PLOT_PARAMS::GetHPGLPenNum(), PCB_PLOT_PARAMS::GetHPGLPenSpeed(), PCB_PLOT_PARAMS::GetScale(), IU_PER_MILS, KiROUND(), HPGL_PLOTTER::SetPenDiameter(), HPGL_PLOTTER::SetPenNumber(), and HPGL_PLOTTER::SetPenSpeed().

Referenced by StartPlotBoard().

◆ FillNegativeKnockout()

static void FillNegativeKnockout ( PLOTTER aPlotter,
const EDA_RECT aBbbox 
)
static

Prefill in black an area a little bigger than the board to prepare for the negative plot.

Definition at line 996 of file plot_board_layers.cpp.

997 {
998  const int margin = 5 * IU_PER_MM; // Add a 5 mm margin around the board
999  aPlotter->SetNegative( true );
1000  aPlotter->SetColor( WHITE ); // Which will be plotted as black
1001  EDA_RECT area = aBbbox;
1002  area.Inflate( margin );
1003  aPlotter->Rect( area.GetOrigin(), area.GetEnd(), FILLED_SHAPE );
1004  aPlotter->SetColor( BLACK );
1005 }
virtual void SetColor(COLOR4D color)=0
const wxPoint GetEnd() const
Definition: eda_rect.h:114
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
virtual void SetNegative(bool aNegative)
Definition: plotter.h:118
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
virtual void Rect(const wxPoint &p1, const wxPoint &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
Definition: colors.h:49
Definition: colors.h:45
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.

References BLACK, FILLED_SHAPE, EDA_RECT::GetEnd(), EDA_RECT::GetOrigin(), EDA_RECT::Inflate(), PLOTTER::Rect(), PLOTTER::SetColor(), PLOTTER::SetNegative(), and WHITE.

Referenced by StartPlotBoard().

◆ initializePlotter()

static void initializePlotter ( PLOTTER aPlotter,
BOARD aBoard,
PCB_PLOT_PARAMS aPlotOpts 
)
static

Set up most plot options for plotting a board (especially the viewport) Important thing: page size is the 'drawing' page size, paper size is the physical page size.

Definition at line 909 of file plot_board_layers.cpp.

911 {
912  PAGE_INFO pageA4( wxT( "A4" ) );
913  const PAGE_INFO& pageInfo = aBoard->GetPageSettings();
914  const PAGE_INFO* sheet_info;
915  double paperscale; // Page-to-paper ratio
916  wxSize paperSizeIU;
917  wxSize pageSizeIU( pageInfo.GetSizeIU() );
918  bool autocenter = false;
919 
920  /* Special options: to fit the sheet to an A4 sheet replace
921  the paper size. However there is a difference between
922  the autoscale and the a4paper option:
923  - Autoscale fits the board to the paper size
924  - A4paper fits the original paper size to an A4 sheet
925  - Both of them fit the board to an A4 sheet
926  */
927  if( aPlotOpts->GetA4Output() ) // Fit paper to A4
928  {
929  sheet_info = &pageA4;
930  paperSizeIU = pageA4.GetSizeIU();
931  paperscale = (double) paperSizeIU.x / pageSizeIU.x;
932  autocenter = true;
933  }
934  else
935  {
936  sheet_info = &pageInfo;
937  paperSizeIU = pageSizeIU;
938  paperscale = 1;
939 
940  // Need autocentering only if scale is not 1:1
941  autocenter = (aPlotOpts->GetScale() != 1.0);
942  }
943 
944  EDA_RECT bbox = aBoard->ComputeBoundingBox();
945  wxPoint boardCenter = bbox.Centre();
946  wxSize boardSize = bbox.GetSize();
947 
948  double compound_scale;
949 
950  /* Fit to 80% of the page if asked; it could be that the board is empty,
951  * in this case regress to 1:1 scale */
952  if( aPlotOpts->GetAutoScale() && boardSize.x > 0 && boardSize.y > 0 )
953  {
954  double xscale = (paperSizeIU.x * 0.8) / boardSize.x;
955  double yscale = (paperSizeIU.y * 0.8) / boardSize.y;
956 
957  compound_scale = std::min( xscale, yscale ) * paperscale;
958  }
959  else
960  compound_scale = aPlotOpts->GetScale() * paperscale;
961 
962 
963  /* For the plot offset we have to keep in mind the auxiliary origin
964  too: if autoscaling is off we check that plot option (i.e. autoscaling
965  overrides auxiliary origin) */
966  wxPoint offset( 0, 0);
967 
968  if( autocenter )
969  {
970  offset.x = KiROUND( boardCenter.x - ( paperSizeIU.x / 2.0 ) / compound_scale );
971  offset.y = KiROUND( boardCenter.y - ( paperSizeIU.y / 2.0 ) / compound_scale );
972  }
973  else
974  {
975  if( aPlotOpts->GetUseAuxOrigin() )
976  offset = aBoard->GetAuxOrigin();
977  }
978 
979  /* Configure the plotter object with all the stuff computed and
980  most of that taken from the options */
981  aPlotter->SetPageSettings( *sheet_info );
982 
983  aPlotter->SetViewport( offset, IU_PER_MILS/10, compound_scale,
984  aPlotOpts->GetMirror() );
985  // has meaning only for gerber plotter. Must be called only after SetViewport
986  aPlotter->SetGerberCoordinatesFormat( aPlotOpts->GetGerberPrecision() );
987 
988  aPlotter->SetDefaultLineWidth( aPlotOpts->GetLineWidth() );
989  aPlotter->SetCreator( wxT( "PCBNEW" ) );
990  aPlotter->SetColorMode( false ); // default is plot in Black and White.
991  aPlotter->SetTextMode( aPlotOpts->GetTextMode() );
992 }
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:549
virtual void SetCreator(const wxString &aCreator)
Definition: plotter.h:161
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:118
virtual void SetColorMode(bool aColorMode)
Plot in B/W or color.
Definition: plotter.h:126
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: plotter.cpp:537
double GetScale() const
virtual void SetGerberCoordinatesFormat(int aResolution, bool aUseInches=false)
Definition: plotter.h:433
bool GetMirror() const
bool GetA4Output() const
int GetGerberPrecision() const
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:54
virtual void SetTextMode(PlotTextMode mode)
Change the current text mode.
Definition: plotter.h:428
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:345
bool GetAutoScale() const
virtual void SetViewport(const wxPoint &aOffset, double aIusPerDecimil, double aScale, bool aMirror)=0
Set the plot offset and scaling for the current plot.
virtual void SetDefaultLineWidth(int width)=0
Set the default line width.
int GetLineWidth() const
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
#define IU_PER_MILS
Definition: plotter.cpp:134
PlotTextMode GetTextMode() const
wxPoint Centre() const
Definition: eda_rect.h:60
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
bool GetUseAuxOrigin() const
const wxSize GetSize() const
Definition: eda_rect.h:101
#define min(a, b)
Definition: auxiliary.h:85

References EDA_RECT::Centre(), BOARD::ComputeBoundingBox(), PCB_PLOT_PARAMS::GetA4Output(), PCB_PLOT_PARAMS::GetAutoScale(), BOARD::GetAuxOrigin(), PCB_PLOT_PARAMS::GetGerberPrecision(), PCB_PLOT_PARAMS::GetLineWidth(), PCB_PLOT_PARAMS::GetMirror(), BOARD::GetPageSettings(), PCB_PLOT_PARAMS::GetScale(), EDA_RECT::GetSize(), PCB_PLOT_PARAMS::GetTextMode(), PCB_PLOT_PARAMS::GetUseAuxOrigin(), IU_PER_MILS, KiROUND(), min, PLOTTER::SetColorMode(), PLOTTER::SetCreator(), PLOTTER::SetDefaultLineWidth(), PLOTTER::SetGerberCoordinatesFormat(), PLOTTER::SetPageSettings(), PLOTTER::SetTextMode(), and PLOTTER::SetViewport().

Referenced by StartPlotBoard().

◆ PlotLayerOutlines()

void PlotLayerOutlines ( BOARD aBoard,
PLOTTER aPlotter,
LSET  aLayerMask,
const PCB_PLOT_PARAMS aPlotOpt 
)

Function PlotLayerOutlines plot copper outline of a copper layer.

Parameters
aBoard= the board to plot
aPlotter= the plotter to use
aLayerMask= the mask to define the layers to plot
aPlotOpt= the plot options. Has meaning for some formats only

Definition at line 649 of file plot_board_layers.cpp.

651 {
652 
653  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
654  itemplotter.SetLayerSet( aLayerMask );
655 
656  SHAPE_POLY_SET outlines;
657 
658  for( LSEQ seq = aLayerMask.Seq( plot_seq, arrayDim( plot_seq ) ); seq; ++seq )
659  {
660  PCB_LAYER_ID layer = *seq;
661 
662  outlines.RemoveAllContours();
663  aBoard->ConvertBrdLayerToPolygonalContours( layer, outlines );
664 
665  outlines.Simplify( SHAPE_POLY_SET::PM_FAST );
666 
667  // Plot outlines
668  std::vector< wxPoint > cornerList;
669 
670  // Now we have one or more basic polygons: plot each polygon
671  for( int ii = 0; ii < outlines.OutlineCount(); ii++ )
672  {
673  for(int kk = 0; kk <= outlines.HoleCount (ii); kk++ )
674  {
675  cornerList.clear();
676  const SHAPE_LINE_CHAIN& path = (kk == 0) ? outlines.COutline( ii ) : outlines.CHole( ii, kk - 1 );
677 
678  for( int jj = 0; jj < path.PointCount(); jj++ )
679  cornerList.push_back( wxPoint( path.CPoint( jj ).x , path.CPoint( jj ).y ) );
680 
681 
682  // Ensure the polygon is closed
683  if( cornerList[0] != cornerList[cornerList.size() - 1] )
684  cornerList.push_back( cornerList[0] );
685 
686  aPlotter->PlotPoly( cornerList, NO_FILL );
687  }
688  }
689 
690  // Plot pad holes
692  {
693  int smallDrill = (aPlotOpt.GetDrillMarksType() == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE)
694  ? SMALL_DRILL : INT_MAX;
695 
696  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
697  {
698  for( D_PAD* pad = module->PadsList(); pad; pad = pad->Next() )
699  {
700  wxSize hole = pad->GetDrillSize();
701 
702  if( hole.x == 0 || hole.y == 0 )
703  continue;
704 
705  if( hole.x == hole.y )
706  {
707  hole.x = std::min( smallDrill, hole.x );
708  aPlotter->Circle( pad->GetPosition(), hole.x, NO_FILL );
709  }
710  else
711  {
712  // Note: small drill marks have no significance when applied to slots
713  wxPoint drl_start, drl_end;
714  int width;
715  pad->GetOblongDrillGeometry( drl_start, drl_end, width );
716  aPlotter->ThickSegment( pad->GetPosition() + drl_start,
717  pad->GetPosition() + drl_end, width, SKETCH, NULL );
718  }
719  }
720  }
721  }
722 
723  // Plot vias holes
724  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
725  {
726  const VIA* via = dyn_cast<const VIA*>( track );
727 
728  if( via && via->IsOnLayer( layer ) ) // via holes can be not through holes
729  {
730  aPlotter->Circle( via->GetPosition(), via->GetDrillValue(), NO_FILL );
731  }
732  }
733  }
734 }
D_PAD * Next() const
Definition: class_pad.h:162
#define SMALL_DRILL
Definition: pcbplot.h:72
int OutlineCount() const
Returns the number of outlines in the set
static const PCB_LAYER_ID plot_seq[]
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Function PlotPoly.
int PointCount() const
Function PointCount()
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:367
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
PCB_LAYER_ID
A quick note on layer IDs:
int GetDrillValue() const
Function GetDrillValue "calculates" the drill value for vias (m-Drill if > 0, or default drill value ...
Class SHAPE_POLY_SET.
void ConvertBrdLayerToPolygonalContours(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aOutlines)
Function ConvertBrdLayerToPolygonalContours Build a set of polygons which are the outlines of copper ...
void Simplify(POLYGON_MODE aFastMode)
Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFast...
int HoleCount(int aOutline) const
Returns the number of holes in a given outline
const wxPoint GetPosition() const override
Definition: class_track.h:410
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Definition: macros.h:107
DLIST< MODULE > m_Modules
Definition: class_board.h:248
Class SHAPE_LINE_CHAIN.
virtual void ThickSegment(const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode, void *aData)
Definition: plotter.cpp:456
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
void RemoveAllContours()
Removes all outlines & holes (clears) the polygon set.
DLIST< TRACK > m_Track
Definition: class_board.h:249
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Function IsOnLayer tests to see if this object is on the given layer.
DrillMarksType GetDrillMarksType() const
virtual void Circle(const wxPoint &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
#define min(a, b)
Definition: auxiliary.h:85

References arrayDim(), SHAPE_POLY_SET::CHole(), PLOTTER::Circle(), BOARD::ConvertBrdLayerToPolygonalContours(), SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), PCB_PLOT_PARAMS::GetDrillMarksType(), VIA::GetDrillValue(), VIA::GetPosition(), SHAPE_POLY_SET::HoleCount(), VIA::IsOnLayer(), BOARD::m_Modules, BOARD::m_Track, min, D_PAD::Next(), PCB_PLOT_PARAMS::NO_DRILL_SHAPE, NO_FILL, SHAPE_POLY_SET::OutlineCount(), plot_seq, PLOTTER::PlotPoly(), SHAPE_POLY_SET::PM_FAST, SHAPE_LINE_CHAIN::PointCount(), SHAPE_POLY_SET::RemoveAllContours(), LSET::Seq(), BRDITEMS_PLOTTER::SetLayerSet(), SHAPE_POLY_SET::Simplify(), SKETCH, SMALL_DRILL, PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE, PLOTTER::ThickSegment(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PlotOneBoardLayer().

◆ PlotOneBoardLayer()

void PlotOneBoardLayer ( BOARD aBoard,
PLOTTER aPlotter,
PCB_LAYER_ID  aLayer,
const PCB_PLOT_PARAMS aPlotOpt 
)

Function PlotOneBoardLayer main function to plot one copper or technical layer.

It prepare options and calls the specialized plot function, according to the layer type

Parameters
aBoard= the board to plot
aPlotter= the plotter to use
aLayer= the layer id to plot
aPlotOpt= the plot options (files, sketch). Has meaning for some formats only

Definition at line 143 of file plot_board_layers.cpp.

145 {
146  PCB_PLOT_PARAMS plotOpt = aPlotOpt;
147  int soldermask_min_thickness = aBoard->GetDesignSettings().m_SolderMaskMinWidth;
148 
149  // Set a default color and the text mode for this layer
150  aPlotter->SetColor( aPlotOpt.GetColor() );
151  aPlotter->SetTextMode( aPlotOpt.GetTextMode() );
152 
153  // Specify that the contents of the "Edges Pcb" layer are to be plotted
154  // in addition to the contents of the currently specified layer.
155  LSET layer_mask( aLayer );
156 
157  if( !aPlotOpt.GetExcludeEdgeLayer() )
158  layer_mask.set( Edge_Cuts );
159 
160  if( IsCopperLayer( aLayer ) )
161  {
162  // Skip NPTH pads on copper layers ( only if hole size == pad size ):
163  // Drill mark will be plotted,
164  // if drill mark is SMALL_DRILL_SHAPE or FULL_DRILL_SHAPE
165  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF )
166  {
167  plotOpt.SetSkipPlotNPTH_Pads( false );
168  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
169  }
170  else
171  {
172  plotOpt.SetSkipPlotNPTH_Pads( true );
173  PlotStandardLayer( aBoard, aPlotter, layer_mask, plotOpt );
174  }
175  }
176  else
177  {
178  switch( aLayer )
179  {
180  case B_Mask:
181  case F_Mask:
182  plotOpt.SetSkipPlotNPTH_Pads( false );
183  // Disable plot pad holes
185 
186  // Plot solder mask:
187  if( soldermask_min_thickness == 0 )
188  {
189  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF )
190  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
191  else
192  PlotStandardLayer( aBoard, aPlotter, layer_mask, plotOpt );
193  }
194  else
195  PlotSolderMaskLayer( aBoard, aPlotter, layer_mask, plotOpt,
196  soldermask_min_thickness );
197 
198  break;
199 
200  case B_Adhes:
201  case F_Adhes:
202  case B_Paste:
203  case F_Paste:
204  plotOpt.SetSkipPlotNPTH_Pads( false );
205  // Disable plot pad holes
207 
208  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF )
209  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
210  else
211  PlotStandardLayer( aBoard, aPlotter, layer_mask, plotOpt );
212  break;
213 
214  case F_SilkS:
215  case B_SilkS:
216  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF && plotOpt.GetDXFPlotPolygonMode() )
217  // PlotLayerOutlines() is designed only for DXF plotters.
218  // and must not be used for other plot formats
219  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
220  else
221  PlotSilkScreen( aBoard, aPlotter, layer_mask, plotOpt );
222 
223  // Gerber: Subtract soldermask from silkscreen if enabled
224  if( aPlotter->GetPlotterType() == PLOT_FORMAT_GERBER
225  && plotOpt.GetSubtractMaskFromSilk() )
226  {
227  if( aLayer == F_SilkS )
228  layer_mask = LSET( F_Mask );
229  else
230  layer_mask = LSET( B_Mask );
231 
232  // Create the mask to subtract by creating a negative layer polarity
233  aPlotter->SetLayerPolarity( false );
234 
235  // Disable plot pad holes
237 
238  // Plot the mask
239  PlotStandardLayer( aBoard, aPlotter, layer_mask, plotOpt );
240  }
241  break;
242 
243  // These layers are plotted like silk screen layers.
244  // Mainly, pads on these layers are not filled.
245  // This is not necessary the best choice.
246  case Dwgs_User:
247  case Cmts_User:
248  case Eco1_User:
249  case Eco2_User:
250  case Edge_Cuts:
251  case Margin:
252  case F_CrtYd:
253  case B_CrtYd:
254  case F_Fab:
255  case B_Fab:
256  plotOpt.SetSkipPlotNPTH_Pads( false );
258 
259  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF && plotOpt.GetDXFPlotPolygonMode() )
260  // PlotLayerOutlines() is designed only for DXF plotters.
261  // and must not be used for other plot formats
262  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
263  else
264  PlotSilkScreen( aBoard, aPlotter, layer_mask, plotOpt );
265  break;
266 
267  default:
268  plotOpt.SetSkipPlotNPTH_Pads( false );
270 
271  if( plotOpt.GetFormat() == PLOT_FORMAT_DXF && plotOpt.GetDXFPlotPolygonMode() )
272  // PlotLayerOutlines() is designed only for DXF plotters.
273  // and must not be used for other plot formats
274  PlotLayerOutlines( aBoard, aPlotter, layer_mask, plotOpt );
275  else
276  PlotStandardLayer( aBoard, aPlotter, layer_mask, plotOpt );
277  break;
278  }
279  }
280 }
bool GetDXFPlotPolygonMode() const
virtual void SetColor(COLOR4D color)=0
virtual void SetLayerPolarity(bool aPositive)
Function SetLayerPolarity sets current Gerber layer polarity to positive or negative by writing %LPD*...
Definition: plotter.h:419
void PlotStandardLayer(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
Function PlotStandardLayer plot copper or technical layers.
PlotFormat GetFormat() const
void PlotSilkScreen(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
Function PlotSilkScreen plot silkscreen layers which have specific requirements, mainly for pads.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:534
void SetDrillMarksType(DrillMarksType aVal)
static void PlotSolderMaskLayer(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt, int aMinThickness)
void PlotLayerOutlines(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
Function PlotLayerOutlines plot copper outline of a copper layer.
Class LSET is a set of PCB_LAYER_IDs.
virtual void SetTextMode(PlotTextMode mode)
Change the current text mode.
Definition: plotter.h:428
COLOR4D GetColor() const
void SetSkipPlotNPTH_Pads(bool aSkip)
Class PCB_PLOT_PARAMS handles plot parameters and options when plotting/printing a board.
bool GetSubtractMaskFromSilk() const
virtual PlotFormat GetPlotterType() const =0
Returns the effective plot engine in use.
PlotTextMode GetTextMode() const
bool IsCopperLayer(LAYER_NUM aLayerId)
Function IsCopperLayer tests whether a layer is a copper layer.
bool GetExcludeEdgeLayer() const
int m_SolderMaskMinWidth
Solder mask min width.

References B_Adhes, B_CrtYd, B_Fab, B_Mask, B_Paste, B_SilkS, Cmts_User, Dwgs_User, Eco1_User, Eco2_User, Edge_Cuts, F_Adhes, F_CrtYd, F_Fab, F_Mask, F_Paste, F_SilkS, PCB_PLOT_PARAMS::GetColor(), BOARD::GetDesignSettings(), PCB_PLOT_PARAMS::GetDXFPlotPolygonMode(), PCB_PLOT_PARAMS::GetExcludeEdgeLayer(), PCB_PLOT_PARAMS::GetFormat(), PLOTTER::GetPlotterType(), PCB_PLOT_PARAMS::GetSubtractMaskFromSilk(), PCB_PLOT_PARAMS::GetTextMode(), IsCopperLayer(), BOARD_DESIGN_SETTINGS::m_SolderMaskMinWidth, Margin, PCB_PLOT_PARAMS::NO_DRILL_SHAPE, PLOT_FORMAT_DXF, PLOT_FORMAT_GERBER, PlotLayerOutlines(), PlotSilkScreen(), PlotSolderMaskLayer(), PlotStandardLayer(), PLOTTER::SetColor(), PCB_PLOT_PARAMS::SetDrillMarksType(), PLOTTER::SetLayerPolarity(), PCB_PLOT_PARAMS::SetSkipPlotNPTH_Pads(), and PLOTTER::SetTextMode().

Referenced by DIALOG_EXPORT_SVG::CreateSVGFile(), DIALOG_PLOT::Plot(), and PLOT_CONTROLLER::PlotLayer().

◆ PlotSilkScreen()

void PlotSilkScreen ( BOARD aBoard,
PLOTTER aPlotter,
LSET  aLayerMask,
const PCB_PLOT_PARAMS aPlotOpt 
)

Function PlotSilkScreen plot silkscreen layers which have specific requirements, mainly for pads.

Should not be used for other layers

Parameters
aBoard= the board to plot
aPlotter= the plotter to use
aLayerMask= the mask to define the layers to plot (silkscreen Front and/or Back)
aPlotOpt= the plot options (files, sketch). Has meaning for some formats only

Definition at line 69 of file plot_board_layers.cpp.

71 {
72  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
73  itemplotter.SetLayerSet( aLayerMask );
74 
75  // Plot edge layer and graphic items
76  itemplotter.PlotBoardGraphicItems();
77 
78  // Plot footprint outlines :
79  itemplotter.Plot_Edges_Modules();
80 
81  // Plot pads (creates pads outlines, for pads on silkscreen layers)
82  LSET layersmask_plotpads = aLayerMask;
83 
84  // Calculate the mask layers of allowed layers for pads
85 
86  if( !aPlotOpt.GetPlotPadsOnSilkLayer() ) // Do not plot pads on silk screen layers
87  layersmask_plotpads.set( B_SilkS, false ).set( F_SilkS, false );
88 
89  if( layersmask_plotpads.any() )
90  {
91  for( MODULE* Module = aBoard->m_Modules; Module; Module = Module->Next() )
92  {
93  aPlotter->StartBlock( NULL );
94 
95  for( D_PAD* pad = Module->PadsList(); pad; pad = pad->Next() )
96  {
97  // See if the pad is on this layer
98  LSET masklayer = pad->GetLayerSet();
99  if( !( masklayer & layersmask_plotpads ).any() )
100  continue;
101 
103 
104  if( layersmask_plotpads[B_SilkS] )
105  color = aBoard->Colors().GetLayerColor( B_SilkS );
106 
107  if( layersmask_plotpads[F_SilkS] )
108  color = ( color == COLOR4D::BLACK) ? aBoard->Colors().GetLayerColor( F_SilkS ) : color;
109 
110  itemplotter.PlotPad( pad, color, SKETCH );
111  }
112 
113  aPlotter->EndBlock( NULL );
114  }
115  }
116 
117  // Plot footprints fields (ref, value ...)
118  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
119  {
120  if( ! itemplotter.PlotAllTextsModule( module ) )
121  {
122  wxLogMessage( _( "Your BOARD has a bad layer number for footprint %s" ),
123  GetChars( module->GetReference() ) );
124  }
125  }
126 
127  // Plot filled areas
128  aPlotter->StartBlock( NULL );
129 
130  for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ )
131  {
132  ZONE_CONTAINER* edge_zone = aBoard->GetArea( ii );
133 
134  if( !aLayerMask[ edge_zone->GetLayer() ] )
135  continue;
136 
137  itemplotter.PlotFilledAreas( edge_zone );
138  }
139 
140  aPlotter->EndBlock( NULL );
141 }
D_PAD * Next() const
Definition: class_pad.h:162
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:59
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...
Definition: plotter.h:454
int color
Definition: DXF_plotter.cpp:62
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:185
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
Definition: plotter.h:445
COLOR4D GetLayerColor(LAYER_NUM aLayer) const
Function GetLayerColor.
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:981
Class LSET is a set of PCB_LAYER_IDs.
const COLORS_DESIGN_SETTINGS & Colors() const
Function GetColorSettings.
Definition: class_board.h:567
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:100
DLIST< MODULE > m_Modules
Definition: class_board.h:248
bool GetPlotPadsOnSilkLayer() const
Definition: colors.h:45
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:952
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39

References B_SilkS, BLACK, color, BOARD::Colors(), PLOTTER::EndBlock(), F_SilkS, BOARD::GetArea(), BOARD::GetAreaCount(), GetChars(), ZONE_CONTAINER::GetLayer(), COLORS_DESIGN_SETTINGS::GetLayerColor(), PCB_PLOT_PARAMS::GetPlotPadsOnSilkLayer(), BOARD::m_Modules, D_PAD::Next(), BRDITEMS_PLOTTER::Plot_Edges_Modules(), BRDITEMS_PLOTTER::PlotAllTextsModule(), BRDITEMS_PLOTTER::PlotBoardGraphicItems(), BRDITEMS_PLOTTER::PlotFilledAreas(), BRDITEMS_PLOTTER::PlotPad(), BRDITEMS_PLOTTER::SetLayerSet(), SKETCH, and PLOTTER::StartBlock().

Referenced by PlotOneBoardLayer().

◆ PlotSolderMaskLayer()

void PlotSolderMaskLayer ( BOARD aBoard,
PLOTTER aPlotter,
LSET  aLayerMask,
const PCB_PLOT_PARAMS aPlotOpt,
int  aMinThickness 
)
static

Definition at line 755 of file plot_board_layers.cpp.

758 {
759  PCB_LAYER_ID layer = aLayerMask[B_Mask] ? B_Mask : F_Mask;
760 
761  // We remove 1nm as we expand both sides of the shapes, so allowing for
762  // a strictly greater than or equal comparison in the shape separation (boolean add)
763  // means that we will end up with separate shapes that then are shrunk
764  int inflate = aMinThickness/2 - 1;
765 
766  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
767  itemplotter.SetLayerSet( aLayerMask );
768 
769  // Plot edge layer and graphic items
770  // They do not have a solder Mask margin, because they are only graphic items
771  // on this layer (like logos), not actually areas around pads.
772  itemplotter.PlotBoardGraphicItems();
773 
774  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
775  {
776  for( BOARD_ITEM* item = module->GraphicalItemsList(); item; item = item->Next() )
777  {
778  if( layer != item->GetLayer() )
779  continue;
780 
781  switch( item->Type() )
782  {
783  case PCB_MODULE_EDGE_T:
784  itemplotter.Plot_1_EdgeModule( (EDGE_MODULE*) item );
785  break;
786 
787  default:
788  break;
789  }
790  }
791  }
792 
793  // Build polygons for each pad shape.
794  // the size of the shape on solder mask should be:
795  // size of pad + clearance around the pad.
796  // clearance = solder mask clearance + extra margin
797  // extra margin is half the min width for solder mask
798  // This extra margin is used to merge too close shapes
799  // (distance < aMinThickness), and will be removed when creating
800  // the actual shapes
801  SHAPE_POLY_SET areas; // Contains shapes to plot
802  SHAPE_POLY_SET initialPolys; // Contains exact shapes to plot
803 
804  /* calculates the coeff to compensate radius reduction of holes clearance
805  * due to the segment approx ( 1 /cos( PI/circleToSegmentsCount )
806  */
807  int circleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF;
808  double correction = GetCircletoPolyCorrectionFactor( circleToSegmentsCount );
809 
810  // Plot pads
811  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
812  {
813  // add shapes with exact size
814  module->TransformPadsShapesWithClearanceToPolygon( layer,
815  initialPolys, 0, circleToSegmentsCount, correction );
816  // add shapes inflated by aMinThickness/2
817  module->TransformPadsShapesWithClearanceToPolygon( layer,
818  areas, inflate, circleToSegmentsCount, correction );
819  }
820 
821  // Plot vias on solder masks, if aPlotOpt.GetPlotViaOnMaskLayer() is true,
822  if( aPlotOpt.GetPlotViaOnMaskLayer() )
823  {
824  // The current layer is a solder mask,
825  // use the global mask clearance for vias
826  int via_clearance = aBoard->GetDesignSettings().m_SolderMaskMargin;
827  int via_margin = via_clearance + inflate;
828 
829  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
830  {
831  const VIA* via = dyn_cast<const VIA*>( track );
832 
833  if( !via )
834  continue;
835 
836  // vias are plotted only if they are on the corresponding
837  // external copper layer
838  LSET via_set = via->GetLayerSet();
839 
840  if( via_set[B_Cu] )
841  via_set.set( B_Mask );
842 
843  if( via_set[F_Cu] )
844  via_set.set( F_Mask );
845 
846  if( !( via_set & aLayerMask ).any() )
847  continue;
848 
849  via->TransformShapeWithClearanceToPolygon( areas, via_margin,
850  circleToSegmentsCount,
851  correction );
852  via->TransformShapeWithClearanceToPolygon( initialPolys, via_clearance,
853  circleToSegmentsCount,
854  correction );
855  }
856  }
857 
858  // Add filled zone areas.
859 #if 0 // Set to 1 if a solder mask margin must be applied to zones on solder mask
860  int zone_margin = aBoard->GetDesignSettings().m_SolderMaskMargin;
861 #else
862  int zone_margin = 0;
863 #endif
864 
865  for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ )
866  {
867  ZONE_CONTAINER* zone = aBoard->GetArea( ii );
868 
869  if( zone->GetLayer() != layer )
870  continue;
871 
873  inflate+zone_margin, false );
875  zone_margin, false );
876  }
877 
878  // To avoid a lot of code, use a ZONE_CONTAINER
879  // to handle and plot polygons, because our polygons look exactly like
880  // filled areas in zones
881  // Note, also this code is not optimized: it creates a lot of copy/duplicate data
882  // However it is not complex, and fast enough for plot purposes (copy/convert data
883  // is only a very small calculation time for these calculations)
884  ZONE_CONTAINER zone( aBoard );
886  zone.SetMinThickness( 0 ); // trace polygons only
887  zone.SetLayer ( layer );
888 
889  areas.BooleanAdd( initialPolys, SHAPE_POLY_SET::PM_FAST );
890  areas.Inflate( -inflate, circleToSegmentsCount );
891 
892  // Combine the current areas to initial areas. This is mandatory because
893  // inflate/deflate transform is not perfect, and we want the initial areas perfectly kept
894  areas.BooleanAdd( initialPolys, SHAPE_POLY_SET::PM_FAST );
896 
897  zone.SetFilledPolysList( areas );
898 
899  itemplotter.PlotFilledAreas( &zone );
900 }
void SetFilledPolysList(SHAPE_POLY_SET &aPolysList)
Function SetFilledPolysList sets the list of filled polygons.
Definition: class_zone.h:594
int m_SolderMaskMargin
Solder mask margin.
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:59
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
void TransformShapeWithClearanceToPolygon(SHAPE_POLY_SET &aCornerBuffer, int aClearanceValue, int aCircleToSegmentsCount, double aCorrectionFactor, bool ignoreLineWidth=false) const override
Function TransformShapeWithClearanceToPolygon Convert the track shape to a closed polygon Used in fil...
void BooleanAdd(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Performs boolean polyset union For aFastMode meaning, see function booleanOp
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
void TransformOutlinesShapeWithClearanceToPolygon(SHAPE_POLY_SET &aCornerBuffer, int aMinClearanceValue, bool aUseNetClearance) const
Function TransformOutlinesShapeWithClearanceToPolygon Convert the outlines shape to a polygon with no...
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:185
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:534
void SetArcSegmentCount(int aArcSegCount)
Definition: class_zone.h:184
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
PCB_LAYER_ID
A quick note on layer IDs:
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:981
Class LSET is a set of PCB_LAYER_IDs.
void Inflate(int aFactor, int aCircleSegmentsCount)
Performs outline inflation/deflation, using round corners.
Class SHAPE_POLY_SET.
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Function SetLayer sets the layer this item is on.
Definition: class_zone.cpp:212
void Fracture(POLYGON_MODE aFastMode)
Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the oute...
bool GetPlotViaOnMaskLayer() const
BOARD_ITEM * Next() const
DLIST< MODULE > m_Modules
Definition: class_board.h:248
DLIST< TRACK > m_Track
Definition: class_board.h:249
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:952
void SetMinThickness(int aMinThickness)
Definition: class_zone.h:200
#define ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF
Definition: pcbnew.h:42
double GetCircletoPolyCorrectionFactor(int aSegCountforCircle)

References ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF, B_Cu, B_Mask, SHAPE_POLY_SET::BooleanAdd(), F_Cu, F_Mask, SHAPE_POLY_SET::Fracture(), BOARD::GetArea(), BOARD::GetAreaCount(), GetCircletoPolyCorrectionFactor(), BOARD::GetDesignSettings(), ZONE_CONTAINER::GetLayer(), VIA::GetLayerSet(), PCB_PLOT_PARAMS::GetPlotViaOnMaskLayer(), SHAPE_POLY_SET::Inflate(), BOARD::m_Modules, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD::m_Track, BOARD_ITEM::Next(), PCB_MODULE_EDGE_T, BRDITEMS_PLOTTER::Plot_1_EdgeModule(), BRDITEMS_PLOTTER::PlotBoardGraphicItems(), BRDITEMS_PLOTTER::PlotFilledAreas(), SHAPE_POLY_SET::PM_FAST, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE, ZONE_CONTAINER::SetArcSegmentCount(), ZONE_CONTAINER::SetFilledPolysList(), ZONE_CONTAINER::SetLayer(), BRDITEMS_PLOTTER::SetLayerSet(), ZONE_CONTAINER::SetMinThickness(), ZONE_CONTAINER::TransformOutlinesShapeWithClearanceToPolygon(), and TRACK::TransformShapeWithClearanceToPolygon().

Referenced by PlotOneBoardLayer().

◆ PlotStandardLayer()

void PlotStandardLayer ( BOARD aBoard,
PLOTTER aPlotter,
LSET  aLayerMask,
const PCB_PLOT_PARAMS aPlotOpt 
)

Function PlotStandardLayer plot copper or technical layers.

not used for silk screen layers, because these layers have specific requirements, mainly for pads

Parameters
aBoard= the board to plot
aPlotter= the plotter to use
aLayerMask= the mask to define the layers to plot
aPlotOpt= the plot options (files, sketch). Has meaning for some formats only

aPlotOpt has 3 important options to control this plot, which are set, depending on the layer type to plot SetEnablePlotVia( bool aEnable ) aEnable = true to plot vias, false to skip vias (has meaning only for solder mask layers). SetSkipPlotNPTH_Pads( bool aSkip ) aSkip = true to skip NPTH Pads, when the pad size and the pad hole have the same size. Used in GERBER format only. SetDrillMarksType( DrillMarksType aVal ) controle the actual hole: no hole, small hole, actual hole

Definition at line 286 of file plot_board_layers.cpp.

288 {
289  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
290 
291  itemplotter.SetLayerSet( aLayerMask );
292 
293  EDA_DRAW_MODE_T plotMode = aPlotOpt.GetPlotMode();
294 
295  // Plot edge layer and graphic items
296  itemplotter.PlotBoardGraphicItems();
297 
298  // Draw footprint shapes without pads (pads will plotted later)
299  // We plot here module texts, but they are usually on silkscreen layer,
300  // so they are not plot here but plot by PlotSilkScreen()
301  // Plot footprints fields (ref, value ...)
302  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
303  {
304  if( ! itemplotter.PlotAllTextsModule( module ) )
305  {
306  wxLogMessage( _( "Your BOARD has a bad layer number for footprint %s" ),
307  GetChars( module->GetReference() ) );
308  }
309  }
310 
311  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
312  {
313  for( BOARD_ITEM* item = module->GraphicalItemsList(); item; item = item->Next() )
314  {
315  if( !aLayerMask[ item->GetLayer() ] )
316  continue;
317 
318  switch( item->Type() )
319  {
320  case PCB_MODULE_EDGE_T:
321  itemplotter.Plot_1_EdgeModule( (EDGE_MODULE*) item );
322  break;
323 
324  default:
325  break;
326  }
327  }
328  }
329 
330  // Plot footprint pads
331  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
332  {
333  aPlotter->StartBlock( NULL );
334 
335  for( D_PAD* pad = module->PadsList(); pad; pad = pad->Next() )
336  {
337  if( (pad->GetLayerSet() & aLayerMask) == 0 )
338  continue;
339 
340  wxSize margin;
341  double width_adj = 0;
342 
343  if( ( aLayerMask & LSET::AllCuMask() ).any() )
344  width_adj = itemplotter.getFineWidthAdj();
345 
346  static const LSET speed( 4, B_Mask, F_Mask, B_Paste, F_Paste );
347 
348  LSET anded = ( speed & aLayerMask );
349 
350  if( anded == LSET( F_Mask ) || anded == LSET( B_Mask ) )
351  {
352  margin.x = margin.y = pad->GetSolderMaskMargin();
353  }
354  else if( anded == LSET( F_Paste ) || anded == LSET( B_Paste ) )
355  {
356  margin = pad->GetSolderPasteMargin();
357  }
358 
359  // Now offset the pad size by margin + width_adj
360  // this is easy for most shapes, but not for a trapezoid or a custom shape
361  wxSize padPlotsSize;
362  wxSize extraSize = margin * 2;
363  extraSize.x += width_adj;
364  extraSize.y += width_adj;
365  wxSize deltaSize = pad->GetDelta(); // has meaning only for trapezoidal pads
366 
367  if( pad->GetShape() == PAD_SHAPE_TRAPEZOID )
368  { // The easy way is to use BuildPadPolygon to calculate
369  // size and delta of the trapezoidal pad after offseting:
370  wxPoint coord[4];
371  pad->BuildPadPolygon( coord, extraSize/2, 0.0 );
372  // Calculate the size and delta from polygon corners coordinates:
373  // coord[0] is the lower left
374  // coord[1] is the upper left
375  // coord[2] is the upper right
376  // coord[3] is the lower right
377 
378  // the size is the distance between middle of segments
379  // (left/right or top/bottom)
380  // size X is the dist between left and right middle points:
381  padPlotsSize.x = ( ( -coord[0].x + coord[3].x ) // the lower segment X length
382  + ( -coord[1].x + coord[2].x ) ) // the upper segment X length
383  / 2; // the Y size is the half sum
384  // size Y is the dist between top and bottom middle points:
385  padPlotsSize.y = ( ( coord[0].y - coord[1].y ) // the left segment Y lenght
386  + ( coord[3].y - coord[2].y ) ) // the right segment Y lenght
387  / 2; // the Y size is the half sum
388 
389  // calculate the delta ( difference of lenght between 2 opposite edges )
390  // The delta.x is the delta along the X axis, therefore the delta of Y lenghts
391  wxSize delta;
392 
393  if( coord[0].y != coord[3].y )
394  delta.x = coord[0].y - coord[3].y;
395  else
396  delta.y = coord[1].x - coord[0].x;
397 
398  pad->SetDelta( delta );
399  }
400  else
401  padPlotsSize = pad->GetSize() + extraSize;
402 
403  // Don't draw a null size item :
404  if( padPlotsSize.x <= 0 || padPlotsSize.y <= 0 )
405  continue;
406 
408 
409  if( pad->GetLayerSet()[B_Cu] )
410  color = aBoard->Colors().GetItemColor( LAYER_PAD_BK );
411 
412  if( pad->GetLayerSet()[F_Cu] )
413  color = color.LegacyMix( aBoard->Colors().GetItemColor( LAYER_PAD_FR ) );
414 
415  // Temporary set the pad size to the required plot size:
416  wxSize tmppadsize = pad->GetSize();
417 
418  switch( pad->GetShape() )
419  {
420  case PAD_SHAPE_CIRCLE:
421  case PAD_SHAPE_OVAL:
422  pad->SetSize( padPlotsSize );
423 
424  if( aPlotOpt.GetSkipPlotNPTH_Pads() &&
425  ( pad->GetSize() == pad->GetDrillSize() ) &&
426  ( pad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED ) )
427  break;
428 
429  itemplotter.PlotPad( pad, color, plotMode );
430  break;
431 
432  case PAD_SHAPE_TRAPEZOID:
433  case PAD_SHAPE_RECT:
434  case PAD_SHAPE_ROUNDRECT:
436  pad->SetSize( padPlotsSize );
437  itemplotter.PlotPad( pad, color, plotMode );
438  break;
439 
440  case PAD_SHAPE_CUSTOM:
441  // inflate/deflate a custom shape is a bit complex.
442  // so build a similar pad shape, and inflate/deflate the polygonal shape
443  {
444  // we expect margin.x = margin.y for custom pads
445  if( margin.x < 0 )
446  // be sure the anchor pad is not bigger than the deflated shape
447  // because this anchor will be added to the pad shape when plotting
448  // the pad
449  pad->SetSize( padPlotsSize );
450 
451  D_PAD dummy( *pad );
452  SHAPE_POLY_SET shape;
453  pad->MergePrimitivesAsPolygon( &shape, 64 );
454  // shape polygon can have holes linked to the main outline.
455  // So use InflateWithLinkedHoles(), not Inflate() that can create
456  // bad shapes if margin.x is < 0
459  dummy.DeletePrimitivesList();
460  dummy.AddPrimitive( shape, 0 );
461  dummy.MergePrimitivesAsPolygon();
462 
463  itemplotter.PlotPad( &dummy, color, plotMode );
464  }
465  break;
466  }
467 
468  pad->SetSize( tmppadsize ); // Restore the pad size
469  pad->SetDelta( deltaSize );
470  }
471 
472  aPlotter->EndBlock( NULL );
473  }
474 
475  // Plot vias on copper layers, and if aPlotOpt.GetPlotViaOnMaskLayer() is true,
476  // plot them on solder mask
477 
478  GBR_METADATA gbr_metadata;
479 
480  bool isOnCopperLayer = ( aLayerMask & LSET::AllCuMask() ).any();
481 
482  if( isOnCopperLayer )
483  {
486  }
487 
488  aPlotter->StartBlock( NULL );
489 
490  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
491  {
492  const VIA* Via = dyn_cast<const VIA*>( track );
493 
494  if( !Via )
495  continue;
496 
497  // vias are not plotted if not on selected layer, but if layer
498  // is SOLDERMASK_LAYER_BACK or SOLDERMASK_LAYER_FRONT,vias are drawn,
499  // only if they are on the corresponding external copper layer
500  LSET via_mask_layer = Via->GetLayerSet();
501 
502  if( aPlotOpt.GetPlotViaOnMaskLayer() )
503  {
504  if( via_mask_layer[B_Cu] )
505  via_mask_layer.set( B_Mask );
506 
507  if( via_mask_layer[F_Cu] )
508  via_mask_layer.set( F_Mask );
509  }
510 
511  if( !( via_mask_layer & aLayerMask ).any() )
512  continue;
513 
514  int via_margin = 0;
515  double width_adj = 0;
516 
517  // If the current layer is a solder mask, use the global mask
518  // clearance for vias
519  if( aLayerMask[B_Mask] || aLayerMask[F_Mask] )
520  via_margin = aBoard->GetDesignSettings().m_SolderMaskMargin;
521 
522  if( ( aLayerMask & LSET::AllCuMask() ).any() )
523  width_adj = itemplotter.getFineWidthAdj();
524 
525  int diameter = Via->GetWidth() + 2 * via_margin + width_adj;
526 
527  // Don't draw a null size item :
528  if( diameter <= 0 )
529  continue;
530 
531  // Some vias can be not connected (no net).
532  // Set the m_NotInNet for these vias to force a empty net name in gerber file
533  gbr_metadata.m_NetlistMetadata.m_NotInNet = Via->GetNetname().IsEmpty();
534 
535  gbr_metadata.SetNetName( Via->GetNetname() );
536 
537  COLOR4D color = aBoard->Colors().GetItemColor( LAYER_VIAS + Via->GetViaType() );
538  // Set plot color (change WHITE to LIGHTGRAY because
539  // the white items are not seen on a white paper or screen
540  aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY);
541  aPlotter->FlashPadCircle( Via->GetStart(), diameter, plotMode, &gbr_metadata );
542  }
543 
544  aPlotter->EndBlock( NULL );
545  aPlotter->StartBlock( NULL );
547 
548  // Plot tracks (not vias) :
549  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
550  {
551  if( track->Type() == PCB_VIA_T )
552  continue;
553 
554  if( !aLayerMask[track->GetLayer()] )
555  continue;
556 
557  // Some track segments can be not connected (no net).
558  // Set the m_NotInNet for these segments to force a empty net name in gerber file
559  gbr_metadata.m_NetlistMetadata.m_NotInNet = track->GetNetname().IsEmpty();
560 
561  gbr_metadata.SetNetName( track->GetNetname() );
562  int width = track->GetWidth() + itemplotter.getFineWidthAdj();
563  aPlotter->SetColor( itemplotter.getColor( track->GetLayer() ) );
564  aPlotter->ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode, &gbr_metadata );
565  }
566 
567  aPlotter->EndBlock( NULL );
568 
569  // Plot filled ares
570  aPlotter->StartBlock( NULL );
571  for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ )
572  {
573  ZONE_CONTAINER* zone = aBoard->GetArea( ii );
574 
575  if( !aLayerMask[zone->GetLayer()] )
576  continue;
577 
578  itemplotter.PlotFilledAreas( zone );
579  }
580  aPlotter->EndBlock( NULL );
581 
582  // Adding drill marks, if required and if the plotter is able to plot them:
584  itemplotter.PlotDrillMarks();
585 }
D_PAD * Next() const
Definition: class_pad.h:162
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:676
int m_SolderMaskMargin
Solder mask margin.
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:59
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...
Definition: plotter.h:454
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:66
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
virtual void SetColor(COLOR4D color)=0
const wxPoint & GetStart() const
Definition: class_track.h:133
void SetNetAttribType(int aNetAttribType)
Definition: gbr_metadata.h:152
int color
Definition: DXF_plotter.cpp:62
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:185
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
Definition: plotter.h:445
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:534
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
static const int delta[8][2]
Definition: solve.cpp:112
COLOR4D GetItemColor(int aItemIdx) const
Function GetItemColor.
virtual void FlashPadCircle(const wxPoint &aPadPos, int aDiameter, EDA_DRAW_MODE_T aTraceMode, void *aData)=0
virtual function FlashPadCircle
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:981
Class LSET is a set of PCB_LAYER_IDs.
Class SHAPE_POLY_SET.
EDA_DRAW_MODE_T
Definition: eda_text.h:78
VIATYPE_T GetViaType() const
Definition: class_track.h:437
bool GetSkipPlotNPTH_Pads() const
const wxString & GetNetname() const
Function GetNetname.
aperture used for connected items like tracks (not vias)
Definition: gbr_metadata.h:84
void SetNetName(const wxString &aNetname)
Definition: gbr_metadata.h:162
const COLORS_DESIGN_SETTINGS & Colors() const
Function GetColorSettings.
Definition: class_board.h:567
bool GetPlotViaOnMaskLayer() const
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:100
smd pads, front layer
BOARD_ITEM * Next() const
int GetWidth() const
Definition: class_track.h:127
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
DLIST< MODULE > m_Modules
Definition: class_board.h:248
virtual void ThickSegment(const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode, void *aData)
Definition: plotter.cpp:456
void InflateWithLinkedHoles(int aFactor, int aCircleSegmentsCount, POLYGON_MODE aFastMode)
Performs outline inflation/deflation, using round corners.
Definition: colors.h:49
void SetApertureAttrib(GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB aApertAttribute)
Definition: gbr_metadata.h:142
bool m_NotInNet
true if a pad of a footprint cannot be connected (for instance a mechanical NPTH, ot a not named pad)...
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
DLIST< TRACK > m_Track
Definition: class_board.h:249
GBR_NETLIST_METADATA m_NetlistMetadata
a item to handle object attribute:
Definition: gbr_metadata.h:181
Definition: colors.h:45
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:952
DrillMarksType GetDrillMarksType() const
#define ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF
Definition: pcbnew.h:42
print info associated to a net (TO.N attribute)
EDA_DRAW_MODE_T GetPlotMode() const
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39

References LSET::AllCuMask(), ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF, B_Cu, B_Mask, B_Paste, BLACK, color, BOARD::Colors(), delta, dummy(), PLOTTER::EndBlock(), F_Cu, F_Mask, F_Paste, PLOTTER::FlashPadCircle(), GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CONDUCTOR, GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_VIAPAD, GBR_NETLIST_METADATA::GBR_NETINFO_NET, BOARD::GetArea(), BOARD::GetAreaCount(), GetChars(), BRDITEMS_PLOTTER::getColor(), BOARD::GetDesignSettings(), PCB_PLOT_PARAMS::GetDrillMarksType(), BRDITEMS_PLOTTER::getFineWidthAdj(), COLORS_DESIGN_SETTINGS::GetItemColor(), ZONE_CONTAINER::GetLayer(), VIA::GetLayerSet(), BOARD_CONNECTED_ITEM::GetNetname(), PCB_PLOT_PARAMS::GetPlotMode(), PCB_PLOT_PARAMS::GetPlotViaOnMaskLayer(), PCB_PLOT_PARAMS::GetSkipPlotNPTH_Pads(), TRACK::GetStart(), VIA::GetViaType(), TRACK::GetWidth(), SHAPE_POLY_SET::InflateWithLinkedHoles(), LAYER_PAD_BK, LAYER_PAD_FR, LAYER_VIAS, LIGHTGRAY, BOARD::m_Modules, GBR_METADATA::m_NetlistMetadata, GBR_NETLIST_METADATA::m_NotInNet, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD::m_Track, BOARD_ITEM::Next(), D_PAD::Next(), PCB_PLOT_PARAMS::NO_DRILL_SHAPE, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_SHAPE_CHAMFERED_RECT, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, PCB_MODULE_EDGE_T, PCB_VIA_T, BRDITEMS_PLOTTER::Plot_1_EdgeModule(), BRDITEMS_PLOTTER::PlotAllTextsModule(), BRDITEMS_PLOTTER::PlotBoardGraphicItems(), BRDITEMS_PLOTTER::PlotDrillMarks(), BRDITEMS_PLOTTER::PlotFilledAreas(), BRDITEMS_PLOTTER::PlotPad(), SHAPE_POLY_SET::PM_FAST, GBR_METADATA::SetApertureAttrib(), PLOTTER::SetColor(), BRDITEMS_PLOTTER::SetLayerSet(), GBR_METADATA::SetNetAttribType(), GBR_METADATA::SetNetName(), PLOTTER::StartBlock(), PLOTTER::ThickSegment(), and WHITE.

Referenced by PlotOneBoardLayer().

◆ StartPlotBoard()

PLOTTER* StartPlotBoard ( BOARD aBoard,
PCB_PLOT_PARAMS aPlotOpts,
int  aLayer,
const wxString &  aFullFileName,
const wxString &  aSheetDesc 
)

Open a new plotfile using the options (and especially the format) specified in the options and prepare the page for plotting.

Return the plotter object if OK, NULL if the file is not created (or has a problem)

Definition at line 1029 of file plot_board_layers.cpp.

1033 {
1034  // Create the plotter driver and set the few plotter specific
1035  // options
1036  PLOTTER* plotter = NULL;
1037 
1038  switch( aPlotOpts->GetFormat() )
1039  {
1040  case PLOT_FORMAT_DXF:
1041  plotter = new DXF_PLOTTER();
1042  break;
1043 
1044  case PLOT_FORMAT_POST:
1045  PS_PLOTTER* PS_plotter;
1046  PS_plotter = new PS_PLOTTER();
1047  PS_plotter->SetScaleAdjust( aPlotOpts->GetFineScaleAdjustX(),
1048  aPlotOpts->GetFineScaleAdjustY() );
1049  plotter = PS_plotter;
1050  break;
1051 
1052  case PLOT_FORMAT_PDF:
1053  plotter = new PDF_PLOTTER();
1054  break;
1055 
1056  case PLOT_FORMAT_HPGL:
1057  HPGL_PLOTTER* HPGL_plotter;
1058  HPGL_plotter = new HPGL_PLOTTER();
1059 
1060  /* HPGL options are a little more convoluted to compute, so
1061  they're split in another function */
1062  ConfigureHPGLPenSizes( HPGL_plotter, aPlotOpts );
1063  plotter = HPGL_plotter;
1064  break;
1065 
1066  case PLOT_FORMAT_GERBER:
1067  plotter = new GERBER_PLOTTER();
1068  break;
1069 
1070  case PLOT_FORMAT_SVG:
1071  plotter = new SVG_PLOTTER();
1072  break;
1073 
1074  default:
1075  wxASSERT( false );
1076  return NULL;
1077  }
1078 
1079  // Compute the viewport and set the other options
1080 
1081  // page layout is not mirrored, so temporary change mirror option
1082  // just to plot the page layout
1083  PCB_PLOT_PARAMS plotOpts = *aPlotOpts;
1084 
1085  if( plotOpts.GetPlotFrameRef() && plotOpts.GetMirror() )
1086  plotOpts.SetMirror( false );
1087 
1088  initializePlotter( plotter, aBoard, &plotOpts );
1089 
1090  if( plotter->OpenFile( aFullFileName ) )
1091  {
1092  plotter->ClearHeaderLinesList();
1093 
1094  // For the Gerber "file function" attribute, set the layer number
1095  if( plotter->GetPlotterType() == PLOT_FORMAT_GERBER )
1096  {
1097  bool useX2mode = plotOpts.GetUseGerberX2format();
1098 
1099  GERBER_PLOTTER* gbrplotter = static_cast <GERBER_PLOTTER*> ( plotter );
1100  gbrplotter->UseX2format( useX2mode );
1101  gbrplotter->UseX2NetAttributes( plotOpts.GetIncludeGerberNetlistInfo() );
1102 
1103  // Attributes can be added using X2 format or as comment (X1 format)
1104  AddGerberX2Attribute( plotter, aBoard, aLayer, not useX2mode );
1105  }
1106 
1107  plotter->StartPlot();
1108 
1109  // Plot the frame reference if requested
1110  if( aPlotOpts->GetPlotFrameRef() )
1111  {
1112  PlotWorkSheet( plotter, aBoard->GetTitleBlock(),
1113  aBoard->GetPageSettings(),
1114  1, 1, // Only one page
1115  aSheetDesc, aBoard->GetFileName() );
1116 
1117  if( aPlotOpts->GetMirror() )
1118  initializePlotter( plotter, aBoard, aPlotOpts );
1119  }
1120 
1121  /* When plotting a negative board: draw a black rectangle
1122  * (background for plot board in white) and switch the current
1123  * color to WHITE; note the color inversion is actually done
1124  * in the driver (if supported) */
1125  if( aPlotOpts->GetNegative() )
1126  {
1127  EDA_RECT bbox = aBoard->ComputeBoundingBox();
1128  FillNegativeKnockout( plotter, bbox );
1129  }
1130 
1131  return plotter;
1132  }
1133 
1134  delete plotter;
1135  return NULL;
1136 }
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:549
void UseX2NetAttributes(bool aEnable)
Definition: plotter.h:1157
bool GetPlotFrameRef() const
static void initializePlotter(PLOTTER *aPlotter, BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts)
Set up most plot options for plotting a board (especially the viewport) Important thing: page size is...
virtual bool StartPlot()=0
static void FillNegativeKnockout(PLOTTER *aPlotter, const EDA_RECT &aBbbox)
Prefill in black an area a little bigger than the board to prepare for the negative plot.
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
Definition: plotter.cpp:79
void SetScaleAdjust(double scaleX, double scaleY)
Set the 'fine' scaling for the postscript engine.
Definition: plotter.h:684
PlotFormat GetFormat() const
void SetMirror(bool aFlag)
void UseX2format(bool aEnable)
Definition: plotter.h:1156
void AddGerberX2Attribute(PLOTTER *aPlotter, const BOARD *aBoard, LAYER_NUM aLayer, bool aUseX1CompatibilityMode)
Calculates some X2 attributes, as defined in the Gerber file format specification and add them to the...
Definition: pcbplot.cpp:352
const wxString & GetFileName() const
Definition: class_board.h:237
bool GetUseGerberX2format() const
void PlotWorkSheet(PLOTTER *plotter, const TITLE_BLOCK &aTitleBlock, const PAGE_INFO &aPageInfo, int aSheetNumber, int aNumberOfSheets, const wxString &aSheetDesc, const wxString &aFilename)
bool GetMirror() const
bool GetIncludeGerberNetlistInfo() const
static void ConfigureHPGLPenSizes(HPGL_PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts)
Calculate the effective size of HPGL pens and set them in the plotter object.
Class PCB_PLOT_PARAMS handles plot parameters and options when plotting/printing a board.
double GetFineScaleAdjustX() const
Base plotter engine class.
Definition: plotter.h:97
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:555
virtual PlotFormat GetPlotterType() const =0
Returns the effective plot engine in use.
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
void ClearHeaderLinesList()
Function ClearHeaderLinesList remove all lines from the list of free lines to print at the beginning ...
Definition: plotter.h:185
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
double GetFineScaleAdjustY() const
bool GetNegative() const

References AddGerberX2Attribute(), PLOTTER::ClearHeaderLinesList(), BOARD::ComputeBoundingBox(), ConfigureHPGLPenSizes(), FillNegativeKnockout(), BOARD::GetFileName(), PCB_PLOT_PARAMS::GetFineScaleAdjustX(), PCB_PLOT_PARAMS::GetFineScaleAdjustY(), PCB_PLOT_PARAMS::GetFormat(), PCB_PLOT_PARAMS::GetIncludeGerberNetlistInfo(), PCB_PLOT_PARAMS::GetMirror(), PCB_PLOT_PARAMS::GetNegative(), BOARD::GetPageSettings(), PCB_PLOT_PARAMS::GetPlotFrameRef(), PLOTTER::GetPlotterType(), BOARD::GetTitleBlock(), PCB_PLOT_PARAMS::GetUseGerberX2format(), initializePlotter(), PLOTTER::OpenFile(), PLOT_FORMAT_DXF, PLOT_FORMAT_GERBER, PLOT_FORMAT_HPGL, PLOT_FORMAT_PDF, PLOT_FORMAT_POST, PLOT_FORMAT_SVG, PlotWorkSheet(), PCB_PLOT_PARAMS::SetMirror(), PSLIKE_PLOTTER::SetScaleAdjust(), PLOTTER::StartPlot(), GERBER_PLOTTER::UseX2format(), and GERBER_PLOTTER::UseX2NetAttributes().

Referenced by DIALOG_EXPORT_SVG::CreateSVGFile(), PLOT_CONTROLLER::OpenPlotfile(), and DIALOG_PLOT::Plot().

Variable Documentation

◆ plot_seq

const PCB_LAYER_ID plot_seq[]
static

Definition at line 589 of file plot_board_layers.cpp.

Referenced by PlotLayerOutlines().