99    m_world = std::make_unique<NODE>( );
 
 
  109        m_world->SetRuleResolver( 
nullptr );
 
 
  129    wxCHECK( node, ret );
 
  131    if( aSlopRadius > 0 )
 
  145        for( 
const OBSTACLE& obstacle : obs )
 
  146            ret.
Add( obstacle.m_item, 
false );
 
 
  168    if( aStartItems.
Empty() )
 
  175        m_dragger = std::make_unique<COMPONENT_DRAGGER>( 
this );
 
  181        m_dragger = std::make_unique<MULTI_DRAGGER>( 
this );
 
  186        m_dragger = std::make_unique<DRAGGER>( 
this );
 
  200        if( aStartItems.
Size() == 1 )
 
  202        else if( aStartItems.
Size() > 1 )
 
  206    if( 
m_dragger->Start( aP, aStartItems ) )
 
 
  221    if( 
Settings().AllowDRCViolations() )
 
  234    wxString failureReason;
 
  239        if( item->BoardItem() && item->BoardItem()->GetLayer() == 
Edge_Cuts )
 
  242        if( !item->Layers().Overlaps( aLayer ) )
 
  245        if( item->IsRoutable() )
 
  247            failureReason = wxEmptyString;
 
  254            switch( parent->
Type() )
 
  261                    failureReason = 
_( 
"Cannot start routing from a non-plated hole." );
 
  267                ZONE* zone = 
static_cast<ZONE*
>( parent );
 
  274                    failureReason = wxString::Format( 
_( 
"Rule area '%s' disallows tracks." ),
 
  279                    failureReason = 
_( 
"Rule area disallows tracks." );
 
  287                failureReason = 
_( 
"Cannot start routing from a text item." );
 
  296    if( !failureReason.IsEmpty() )
 
  309        dummyStartSeg.
Append( startPoint );
 
  310        dummyStartSeg.
Append( startPoint, 
true );
 
  312        dummyStartLine.
SetShape( dummyStartSeg );
 
  314        dummyStartLine.
SetNet( aStartItem ? aStartItem->
Net() : 0 );
 
  325                ITEM_SET dummyStartSet( &dummyStartLine );
 
  330                for( 
ITEM* item : highlightedItems )
 
  342            SetFailureReason( 
_( 
"Cannot start a differential pair in the middle of nowhere." ) );
 
  358        LINE             dummyStartLineA;
 
  359        LINE             dummyStartLineB;
 
  367        dummyStartLineA.
SetShape( dummyStartSegA );
 
  372        dummyStartLineB.
SetShape( dummyStartSegB );
 
  391                dummyStartSet.
Add( dummyStartLineA );
 
  392                dummyStartSet.
Add( dummyStartLineB );
 
  395                for( 
ITEM* item : highlightedItems )
 
 
  418        m_placer = std::make_unique<LINE_PLACER>( 
this );
 
  422        m_placer = std::make_unique<DIFF_PAIR_PLACER>( 
this );
 
  426        m_placer = std::make_unique<MEANDER_PLACER>( 
this );
 
  430        m_placer = std::make_unique<DP_MEANDER_PLACER>( 
this );
 
  434        m_placer = std::make_unique<MEANDER_SKEW_PLACER>( 
this );
 
  446    if( 
m_placer->Start( aP, aStartItem ) )
 
 
  493                                      ITEM*& aOtherEndItem )
 
  501    if( placer == 
nullptr || placer->
Traces().
Size() == 0 )
 
  506    if( trace == 
nullptr )
 
  536    aOtherEndLayers = it->
Layers();
 
 
  550    if( placer == 
nullptr || placer->
Traces().
Size() == 0 )
 
  555    if( current == 
nullptr )
 
  561    ITEM*       otherEndItem = 
nullptr;
 
  574        Move( otherEnd, otherEndItem );
 
  576    } 
while( placer->
CurrentEnd() != moveResultPoint && triesLeft );
 
  581        bool forceFinish = 
