49    std::vector<PCB_TRACK*>* buffer;
 
   53        buffer = 
new std::vector<PCB_TRACK*>;
 
   58        buffer = (*item).second;
 
   61    buffer->push_back( aTrack );
 
 
   70        return via->GetWidth( aLayer );
 
   75        return std::min( 
pad->GetSize( aLayer ).x, 
pad->GetSize( aLayer ).y );
 
 
   95                    && 
pad->GetSize( aLayer ).x
 
   96                               == 
pad->GetSize( aLayer ).y );
 
 
  121        if( zone->IsTeardropArea() )
 
  125        if( !zone->IsOnLayer( aTrack->
GetLayer() ) )
 
  128        if( zone->GetNetCode() == aTrack->
GetNetCode() )
 
  135                    PAD *
pad = 
static_cast<PAD*
>( aPadOrVia );
 
 
  163                return trackItem != aTrackRef;
 
  168                PCB_TRACK* curr_track = static_cast<PCB_TRACK*>( trackItem );
 
  171                if( EDA_ITEM_FLAGS match = curr_track->IsPointOnEnds( aEndPoint, m_tolerance ) )
 
  178                        double previous_len = candidate->GetLength();
 
  179                        double curr_len = curr_track->GetLength();
 
  181                        if( previous_len >= curr_len )
 
  186                    candidate = curr_track;
 
 
  214                                                   std::vector<VECTOR2I>& aPoly,
 
  216                                                   int aTrackHalfWidth, 
const VECTOR2D& aTrackDir,
 
  218                                                   std::vector<VECTOR2I>& pts )
 const 
  220    int maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  240    double minVpercent = double( aTrackHalfWidth ) / 
radius;
 
  241    double weaken = (Vpercent - minVpercent) / ( 1 - minVpercent ) / 
radius;
 
  243    double biasBC = 0.5 * 
SEG( pts[1], pts[2] ).
Length();
 
  244    double biasAE = 0.5 * 
SEG( pts[4], pts[0] ).
Length();
 
  248                                pts[2].y + vecC.
x * biasBC * weaken );
 
  251                                pts[4].y - vecE.
x * biasAE * weaken );
 
  253    VECTOR2I tangentB = 
VECTOR2I( pts[1].x - aTrackDir.
x * biasBC, pts[1].y - aTrackDir.
y * biasBC );
 
  254    VECTOR2I tangentA = 
VECTOR2I( pts[0].x - aTrackDir.
x * biasAE, pts[0].y - aTrackDir.
y * biasAE );
 
  256    std::vector<VECTOR2I> curve_pts;
 
  260        aPoly.push_back( corner );
 
  262    aPoly.push_back( pts[3] );
 
  268        aPoly.push_back( corner );
 
 
  277                                                  std::vector<VECTOR2I>& aPoly, 
int aTdWidth,
 
  279                                                  std::vector<VECTOR2I>& aPts,
 
  280                                                  const VECTOR2I& aIntersection)
 const 
  282    int maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  290    VECTOR2I side1( aPts[2] - aPts[1] );  
 
  292    VECTOR2I side2( aPts[4] - aPts[0] );  
 
  294    VECTOR2I trackDir( aIntersection - ( aPts[0] + aPts[1] ) / 2 );
 
  296    std::vector<VECTOR2I> curve_pts;
 
  300    VECTOR2I ctrl2 = ( aPts[2] + aIntersection ) / 2;
 
  305        aPoly.push_back( corner );
 
  307    aPoly.push_back( aPts[3] );
 
  312    ctrl1 = ( aPts[4] + aIntersection ) / 2;
 
  318        aPoly.push_back( corner );
 
 
  324                                            std::vector<VECTOR2I>& aPts )
 const 
  326    int maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  357        wxCHECK_MSG( aItem->
Type() == 
PCB_PAD_T, 
false, wxT( 
"Expected non-round item to be PAD" ) );
 
  363        pad->TransformShapeToPolygon( c_buffer, aLayer, 0, maxError, 
ERROR_INSIDE );
 
  370        int halfsize = std::min( aParams.
m_TdMaxWidth, preferred_width )/2;
 
  375        VECTOR2I ref_on_track = ( aPts[0] + aPts[1] ) / 2;
 
  376        VECTOR2I teardrop_axis( aPts[3] - ref_on_track );
 
  388        clipping_rect.
Append( 0, - halfsize );
 
  389        clipping_rect.
Append( 0, halfsize );
 
  390        clipping_rect.
Append( len, halfsize );
 
  391        clipping_rect.
Append( len, - halfsize );
 
  393        clipping_rect.
Rotate( -orient );
 
  394        clipping_rect.
