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

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 1024 of file plot_board_layers.cpp.

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

Referenced by StartPlotBoard().

1026 {
1027  /* Compute pen_dim (the value is given in mils) in pcb units,
1028  with plot scale (if Scale is 2, pen diameter value is always m_HPGLPenDiam
1029  so apparent pen diam is actually pen diam / Scale */
1030  int pen_diam = KiROUND( aPlotOpts->GetHPGLPenDiameter() * IU_PER_MILS /
1031  aPlotOpts->GetScale() );
1032 
1033  // Set HPGL-specific options and start
1034  aPlotter->SetPenSpeed( aPlotOpts->GetHPGLPenSpeed() );
1035  aPlotter->SetPenNumber( aPlotOpts->GetHPGLPenNum() );
1036  aPlotter->SetPenDiameter( pen_diam );
1037 }
double GetHPGLPenDiameter() const
double GetScale() const
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:106
virtual void SetPenDiameter(double diameter)
int GetHPGLPenNum() const
virtual void SetPenSpeed(int speed)
Definition: plotter.h:605
virtual void SetPenNumber(int number)
Definition: plotter.h:610
int GetHPGLPenSpeed() const
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 1011 of file plot_board_layers.cpp.

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

Referenced by StartPlotBoard().

1012 {
1013  const int margin = 5 * IU_PER_MM; // Add a 5 mm margin around the board
1014  aPlotter->SetNegative( true );
1015  aPlotter->SetColor( WHITE ); // Which will be plotted as black
1016  EDA_RECT area = aBbbox;
1017  area.Inflate( margin );
1018  aPlotter->Rect( area.GetOrigin(), area.GetEnd(), FILLED_SHAPE );
1019  aPlotter->SetColor( BLACK );
1020 }
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
virtual void SetColor(COLOR4D color)=0
const wxPoint GetEnd() const
Definition: eda_rect.h:114
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
virtual void SetNegative(bool _negative)
Definition: plotter.h:120
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
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 924 of file plot_board_layers.cpp.

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(), KiROUND(), min, PLOTTER::SetColorMode(), PLOTTER::SetCreator(), PLOTTER::SetDefaultLineWidth(), PLOTTER::SetGerberCoordinatesFormat(), PLOTTER::SetPageSettings(), PLOTTER::SetTextMode(), PLOTTER::SetViewport(), wxPoint::x, and wxPoint::y.

Referenced by StartPlotBoard().