false;
 
  582        bool allowViolations = 
false;
 
  584        return FixRoute( otherEnd, otherEndItem, forceFinish, allowViolations );
 
 
  595    if( placer == 
nullptr || placer->
Traces().
Size() == 0 )
 
  600    if( current == 
nullptr )
 
  607    ITEM*       otherEndItem = 
nullptr;
 
  616    int nextLayer = otherEndLayers.
Overlaps( currentLayer ) ? currentLayer : otherEndLayers.
Start();
 
  618    if( !
StartRouting( otherEnd, otherEndItem, nextLayer ) )
 
  622    Move( currentEnd, 
nullptr );
 
  624    *aNewStartItem = otherEndItem;
 
 
  647            [&]( 
ITEM* currentItem, 
ITEM* itemToMark )
 
  649                std::unique_ptr<ITEM> tmp( itemToMark->Clone() );
 
  652                bool removeOriginal = 
true;
 
  657                    tmp->SetLayer( currentItem->
Layer() );
 
  659                if( itemToMark->IsCompoundShapePrimitive() )
 
  663                    removeOriginal = 
false;
 
  669                    aRemoved.push_back( itemToMark );
 
  680            LINE* l = 
static_cast<LINE*
>( item );
 
  694        for( 
const OBSTACLE& obs : obstacles )
 
  697            if( draggedItems.
Contains( obs.m_item ) )
 
  700            obs.m_item->Mark( obs.m_item->Marker() | 
MK_VIOLATION );
 
  701            updateItem( item, obs.m_item );
 
  706            LINE* line = 
static_cast<LINE*
>( item );
 
 
  728    std::vector<const PNS::ITEM*> cacheCheckItems( added.begin(), added.end() );
 
  731    for( 
ITEM* item : added )
 
  737    for( 
ITEM* item : removed )
 
 
  756    bool ret = 
m_placer->Move( aP, aEndItem );
 
  764        const LINE* l = 
static_cast<const LINE*
>( item );
 
  777                int annularWidth = std::max( 0, 
via.Diameter( l->
Layer() ) - 
via.Drill() ) / 2;
 
  778                int excessHoleClearance = holeClearance - annularWidth;
 
 
  797                              std::vector<PNS::ITEM*>& aHeads )
 
  799    NODE *node = 
nullptr;
 
  804        node = 
m_placer->CurrentNode( 
true );
 
  821        aHeads.push_back( item->Clone() );
 
 
  836    for( 
ITEM* item : removed )
 
  838        bool is_changed = 
false;
 
  844            for( NODE::ITEM_VECTOR::iterator added_it = added.begin();
 
  845                    added_it != added.end(); ++added_it )
 
  847                if( ( *added_it )->Parent() && ( *added_it )->Parent() == item->Parent() )
 
  849                    changed.push_back( *added_it );
 
  850                    added.erase( added_it );
 
  857        if( !is_changed && !item->IsVirtual() )
 
  861    for( 
ITEM* item : added )
 
  863        if( !item->IsVirtual() )
 
  867    for( 
ITEM* item : changed )
 
  869        if( !item->IsVirtual() )
 
 
  888        rv = 
m_placer->FixRoute( aP, aEndItem, aForceFinish );
 
  893        rv = 
m_dragger->FixRoute( aForceCommit );
 
 
  936        std::vector<NET_HANDLE> nets;
 
 
  976        return m_placer->SetLayer( aLayer );
 
 
  986        bool toggle = !
m_placer->IsPlacingVia();
 
 
 1002    return std::vector<NET_HANDLE>();
 
 
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
@ ROUNDED_90
H/V with filleted corners.
 
@ MITERED_90
H/V only (90-degree corners)
 
@ ROUNDED_45
H/V/45 with filleted corners.
 
@ MITERED_45
H/V/45 with mitered corners (default)
 
KICAD_T Type() const
Returns the type of object.
 
