;;; Inpirated by http://autocadtips1.com/2011/05/09/lisp-unique-polyline-arrow/
;;; Modified by Igal Averbuh 2016

(defun c:DFA (/ DrawEndArrowHead DrawStartArrowHead ActDoc CurSpc Dist ArSty Pt PtList StList Ang EndList
PtList+ PtList- oPt nPt tempPt oAng oAng+ oAng- oPt+ oPt- nPt+ nPt- cAng cAng+ cAng-
tempPt+ tempPt- ntemp+ ntemp- Pt+ Pt- PolyPtList *error* AlignX AlignY AlignZ DistX DistY DistZ)
(if (not (tblsearch "LAYER" "TPZ-TXT"))
(command "._-layer" "NEW" "TPZ-TXT" "C" "1" "TPZ-TXT" "" )
(command "._-layer" "ON" "TPZ-TXT" "T" "TPZ-TXT" "")
)
(command "._-layer" "SET" "TPZ-TXT" "" )

(vl-load-com)
; Draw a polyline arrow, now shown as you move the cursor
(defun *error* (msg)
;(vl-bt)
(redraw)
(prompt (strcat "\n Error-> " msg))
)
;---------------------------------------------------------------------------------------------------------
(defun GetCurrentSpace (Doc / BlkCol SpaceList CurSpace ActSpace temp1)
; Returns the "block object" for the active space
; Thanks to Jeff Mishler
(if (= (getvar "cvport") 1)
(vla-get-PaperSpace Doc)
(vla-get-ModelSpace Doc)
)
)
;---------------------------------------------------------------------------------------------------------
(defun AlignX (pt1 pt2)
(list
(car pt1)
(cadr pt2)
(caddr pt2)
)
)
;---------------------------------------------------------------------------------------------------------
(defun AlignY (pt1 pt2)
(list
(car pt2)
(cadr pt1)
(caddr pt2)
)
)
;---------------------------------------------------------------------------------------------------------
(defun AlignZ (pt1 pt2)
(list
(car pt2)
(cadr pt2)
(caddr pt1)
)
)
;---------------------------------------------------------------------------------------------------------
(defun DrawEndArrowHead (Stpt CurPt ArrHeadDist ReturnPoints / Ang -Ang tempPt Ang+ Ang- Pt+ Pt-)
(setq Ang (angle StPt CurPt))
(setq -Ang (rem (+ Ang pi) (* pi 2.0)))
(setq tempPt (polar CurPt -Ang (* ArrHeadDist 2.0)))
(setq Ang+ (rem (+ Ang (* pi 0.5)) (* pi 2.0)))
(setq Ang- (rem (+ Ang (* pi 1.5)) (* pi 2.0)))
(setq Pt+ (polar tempPt Ang+ (* ArrHeadDist 0.5)))
(setq Pt- (polar tempPt Ang- (* ArrHeadDist 0.5)))
(grvecs
(list
1 Pt+ (polar Pt+ Ang+ (* ArrHeadDist 0.5))
1 (polar Pt+ Ang+ (* ArrHeadDist 0.5)) CurPt
1 CurPt (polar Pt- Ang- (* ArrHeadDist 0.5))
1 (polar Pt- Ang- (* ArrHeadDist 0.5)) Pt-
)
)
(if ReturnPoints
(list
(polar Pt+ Ang+ (* ArrHeadDist 0.5))
CurPt
(polar Pt- Ang- (* ArrHeadDist 0.5))
)
(list Pt+ Pt-)
)
)
;-------------------------------------------------------------------------------------------------------------------
(defun DrawStartArrowHead (StPt CurPt ArrHeadDist ReturnPoints / Ang -Ang tempPt Ang+ Ang- Pt+ Pt- Pt+2 Pt-2)
(setq Ang (angle CurPt StPt))
(setq -Ang (rem (+ Ang pi) (* pi 2.0)))
(setq tempPt (polar StPt -Ang (* ArrHeadDist 2.0)))
(setq Ang+ (rem (+ Ang (* pi 0.5)) (* pi 2.0)))
(setq Ang- (rem (+ Ang (* pi 1.5)) (* pi 2.0)))
(setq Pt+ (polar tempPt Ang+ (* ArrHeadDist 0.5)))
(setq Pt- (polar tempPt Ang- (* ArrHeadDist 0.5)))
(grvecs
(list
1 Pt+ (polar Pt+ Ang+ (* ArrHeadDist 0.5))
1 (polar Pt+ Ang+ (* ArrHeadDist 0.5)) StPt
1 StPt (polar Pt- Ang- (* ArrHeadDist 0.5))
1 (polar Pt- Ang- (* ArrHeadDist 0.5)) Pt-
)
)
(if ReturnPoints
(list
(polar Pt+ Ang+ (* ArrHeadDist 0.5))
StPt
(polar Pt- Ang- (* ArrHeadDist 0.5))
)
(list Pt- Pt+)
)
)
,-------------------------------------------------------------------------------------------------------------------
(setq ActDoc (vla-get-ActiveDocument (vlax-get-Acad-Object)))
(vla-EndUndoMark ActDoc)
(vla-StartUndoMark ActDoc)
(setq CurSpc (GetCurrentSpace ActDoc))
(initget "Single Double")
(setq Dist (getdist "\nSelect arrowhead type [Single arrowhead/Double arrowhead]: "))(if (= (type Dist) 'STR)
(progn
(setq ArSty Dist)
(setq Dist (getdist "\n Enter arrow width by two points: "))
)
(setq ArSty "Single")
)
(setq Pt (getpoint "\n Select arrow starting point (not an arrowhead point): "))
(setq PtList (list Pt))
(while
(and
PtList
Pt
ArSty
Dist
(not (prompt "\r Select next point [right click to exit / Undo]: "))
(not (vl-position (car (setq tempList (grread T 0))) '(11 25)))
)
(cond
((equal (car tempList) 2)
(cond
((equal (cadr tempList) 15)
(setvar "orthomode" (abs (1- (getvar "orthomode"))))
)
((and (> (length PtList) 1) (vl-position (cadr tempList) '(85 117)))
(setq PtList (cdr PtList))
(setq PtList+ (cdr PtList+))
(setq PtList- (cdr PtList-))
(redraw)
(if (= ArSty "Double")
(DrawStartArrowHead (last PtList) (nth (- (length PtList) 2) PtList) Dist nil)
(grdraw (car StList) (cadr StList) 1)
)
(setq EndList (DrawEndArrowHead (car PtList) (polar tempPt cAng (* Dist 2.0)) Dist nil))
(setq cnt 0)
(while ( DistX DistY) (> DistX DistZ))
(AlignY Pt tempPt)
)
((and (> DistY DistZ) (> DistY DistX))
(AlignX Pt tempPt)
)
((and (> DistZ DistX) (> DistZ DistY))
(AlignZ Pt tempPt)
)
)
)
)
(if (and tempPt (not (equal Pt tempPt 0.0001)))
(progn
(if (= ArSty "Double")
(setq StList (DrawStartArrowHead Pt tempPt Dist nil))
(progn
(setq Ang (angle Pt tempPt))
(setq StList
(list
(polar Pt (rem (+ Ang (* pi 0.5)) (* pi 2.0)) (* Dist 0.5))
(polar Pt (rem (+ Ang (* pi 1.5)) (* pi 2.0)) (* Dist 0.5))
)
)
)
)
(cond
((equal (car tempList) 5)
(redraw)
(if (= ArSty "Double")
(DrawStartArrowHead Pt tempPt Dist nil)
(grdraw (car StList) (cadr StList) 1)
)
(setq EndList (DrawEndArrowHead Pt tempPt Dist nil))
(grdraw (car StList) (car EndList) 1)
(grdraw (cadr StList) (cadr EndList) 1)
)
((equal (car tempList) 3)
(setq PtList+ (cons (car StList) PtList+))
(setq PtList- (cons (cadr StList) PtList-))
(setq PtList (cons tempPt PtList))
)
)
)
)
)
((and (> (length PtList) 1) (or (equal (car tempList) 5) (equal (car tempList) 3)))
(setq oPt (cadr PtList))
(setq nPt (car PtList))
(setq tempPt (cadr tempList))
(setq DistX (abs (- (car nPt) (car tempPt))))
(setq DistY (abs (- (cadr nPt) (cadr tempPt))))
(setq DistZ (abs (- (caddr nPt) (caddr tempPt))))
(if (equal (getvar "orthomode") 1)
(setq tempPt
(cond
((and (> DistX DistY) (> DistX DistZ))
(AlignY nPt tempPt)
)
((and (> DistY DistZ) (> DistY DistX))
(AlignX nPt tempPt)
)
((and (> DistZ DistX) (> DistZ DistY))
(AlignZ nPt tempPt)
)
)
)
)
(if (and tempPt (not (equal nPt tempPt 0.0001)))
(progn
(if (= ArSty "Double")
(setq StList (DrawStartArrowHead (last PtList) (nth (- (length PtList) 2) PtList) Dist nil))
(progn
(setq Ang (angle (last PtList) (nth (- (length PtList) 2) PtList)))
(setq StList
(list
(polar (last PtList) (rem (+ Ang (* pi 0.5)) (* pi 2.0)) (* Dist 0.5))
(polar (last PtList) (rem (+ Ang (* pi 1.5)) (* pi 2.0)) (* Dist 0.5))
)
)
)
)
(setq oAng (angle oPt nPt))
(setq oAng+ (rem (+ oAng (* pi 0.5)) (* pi 2.0)))
(setq oAng- (rem (+ oAng (* pi 1.5)) (* pi 2.0)))
(setq oPt+ (polar oPt oAng+ (* Dist 0.5)))
(setq oPt- (polar oPt oAng- (* Dist 0.5)))
(setq nPt+ (polar nPt oAng+ (* Dist 0.5)))
(setq nPt- (polar nPt oAng- (* Dist 0.5)))
(setq cAng (angle nPt tempPt))
(setq cAng+ (rem (+ cAng (* pi 0.5)) (* pi 2.0)))
(setq cAng- (rem (+ cAng (* pi 1.5)) (* pi 2.0)))
(if (equal (car tempList) 5)
(setq tempPt (polar tempPt (rem (+ cAng pi) (* pi 2.0)) (* Dist 2.0)))
)
(setq tempPt+ (polar tempPt cAng+ (* Dist 0.5)))
(setq tempPt- (polar tempPt cAng- (* Dist 0.5)))
(setq ntempPt+ (polar nPt cAng+ (* Dist 0.5)))
(setq ntempPt- (polar nPt cAng- (* Dist 0.5)))
(setq Pt+ (inters oPt+ nPt+ ntempPt+ tempPt+ nil))
(setq Pt- (inters oPt- nPt- ntempPt- tempPt- nil))
(if (and Pt+ Pt-)
(cond
((equal (car tempList) 5)
(redraw)
(if (= ArSty "Double")
(DrawStartArrowHead (last PtList) (nth (- (length PtList) 2) PtList) Dist nil)
(grdraw (car StList) (cadr StList) 1)
)
(setq EndList (DrawEndArrowHead (car PtList) (polar tempPt cAng (* Dist 2.0)) Dist nil))
(setq cnt 0)
(while ( (length PtList) 1)
(progn
(setq EndList (DrawEndArrowHead (cadr PtList) (car PtList) Dist nil))
(setq PtList+ (cons (car EndList) PtList+))
(setq PtList- (cons (cadr EndList) PtList-))
(setq EndPtList (DrawEndArrowHead (cadr PtList) (car PtList) Dist T))
(if (= ArSty "Double")
(progn
(setq StPtList (DrawStartArrowHead (last PtList) (nth (- (length PtList) 2) PtList) Dist T))
(setq tempPtList (append StPtList (append (reverse PtList+) (append EndPtList PtList-))))
)
(setq tempPtList (append (reverse PtList+) (append EndPtList PtList-)))
)
(foreach Pt (mapcar '(lambda (x) (trans x 1 0)) tempPtList)
(setq PolyPtList (cons (car Pt) PolyPtList))
(setq PolyPtList (cons (cadr Pt) PolyPtList))
)
(vla-put-Closed (vlax-invoke CurSpc 'AddLightWeightPolyline (reverse PolyPtList)) :vlax-true)
(command "-hatch" "s" "l" "" "p" "s" "co" "t" "7,7,7" "" )
)
)
(redraw)
(vla-EndUndoMark ActDoc)
(princ)
)

(c:dfa)

Advertisements