67 wxCHECK( aBoard && aPlotter && aLayers.size(), );
69 for(
LSEQ seq = aLayers; seq; ++seq )
84 std::vector<wxString> properties;
86 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
87 _(
"Reference designator" ),
88 fp->Reference().GetShownText(
false ) ) );
90 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
92 fp->Value().GetShownText(
false ) ) );
94 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
96 fp->GetFPID().GetUniStringLibItemName() ) );
98 for(
int i = 0; i < fp->GetFieldCount(); i++ )
100 PCB_FIELD* field = fp->GetFields().at( i );
105 if( field->
GetText().IsEmpty() )
108 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
115 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
_(
"Library Description" ),
116 fp->GetLibDescription() ) );
118 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
120 fp->GetKeywords() ) );
124 aPlotter->
Bookmark( fp->GetBoundingBox(), fp->GetReference(),
_(
"Footprints" ) );
141 LSET layer_mask( aLayer );
170 if( soldermask_min_thickness == 0 )
180 soldermask_min_thickness );
293 bool onFrontFab = (
LSET(
F_Fab ) & aLayerMask ).any();
294 bool onBackFab = (
LSET(
B_Fab ) & aLayerMask ).any();
314 for(
PAD*
pad : footprint->Pads() )
318 if( !(
pad->GetLayerSet() & aLayerMask ).any() )
321 ( ( onFrontFab &&
pad->GetLayerSet().Contains(
F_Cu ) ) ||
322 ( onBackFab &&
pad->GetLayerSet().Contains(
B_Cu ) ) ) )
332 if( onCopperLayer && !
pad->IsOnCopperLayer() )
336 if( onCopperLayer && !
pad->FlashLayer( aLayerMask ) )
342 if( aLayerMask.count() == 1 )
348 if( (
pad->GetLayerSet() & aLayerMask )[
B_Cu] )
351 if( (
pad->GetLayerSet() & aLayerMask )[
F_Cu] )
354 if( sketchPads && aLayerMask[
F_Fab] )
356 else if( sketchPads && aLayerMask[
B_Fab] )
366 if( onSolderMaskLayer )
367 margin.
x = margin.
y =
pad->GetSolderMaskExpansion();
369 if( onSolderPasteLayer )
370 margin =
pad->GetSolderPasteMargin();
376 int mask_clearance = margin.
x;
385 double padCornerRadius =
pad->GetRoundRectCornerRadius();
390 && ( padPlotsSize.
x <= 0 || padPlotsSize.
y <= 0 ) )
395 switch(
pad->GetShape() )
399 pad->SetSize( padPlotsSize );
403 (
pad->GetSize() ==
pad->GetDrillSize() ) &&
413 pad->SetSize( padPlotsSize );
415 if( mask_clearance > 0 )
418 pad->SetRoundRectCornerRadius( mask_clearance );
430 if( mask_clearance == 0 )
441 int dx = padSize.
x / 2;
442 int dy = padSize.
y / 2;
443 int ddx = padDelta.
x / 2;
444 int ddy = padDelta.
y / 2;
446 outline.
Append( -dx - ddy, dy + ddx );
447 outline.
Append( dx + ddy, dy - ddx );
448 outline.
Append( dx - ddy, -dy + ddx );
449 outline.
Append( -dx + ddy, -dy - ddx );
456 dummy.DeletePrimitivesList();
457 dummy.AddPrimitivePoly( outline, 0,
true );
473 int initial_radius =
pad->GetRoundRectCornerRadius();
474 pad->SetSize( padPlotsSize );
475 pad->SetRoundRectCornerRadius( std::max( initial_radius + mask_clearance, 0 ) );
482 if( mask_clearance == 0 )
485 pad->SetSize( padPlotsSize );
509 dummy.DeletePrimitivesList();
510 dummy.AddPrimitivePoly( outline, 0,
true );
516 dummy.SetPosition(
pad->GetPosition() );
517 dummy.SetOrientation(
pad->GetOrientation() );
530 pad->MergePrimitivesAsPolygon( &shape );
537 dummy.DeletePrimitivesList();
538 dummy.AddPrimitivePoly( shape, 0,
true );
543 if( mask_clearance < 0 )
544 dummy.SetSize( padPlotsSize );
552 pad->SetSize( padSize );
553 pad->SetDelta( padDelta );
554 pad->SetShape( padShape );
555 pad->SetRoundRectCornerRadius( padCornerRadius );
568 if( isOnCopperLayer )
584 LSET via_mask_layer =
via->GetLayerSet();
586 if( !( via_mask_layer & aLayerMask ).any() )
590 double width_adj = 0;
593 via_margin =
via->GetSolderMaskExpansion();
598 int diameter =
via->GetWidth() + 2 * via_margin + width_adj;
601 if( onCopperLayer && !
via->FlashLayer( aLayerMask ) )
633 if( !aLayerMask[track->GetLayer()] )
640 gbr_metadata.
SetNetName( track->GetNetname() );
653 arc->
GetRadius(), width, plotMode, &gbr_metadata );
658 aPlotter->
ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode,
664 aPlotter->
ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode,
676 for(
const ZONE* zone : aBoard->
Zones() )
680 if( !aLayerMask[layer] )
688 if( zone->IsIsland( layer, i ) )
695 itemplotter.
PlotZone( zone, layer, mainArea );
700 dummy.SetNet( &nonet );
735 std::vector<VECTOR2I> cornerList;
740 for(
int kk = 0; kk <= outlines.
HoleCount(ii); kk++ )
744 : outlines.
CHole( ii, kk - 1 );
759 for(
PAD*
pad : footprint->Pads() )
763 std::shared_ptr<SHAPE_SEGMENT> slot =
pad->GetEffectiveHoleShape();
765 if( slot->GetSeg().A == slot->GetSeg().B )
767 int drill = std::min( smallDrill, slot->GetWidth() );
773 aPlotter->
ThickSegment( slot->GetSeg().A, slot->GetSeg().B,
774 slot->GetWidth(),
SKETCH,
nullptr );
789 if(
via->IsOnLayer( layer ) )
822 boardOutline = &buffer;
826 int inflate = aMinThickness / 2 - 1;
843 auto plotFPTextItem =
852 if( aText.GetText() == wxT(
"${REFERENCE}" ) && !itemplotter.
GetPlotReference() )
855 if( aText.GetText() == wxT(
"${VALUE}" ) && !itemplotter.
GetPlotValue() )
859 aText.TransformTextToPolySet( initialPolys, 0, maxError,
ERROR_OUTSIDE );
862 aText.TransformTextToPolySet( areas, inflate, maxError,
ERROR_OUTSIDE );
873 footprint->TransformPadsToPolySet( initialPolys, layer, 0, maxError,
ERROR_OUTSIDE );
875 footprint->TransformPadsToPolySet( areas, layer, inflate, maxError,
ERROR_OUTSIDE );
877 if( itemplotter.
GetPlotReference() && footprint->Reference().IsOnLayer( layer ) )
878 plotFPTextItem( footprint->Reference() );
880 if( itemplotter.
GetPlotValue() && footprint->Value().IsOnLayer( layer ) )
881 plotFPTextItem( footprint->Value() );
883 for(
const PCB_FIELD* field : footprint->Fields() )
885 if( field->IsOnLayer( layer ) )
886 plotFPTextItem(
static_cast<const PCB_TEXT&
>( *field ) );
889 for(
const BOARD_ITEM* item : footprint->GraphicalItems() )
891 if( item->IsOnLayer( layer ) )
895 plotFPTextItem(
static_cast<const PCB_TEXT&
>( *item ) );
900 item->TransformShapeToPolygon( initialPolys, layer, 0, maxError,
904 item->TransformShapeToPolygon( areas, layer, inflate, maxError,
920 if( !
via->IsOnLayer( layer ) )
923 int clearance =
via->GetSolderMaskExpansion();
926 via->TransformShapeToPolygon( initialPolys, layer, clearance, maxError,
ERROR_OUTSIDE );
929 clearance += inflate;
930 via->TransformShapeToPolygon( areas, layer, clearance, maxError,
ERROR_OUTSIDE );
942 if( item->IsOnLayer( layer ) )
957 item->TransformShapeToPolygon( initialPolys, layer, 0, maxError,
961 item->TransformShapeToPolygon( areas, layer, inflate, maxError,
969 if( !zone->IsOnLayer( layer ) )
973 zone->TransformSmoothedOutlineToPolygon( areas, inflate + zone_margin, maxError,
977 zone->TransformSmoothedOutlineToPolygon( initialPolys, zone_margin, maxError,
1001 itemplotter.
PlotZone( &zone, layer, areas );
1020 bool autocenter =
false;
1029 sheet_info = &pageA4;
1031 paperscale = (double) paperSizeIU.
x / pageSizeIU.
x;
1036 sheet_info = &pageInfo;
1037 paperSizeIU = pageSizeIU;
1041 autocenter = (aPlotOpts->
GetScale() != 1.0);
1048 double compound_scale;
1052 if( aPlotOpts->
GetAutoScale() && boardSize.
x > 0 && boardSize.
y > 0 )
1054 double xscale = (paperSizeIU.
x * 0.8) / boardSize.
x;
1055 double yscale = (paperSizeIU.
y * 0.8) / boardSize.
y;
1057 compound_scale = std::min( xscale, yscale ) * paperscale;
1061 compound_scale = aPlotOpts->
GetScale() * paperscale;
1070 offset.
x =
KiROUND( boardCenter.
x - ( paperSizeIU.
x / 2.0 ) / compound_scale );
1071 offset.
y =
KiROUND( boardCenter.
y - ( paperSizeIU.
y / 2.0 ) / compound_scale );
1104 BOX2I area = aBbbox;
1134 const wxString& aFullFileName,
const wxString& aSheetName,
1135 const wxString& aSheetPath )
1147 plotter = DXF_plotter;
1155 plotter = PS_plotter;
1168 plotter = HPGL_plotter;
1176 wxLogError( wxString::Format(
1177 "Invalid board layer %d, cannot build a valid Gerber file header",
1212 if( plotter->
OpenFile( aFullFileName ) )
constexpr EDA_IU_SCALE pcbIUScale
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
const VECTOR2I & GetAuxOrigin()
int m_SolderMaskExpansion
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
const PAGE_INFO & GetPageSettings() const
void ConvertBrdLayerToPolygonalContours(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aOutlines) const
Build a set of polygons which are the outlines of copper items (pads, tracks, vias,...
TITLE_BLOCK & GetTitleBlock()
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
FOOTPRINTS & Footprints()
const std::map< wxString, wxString > & GetProperties() const
const wxString & GetFileName() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
PROJECT * GetProject() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const Vec & GetOrigin() const
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
const Vec & GetSize() const
void PlotDrillMarks()
Draw a drill mark for pads and vias.
void PlotZone(const ZONE *aZone, PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
void PlotBoardGraphicItem(const BOARD_ITEM *item)
Plot items like text and graphics but not tracks and footprints.
void SetLayerSet(LSET aLayerMask)
void PlotPad(const PAD *aPad, const COLOR4D &aColor, OUTLINE_MODE aPlotMode)
Plot a pad.
COLOR4D getColor(int aLayer) const
White color is special because it cannot be seen on a white paper in B&W mode.
void PlotFootprintTextItems(const FOOTPRINT *aFootprint)
int getFineWidthAdj() const
void PlotFootprintGraphicItems(const FOOTPRINT *aFootprint)
COLOR4D GetColor(int aLayer) const
When creating polygons to create a clearance polygonal area, the polygon must be same or bigger than ...
void SetUnits(DXF_UNITS aUnit)
Set the units to use for plotting the DXF file.
virtual const wxString & GetText() const
Return the string associated with the text object.
void UseX2format(bool aEnable)
void UseX2NetAttributes(bool aEnable)
void DisableApertMacros(bool aDisable)
Disable Aperture Macro (AM) command, only for broken Gerber Readers.
virtual void SetPenSpeed(int speed)
virtual void SetPenNumber(int number)
virtual void SetPenDiameter(double diameter)
A color representation with 4 components: red, green, blue, alpha.
static const COLOR4D BLACK
PCB specific render settings.
void LoadColors(const COLOR_SETTINGS *aSettings) override
void SetDefaultPenWidth(int aWidth)
void SetLayerName(const wxString &aLayerName)
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
LSEQ SeqStackupBottom2Top() const
Return the sequence that is typical for a bottom-to-top stack-up.
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Handle the data for a net.
Describe the page size and margins of a paper page on which to eventually print or plot.
const VECTOR2I GetSizeIU(double aIUScale) const
Gets the page size in internal units.
bool IsDegenerated(int aThreshold=5) const
EDA_ANGLE GetArcAngleStart() const
EDA_ANGLE GetAngle() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Parameters and options when plotting/printing a board.
PLOT_FORMAT GetFormat() const
bool GetSkipPlotNPTH_Pads() const
void SetDrillMarksType(DRILL_MARKS aVal)
bool GetUseAuxOrigin() const
void SetSkipPlotNPTH_Pads(bool aSkip)
DXF_UNITS GetDXFPlotUnits() const
bool GetAutoScale() const
bool GetPlotInvisibleText() const
PLOT_TEXT_MODE GetTextMode() const
double GetHPGLPenDiameter() const
unsigned GetSvgPrecision() const
unsigned GetBlackAndWhite() const
bool GetDXFPlotPolygonMode() const
bool GetPlotReference() const
bool m_PDFFrontFPPropertyPopups
Generate PDF property popup menus for footprints.
void SetMirror(bool aFlag)
bool GetSketchPadsOnFabLayers() const
bool GetSubtractMaskFromSilk() const
int GetGerberPrecision() const
int GetHPGLPenSpeed() const
double GetFineScaleAdjustY() const
int GetHPGLPenNum() const
DRILL_MARKS GetDrillMarksType() const
bool GetUseGerberX2format() const
bool GetPlotValue() const
bool GetIncludeGerberNetlistInfo() const
double GetFineScaleAdjustX() const
bool m_PDFBackFPPropertyPopups
on front and/or back of board
bool GetPlotFPText() const
bool GetPlotFrameRef() const
bool GetDisableGerberMacros() const
OUTLINE_MODE GetPlotMode() const
COLOR_SETTINGS * ColorSettings() const
Base plotter engine class.
virtual void ThickSegment(const VECTOR2I &start, const VECTOR2I &end, int width, OUTLINE_MODE tracemode, void *aData)
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
virtual void SetNegative(bool aNegative)
virtual void SetSvgCoordinatesFormat(unsigned aPrecision)
Set the number of digits for mantissa in coordinates in mm for SVG plotter.
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
void SetRenderSettings(RENDER_SETTINGS *aSettings)
virtual bool StartPlot(const wxString &aPageNumber)=0
RENDER_SETTINGS * RenderSettings()
virtual void SetGerberCoordinatesFormat(int aResolution, bool aUseInches=false)
virtual void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString)
Create a bookmark to a symbol.
virtual PLOT_FORMAT GetPlotterType() const =0
Returns the effective plot engine in use.
virtual void SetTextMode(PLOT_TEXT_MODE mode)
Change the current text mode.
virtual void SetCreator(const wxString &aCreator)
void ClearHeaderLinesList()
Remove all lines from the list of free lines to print at the beginning of the file.
virtual void FlashPadCircle(const VECTOR2I &aPadPos, int aDiameter, OUTLINE_MODE aTraceMode, void *aData)=0
virtual void ThickArc(const EDA_SHAPE &aArcShape, OUTLINE_MODE aTraceMode, void *aData)
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror)=0
Set the plot offset and scaling for the current plot.
virtual void SetColorMode(bool aColorMode)
Plot in B/W or color.
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
virtual void PlotPoly(const std::vector< VECTOR2I > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr)=0
Draw a polygon ( filled or not ).
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
virtual void SetLayerPolarity(bool aPositive)
Set the current Gerber layer polarity to positive or negative by writing %LPD*% or %LPC*% to the Gerb...
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual void SetColor(const COLOR4D &color)=0
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...
void SetScaleAdjust(double scaleX, double scaleY)
Set the 'fine' scaling for the postscript engine.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
void InflateWithLinkedHoles(int aFactor, CORNER_STRATEGY aCornerStrategy, int aMaxError, POLYGON_MODE aFastMode)
Perform outline inflation/deflation, using round corners.
void Fracture(POLYGON_MODE aFastMode)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
@ CHAMFER_ALL_CORNERS
All angles are chamfered.
@ ROUND_ALL_CORNERS
All angles are rounded.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
void DeletePolygon(int aIdx)
Delete aIdx-th polygon from the set.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void BooleanAdd(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset union For aFastMode meaning, see function booleanOp.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify(POLYGON_MODE aFastMode)
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMo...
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
int OutlineCount() const
Return the number of outlines in the set.
SHAPE_POLY_SET CloneDropTriangulation() const
const POLYGON & CPolygon(int aIndex) const
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Handle a list of polygons defining a copper zone.
void SetMinThickness(int aMinThickness)
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void PlotDrawingSheet(PLOTTER *plotter, const PROJECT *aProject, const TITLE_BLOCK &aTitleBlock, const PAGE_INFO &aPageInfo, const std::map< wxString, wxString > *aProperties, const wxString &aSheetNumber, int aSheetCount, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aFilename, COLOR4D aColor, bool aIsFirstPage)
static constexpr EDA_ANGLE & ANGLE_0
a few functions useful in geometry calculations.
double m_SmallDrillMarkSize
The diameter of the drill marks on print and plot outputs (in mm), when the "Drill marks" option is s...
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
PCB_LAYER_ID
A quick note on layer IDs:
PCB_LAYER_ID ToLAYER_ID(int aLayer)
@ NPTH
like PAD_PTH, but not plated
PAD_SHAPE
The set of pad shapes, used with PAD::{Set,Get}Shape()
void AddGerberX2Attribute(PLOTTER *aPlotter, const BOARD *aBoard, int aLayer, bool aUseX1CompatibilityMode)
Calculate some X2 attributes as defined in the Gerber file format specification and add them to the g...
static void FillNegativeKnockout(PLOTTER *aPlotter, const BOX2I &aBbbox)
Prefill in black an area a little bigger than the board to prepare for the negative plot.
void PlotBoardLayers(BOARD *aBoard, PLOTTER *aPlotter, const LSEQ &aLayers, const PCB_PLOT_PARAMS &aPlotOptions)
Plot a sequence of board layer IDs.
void PlotStandardLayer(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
Plot a copper layer or mask.
static void PlotSolderMaskLayer(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt, int aMinThickness)
Plot a solder mask layer.
void PlotOneBoardLayer(BOARD *aBoard, PLOTTER *aPlotter, PCB_LAYER_ID aLayer, const PCB_PLOT_PARAMS &aPlotOpt)
Plot one copper or technical layer.
void PlotLayerOutlines(BOARD *aBoard, PLOTTER *aPlotter, LSET aLayerMask, const PCB_PLOT_PARAMS &aPlotOpt)
Plot outlines of copper layer.
static void ConfigureHPGLPenSizes(HPGL_PLOTTER *aPlotter, const PCB_PLOT_PARAMS *aPlotOpts)
Calculate the effective size of HPGL pens and set them in the plotter object.
PLOTTER * StartPlotBoard(BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aLayer, const wxString &aFullFileName, const wxString &aSheetName, const wxString &aSheetPath)
Open a new plotfile using the options (and especially the format) specified in the options and prepar...
static void initializePlotter(PLOTTER *aPlotter, const BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts)
Set up most plot options for plotting a board (especially the viewport) Important thing: page size is...
void PlotInteractiveLayer(BOARD *aBoard, PLOTTER *aPlotter, const PCB_PLOT_PARAMS &aPlotOpt)
Plot interactive items (hypertext links, properties, etc.).
Plotting engines similar to ps (PostScript, Gerber, svg)
std::vector< FAB_LAYER_COLOR > dummy
constexpr int mmToIU(double mm) const
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".