113    if( aConstraint.
HasMin() )
 
  116    if( aConstraint.
HasMax() )
 
 
  142    if( aConstraint.
HasMin() )
 
  145    if( aConstraint.
HasMax() )
 
 
  171    if( aConstraint.
HasMin() )
 
  174    if( aConstraint.
HasMax() )
 
 
  193    double base_len = aBase.
Length();
 
  204    bool turning = 
false;
 
  205    bool started = 
false;
 
  216        double thr = (double) m.
spacing();
 
  219        double remaining = base_len - ( 
m_last - aBase.
A ).EuclideanNorm();
 
  221        auto flipInitialSide =
 
  226                    m_placer->UpdateSettings( settings );
 
  229        auto addSingleIfFits =
 
  241                    if( fail && !singleSided )
 
  256        if( remaining < 
Settings( ).m_step )
 
  259        if( !singleSided && remaining > 3.0 * thr )
 
  263                for( 
int i = 0; i < 2; i++ )
 
  265                    bool checkSide = ( i == 0 ) ? side : !side;
 
  269                        if( !started && checkSide != side )
 
  303        else if( !singleSided && started )
 
  313        else if( !turning && remaining > thr * 2.0 )
 
  322        remaining = base_len - ( 
m_last - aBase.
A ).EuclideanNorm( );
 
  324        if( remaining < 
Settings( ).m_step )
 
 
  382    int maxCr = std::min( maxCr1, maxCr2 );
 
  384    wxCHECK2_MSG( maxCr >= minCr, 
return maxCr,
 
  385                  wxString::Format( 
"cornerRadius %d < %d amp %d spc %d w %d off %d", maxCr, minCr,
 
  389    int optCr = 
static_cast<int>( 
static_cast<SEG::ecoord>( 
spacing() ) * rPercent / 200 );
 
  391    return std::clamp( optCr, minCr, maxCr );
 
 
  404        return std::max( sp, 
Settings().m_spacing );
 
 
  423    VECTOR2D endPoint = aP + dir_u + dir_v * ( aSide ? -1.0 : 1.0 );
 
  425    lc.
Append( ( 
int ) p.x, ( 
int ) p.y );
 
  428    switch( 
m_placer->MeanderSettings().m_cornerStyle )
 
  432        VECTOR2I arcEnd( (
int) endPoint.
x, (
int) endPoint.
y );
 
  452        lc.
Append( ( 
int ) p.x, ( 
int ) p.y );
 
  453        p = aP + dir_u + (dir_v + dir_cv) * ( aSide ? -1.0 : 1.0 );
 
  454        lc.
Append( ( 
int ) p.x, ( 
int ) p.y );
 
  457        lc.
Append( (
int) p.x, (
int) p.y );
 
 
  517    miter( aCorner, 
true );
 
  519    miter( aCorner, 
true );
 
 
  526                                                 int aBaselineOffset )
 
  529    int offset = aBaselineOffset;
 
  540    if( 2 * cr > amplitude + 
std::abs( offset ) )
 
  541        cr = ( amplitude + 
std::abs( offset ) ) / 2;
 
  546    if( cr - offset < 0 )
 
  551    int sCorner = cr - offset;
 
  552    int uCorner = cr + offset;
 
  553    int startSide = amplitude - 2 * cr + 
std::abs( offset );
 
  554    int turnSide = amplitude - cr;
 
  555    int top = spc - 2 * cr;
 
  559    start( &lc, aP + dir_v_b, aDir );
 
  565        lc.
Append( aP + dir_v_b + aDir );
 
  571            top = std::max( top, targetBaseLen - sCorner - uCorner * 2 + offset );
 
  573        miter( sCorner, 
false );
 
  574        uShape( startSide, uCorner, top );
 
  575        forward( std::min( sCorner, uCorner ) );
 
  583            top = std::max( top, targetBaseLen - cr - spc );
 
  585        start( &lc, aP - dir_u_b, aDir );
 
  587        forward( std::min( sCorner, uCorner ) );
 
  589        uShape( startSide, uCorner, top );
 
  590        miter( sCorner, 
false );
 
  592        if( targetBaseLen >= spc + cr )
 
  593            lc.
Append( aP + dir_v_b + aDir.
Resize( targetBaseLen ) );
 
  595            lc.
Append( aP + dir_v_b + aDir.
Resize( 2 * spc - cr ) );
 
  603            top = std::max( top, targetBaseLen - uCorner * 2 + offset * 2 );
 
  605        start( &lc, aP - dir_u_b, aDir );
 
  608        uShape( turnSide, uCorner, top );
 
  616            top = std::max( top, ( targetBaseLen - sCorner * 2 - uCorner * 2 ) / 2 );
 
  618        miter( sCorner, 
false );
 
  619        uShape( startSide, uCorner, top );
 
  620        miter( sCorner, 
false );
 
  631        SEG axis( aP, aP + aDir );
 
 
  645    for( 
int i = 
m_meanders.size() - 1; i >= 0; i-- )
 
  660        for( 
int j = n - 1; j >= 0; j-- )
 
 
  675    bool         checkMode = 
false;
 
  700        bool c1 = m1.
Fit( prim1, aSeg, aP, aSide );
 
  704            c2 = 
m2.Fit( prim2, aSeg, m1.
End(), !aSide );
 
  731    for( 
int ampl = maxAmpl; ampl >= minAmpl; ampl -= st.
m_step )
 
 
  897    return copy.CurrentLength();
 
 
constexpr EDA_IU_SCALE pcbIUScale
 
void AddMeander(MEANDER_SHAPE *aShape)
Add a new meander shape to the meandered line.
 
MEANDER_PLACER_BASE * m_placer
 
void AddCorner(const VECTOR2I &aA, const VECTOR2I &aB=VECTOR2I(0, 0))
Create a dummy meander shape representing a line corner.
 
void Clear()
Clear the line geometry, removing all corners and meanders.
 
std::vector< MEANDER_SHAPE * > m_meanders
 
void MeanderSegment(const SEG &aSeg, bool aSide, int aBaseIndex=0)
Fit maximum amplitude meanders on a given segment and adds to the current line.
 
void AddArc(const SHAPE_ARC &aArc1, const SHAPE_ARC &aArc2=SHAPE_ARC())
Create a dummy meander shape representing an arc corner.
 
void AddArcAndPt(const SHAPE_ARC &aArc1, const VECTOR2I &aPt2)
Create a dummy meander shape representing an arc corner.
 
bool CheckSelfIntersections(MEANDER_SHAPE *aShape, int aClearance)
Check if the given shape is intersecting with any other meander in the current line.
 
const MEANDER_SETTINGS & Settings() const
 
void AddPtAndArc(const VECTOR2I &aPt1, const SHAPE_ARC &aArc2)
Create a dummy meander shape representing an arc corner.
 
Dimensions for the meandering algorithm.
 
int m_minAmplitude
Maximum meandering amplitude.
 
void SetTargetLength(long long int aOpt)
 
bool m_isTimeDomain
The net class this meander pattern belongs to.
 
static const long long int LENGTH_UNCONSTRAINED
 
int m_cornerRadiusPercentage
Place meanders on one side.
 
MEANDER_SIDE m_initialSide
Allowable tuning error.
 
bool m_singleSided
Initial side when placing meanders at segment.
 
void SetTargetLengthDelay(long long int aOpt)
 
static const int SKEW_UNCONSTRAINED
 
static const long long int DEFAULT_DELAY_TOLERANCE
 
MINOPTMAX< long long int > m_targetLength
Desired propagation delay of the tuned line.
 
void SetTargetSkew(int aOpt)
 
static const long long int DEFAULT_LENGTH_TOLERANCE
 
int m_lengthTolerance
Keep vertices between pre, tuned and post parts of the line.
 
int m_step
Length PadToDie.
 
MINOPTMAX< int > m_targetSkew
Target skew value for diff pair de-skewing.
 
MEANDER_STYLE m_cornerStyle
Rounding percentage (0 - 100).
 
bool m_keepEndpoints
Calculate tuning in the time domain.
 
MINOPTMAX< int > m_targetSkewDelay
 
int m_maxAmplitude
Meandering period/spacing (see dialog picture for explanation).
 
bool m_overrideCustomRules
Type of corners for the meandered line.
 
MINOPTMAX< long long int > m_targetLengthDelay
Target skew value for diff pair de-skewing.
 
void SetTargetSkewDelay(int aOpt)
 
static const long long int DELAY_UNCONSTRAINED
 
int m_lenPadToDie
Desired length of the tuned line/diff pair (this is in nm, so allow more than board width).
 
int m_spacing
Amplitude/spacing adjustment step.
 
The geometry of a single meander.
 
MEANDER_TYPE m_type
The placer that placed this meander.
 
MEANDER_PLACER_BASE * m_placer
Dual or single line.
 
SEG m_baseSeg
Base segment (clipped).
 
MEANDER_SHAPE(MEANDER_PLACER_BASE *aPlacer, int aWidth, bool aIsDual=false)
 
SEG m_clippedBaseSeg
Side (true = right).
 
void SetType(MEANDER_TYPE aType)
Set the type of the meander.
 
int m_targetBaseLen
First point of the meandered line.
 
SHAPE_LINE_CHAIN genMeanderShape(const VECTOR2D &aP, const VECTOR2D &aDir, bool aSide, MEANDER_TYPE aType, int aBaselineOffset=0)
Recalculate the clipped baseline after the parameters of the meander have been changed.
 
void start(SHAPE_LINE_CHAIN *aTarget, const VECTOR2D &aWhere, const VECTOR2D &aDir)
Move turtle forward by aLength.
 
void SetBaseIndex(int aIndex)
Set an auxiliary index of the segment being meandered in its original LINE.
 
int m_baselineOffset
Average radius of meander corners (for correction of DP meanders).
 
VECTOR2D m_currentDir
The current turtle position.
 
int m_width
Amplitude of the meander.
 
VECTOR2D m_currentPos
The line the turtle is drawing on.
 
SHAPE_LINE_CHAIN m_shapes[2]
Index of the meandered segment in the base line.
 
long long int CurrentLength() const
 
bool m_side
The actual shapes (0 used for single, both for dual).
 
void updateBaseSegment()
Return sanitized corner radius value.
 
SHAPE_LINE_CHAIN makeMiterShape(const VECTOR2D &aP, const VECTOR2D &aDir, bool aSide)
Produce a meander shape of given type.
 
void MakeArc(const SHAPE_ARC &aArc1, const SHAPE_ARC &aArc2=SHAPE_ARC())
Create a dummy meander shape representing an arc corner.
 
int m_baseIndex
The current turtle direction.
 
SHAPE_LINE_CHAIN * m_currentTarget
 
bool m_dual
Width of the line.
 
void Recalculate()
Recalculate the line chain representing the meander's shape.
 
void miter(int aRadius, bool aSide)
Tell the turtle to draw an U-like shape.
 
long long int MinTunableLength() const
 
void Resize(int aAmpl)
Change the amplitude of the meander shape to aAmpl and recalculates the resulting line chain.
 
int m_meanCornerRadius
Minimum length of the base segment to target when resizing.
 
int spacing() const
The type of meander.
 
int m_amplitude
Offset wrs the base segment (dual only).
 
int cornerRadius() const
Return sanitized spacing value.
 
void turn(const EDA_ANGLE &aAngle)
Tell the turtle to draw a mitered corner of given radius and turn direction.
 
void SetBaselineOffset(int aOffset)
Set the parallel offset between the base segment and the meandered line.
 
void forward(int aLength)
Turn the turtle by aAngle.
 
MEANDER_TYPE Type() const
 
VECTOR2I m_p0
Base segment (unclipped).
 
const MEANDER_SETTINGS & Settings() const
 
void MakeEmpty()
Replace the meander with straight bypass line(s), effectively clearing it.
 
bool Fit(MEANDER_TYPE aType, const SEG &aSeg, const VECTOR2I &aP, bool aSide)
Attempt to fit a meander of a given type onto a segment, avoiding collisions with other board feature...
 
void uShape(int aSides, int aCorner, int aTop)
Generate a 90-degree circular arc.
 
const SHAPE_LINE_CHAIN & CLine(int aShape) const
 
int BaselineLength() const
 
const SEG & BaseSegment() const
Return the base segment the meander was fitted to.
 
void MakeCorner(const VECTOR2I &aP1, const VECTOR2I &aP2=VECTOR2I(0, 0))
Create a dummy meander shape representing a line corner.
 
VECTOR2I::extended_type ecoord
 
int Length() const
Return the length (this).
 
bool ApproxParallel(const SEG &aSeg, int aDistanceThreshold=1) const
 
bool Contains(const SEG &aSeg) const
 
SHAPE_ARC & ConstructFromStartEndAngle(const VECTOR2I &aStart, const VECTOR2I &aEnd, const EDA_ANGLE &aAngle, double aWidth=0)
Construct this arc from the given start, end and angle.
 
const VECTOR2I & GetP1() const
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if point aP lies closer to us than aClearance.
 
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
 
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
 
int SegmentCount() const
Return the number of segments in this line chain.
 
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
 
void Mirror(const VECTOR2I &aRef, FLIP_DIRECTION aFlipDirection)
Mirror the line points about y or x (or both).
 
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.
 
long long int Length() const
Return length of the line chain in Euclidean metric.
 
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
 
constexpr VECTOR2< T > Perpendicular() const
Compute the perpendicular vector.
 
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
 
static constexpr EDA_ANGLE ANGLE_90
 
Push and Shove diff pair dimensions (gap) settings dialog.
 
MEANDER_TYPE
Shapes of available meanders.
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
constexpr double correction
 
const double IU_PER_PS
Internal time units are attoseconds.
 
constexpr int mmToIU(double mm) const
 
MATRIX3x3D m2(VECTOR3I{ 6, 6, 6 }, { 1, 1, 1 }, { 3, 3, 3 })
Test suite for KiCad math code.
 
SHAPE_ARC arc2(c.m_arc2.GenerateArc())
 
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.
 
double DEG2RAD(double deg)
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D