Move( ref_on_track );
 
  407    std::vector<VECTOR2I> points = padpoly.
CPoints();
 
  409    std::vector<VECTOR2I> initialPoints;
 
  410    initialPoints.push_back( aPts[0] );
 
  411    initialPoints.push_back( aPts[1] );
 
  414        initialPoints.emplace_back( pt.x, pt.y );
 
  416    std::vector<VECTOR2I> hull;
 
  423    int found_start = -1;      
 
  429    for( 
unsigned ii = 0, jj = 0; jj < hull.size(); ii++, jj++ )
 
  431        unsigned next = ii+ 1;
 
  433        if( 
next >= hull.size() )
 
  439            prev = hull.size()-1;
 
  441        if( hull[ii] == start )
 
  444            if( hull[
next] != pend )
 
  452        if( hull[ii] == pend )
 
  454            if( hull[
next] != start )
 
  463    if( found_start < 0 )   
 
  465        int ii = found_end-1;
 
  475        int ii = found_start-1;
 
  492    double area1 = dummy1.
Area();
 
  494    std::swap( aPts[2], aPts[4] );
 
  496    double area2 = dummy2.
Area();
 
  499        std::swap( aPts[2], aPts[4] );
 
 
  509                                                int* aEffectiveTeardropLen )
 const 
  516    int          maxError = 
m_board->GetDesignSettings().m_MaxError;
 
  522        targetLength = std::min( aParams.
m_TdMaxLen, targetLength );
 
  526    bool need_swap = 
false;     
 
  530    if( !aOther->
HitTest( start, 0 ) )
 
  532        std::swap( start, 
end );
 
  544        wxCHECK_MSG( aOther->
Type() == 
PCB_PAD_T, 
false, wxT( 
"Expected non-round item to be PAD" ) );
 
  545        static_cast<PAD*
