QList<RVector> RSnapTangential::snapEntity( QSharedPointer<REntity> entity, const RVector& point, const RBox& queryBox, RGraphicsView& view) { QList<RVector> ret; RDocumentInterface* di = view.getDocumentInterface(); if (di==NULL) { return ret; } QSharedPointer<RShape> shape = entity->getClosestShape(point, queryBox.getWidth()/2, true); if (shape.isNull()) { return ret; } QSharedPointer<RCircle> circle = shape.dynamicCast<RCircle>(); if (!circle.isNull()) { QList<RLine> lines = circle->getTangents(di->getLastPosition()); for (int i=0; i<lines.length(); i++) { ret.append(lines[i].getEndPoint()); } } QSharedPointer<RArc> arc = shape.dynamicCast<RArc>(); if (!arc.isNull()) { QList<RLine> lines = arc->getTangents(di->getLastPosition()); for (int i=0; i<lines.length(); i++) { ret.append(lines[i].getEndPoint()); } } QSharedPointer<REllipse> ellipse = shape.dynamicCast<REllipse>(); if (!ellipse.isNull()) { QList<RLine> lines = ellipse->getTangents(di->getLastPosition()); for (int i=0; i<lines.length(); i++) { ret.append(lines[i].getEndPoint()); } } return ret; }
QList<RVector> RSnapPerpendicular::snapEntity( QSharedPointer<REntity> entity, const RVector& point, const RBox& queryBox, RGraphicsView& view) { QList<RVector> ret; RDocumentInterface* di = view.getDocumentInterface(); if (di==NULL) { return ret; } QSharedPointer<RShape> shape = entity->getClosestShape(point, queryBox.getWidth()/2, true); if (shape.isNull()) { return ret; } ret.append(shape->getClosestPointOnShape(di->getLastPosition(), false)); return ret; }