84 if( padNumber.IsEmpty() )
99 position = primitive->GetCenter();
103 padsize.
x = abs( primitive->GetBotRight().x - primitive->GetTopLeft().x );
104 padsize.
y = abs( primitive->GetBotRight().y - primitive->GetTopLeft().y );
117 if( padsize.
x > limit && padsize.
y > limit )
128 if( padsize.
x < ( padsize.
y * 0.95 ) )
131 std::swap( padsize.
x, padsize.
y );
137 tsize = std::min( tsize, padsize.
y );
140 tsize = std::min( tsize,
pcbIUScale.mmToIU( 5.0 ) );
147 m_plotter->PlotText( position, aColor, padNumber, textAttrs );
167 if( plotOnCopperLayer )
178 const bool useUTF8 =
false;
179 const bool useQuoting =
false;
193 if( !plotOnExternalCopperLayer )
222 if( plotOnExternalCopperLayer )
228 if( plotOnExternalCopperLayer )
238 if( plotOnExternalCopperLayer )
251 if( plotOnExternalCopperLayer )
303 VECTOR2I( shape_pos.
x + ( size.
x / 2 ), shape_pos.
y + (size.
y / 2 ) ),
359 coord[0] =
VECTOR2I( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
360 coord[1] =
VECTOR2I( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
361 coord[2] =
VECTOR2I( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
362 coord[3] =
VECTOR2I( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
388 if( polygons->OutlineCount() )
391 polygons.get(), &metadata );
428 std::vector<PCB_TEXT*> texts;
433 if( field->IsReference() || field->IsValue() )
436 if( field->IsVisible() )
437 texts.push_back( field );
443 texts.push_back( textItem );
449 bool strikeout =
false;
460 if(
text->GetText() == wxT(
"${REFERENCE}" ) )
468 if(
text->GetText() == wxT(
"${VALUE}" ) )
481 switch( item->
Type() )
519 PlotText( cell, cell->GetLayer(), cell->IsKnockout(), cell->GetFontMetrics() );
567 for(
const std::shared_ptr<SHAPE>& shape : aDim->
GetShapes() )
569 switch( shape->Type() )
606 int dx1, dx2, dy1, dy2,
radius;
673 switch( item->Type() )
706 PlotText( cell, cell->GetLayer(), cell->IsKnockout(), cell->GetFontMetrics() );
737#define getMetadata() ( m_plotter->GetPlotterType() == PLOT_FORMAT::GERBER ? (void*) &gbr_metadata \
738 : m_plotter->GetPlotterType() == PLOT_FORMAT::DXF ? (void*) this \
745 int maxError =
m_board->GetDesignSettings().m_MaxError;
749 if( shownText.IsEmpty() )
799 textbox->TransformTextToPolySet( finalPoly, 0, maxError,
ERROR_INSIDE );
808 if( font->
IsOutline() && !
m_board->GetEmbeddedFiles()->GetAreFontsEmbedded() )
828 std::vector<VECTOR2I> positions;
829 wxArrayString strings_list;
831 positions.reserve( strings_list.Count() );
835 for(
unsigned ii = 0; ii < strings_list.Count(); ii++ )
837 wxString& txt = strings_list.Item( ii );
841 if( aStrikeout && strings_list.Count() == 1 )
842 strikeoutText(
static_cast<const PCB_TEXT*
>( aText ) );
849 strikeoutText(
static_cast<const PCB_TEXT*
>( aText ) );
889 for(
int idx = 0; idx < aPolysList.
OutlineCount(); ++idx )
919 int margin = thickness;
926 if( onSolderMaskLayer
931 thickness = std::max( margin, 0 );
936 isHatchedFill =
false;
957 isHatchedFill =
false;
965 else if( onCopperLayer )
999 int diameter = aShape->
GetRadius() * 2 + thickness;
1004 diameter = std::max( diameter, 0 );
1048 m_plotter->SetCurrentLineWidth( thickness, &gbr_metadata );
1109 for(
int ii = 0; ii < outline.
PointCount(); ++ii )
1143 for(
SHAPE* shape : shapes )
1149 m_plotter->ThickSegment( a, b, thickness, getMetadata() );
1153 for(
SHAPE* shape : shapes )
1159 for(
int ii = 0; ii < aShape->
GetHatching().OutlineCount(); ++ii )
1186 dummy.SetWidth( 0 );
1190 dummy.SetPolyShape( shape );
1226 m_plotter->ThickSegment( a, b, lineWidth, getMetadata() );
1235 const EDA_ANGLE& aOrientation,
int aSmallDrill )
1241 drillSize.
x = std::min( aSmallDrill, drillSize.
x );
1245 drillSize.
x = std::clamp( drillSize.
x, 1, aPadSize.
x - 1 );
1250 drillSize.
y = std::clamp( drillSize.
y, 1, aPadSize.
y - 1 );
1252 m_plotter->FlashPadOval( aDrillPos, drillSize, aOrientation,
nullptr );
1256 m_plotter->FlashPadCircle( aDrillPos, drillSize.
x,
nullptr );
1299 for(
PAD*
pad : footprint->Pads() )
1301 if(
pad->GetDrillSize().x == 0 )
1311 if( !
pad->IsOnLayer( layer ) )
1316 if( padSize.
x >
pad->GetDrillSizeX() || padSize.
y >
pad->GetDrillSizeY() )
constexpr EDA_IU_SCALE pcbIUScale
constexpr int ARC_LOW_DEF
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
wxString GetNetname() const
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc) const
Convert the item shape to a polyset.
virtual bool IsKnockout() const
FOOTPRINT * GetParentFootprint() const
const KIFONT::METRICS & GetFontMetrics() const
BOARD_ITEM_CONTAINER * GetParent() const
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr Vec Centre() const
constexpr coord_type GetLeft() const
constexpr coord_type GetRight() const
constexpr const SizeVec & GetSize() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() 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 PlotPadNumber(const PAD *aPad, const COLOR4D &aColor)
void PlotBoardGraphicItem(const BOARD_ITEM *item)
Plot items like text and graphics but not tracks and footprints.
void PlotPad(const PAD *aPad, PCB_LAYER_ID aLayer, const COLOR4D &aColor, bool aSketchMode)
Plot a pad.
void PlotDimension(const PCB_DIMENSION_BASE *aDim)
void PlotText(const EDA_TEXT *aText, PCB_LAYER_ID aLayer, bool aIsKnockout, const KIFONT::METRICS &aFontMetrics, bool aStrikeout=false)
void PlotShape(const PCB_SHAPE *aShape)
bool crossoutDNPItems(PCB_LAYER_ID aLayer)
void PlotBarCode(const PCB_BARCODE *aBarCode)
COLOR4D getColor(int aLayer) const
White color is special because it cannot be seen on a white paper in B&W mode.
void PlotPcbTarget(const PCB_TARGET *aMire)
void PlotTableBorders(const PCB_TABLE *aTable)
void PlotFootprintTextItems(const FOOTPRINT *aFootprint)
int getFineWidthAdj() const
void plotOneDrillMark(PAD_DRILL_SHAPE aDrillShape, const VECTOR2I &aDrillPos, const VECTOR2I &aDrillSize, const VECTOR2I &aPadSize, const EDA_ANGLE &aOrientation, int aSmallDrill)
Helper function to plot a single drill mark.
bool hideDNPItems(PCB_LAYER_ID aLayer)
void PlotFootprintGraphicItems(const FOOTPRINT *aFootprint)
static const COLOR4D WHITE
COLOR4D GetColor(int aLayer) const
KICAD_T Type() const
Returns the type of object.
EDA_ANGLE GetArcAngle() const
const VECTOR2I & GetBezierC2() const
const SHAPE_POLY_SET & GetHatching() const
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
SHAPE_POLY_SET & GetPolyShape()
bool IsHatchedFill() const
virtual void SetFilled(bool aFlag)
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetShape(SHAPE_T aShape)
std::vector< VECTOR2I > GetRectCorners() const
void SetEnd(const VECTOR2I &aEnd)
wxString SHAPE_T_asString() const
const VECTOR2I & GetBezierC1() const
int GetCornerRadius() const
bool IsPolyShapeValid() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const VECTOR2I & GetTextPos() const
bool IsMultilineAllowed() const
virtual bool IsVisible() const
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
virtual EDA_ANGLE GetDrawRotation() const
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
const TEXT_ATTRIBUTES & GetAttributes() const
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
void GetLinePositions(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPositions, int aLineCount) const
Populate aPositions with the position of each line of a multiline text, according to the vertical jus...
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
void FlashPadChamferRoundRect(const VECTOR2I &aShapePos, const VECTOR2I &aPadSize, int aCornerRadius, double aChamferRatio, int aChamferPositions, const EDA_ANGLE &aPadOrient, void *aData)
Flash a chamfered round rect pad.
void PlotPolyAsRegion(const SHAPE_LINE_CHAIN &aPoly, FILL_T aFill, int aWidth, GBR_METADATA *aGbrMetadata)
Similar to PlotPoly(), plot a filled polygon using Gerber region, therefore adding X2 attributes to t...
FONT is an abstract base class for both outline and stroke fonts.
virtual bool IsOutline() const
A color representation with 4 components: red, green, blue, alpha.
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs)
Draw polygons representing font glyphs.
LSET is a set of PCB_LAYER_IDs.
static const LSET & ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
PAD_PROP GetProperty() const
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
int GetRoundRectCornerRadius(PCB_LAYER_ID aLayer) const
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
PAD_ATTRIB GetAttribute() const
const wxString & GetPinFunction() const
const wxString & GetNumber() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE, bool ignoreLineWidth=false) const override
Convert the pad shape to a closed polygon.
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
int GetChamferPositions(PCB_LAYER_ID aLayer) const
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(PCB_LAYER_ID aLayer, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
wxString ShowPadShape(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
int GetLineThickness() const
const std::vector< std::shared_ptr< SHAPE > > & GetShapes() const
bool GetSketchDNPFPsOnFabLayers() const
PLOT_TEXT_MODE GetTextMode() const override
bool GetPlotReference() const
DXF_OUTLINE_MODE GetDXFPlotMode() const override
int GetSketchPadLineWidth() const
DRILL_MARKS GetDrillMarksType() const
bool GetPlotValue() const
bool GetPlotFPText() const
COLOR_SETTINGS * ColorSettings() const
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
bool HasSolderMask() const
int GetSolderMaskExpansion() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
STROKE_PARAMS GetStroke() const override
void SetStroke(const STROKE_PARAMS &aStroke) override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
void DrawBorders(const std::function< void(const VECTOR2I &aPt1, const VECTOR2I &aPt2, const STROKE_PARAMS &aStroke)> &aCallback) const
VECTOR2I GetPosition() const override
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
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)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
int OutlineCount() const
Return the number of outlines in the set.
SHAPE_POLY_SET CloneDropTriangulation() const
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
const SHAPE_LINE_CHAIN Outline() const
void SetRadius(int aRadius)
const SEG & GetSeg() const
An abstract shape on 2D plane.
Simple container to manage line stroke parameters.
LINE_STYLE GetLineStyle() const
static void Stroke(const SHAPE *aShape, LINE_STYLE aLineStyle, int aWidth, const KIGFX::RENDER_SETTINGS *aRenderSettings, const std::function< void(const VECTOR2I &a, const VECTOR2I &b)> &aStroker)
Handle a list of polygons defining a copper zone.
bool IsOnCopperLayer() const override
A type-safe container of any type.
constexpr any() noexcept
Default constructor, creates an empty object.
@ ROUND_ALL_CORNERS
All angles are rounded.
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_SHAPE
Fill with object color.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
#define UNIMPLEMENTED_FOR(type)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
@ CONN
Like smd, does not appear on the solder paste layer (default) Note: also has a special attribute in G...
@ FIDUCIAL_LOCAL
a fiducial (usually a smd) local to the parent footprint
@ FIDUCIAL_GLBL
a fiducial (usually a smd) for the full board
@ MECHANICAL
a pad used for mechanical support
@ PRESSFIT
a PTH with a hole diameter with tight tolerances for press fit pin
@ HEATSINK
a pad used as heat sink, usually in SMD footprints
@ NONE
no special fabrication property
@ TESTPOINT
a test point pad
@ CASTELLATED
a pad with a castellated through hole
@ BGA
Smd pad, used in BGA footprints.
BARCODE class definition.
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
int PrintableCharCount(const wxString &aString)
Return the number of printable (ie: non-formatting) chars.
LINE_STYLE
Dashed line types.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I