40 m_draggedSegmentIndex = 0;
43 m_freeAngleMode =
false;
61 if(
via->PushoutForce( node, lead, force,
ITEM::ANY_T, iterLimit ) )
63 via->SetPos(
via->Pos() + force );
73 int w2 = aSeg->
Width() / 2;
82 psnap = aSeg->
Seg().
A;
84 else if( distB <= w2 )
86 psnap = aSeg->
Seg().
B;
102 if( lnk.item->IsVirtual() && lnk.item->OfKind(
ITEM::VIA_T ))
104 return static_cast<VVIA*
>( lnk.item );
114 int w2 = aSeg->
Width() / 2;
127 if( distA < w2 || distB < w2 )
207 if( aPrimitives.
Empty() )
210 ITEM* startItem = aPrimitives[0];
231 startItem, (
int) startItem->
Kind() ) );
233 switch( startItem->
Kind() )
263 m_mode =
static_cast<int>( aMode );
327 if(
Settings().AllowDRCViolations() )
349 if(
const LINE* l = dyn_cast<const LINE*>( item ) )
352 LINE draggedLine( *l );
362 else if (
VIA *
via = dyn_cast<VIA*>( item ) )
389 bool viaPropOk =
false;
394 if (
VIA *
via = dyn_cast<VIA*>( item ) )
398 draggedVia->SetPos( aP );
403 vias.insert( draggedVia.get() );
409 viaTargetPos = draggedVia->Pos();
422 if(
const LINE* l = dyn_cast<const LINE*>( item ) )
425 LINE draggedLine( *l );
468 if(
Settings().SmoothDraggedSegments() )
485 if(
Settings().GetOptimizeEntireDraggedTrack() )
487 else if( !affectedArea )
488 affectedArea =
BOX2I( aP );
491 PNS_DBG(
Dbg(), AddShape, *affectedArea,
RED, 0, wxT(
"drag-affected-area" ) );
499 PNS_DBG(
Dbg(), AddShape, *optArea,
BLUE, 0, wxT(
"drag-opt-area" ) );
585 draggedWalk = dragged;
std::optional< BOX2I > OPT_BOX2I
const BOX2I & VisibleViewArea() const
void SetDebugDecorator(DEBUG_DECORATOR *aDecorator)
Assign a debug decorator allowing this algo to draw extra graphics for visual debugging.
void SetLogger(LOGGER *aLogger)
virtual LOGGER * Logger()
ROUTER * Router() const
Return current router settings.
ROUTING_SETTINGS & Settings() const
Return the logger object, allowing to dump geometry to a file.
DEBUG_DECORATOR * Dbg() const
ITEM_SET m_draggedItems
If true, moves the connection lines without maintaining 45 degrees corners.
PNS::DRAG_MODE Mode() const override
void optimizeAndUpdateDraggedLine(LINE &aDragged, const LINE &aOrig, const VECTOR2I &aP)
const ITEM_SET findViaFanoutByHandle(NODE *aNode, const VIA_HANDLE &handle)
bool startDragSegment(const VECTOR2D &aP, SEGMENT *aSeg)
VECTOR2D m_lastValidPoint
Contains the list of items that are currently modified by the dragger.
virtual bool Start(const VECTOR2I &aP, ITEM_SET &aPrimitives) override
Function Start()
NODE * CurrentNode() const override
Function CurrentNode()
bool dragViaMarkObstacles(const VIA_HANDLE &aHandle, NODE *aNode, const VECTOR2I &aP)
bool Drag(const VECTOR2I &aP) override
Function Drag()
bool startDragVia(VIA *aVia)
int m_draggedSegmentIndex
bool dragShove(const VECTOR2I &aP)
void SetMode(PNS::DRAG_MODE aDragMode) override
bool dragMarkObstacles(const VECTOR2I &aP)
std::unique_ptr< SHOVE > m_shove
bool dragWalkaround(const VECTOR2I &aP)
bool FixRoute() override
Function FixRoute()
const std::vector< int > CurrentNets() const override
Function CurrentNets()
VVIA * checkVirtualVia(const VECTOR2D &aP, SEGMENT *aSeg)
bool dragViaWalkaround(const VIA_HANDLE &aHandle, NODE *aNode, const VECTOR2I &aP)
const ITEM_SET Traces() override
Function Traces()
bool tryWalkaround(NODE *aNode, LINE &aOrig, LINE &aWalk)
bool startDragArc(const VECTOR2D &aP, ARC *aArc)
MOUSE_TRAIL_TRACER m_mouseTrailTracer
bool propagateViaForces(NODE *node, std::set< VIA * > &vias)
void Add(const LINE &aLine)
Base class for PNS router board items.
virtual void Unmark(int aMarker=-1) const
PnsKind Kind() const
Return the type (kind) of the item.
A 2D point on a given set of layers and belonging to a certain net, that links together a number of b...
const LINKED_ITEMS & LinkList() const
Represents a track on a PCB, connecting two non-trivial joints (that is, vias, pads,...
virtual void Unmark(int aMarker=-1) const override
const SHAPE_LINE_CHAIN & CLine() const
OPT_BOX2I ChangedArea(const LINE *aOther) const
void Reverse()
Clip the line to the nearest obstacle, traversing from the line's start vertex (0).
void DragCorner(const VECTOR2I &aP, int aIndex, bool aFreeAngle=false)
void SetSnapThreshhold(int aThreshhold)
void DragSegment(const VECTOR2I &aP, int aIndex, bool aFreeAngle=false)
int Width() const
Return true if the line is geometrically identical as line aOther.
virtual void ClearLinks()
Return the number of segments that were assembled together to form this line.
void AddTrailPoint(const VECTOR2I &aP)
VECTOR2I GetTrailLeadVector() const
Keep the router "world" - i.e.
NODE * Branch()
Create a lightweight copy (called branch) of self that tracks the changes (added/removed items) wrs t...
OPT_OBSTACLE CheckColliding(const ITEM *aItem, int aKindMask=ITEM::ANY_T)
Check if the item collides with anything else in the world, and if found, returns the obstacle.
bool Add(std::unique_ptr< SEGMENT > aSegment, bool aAllowRedundant=false)
Add an item to the current node.
JOINT * FindJoint(const VECTOR2I &aPos, int aLayer, int aNet)
Search for a joint at a given position, layer and belonging to given net.
void Remove(ARC *aArc)
Remove an item from this branch.
const LINE AssembleLine(LINKED_ITEM *aSeg, int *aOriginSegmentIndex=nullptr, bool aStopAtLockedJoints=false, bool aFollowLockedSegments=false)
Follow the joint map to assemble a line connecting two non-trivial joints starting from segment aSeg.
Perform various optimizations of the lines being routed, attempting to make the lines shorter and les...
void SetPreserveVertex(const VECTOR2I &aV)
void SetRestrictArea(const BOX2I &aArea, bool aStrict=true)
void SetEffortLevel(int aEffort)
static bool Optimize(LINE *aLine, int aEffortLevel, NODE *aWorld, const VECTOR2I &aV=VECTOR2I(0, 0))
@ LIMIT_CORNER_COUNT
Do not attempt to optimize if the resulting line's corner count is outside the predefined range.
@ MERGE_SEGMENTS
Reduce corner cost iteratively.
@ MERGE_COLINEAR
Merge co-linear segments.
int ViaForcePropIterationLimit() const
bool SmoothDraggedSegments() const
Enable/disable smoothing segments during dragging.
PNS_MODE Mode() const
Set the routing mode.
int Width() const override
const VIA_HANDLE MakeHandle() const
void SetIterationLimit(const int aIterLimit)
void SetSolidsOnly(bool aSolidsOnly)
WALKAROUND_STATUS Route(const LINE &aInitialPath, LINE &aWalkPath, bool aOptimize=true)
bool IsPtOnArc(size_t aPtIndex) const
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I NearestPoint(const VECTOR2I &aP, bool aAllowInternalShapePoints=true) const
Find a point on the line chain that is closest to point aP.
long long int Length() const
Return length of the line chain in Euclidean metric.
int Find(const VECTOR2I &aP, int aThreshold=0) const
Search for point aP.
Push and Shove diff pair dimensions (gap) settings dialog.
@ RM_MarkObstacles
Ignore collisions, mark obstacles.
@ RM_Walkaround
Only walk around.
std::unique_ptr< typename std::remove_const< T >::type > Clone(const T &aItem)
#define PNS_DBG(dbg, method,...)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
WALKAROUND_STATUS statusCcw
WALKAROUND_STATUS statusCw
double EuclideanNorm(const VECTOR2I &vector)