CDPoint CTinyCadDoc::GetStickyPoint( CDPoint q, BOOL pins, BOOL wires, BOOL &is_stuck, BOOL &is_junction ) { CDPoint r(0,0); bool first = true; double min_distance = 0; int items = 0; int range = GetOption().GetAutoSnapRange(); if (!GetOption().GetAutoSnap()) { is_stuck = FALSE; is_junction = FALSE; return q; } // Search for methods, and look at their pins drawingIterator it = GetDrawingBegin(); while (it != GetDrawingEnd()) { CDrawingObject *ObjPtr = *it; switch (ObjPtr->GetType()) { case xWire: #define theLine ((CDrawLine*)ObjPtr) if (wires) { CDPoint d; CLineUtils l( theLine->m_point_a, theLine->m_point_b ); double distance = l.DistanceFromPoint( q, d ); if (d == r) { items ++; } if (first || distance < min_distance) { if (r != d) { // have we split this wire? if (d != theLine->m_point_a && d != theLine->m_point_b) { items = 2; } else { items = 1; } } r = d; first = false; min_distance = distance; } } break; default: if (pins) { CDRect s( ObjPtr->m_point_a.x, ObjPtr->m_point_a.y, ObjPtr->m_point_b.x, ObjPtr->m_point_b.y ); s.NormalizeRect(); s.left -= range * 2; s.right += range * 2; s.bottom += range * 2; s.top -= range * 2; if (s.PtInRect(q)) { CActiveNode a; ObjPtr->GetActiveListFirst( a ); while (ObjPtr->GetActive(a)) { // This is a valid pin... CDPoint d = a.m_a; double dx = d.x - q.x; double dy = d.y - q.y; double distance = sqrt(dx*dx + dy*dy); if (r == d) { items ++; } if (first || distance < min_distance) { if (r != d) { items = 1; } r = d; first = false; min_distance = distance; } } } } break; } ++ it; } if (!first && min_distance < GetOption().GetAutoSnapRange()) { is_stuck = TRUE; is_junction = GetOption().GetAutoJunc() ? items > 1 : FALSE; return r; } else { is_junction = FALSE; is_stuck = FALSE; } return q; }