926 {
927  PAGE_INFO pageA4( wxT( "A4" ) );
928  const PAGE_INFO& pageInfo = aBoard->GetPageSettings();
929  const PAGE_INFO* sheet_info;
930  double paperscale; // Page-to-paper ratio
931  wxSize paperSizeIU;
932  wxSize pageSizeIU( pageInfo.GetSizeIU() );
933  bool autocenter = false;
934 
935  /* Special options: to fit the sheet to an A4 sheet replace
936  the paper size. However there is a difference between
937  the autoscale and the a4paper option:
938  - Autoscale fits the board to the paper size
939  - A4paper fits the original paper size to an A4 sheet
940  - Both of them fit the board to an A4 sheet
941  */
942  if( aPlotOpts->GetA4Output() ) // Fit paper to A4
943  {
944  sheet_info = &pageA4;
945  paperSizeIU = pageA4.GetSizeIU();
946  paperscale = (double) paperSizeIU.x / pageSizeIU.x;
947  autocenter = true;
948  }
949  else
950  {
951  sheet_info = &pageInfo;
952  paperSizeIU = pageSizeIU;
953  paperscale = 1;
954 
955  // Need autocentering only if scale is not 1:1
956  autocenter = (aPlotOpts->GetScale() != 1.0);
957  }
958 
959  EDA_RECT bbox = aBoard->ComputeBoundingBox();
960  wxPoint boardCenter = bbox.Centre();
961  wxSize boardSize = bbox.GetSize();
962 
963  double compound_scale;
964 
965  /* Fit to 80% of the page if asked; it could be that the board is empty,
966  * in this case regress to 1:1 scale */
967  if( aPlotOpts->GetAutoScale() && boardSize.x > 0 && boardSize.y > 0 )
968  {
969  double xscale = (paperSizeIU.x * 0.8) / boardSize.x;
970  double yscale = (paperSizeIU.y * 0.8) / boardSize.y;
971 
972  compound_scale = std::min( xscale, yscale ) * paperscale;
973  }
974  else
975  compound_scale = aPlotOpts->GetScale() * paperscale;
976 
977 
978  /* For the plot offset we have to keep in mind the auxiliary origin
979  too: if autoscaling is off we check that plot option (i.e. autoscaling
980  overrides auxiliary origin) */
981  wxPoint offset( 0, 0);
982 
983  if( autocenter )
984  {
985  offset.x = KiROUND( boardCenter.x - ( paperSizeIU.x / 2.0 ) / compound_scale );
986  offset.y = KiROUND( boardCenter.y - ( paperSizeIU.y / 2.0 ) / compound_scale );
987  }
988  else
989  {
990  if( aPlotOpts->GetUseAuxOrigin() )
991  offset = aBoard->GetAuxOrigin();
992  }
993 
994  /* Configure the plotter object with all the stuff computed and
995  most of that taken from the options */
996  aPlotter->SetPageSettings( *sheet_info );
997 
998  aPlotter->SetViewport( offset, IU_PER_MILS/10, compound_scale,
999  aPlotOpts->GetMirror() );
1000  // has meaning only for gerber plotter. Must be called only after SetViewport
1001  aPlotter->SetGerberCoordinatesFormat( aPlotOpts->GetGerberPrecision() );
1002 
1003  aPlotter->SetDefaultLineWidth( aPlotOpts->GetLineWidth() );
1004  aPlotter->SetCreator( wxT( "PCBNEW" ) );
1005  aPlotter->SetColorMode( false ); // default is plot in Black and White.
1006  aPlotter->SetTextMode( aPlotOpts->GetTextMode() );
1007 }
bool GetMirror() const
bool GetAutoScale() const
virtual void SetCreator(const wxString &aCreator)
Definition: plotter.h:160
double GetScale() const
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:106
const wxSize GetSize() const
Definition: eda_rect.h:101
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
bool GetUseAuxOrigin() const
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: plotter.cpp:538
virtual void SetGerberCoordinatesFormat(int aResolution, bool aUseInches=false)
Definition: plotter.h:432
bool GetA4Output() const
int GetLineWidth() const
PlotTextMode GetTextMode() 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:49
virtual void SetTextMode(PlotTextMode mode)
Change the current text mode.
Definition: plotter.h:427
wxPoint Centre() const
Definition: eda_rect.h:60
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:550
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.
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:346
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
virtual void SetColorMode(bool _color_mode)
Definition: plotter.h:125
#define min(a, b)
Definition: auxiliary.h:85
int GetGerberPrecision() const
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 666 of file plot_board_layers.cpp.

References SHAPE_POLY_SET::CHole(), PLOTTER::Circle(), BOARD::ConvertBrdLayerToPolygonalContours(), SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), DIM, dyn_cast(), PCB_PLOT_PARAMS::GetDrillMarksType(), VIA::GetDrillValue(), VIA::GetPosition(), SHAPE_POLY_SET::HoleCount(), VIA::IsOnLayer(), BOARD::m_Modules, BOARD::m_Track, min, TRACK::Next(), MODULE::Next(), 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(), and BRDITEMS_PLOTTER::SetLayerSet().

