51                                      const VECTOR2I& aCenter, uint64_t aWidth,
 
 
   85    int stroke_width = aShape.
GetWidth();
 
  131        int soldermask_min_thickness = 0;
 
  136            soldermask_min_thickness = stroke_width;
 
  138        int            maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  141        if( soldermask_min_thickness == 0 )
 
  156            poly_set.
Deflate( soldermask_min_thickness / 2 - 1,
 
  170                if( stroke_width != 0 )
 
  172                    for( 
int jj = 0; jj < poly_set.
COutline( ii ).SegmentCount(); ++jj )
 
  184                for( 
int jj = 0; jj < poly_set.
COutline( ii ).SegmentCount(); ++jj )
 
  207        for( 
size_t i = 0; i < points.size() - 1; i++ )
 
  218        wxLogError( wxT( 
"Unknown shape when adding ODB++ layer feature" ) );
 
  224        for( 
int ii = 0; ii < aShape.
GetHatching().OutlineCount(); ++ii )
 
 
  248    int maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  258    int mask_clearance = expansion.
x;
 
  280        if( mask_clearance > 0 )
 
  312        int shorterSide = std::min( plotSize.
x, plotSize.
y );
 
  366    default: wxLogError( wxT( 
"Unknown pad type" ) ); 
break;
 
 
  379            wxLogError( wxT( 
"Failed to get subnet track data" ) );
 
  383        auto subnet = iter->second;
 
  388            shape.
SetStart( track->GetStart() );
 
  389            shape.
SetEnd( track->GetEnd() );
 
  390            shape.
SetWidth( track->GetWidth() );
 
  393            subnet->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::COPPER, 
m_layerName,
 
  405            subnet->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::COPPER, 
m_layerName,
 
  428                subnet->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::HOLE, 
m_layerName,
 
  439                            ODB_ATTR::GEOMETRY{ 
"VIA_RoundD" + std::to_string( via->GetWidth( aLayer ) ) } );
 
  446                subnet->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::COPPER, 
m_layerName,
 
  454                            ODB_ATTR::GEOMETRY{ 
"VIA_RoundD" + std::to_string( via->GetWidth( aLayer ) ) } );
 
  472                wxLogError( wxT( 
"Failed to get subnet plane data" ) );
 
  476            iter->second->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::COPPER, 
m_layerName,
 
  489            text_item = 
static_cast<EDA_TEXT*
>( tmp_text );
 
  491            text_item = 
static_cast<EDA_TEXT*
>( tmp_text );
 
  496        auto plot_text = [&]( 
const VECTOR2I& aPos, 
const wxString& aTextString,
 
  505            if( penWidth == 0 && attributes.
m_Bold ) 
 
  510                penWidth = -penWidth;
 
  514            std::list<VECTOR2I> pts;
 
  516            auto push_pts = [&]()
 
  528                    shape.
SetEnd( pts.back() );
 
  533                                         ODB_ATTR::STRING{ aTextString.ToStdString() } );
 
  537                    for( 
auto it = pts.begin(); std::next( it ) != pts.end(); ++it )
 
  539                        auto      it2 = std::next( it );
 
  549                                                 ODB_ATTR::STRING{ aTextString.ToStdString() } );
 
  564                            if( aPt1 == pts.back() )
 
  565                                pts.push_back( aPt2 );
 
  566                            else if( aPt2 == pts.front() )
 
  567                                pts.push_front( aPt1 );
 
  568                            else if( aPt1 == pts.front() )
 
  569                                pts.push_front( aPt2 );
 
  570                            else if( aPt2 == pts.back() )
 
  571                                pts.push_back( aPt1 );
 
  575                                pts.push_back( aPt1 );
 
  576                                pts.push_back( aPt2 );
 
  581                            pts.push_back( aPt1 );
 
  582                            pts.push_back( aPt2 );
 
  588                        if( aPoly.PointCount() < 3 )
 
  601                                                    ODB_ATTR::STRING{ aTextString.ToStdString() } );
 
  606            aFont->Draw( &callback_gal, aTextString, aPos, aAttributes, aFontMetrics );
 
  612        bool isKnockout = 