>( aOther )->TransformShapeToPolygon( shapebuffer, aTrack->
GetLayer(), 0,
 
  565        pt_count = outline.
Intersect( poly, pts );
 
  577    aIntersection = pts[0].p;
 
  578    start = aIntersection;      
 
  582    actualTdLen = std::min( targetLength, 
SEG( start, 
end ).Length() );
 
  591        while( actualTdLen + consumed < targetLength )
 
  597            if( connected_track == 
nullptr )
 
  601            consumed += actualTdLen;
 
  603            actualTdLen = std::min( targetLength-consumed, 
int( connected_track->
GetLength() ) );
 
  604            aTrack = connected_track;
 
  606            start = connected_track->
GetStart();
 
  611                std::swap( start, 
end );
 
  645            for( 
int ii = poly.
PointCount()-1; ii >= 0 ; ii-- )
 
  647                int dist_from_start = ( poly.
CPoint( ii ) - start ).EuclideanNorm();
 
  651                if( dist_from_start < actualTdLen || ii == 0 )
 
  653                    start = poly.
CPoint( ii );
 
  662                    actualTdLen -= (start - ref_lenght_point).EuclideanNorm();
 
  665                    if( actualTdLen < 0 )   
 
  668                    actualTdLen = std::min( actualTdLen, (
end - start).EuclideanNorm() );
 
  683    *aEffectiveTeardropLen = actualTdLen;
 
 
  689                                               std::vector<VECTOR2I>& aCorners, 
PCB_TRACK* aTrack,
 
  713    int track_halfwidth = aTrack->
GetWidth() / 2;
 
  714    VECTOR2I pointB = start + 
VECTOR2I( vecT.
x * track_stub_len + vecT.
y * track_halfwidth,
 
  715                                        vecT.
y * track_stub_len - vecT.
x * track_halfwidth );
 
  716    VECTOR2I pointA = start + 
VECTOR2I( vecT.
x * track_stub_len - vecT.
y * track_halfwidth,
 
  717                                        vecT.
y * track_stub_len + vecT.
x * track_halfwidth );
 
  723    if( !
IsRound( aOther, layer ) )
 
  727        if( 
pad->HitTest( pointA, 0, layer ) )
 
  730        if( 
pad->HitTest( pointB, 0, layer ) )
 
  739    pointD += 
VECTOR2I( 
int( -vecT.
x*offset), 
int(-vecT.
y*offset) );
 
  742    std::vector<VECTOR2I> pts = { pointA, pointB, pointC, pointD, pointE };
 
  748        aCorners = std::move( pts );
 
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
Bezier curves to polygon converter.
 
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
 
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 VECTOR2I GetPosition() const
 
KICAD_T Type() const
Returns the type of object.
 
virtual bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
Test if aPosition is inside or on the boundary of this item.
 
const VECTOR2I & GetMid() const
 
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
 
const VECTOR2I & GetStart() const
 
const VECTOR2I & GetEnd() const
 
virtual int GetWidth() const
 
int Length() const
Return the length (this).
 
const SHAPE_LINE_CHAIN ConvertToPolyline(int aMaxError=DefaultAccuracyForPCB(), int *aActualError=nullptr) const
Construct a SHAPE_LINE_CHAIN of segments from a given arc.
 
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 Intersect(const SEG &aSeg, INTERSECTIONS &aIp) const
Find all intersection points between our line chain and the segment aSeg.
 
int PointCount() const
Return the number of points (vertices) in this line chain.
 
double Area(bool aAbsolute=true) const
Return the area of this chain.
 
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
 
std::vector< INTERSECTION > INTERSECTIONS
 
const std::vector< VECTOR2I > & CPoints() const
 
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.
 
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.
 
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
 
void Move(const VECTOR2I &aVector) override
 
static bool IsRound(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer)
 
bool computeAnchorPoints(const TEARDROP_PARAMETERS &aParams, PCB_LAYER_ID aLayer, BOARD_ITEM *aItem, const VECTOR2I &aPos, std::vector< VECTOR2I > &aPts) const
Compute the 2 points on pad/via of the teardrop shape.
 
static int GetWidth(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer)
 
bool computeTeardropPolygon(const TEARDROP_PARAMETERS &aParams, std::vector< VECTOR2I > &aCorners, PCB_TRACK *aTrack, BOARD_ITEM *aOther, const VECTOR2I &aOtherPos) const
Compute all teardrop points of the polygon shape.
 
void computeCurvedForRectShape(const TEARDROP_PARAMETERS &aParams, std::vector< VECTOR2I > &aPoly, int aTdWidth, int aTrackHalfWidth, std::vector< VECTOR2I > &aPts, const VECTOR2I &aIntersection) const
Compute the curve part points for teardrops connected to a rectangular/polygonal shape The Bezier cur...
 
void computeCurvedForRoundShape(const TEARDROP_PARAMETERS &aParams, std::vector< VECTOR2I > &aPoly, PCB_LAYER_ID aLayer, int aTrackHalfWidth, const VECTOR2D &aTrackDir, BOARD_ITEM *aOther, const VECTOR2I &aOtherPos, std::vector< VECTOR2I > &aPts) const
Compute the curve part points for teardrops connected to a round shape The Bezier curve control point...
 
PCB_TRACK * findTouchingTrack(EDA_ITEM_FLAGS &aMatchType, PCB_TRACK *aTrackRef, const VECTOR2I &aEndPoint) const
Find a track connected to the end of another track.
 
TRACK_BUFFER m_trackLookupList
 
bool areItemsInSameZone(BOARD_ITEM *aPadOrVia, PCB_TRACK *aTrack) const
 
friend class TEARDROP_PARAMETERS
 
bool findAnchorPointsOnTrack(const TEARDROP_PARAMETERS &aParams, VECTOR2I &aStartPoint, VECTOR2I &aEndPoint, VECTOR2I &aIntersection, PCB_TRACK *&aTrack, BOARD_ITEM *aOther, const VECTOR2I &aOtherPos, int *aEffectiveTeardropLen) const
 
double m_BestWidthRatio
The height of a teardrop as ratio between height and size of pad/via.
 
int m_TdMaxLen
max allowed length for teardrops in IU. <= 0 to disable
 
bool m_AllowUseTwoTracks
True to create teardrops using 2 track segments if the first in too small.
 
int m_TdMaxWidth
max allowed height for teardrops in IU. <= 0 to disable
 
double m_BestLengthRatio
The length of a teardrop as ratio between length and size of pad/via.
 
bool m_CurvedEdges
True if the teardrop should be curved.
 
int idxFromLayNet(int aLayer, int aNetcode) const
 
void AddTrack(PCB_TRACK *aTrack, int aLayer, int aNetcode)
Add a track in buffer, in space grouping tracks having the same netcode and the same layer.
 
std::map< int, std::vector< PCB_TRACK * > * > m_map_tracks
 
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
 
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
 
Handle a list of polygons defining a copper zone.
 
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
 
void BuildConvexHull(std::vector< VECTOR2I > &aResult, const std::vector< VECTOR2I > &aPoly)
Calculate the convex hull of a list of points in counter-clockwise order.
 
std::uint32_t EDA_ITEM_FLAGS
 
#define STARTPOINT
When a line is selected, these flags indicate which.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
static VECTOR2D NormalizeVector(const VECTOR2I &aVector)
 
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
 
@ 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_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D
 
@ NONE
Pads are not covered.