668 {
669 
670  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
671  itemplotter.SetLayerSet( aLayerMask );
672 
673  SHAPE_POLY_SET outlines;
674 
675  for( LSEQ seq = aLayerMask.Seq( plot_seq, DIM( plot_seq ) ); seq; ++seq )
676  {
677  PCB_LAYER_ID layer = *seq;
678 
679  outlines.RemoveAllContours();
680  aBoard->ConvertBrdLayerToPolygonalContours( layer, outlines );
681 
682  outlines.Simplify( SHAPE_POLY_SET::PM_FAST );
683 
684  // Plot outlines
685  std::vector< wxPoint > cornerList;
686 
687  // Now we have one or more basic polygons: plot each polygon
688  for( int ii = 0; ii < outlines.OutlineCount(); ii++ )
689  {
690  for(int kk = 0; kk <= outlines.HoleCount (ii); kk++ )
691  {
692  cornerList.clear();
693  const SHAPE_LINE_CHAIN& path = (kk == 0) ? outlines.COutline( ii ) : outlines.CHole( ii, kk - 1 );
694 
695  for( int jj = 0; jj < path.PointCount(); jj++ )
696  cornerList.push_back( wxPoint( path.CPoint( jj ).x , path.CPoint( jj ).y ) );
697 
698 
699  // Ensure the polygon is closed
700  if( cornerList[0] != cornerList[cornerList.size() - 1] )
701  cornerList.push_back( cornerList[0] );
702 
703  aPlotter->PlotPoly( cornerList, NO_FILL );
704  }
705  }
706 
707  // Plot pad holes
709  {
710  int smallDrill = (aPlotOpt.GetDrillMarksType() == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE)
711  ? SMALL_DRILL : INT_MAX;
712 
713  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
714  {
715  for( D_PAD* pad = module->PadsList(); pad; pad = pad->Next() )
716  {
717  wxSize hole = pad->GetDrillSize();
718 
719  if( hole.x == 0 || hole.y == 0 )
720  continue;
721 
722  if( hole.x == hole.y )
723  {
724  hole.x = std::min( smallDrill, hole.x );
725  aPlotter->Circle( pad->GetPosition(), hole.x, NO_FILL );
726  }
727  else
728  {
729  // Note: small drill marks have no significance when applied to slots
730  wxPoint drl_start, drl_end;
731  int width;
732  pad->GetOblongDrillGeometry( drl_start, drl_end, width );
733  aPlotter->ThickSegment( pad->GetPosition() + drl_start,
734  pad->GetPosition() + drl_end, width, SKETCH, NULL );
735  }
736  }
737  }
738  }
739 
740  // Plot vias holes
741  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
742  {
743  const VIA* via = dyn_cast<const VIA*>( track );
744 
745  if( via && via->IsOnLayer( layer ) ) // via holes can be not through holes
746  {
747  aPlotter->Circle( via->GetPosition(), via->GetDrillValue(), NO_FILL );
748  }
749  }
750  }
751 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
#define SMALL_DRILL
Definition: pcbplot.h:73
int PointCount() const
Function PointCount()
static const PCB_LAYER_ID plot_seq[]
MODULE * Next() const
Definition: class_module.h:121
int HoleCount(int aOutline) const
Returns the number of holes in a given outline
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
int OutlineCount() const
Returns the number of outlines in the set
virtual void PlotPoly(const std::vector< wxPoint > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=NULL)=0
Function PlotPoly.
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:61
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:364
DrillMarksType GetDrillMarksType() const
PCB_LAYER_ID
A quick note on layer IDs:
Class SHAPE_POLY_SET.
D_PAD * Next() const
Definition: class_pad.h:160
void ConvertBrdLayerToPolygonalContours(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aOutlines)
Function ConvertBrdLayerToPolygonalContours Build a set of polygons which are the outlines of copper ...
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
void Simplify(POLYGON_MODE aFastMode)
Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFast...
const wxPoint GetPosition() const override
Definition: class_track.h:432
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
TRACK * Next() const
Definition: class_track.h:99
int GetDrillValue() const
Function GetDrillValue "calculates" the drill value for vias (m-Drill if > 0, or default drill value ...
DLIST< MODULE > m_Modules
Definition: class_board.h:247
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:457
void RemoveAllContours()
Removes all outlines & holes (clears) the polygon set.
DLIST< TRACK > m_Track
Definition: class_board.h:248
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Function IsOnLayer tests to see if this object is on the given layer.
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
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
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 154 of file plot_board_layers.cpp.

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_SVG_PRINT::CreateSVGFile(), DIALOG_PLOT::Plot(), PLOT_CONTROLLER::PlotLayer(), and BRDITEMS_PLOTTER::SetLayerSet().

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

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::GetPlotMode(), PCB_PLOT_PARAMS::GetPlotPadsOnSilkLayer(), BOARD::m_Modules, BOARD::m_SegZoneDeprecated, MODULE::Next(), D_PAD::Next(), SEGZONE::Next(), BRDITEMS_PLOTTER::Plot_Edges_Modules(), BRDITEMS_PLOTTER::PlotAllTextsModule(), BRDITEMS_PLOTTER::PlotBoardGraphicItems(), BRDITEMS_PLOTTER::PlotFilledAreas(), BRDITEMS_PLOTTER::PlotPad(), BRDITEMS_PLOTTER::SetLayerSet(), SKETCH, PLOTTER::StartBlock(), and PLOTTER::ThickSegment().

Referenced by PlotOneBoardLayer(), and BRDITEMS_PLOTTER::SetLayerSet().

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 
142  // Plot segments used to fill zone areas (deprecated, but here for very old boards
143  // compatibility):
144  for( SEGZONE* seg = aBoard->m_SegZoneDeprecated; seg; seg = seg->Next() )
145  {
146  if( !aLayerMask[ seg->GetLayer() ] )
147  continue;
148 
149  aPlotter->ThickSegment( seg->GetStart(), seg->GetEnd(), seg->GetWidth(),
150  itemplotter.GetPlotMode(), NULL );
151  }
152 }
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
virtual void EndBlock(void *aData)
calling this function allows to define the end of a group of drawing items for instance in SVG or Ger...
Definition: plotter.h:453
int color
Definition: DXF_plotter.cpp:62
MODULE * Next() const
Definition: class_module.h:121
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:175
virtual void StartBlock(void *aData)
calling this function allows to define the beginning of a group of drawing items, for instance in SVG...
Definition: plotter.h:444
SEGZONE * Next() const
Definition: class_track.h:366
Class LSET is a set of PCB_LAYER_IDs.
const COLORS_DESIGN_SETTINGS & Colors() const
Function GetColorSettings.
Definition: class_board.h:566
DLIST< SEGZONE > m_SegZoneDeprecated
Definition: class_board.h:249
D_PAD * Next() const
Definition: class_pad.h:160
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1015
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:92
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:986
DLIST< MODULE > m_Modules
Definition: class_board.h:247
virtual void ThickSegment(const wxPoint &start, const wxPoint &end, int width, EDA_DRAW_MODE_T tracemode, void *aData)
Definition: plotter.cpp:457
bool GetPlotPadsOnSilkLayer() const
COLOR4D GetLayerColor(LAYER_NUM aLayer) const
Function GetLayerColor.
Definition: colors.h:45
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
void PlotSolderMaskLayer ( BOARD aBoard,
PLOTTER aPlotter,
LSET  aLayerMask,
const PCB_PLOT_PARAMS aPlotOpt,
int  aMinThickness 
)
static

Definition at line 772 of file plot_board_layers.cpp.

References B_Cu, B_Mask, SHAPE_POLY_SET::BooleanAdd(), dyn_cast(), 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, TRACK::Next(), BOARD_ITEM::Next(), MODULE::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().

775 {
776  PCB_LAYER_ID layer = aLayerMask[B_Mask] ? B_Mask : F_Mask;
777  int inflate = aMinThickness/2;
778 
779  BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
780  itemplotter.SetLayerSet( aLayerMask );
781 
782  // Plot edge layer and graphic items
783  // They do not have a solder Mask margin, because they are only graphic items
784  // on this layer (like logos), not actually areas around pads.
785  itemplotter.PlotBoardGraphicItems();
786 
787  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
788  {
789  for( BOARD_ITEM* item = module->GraphicalItemsList(); item; item = item->Next() )
790  {
791  if( layer != item->GetLayer() )
792  continue;
793 
794  switch( item->Type() )
795  {
796  case PCB_MODULE_EDGE_T:
797  itemplotter.Plot_1_EdgeModule( (EDGE_MODULE*) item );
798  break;
799 
800  default:
801  break;
802  }
803  }
804  }
805 
806  // Build polygons for each pad shape.
807  // the size of the shape on solder mask should be:
808  // size of pad + clearance around the pad.
809  // clearance = solder mask clearance + extra margin
810  // extra margin is half the min width for solder mask
811  // This extra margin is used to merge too close shapes
812  // (distance < aMinThickness), and will be removed when creating
813  // the actual shapes
814  SHAPE_POLY_SET areas; // Contains shapes to plot
815  SHAPE_POLY_SET initialPolys; // Contains exact shapes to plot
816 
817  /* calculates the coeff to compensate radius reduction of holes clearance
818  * due to the segment approx ( 1 /cos( PI/circleToSegmentsCount )
819  */
820  int circleToSegmentsCount = 32;
821  double correction = GetCircletoPolyCorrectionFactor( circleToSegmentsCount );
822 
823  // Plot pads
824  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
825  {
826  // add shapes with exact size
827  module->TransformPadsShapesWithClearanceToPolygon( layer,
828  initialPolys, 0,
829  circleToSegmentsCount, correction );
830  // add shapes inflated by aMinThickness/2
831  module->TransformPadsShapesWithClearanceToPolygon( layer,
832  areas, inflate,
833  circleToSegmentsCount, correction );
834  }
835 
836  // Plot vias on solder masks, if aPlotOpt.GetPlotViaOnMaskLayer() is true,
837  if( aPlotOpt.GetPlotViaOnMaskLayer() )
838  {
839  // The current layer is a solder mask,
840  // use the global mask clearance for vias
841  int via_clearance = aBoard->GetDesignSettings().m_SolderMaskMargin;
842  int via_margin = via_clearance + inflate;
843 
844  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
845  {
846  const VIA* via = dyn_cast<const VIA*>( track );
847 
848  if( !via )
849  continue;
850 
851  // vias are plotted only if they are on the corresponding
852  // external copper layer
853  LSET via_set = via->GetLayerSet();
854 
855  if( via_set[B_Cu] )
856  via_set.set( B_Mask );
857 
858  if( via_set[F_Cu] )
859  via_set.set( F_Mask );
860 
861  if( !( via_set & aLayerMask ).any() )
862  continue;
863 
864  via->TransformShapeWithClearanceToPolygon( areas, via_margin,
865  circleToSegmentsCount,
866  correction );
867  via->TransformShapeWithClearanceToPolygon( initialPolys, via_clearance,
868  circleToSegmentsCount,
869  correction );
870  }
871  }
872 
873  // Add filled zone areas.
874 #if 0 // Set to 1 if a solder mask margin must be applied to zones on solder mask
875  int zone_margin = aBoard->GetDesignSettings().m_SolderMaskMargin;
876 #else
877  int zone_margin = 0;
878 #endif
879 
880  for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ )
881  {
882  ZONE_CONTAINER* zone = aBoard->GetArea( ii );
883 
884  if( zone->GetLayer() != layer )
885  continue;
886 
888  inflate+zone_margin, false );
890  zone_margin, false );
891  }
892 
893  // To avoid a lot of code, use a ZONE_CONTAINER
894  // to handle and plot polygons, because our polygons look exactly like
895  // filled areas in zones
896  // Note, also this code is not optimized: it creates a lot of copy/duplicate data
897  // However it is not complex, and fast enough for plot purposes (copy/convert data
898  // is only a very small calculation time for these calculations)
899  ZONE_CONTAINER zone( aBoard );
900  zone.SetArcSegmentCount( 32 );
901  zone.SetMinThickness( 0 ); // trace polygons only
902  zone.SetLayer ( layer );
903 
904  areas.BooleanAdd( initialPolys, SHAPE_POLY_SET::PM_FAST );
905  areas.Inflate( -inflate, circleToSegmentsCount );
906 
907  // Combine the current areas to initial areas. This is mandatory because
908  // inflate/deflate transform is not perfect, and we want the initial areas perfectly kept
909  areas.BooleanAdd( initialPolys, SHAPE_POLY_SET::PM_FAST );
911 
912  zone.SetFilledPolysList( areas );
913 
914  itemplotter.PlotFilledAreas( &zone );
915 }
void SetFilledPolysList(SHAPE_POLY_SET &aPolysList)
Function SetFilledPolysList sets the list of filled polygons.
Definition: class_zone.h:545
int m_SolderMaskMargin
Solder mask margin.
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
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...
MODULE * Next() const
Definition: class_module.h:121
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:175
void SetArcSegmentCount(int aArcSegCount)
Definition: class_zone.h:186
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:61
BOARD_ITEM * Next() const
PCB_LAYER_ID
A quick note on layer IDs:
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.
void TransformShapeWithClearanceToPolygon(SHAPE_POLY_SET &aCornerBuffer, int aClearanceValue, int aCircleToSegmentsCount, double aCorrectionFactor) const override
Function TransformShapeWithClearanceToPolygon Convert the track shape to a closed polygon Used in fil...
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Function SetLayer sets the layer this item is on.
Definition: class_zone.cpp:202
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:535
bool GetPlotViaOnMaskLayer() const
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1015
void Fracture(POLYGON_MODE aFastMode)
Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the oute...
void TransformOutlinesShapeWithClearanceToPolygon(SHAPE_POLY_SET &aCornerBuffer, int aMinClearanceValue, bool aUseNetClearance) const
Function TransformOutlinesShapeWithClearanceToPolygon Convert the outlines shape to a polygon with no...
TRACK * Next() const
Definition: class_track.h:99
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:986
DLIST< MODULE > m_Modules
Definition: class_board.h:247
DLIST< TRACK > m_Track
Definition: class_board.h:248
void SetMinThickness(int aMinThickness)
Definition: class_zone.h:199
double GetCircletoPolyCorrectionFactor(int aSegCountforCircle)
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 297 of file plot_board_layers.cpp.