static bool FindDpPrimitivePair(NODE *aWorld, const VECTOR2I &aP, ITEM *aItem, DP_PRIMITIVE_PAIR &aPair, wxString *aErrorMsg=nullptr)
 
Store starting/ending primitives (pads, vias or segments) for a differential pair.
 
const VECTOR2I & AnchorN() const
 
const VECTOR2I & AnchorP() const
 
virtual const ITEM_SET Traces()=0
Function Traces()
 
int Count(int aKindMask=-1) const
 
void Add(const LINE &aLine)
 
bool Contains(ITEM *aItem) const
 
std::vector< ITEM * > & Items()
 
const std::vector< ITEM * > & CItems() const
 
Base class for PNS router board items.
 
const PNS_LAYER_RANGE & Layers() const
 
virtual NET_HANDLE Net() const
 
void SetNet(NET_HANDLE aNet)
 
virtual int Layer() const
 
void SetLayer(int aLayer)
 
bool OfKind(int aKindMask) const
 
virtual VECTOR2I Anchor(int n) const
 
A 2D point on a given set of layers and belonging to a certain net, that links together a number of b...
 
Single track placement algorithm.
 
bool SplitAdjacentArcs(NODE *aNode, ITEM *aArc, const VECTOR2I &aP)
Snaps the point aP to arc aArc.
 
bool SplitAdjacentSegments(NODE *aNode, ITEM *aSeg, const VECTOR2I &aP)
Snaps the point aP to segment aSeg.
 