false;
 
  615            isKnockout = 
static_cast<PCB_TEXT*
>( item )->IsKnockout();
 
  617            isKnockout = 
static_cast<PCB_TEXTBOX*
>( item )->IsKnockout();
 
  623        if( shownText.IsEmpty() )
 
  638            text->TransformTextToPolySet( finalpolyset, 0, 
m_board->GetDesignSettings().m_MaxError,
 
  642            for( 
int ii = 0; ii < finalpolyset.
OutlineCount(); ++ii )
 
  649                                         ODB_ATTR::STRING{ shownText.ToStdString() } );
 
  655            std::vector<VECTOR2I> positions;
 
  656            wxArrayString         strings_list;
 
  658            positions.reserve( strings_list.Count() );
 
  662            for( 
unsigned ii = 0; ii < strings_list.Count(); ii++ )
 
  664                wxString& txt = strings_list.Item( ii );
 
  665                plot_text( positions[ii], txt, attrs, font, fontMetrics );
 
  670            plot_text( pos, shownText, attrs, font, fontMetrics );
 
  681    auto add_pad = [&]( 
PAD* 
pad )
 
  687            wxLogError( wxT( 
"Failed to get subnet top data" ) );
 
  697            iter->second->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::COPPER, 
m_layerName,
 
  714                if( 
pad->GetDrillSizeX() == 
pad->GetDrillSizeY() )
 
  728                    iter->second->AddFeatureID( EDA_DATA::FEATURE_ID::TYPE::HOLE, 
m_layerName,
 
  747        switch( item->Type() )
 
  752            add_track( 
static_cast<PCB_TRACK*
>( item ) );
 
  760            add_pad( 
static_cast<PAD*
>( item ) );
 
  764            add_shape( 
static_cast<PCB_SHAPE*
>( item ) );
 
  775            if( 
static_cast<PCB_TEXTBOX*
>( item )->IsBorderEnabled() )
 
 
  828    ost << 
"#\n#Num Features\n#" << std::endl;
 
  834    ost << 
"#\n#Layer features\n#" << std::endl;
 
  838        feat->WriteFeatures( ost );
 
 
  846    ost << 
"#\n#Num Features\n#" << std::endl;
 
  852    ost << 
"#\n#Feature symbol names\n#" << std::endl;
 
  856        ost << 
"$" << n << 
" " << 
name << std::endl;
 
  861    ost << 
"#\n#Layer features\n#" << std::endl;
 
  865        feat->WriteFeatures( ost );
 
 
  930    if( !aPolygon.empty() && aPolygon[0].PointCount() >= 3 )
 
  932        m_surfaces = std::make_unique<ODB_SURFACE_DATA>( aPolygon );
 
  933        if( aFillType != FILL_T::NO_FILL )
 
  935            m_surfaces->AddPolygonHoles( aPolygon );
 
 
  957    const std::vector<VECTOR2I>& pts = aPolygon[0].CPoints();
 
  966        m_polygons.at( 0 ).emplace_back( pts.back() );
 
  968        for( 
size_t jj = 0; jj < pts.size(); ++jj )
 
  970            m_polygons.at( 0 ).emplace_back( pts.at( jj ) );
 
 
  978    for( 
size_t ii = 1; ii < aPolygon.size(); ++ii )
 
  980        wxCHECK2( aPolygon[ii].PointCount() >= 3, 
continue );
 
  982        const std::vector<VECTOR2I>& hole = aPolygon[ii].CPoints();
 
  994        m_polygons.at( ii ).emplace_back( hole.back() );
 
  996        for( 
size_t jj = 0; jj < hole.size(); ++jj )
 
 
 1010        if( contour.empty() )
 
 1013        ost << 
"OB " << 
ODB::AddXY( contour.back().m_end ).first << 
" " 
 1014            << 
ODB::AddXY( contour.back().m_end ).second << 
" ";
 
 1022        for( 
const auto& line : contour )
 
 1025                ost << 
"OS " << 
ODB::AddXY( line.m_end ).first << 
" " 
 1026                    << 
ODB::AddXY( line.m_end ).second << std::endl;
 
 1028                ost << 
"OC " << 
ODB::AddXY( line.m_end ).first << 
" " 
 1030                    << 
" " << 
ODB::AddXY( line.m_center ).second << 
" " 
 1033        ost << 
"OE" << std::endl;
 
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
void WriteAttributes(std::ostream &ost, const std::string &prefix="") const
 
void AddSystemAttribute(Tr &r, Ta v)
 
void WriteAttributes(std::ostream &ost) const
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
FOOTPRINT * GetParentFootprint() const
 
const SHAPE_POLY_SET & GetHatching() const
 
int GetRectangleWidth() const
 
SHAPE_POLY_SET & GetPolyShape()
 
bool IsHatchedFill() const
 
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.
 
const std::vector< VECTOR2I > & GetBezierPoints() const
 
void SetEnd(const VECTOR2I &aEnd)
 
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
 
int GetRectangleHeight() const
 
bool IsClockwiseArc() const
 
void SetWidth(int aWidth)
 
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
 
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 AddPadShape(const PAD &aPad, PCB_LAYER_ID aLayer)
 
uint32_t AddRoundRectDonutSymbol(const wxString &aOuterWidth, const wxString &aOuterHeight, const wxString &aLineWidth, const wxString &aRadius)
 
void AddShape(const PCB_SHAPE &aShape, PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
 
uint32_t AddRectSymbol(const wxString &aWidth, const wxString &aHeight)
 
void AddVia(const PCB_VIA *aVia, PCB_LAYER_ID aLayer)
 
PCB_IO_ODBPP * GetODBPlugin()
 
void InitFeatureList(PCB_LAYER_ID aLayer, std::vector< BOARD_ITEM * > &aItems)
 
void AddFeatureLine(const VECTOR2I &aStart, const VECTOR2I &aEnd, uint64_t aWidth)
 
void AddFeatureArc(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, uint64_t aWidth, ODB_DIRECTION aDirection)
 
std::map< uint32_t, wxString > m_allSymMap
 
void GenerateFeatureFile(std::ostream &ost) const
 
void AddViaDrillHole(const PCB_VIA *aVia, PCB_LAYER_ID aLayer)
 
void AddPadCircle(const VECTOR2I &aCenter, uint64_t aDiameter, const EDA_ANGLE &aAngle, bool aMirror, double aResize=1.0)
 
void AddFeatureSurface(const SHAPE_POLY_SET::POLYGON &aPolygon, FILL_T aFillType=FILL_T::FILLED_SHAPE)
 
uint32_t AddRoundRectSymbol(const wxString &aWidth, const wxString &aHeight, const wxString &aRadius)
 
uint32_t AddOvalSymbol(const wxString &aWidth, const wxString &aHeight)
 
void GenerateProfileFeatures(std::ostream &ost) const
 
std::list< std::unique_ptr< ODB_FEATURE > > m_featuresList
 
void AddFeature(Args &&... args)
 
uint32_t AddCircleSymbol(const wxString &aDiameter)
 
uint32_t AddChamferRectSymbol(const wxString &aWidth, const wxString &aHeight, const wxString &aRadius, int aPositions)
 
uint32_t AddRoundDonutSymbol(const wxString &aOuterDim, const wxString &aInnerDim)
 
bool AddContour(const SHAPE_POLY_SET &aPolySet, int aOutline=0, FILL_T aFillType=FILL_T::FILLED_SHAPE)
 
FONT is an abstract base class for both outline and stroke fonts.
 
LSET is a set of PCB_LAYER_IDs.
 
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
 
std::pair< wxString, wxString > m_end
 
std::pair< wxString, wxString > m_start
 
virtual void WriteRecordContent(std::ostream &ost) override
 
ODB_DIRECTION m_direction
 
std::pair< wxString, wxString > m_center
 
virtual void WriteRecordContent(std::ostream &ost)=0
 
virtual void WriteFeatures(std::ostream &ost)
 
virtual FEATURE_TYPE GetFeatureType()=0
 
ODB_FEATURE(uint32_t aIndex)
 
virtual void WriteRecordContent(std::ostream &ost) override
 
std::pair< wxString, wxString > m_start
 
std::pair< wxString, wxString > m_end
 
virtual void WriteRecordContent(std::ostream &ost) override
 
std::pair< wxString, wxString > m_center
 
void WriteData(std::ostream &ost) const
 
std::vector< std::vector< SURFACE_LINE > > m_polygons
 
ODB_SURFACE_DATA(const SHAPE_POLY_SET::POLYGON &aPolygon)
 
void AddPolygonHoles(const SHAPE_POLY_SET::POLYGON &aPolygon)
 
std::unique_ptr< ODB_SURFACE_DATA > m_surfaces
 
virtual void WriteRecordContent(std::ostream &ost) override
 
ODB_SURFACE(uint32_t aIndex, const SHAPE_POLY_SET::POLYGON &aPolygon, FILL_T aFillType=FILL_T::FILLED_SHAPE)
 
@ NORMAL
Shape is the same on all layers.
 
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
 
void MergePrimitivesAsPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
 
int GetRoundRectCornerRadius(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.
 
int GetSolderMaskExpansion(PCB_LAYER_ID aLayer) const
 
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
 
int GetChamferPositions(PCB_LAYER_ID aLayer) const
 
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
 
VECTOR2I GetSolderPasteMargin(PCB_LAYER_ID aLayer) const
Usually < 0 (mask shape smaller than pad)because the margin can be dependent on the pad size,...
 
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
 
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
 
const VECTOR2I & GetMid() const
 
std::map< std::pair< PCB_LAYER_ID, ZONE * >, EDA_DATA::SUB_NET_PLANE * > & GetPlaneSubnetMap()
 
std::map< PCB_TRACK *, EDA_DATA::SUB_NET * > & GetViaTraceSubnetMap()
 
std::map< const PAD *, EDA_DATA::SUB_NET_TOEPRINT * > & GetPadSubnetMap()
 
static std::string m_unitsStr
 
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
 
int GetWidth() const override
 
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
 
const VECTOR2I & GetStart() const
 
const VECTOR2I & GetEnd() const
 
virtual int GetWidth() const
 
bool FlashLayer(int aLayer) const
Check to see whether the via should have a pad on the specific layer.
 
const PADSTACK & Padstack() const
 
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment 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.
 
void BooleanAdd(const SHAPE_POLY_SET &b)
Perform boolean polyset union.
 
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
 
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
 
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
 
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
 
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
 
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
 
int OutlineCount() const
Return the number of outlines in the set.
 
void InflateWithLinkedHoles(int aFactor, CORNER_STRATEGY aCornerStrategy, int aMaxError)
Perform outline inflation/deflation, using round corners.
 
void Move(const VECTOR2I &aVector) override
 
SHAPE_POLY_SET CloneDropTriangulation() const
 
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
 
Handle a list of polygons defining a copper zone.
 
@ CHAMFER_ALL_CORNERS
All angles are chamfered.
 
@ ROUND_ALL_CORNERS
All angles are rounded.
 
static constexpr EDA_ANGLE ANGLE_0
 
static constexpr EDA_ANGLE ANGLE_360
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
@ FILLED_SHAPE
Fill with object color.
 
int GetPenSizeForBold(int aTextSize)
 
PCB_LAYER_ID
A quick note on layer IDs:
 
std::pair< wxString, wxString > AddXY(const VECTOR2I &aVec)
 
wxString Double2String(double aVal)
 
wxString SymDouble2String(double aVal)
 
VECTOR2I GetShapePosition(const PCB_SHAPE &aShape)
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
@ PTH
Plated through hole pad.
 
std::vector< FAB_LAYER_COLOR > dummy
 
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
 
@ 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_ZONE_T
class ZONE, a copper pour area
 
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
 
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
 
@ 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_PAD_T
class PAD, a pad in a footprint
 
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
 
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
 
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
 
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
 
VECTOR2< int32_t > VECTOR2I