References D_PAD::AddPrimitive(), LSET::AllCuMask(), B_Cu, B_Mask, B_Paste, BLACK, color, BOARD::Colors(), D_PAD::DeletePrimitivesList(), delta, dummy(), dyn_cast(), 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::Inflate(), LAYER_PAD_BK, LAYER_PAD_FR, LAYER_VIAS, LIGHTGRAY, BOARD::m_Modules, GBR_METADATA::m_NetlistMetadata, GBR_NETLIST_METADATA::m_NotInNet, BOARD::m_SegZoneDeprecated, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD::m_Track, D_PAD::MergePrimitivesAsPolygon(), TRACK::Next(), BOARD_ITEM::Next(), MODULE::Next(), D_PAD::Next(), SEGZONE::Next(), PCB_PLOT_PARAMS::NO_DRILL_SHAPE, PAD_ATTRIB_HOLE_NOT_PLATED, 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(), GBR_METADATA::SetApertureAttrib(), PLOTTER::SetColor(), BRDITEMS_PLOTTER::SetLayerSet(), GBR_METADATA::SetNetAttribType(), GBR_METADATA::SetNetName(), PLOTTER::StartBlock(), PLOTTER::ThickSegment(), WHITE, wxPoint::x, and wxPoint::y.

Referenced by PlotOneBoardLayer(), and BRDITEMS_PLOTTER::SetLayerSet().

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

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::GetUseGerberAttributes(), 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::UseX2Attributes(), and GERBER_PLOTTER::UseX2NetAttributes().

