以下是我如何构造弧线(为了清楚起见,我使用了动态输入):解释:使用PER垂直对象捕捉构造垂直于ARC的XLINE。
绘制一个以 XLINE 和 ARC 之间的交点为中心的圆,圆周穿过 XLINE 和 LINE 之间的交点。
复制 CIRCLE,使中心位于 XLINE 和 LINE 之间的交点处。
构造 ARC 的起点位于复制的 CIRCLE 和 LINE 的交点处,终点位于 XLINE 和 ARC 的交点处,方向位于 XLINE 和 LINE 之间的交点处。当然还有替代方法(在AutoCAD中有很多方法可以剥猫皮);例如,可以使用 ARC 的中心构造初始 XLINE,以避免使用 PER 垂直对象捕捉。此外,您可以构造两个垂直于 LINE 和初始 XLINE 的附加 XLINE,然后使用这些 XLINE 的交集作为结果弧的中心,如下图所示:也可以使用 AutoLISP 构造弧:
- (defun c:myarc ( / a c i l p u v x z )
- (while
- (and
- (setq p (getpoint "\nSpecify point on Arc: "))
- (or
- (null (setq a (car (nentselp p))))
- (/= "ARC" (cdr (assoc 0 (entget a))))
- )
- )
- (princ "\nPoint does not lie on an Arc.")
- )
- (if p
- (progn
- (while
- (progn (setvar 'errno 0) (setq l (car (entsel "\nSelect Line: ")))
- (cond
- ( (= 7 (getvar 'errno))
- (princ "\nMissed, try again.")
- )
- ( (= 'ename (type l))
- (if (/= "LINE" (cdr (assoc 0 (entget l))))
- (princ "\nSelected object is not a Line.")
- )
- )
- )
- )
- )
- (if l
- (progn
- (setq l (entget l)
- u (cdr (assoc 10 l))
- v (cdr (assoc 11 l))
- p (vlax-curve-getclosestpointto a (trans p 1 0))
- )
- (if (< (distance p u) (distance p v))
- (setq x u u v v x)
- )
- (if (and
- (setq i (inters u v p (cdr (assoc 10 (entget a))) nil))
- (setq x (polar i (angle i u) (distance p i)))
- (setq c
- (inters
- x (polar x (+ (angle u v) (/ pi 2.0)) 1.0)
- p (polar p (+ (angle p i) (/ pi 2.0)) 1.0)
- nil
- )
- )
- )
- (progn
- (if (LM:Clockwise-p p i x)
- (setq z p p x x z)
- )
- (entmake
- (list
- '(0 . "ARC")
- (cons 10 c)
- (cons 40 (distance c p))
- (cons 50 (angle c p))
- (cons 51 (angle c x))
- )
- )
- )
- (princ "\nLine is parallel with perpendicular from Arc.")
- )
- )
- )
- )
- )
- (princ)
- )
- ;; Clockwise-p - Lee Mac
- ;; Returns T if p1,p2,p3 are clockwise oriented
- (defun LM:Clockwise-p ( p1 p2 p3 )
- (<
- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1)))
- (* (- (cadr p2) (cadr p1)) (- (car p3) (car p1)))
- )
- )
- (vl-load-com) (princ)
请注意,此弧不是唯一的,因为原始 XLINE 可以垂直于弧上的任何位置。我希望这很清楚!。
|