Thanks Alexander's Classic
My old dyn arrow-leader code can be simplified
(defun c:test (/ dyn_leader_call_back *error* p1 p2 p3 p p_base)
;;dyndraw arrow leader , e.g.
;;by GSLS(SS)
(defun dyn_leader_call_back (p)
(cond ((= (type p) 'STR)
(redraw)
)
((= (type p) 'LIST)
(if (> (distance p p_base) 1e-6)
(progn
(redraw)
(if (<= (distance p1 p) (distance p p3))
(ss:grvecs:leader (list p1 p2 p3 450. 150.) nil)
(ss:grvecs:leader (list p3 p2 p1 450. 150.) nil)
)
(setq p_base p)
)
)
)
)
p
)
(setq _cm (getvar "cmdecho")
_ps (getvar "PICKSTYLE")
_oe *error*
)
(defun *error* (msg)
(if (or (= msg "Function cancelled")
(= msg "quit / exit abort")
)
(princ msg)
(princ (strcat "\n错误: " msg))
)
(vla-EndUndoMark
(vla-get-ActiveDocument (vlax-get-acad-object))
)
(setvar "cmdecho" _cm)
(setvar "PICKSTYLE" _ps)
(vl-acad-undefun "dyn_leader_call_back")
(setq *error* _oe)
(princ)
)
(setvar "cmdecho" 0)
(setvar "PICKSTYLE" 0)
(vl-acad-defun "dyn_leader_call_back")
(setq p1 (getpoint "\nSelect First Point of Lead Arrow :"))
(setq p2 (getpoint p1 ">>Sencond Point :"))
(grdraw p1 p2 3 3)
(setq p3 (getpoint p2 ">>Third Point :"))
(grdraw p2 p3 3 3)
(setq p p3
p_base p
)
(if (and dyndraw (>= (distance p1 p2) 500.) (>= (distance p2 p3) 500.) p p_base (/= (type p) 'STR))
(progn
(setq p
(dyndraw
;; Name of callback - finction
"dyn_leader_call_back"
;; Prompt string
"\nSelect Direction of the Arrow |^|"
;; Keyword string
""
;; Input flag
8
;; Cursor type
-1
;; Base point (in UCS)
p
)
)
(redraw)
(if (= (type p) 'LIST)
(progn
(vla-startundomark
(vla-get-activedocument (vlax-get-acad-object))
)
(if (<= (distance p1 p) (distance p p3))
(command "_pline" p1 "w" 0 150 (polar p1 (angle p1 p2) 450.) "w" 0 0 p2 "_none" p3 "")
(command "_pline" p3 "w" 0 150(polar p3 (angle p3 p2) 450.)"w" 0 0 p2 "_none" p1 "")
)
(vla-EndUndoMark
(vla-get-ActiveDocument (vlax-get-acad-object))
)
)
) ;_endof if progn
)
)
(setvar "cmdecho" _cm)
(setvar "PICKSTYLE" _ps)
(vl-acad-undefun "dyn_leader_call_back")
(setq *error* _oe)
(princ)
)
(defun ss:grvecs:leader (l mat / p1 p2 p3 p4 p5 p6 len wid ang)
(if (and (= (length l) 5)
(setq p1 (car l))
(setq p2 (cadr l))
(setq p3 (caddr l))
(setq len (cadddr l))
(setq wid (last l))
(> (distance p1 p2) len)
(setq ang (angle p1 p2))
(setq p4 (polar p1 ang len))
(setq p5 (polar p4 (+ ang (/ pi 2.)) (/ wid 2.)))
(setq p6 (polar p4 (- ang (/ pi 2.)) (/ wid 2.)))
)
(if (and mat
(= (length mat) 4)
(apply '= (cons 'list (mapcar 'type mat)))
)
(grvecs (list 3 p1 p5 3 p1 p6 3 p5 p6 3 p4 p2 3 p2 p3) mat)
(grvecs (list 3 p1 p5 3 p1 p6 3 p5 p6 3 p4 p2 3 p2 p3))
)
)
)