Referenced by DIALOG_SVG_PRINT::CreateSVGFile(), PLOT_CONTROLLER::OpenPlotfile(), DIALOG_PLOT::Plot(), and BRDITEMS_PLOTTER::SetLayerSet().

1048 {
1049  // Create the plotter driver and set the few plotter specific
1050  // options
1051  PLOTTER* plotter = NULL;
1052 
1053  switch( aPlotOpts->GetFormat() )
1054  {
1055  case PLOT_FORMAT_DXF:
1056  plotter = new DXF_PLOTTER();
1057  break;
1058 
1059  case PLOT_FORMAT_POST:
1060  PS_PLOTTER* PS_plotter;
1061  PS_plotter = new PS_PLOTTER();
1062  PS_plotter->SetScaleAdjust( aPlotOpts->GetFineScaleAdjustX(),
1063  aPlotOpts->GetFineScaleAdjustY() );
1064  plotter = PS_plotter;
1065  break;
1066 
1067  case PLOT_FORMAT_PDF:
1068  plotter = new PDF_PLOTTER();
1069  break;
1070 
1071  case PLOT_FORMAT_HPGL:
1072  HPGL_PLOTTER* HPGL_plotter;
1073  HPGL_plotter = new HPGL_PLOTTER();
1074 
1075  /* HPGL options are a little more convoluted to compute, so
1076  they're split in another function */
1077  ConfigureHPGLPenSizes( HPGL_plotter, aPlotOpts );
1078  plotter = HPGL_plotter;
1079  break;
1080 
1081  case PLOT_FORMAT_GERBER:
1082  plotter = new GERBER_PLOTTER();
1083  break;
1084 
1085  case PLOT_FORMAT_SVG:
1086  plotter = new SVG_PLOTTER();
1087  break;
1088 
1089  default:
1090  wxASSERT( false );
1091  return NULL;
1092  }
1093 
1094  // Compute the viewport and set the other options
1095 
1096  // page layout is not mirrored, so temporary change mirror option
1097  // just to plot the page layout
1098  PCB_PLOT_PARAMS plotOpts = *aPlotOpts;
1099 
1100  if( plotOpts.GetPlotFrameRef() && plotOpts.GetMirror() )
1101  plotOpts.SetMirror( false );
1102 
1103  initializePlotter( plotter, aBoard, &plotOpts );
1104 
1105  if( plotter->OpenFile( aFullFileName ) )
1106  {
1107  plotter->ClearHeaderLinesList();
1108 
1109  // For the Gerber "file function" attribute, set the layer number
1110  if( plotter->GetPlotterType() == PLOT_FORMAT_GERBER )
1111  {
1112  bool useX2mode = plotOpts.GetUseGerberAttributes();
1113 
1114  if( useX2mode )
1115  {
1116  AddGerberX2Attribute( plotter, aBoard, aLayer, false );
1117  GERBER_PLOTTER* gbrplotter = static_cast <GERBER_PLOTTER*> ( plotter );
1118  gbrplotter->UseX2Attributes( true );
1119  gbrplotter->UseX2NetAttributes( plotOpts.GetIncludeGerberNetlistInfo() );
1120  }
1121  else
1122  {
1123  AddGerberX2Attribute( plotter, aBoard, aLayer, true );
1124  }
1125  }
1126 
1127  plotter->StartPlot();
1128 
1129  // Plot the frame reference if requested
1130  if( aPlotOpts->GetPlotFrameRef() )
1131  {
1132  PlotWorkSheet( plotter, aBoard->GetTitleBlock(),
1133  aBoard->GetPageSettings(),
1134  1, 1, // Only one page
1135  aSheetDesc, aBoard->GetFileName() );
1136 
1137  if( aPlotOpts->GetMirror() )
1138  initializePlotter( plotter, aBoard, aPlotOpts );
1139  }
1140 
1141  /* When plotting a negative board: draw a black rectangle
1142  * (background for plot board in white) and switch the current
1143  * color to WHITE; note the color inversion is actually done
1144  * in the driver (if supported) */
1145  if( aPlotOpts->GetNegative() )
1146  {
1147  EDA_RECT bbox = aBoard->ComputeBoundingBox();
1148  FillNegativeKnockout( plotter, bbox );
1149  }
1150 
1151  return plotter;
1152  }
1153 
1154  delete plotter;
1155  return NULL;
1156 }
bool GetMirror() const
void UseX2NetAttributes(bool aEnable)
Definition: plotter.h:1137
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...
bool GetUseGerberAttributes() const
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
Definition: plotter.cpp:82
void SetScaleAdjust(double scaleX, double scaleY)
Set the &#39;fine&#39; scaling for the postscript engine.
Definition: plotter.h:683
void SetMirror(bool aFlag)
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:465
double GetFineScaleAdjustX() const
void PlotWorkSheet(PLOTTER *plotter, const TITLE_BLOCK &aTitleBlock, const PAGE_INFO &aPageInfo, int aSheetNumber, int aNumberOfSheets, const wxString &aSheetDesc, const wxString &aFilename)
bool GetIncludeGerberNetlistInfo() const
const wxString & GetFileName() const
Definition: class_board.h:236
static void ConfigureHPGLPenSizes(HPGL_PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts)
Calculate the effective size of HPGL pens and set them in the plotter object.
PlotFormat GetFormat() const
Class PCB_PLOT_PARAMS handles plot parameters and options when plotting/printing a board...
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:550
Base plotter engine class.
Definition: plotter.h:96
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:556
bool GetNegative() const
virtual PlotFormat GetPlotterType() const =0
Returns the effective plot engine in use.
bool GetPlotFrameRef() const
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:184
void UseX2Attributes(bool aEnable)
Definition: plotter.h:1136
double GetFineScaleAdjustY() const

Variable Documentation

const PCB_LAYER_ID plot_seq[]
static

Definition at line 606 of file plot_board_layers.cpp.

Referenced by PlotLayerOutlines().