Represents a track on a PCB, connecting two non-trivial joints (that is, vias, pads,...
 
ITEM * GetBlockingObstacle() const
 
void SetShape(const SHAPE_LINE_CHAIN &aLine)
Return the shape of the line.
 
void SetWidth(int aWidth)
Return line width.
 
Keep the router "world" - i.e.
 
std::vector< ITEM * > ITEM_VECTOR
 
int GetClearance(const ITEM *aA, const ITEM *aB, bool aUseClearanceEpsilon=true) const
Return the pre-set worst case clearance between any pair of items.
 
void GetUpdatedItems(ITEM_VECTOR &aRemoved, ITEM_VECTOR &aAdded)
Return the list of items removed and added in this branch with respect to the root branch.
 
const JOINT * FindJoint(const VECTOR2I &aPos, int aLayer, NET_HANDLE aNet) const
Search for a joint at a given position, layer and belonging to given net.
 
std::set< OBSTACLE > OBSTACLES
 
int QueryColliding(const ITEM *aItem, OBSTACLES &aObstacles, const COLLISION_SEARCH_OPTIONS &aOpts=COLLISION_SEARCH_OPTIONS()) const
Find items colliding (closer than clearance) with the item aItem.
 
const ITEM_SET HitTest(const VECTOR2I &aPoint) const
Find all items that contain the point aPoint.
 
virtual NODE * CurrentNode(bool aLoopsRemoved=false) const =0
Function CurrentNode()
 
virtual const VECTOR2I & CurrentEnd() const =0
Function CurrentEnd()
 
virtual const ITEM_SET Traces()=0
Function Traces()
 
virtual const VECTOR2I & CurrentStart() const =0
Function CurrentStart()
 
virtual int CurrentLayer() const =0
Function CurrentLayer()
 
virtual const std::vector< NET_HANDLE > CurrentNets() const =0
Function CurrentNets()
 
void updateView(NODE *aNode, ITEM_SET &aCurrent, bool aDragging=false)
 
void SetMode(ROUTER_MODE aMode)
 
bool moveDragging(const VECTOR2I &aP, ITEM *aItem)
 
bool SwitchLayer(int layer)
 
void ClearViewDecorations()
 
std::vector< PNS::ITEM * > m_leaderSegments
 
PLACEMENT_ALGO * Placer()
 
std::vector< PNS::ITEM * > GetLastCommittedLeaderSegments()
 
void BreakSegmentOrArc(ITEM *aItem, const VECTOR2I &aP)
 
bool ContinueFromEnd(ITEM **aNewStartItem)
 
void UpdateSizes(const SIZES_SETTINGS &aSizes)
Applies stored settings.
 
void SetFailureReason(const wxString &aReason)
 
std::unique_ptr< DRAG_ALGO > m_dragger
 
const ITEM_SET QueryHoverItems(const VECTOR2I &aP, int aSlopRadius=0)
 
void SetInterface(ROUTER_IFACE *aIface)
 
void markViolations(NODE *aNode, ITEM_SET &aCurrent, NODE::ITEM_VECTOR &aRemoved)
 
std::unique_ptr< PLACEMENT_ALGO > m_placer
 
bool isStartingPointRoutable(const VECTOR2I &aWhere, ITEM *aItem, int aLayer)
 
bool IsPlacingVia() const
 
RULE_RESOLVER * GetRuleResolver() const
 
ROUTING_SETTINGS & Settings()
 
bool movePlacing(const VECTOR2I &aP, ITEM *aItem)
 
bool RoutingInProgress() const
 
static ROUTER * GetInstance()
 
std::optional< VECTOR2I > UndoLastSegment()
 
void SetOrthoMode(bool aEnable)
 
bool StartDragging(const VECTOR2I &aP, ITEM *aItem, int aDragMode=DM_ANY)
 
bool StartRouting(const VECTOR2I &aP, ITEM *aItem, int aLayer)
 
int GetCurrentLayer() const
 
void GetUpdatedItems(std::vector< PNS::ITEM * > &aRemoved, std::vector< PNS::ITEM * > &aAdded, std::vector< PNS::ITEM * > &aHeads)
 
bool FixRoute(const VECTOR2I &aP, ITEM *aItem, bool aForceFinish, bool aForceCommit)
 
std::unique_ptr< NODE > m_world
 
void ToggleViaPlacement()
 
ROUTING_SETTINGS * m_settings
 
const std::vector< NET_HANDLE > GetCurrentNets() const
 
bool GetNearestRatnestAnchor(VECTOR2I &aOtherEnd, PNS_LAYER_RANGE &aOtherEndLayers, ITEM *&aOtherEndItem)
 
bool Move(const VECTOR2I &aP, ITEM *aItem)
 
virtual void ClearCacheForItems(std::vector< const ITEM * > &aItems)
 
virtual void ClearTemporaryCaches()
 
virtual int Clearance(const ITEM *aA, const ITEM *aB, bool aUseClearanceEpsilon=true)=0
 
virtual void ClearCaches()
 
ITEM * NearestUnconnectedItem(const JOINT *aStart, int *aAnchor=nullptr, int aKindMask=ITEM::ANY_T)
 
bool NearestUnconnectedAnchorPoint(const LINE *aTrack, VECTOR2I &aPoint, PNS_LAYER_RANGE &aLayers, ITEM *&aItem)
 
Represent a contiguous set of PCB layers.
 
bool Overlaps(const PNS_LAYER_RANGE &aOther) const
 
static PNS_LAYER_RANGE All()
 
bool IsMultilayer() const
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
 
Handle a list of polygons defining a copper zone.
 
const wxString & GetZoneName() const
 
bool HasKeepoutParametersSet() const
Accessor to determine if any keepout parameters are set.
 
static bool empty(const wxTextEntryBase *aCtrl)
 
Push and Shove diff pair dimensions (gap) settings dialog.
 
static ROUTER * theRouter
 
@ PNS_MODE_ROUTE_DIFF_PAIR
 
@ PNS_MODE_TUNE_DIFF_PAIR
 
@ PNS_MODE_TUNE_DIFF_PAIR_SKEW
 
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
 
Hold an object colliding with another object, along with some useful data about the collision.
 
@ 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_PAD_T
class PAD, a pad in a footprint
 
VECTOR2< int32_t > VECTOR2I