Fantomas
7th Dec 2004, 06:57 pm
This program for automatic alignment of DText. You can choose Standard or Custom distance between strings. Alignment is made on the upper string. All types of alignment behind exception Alignment and Fit are supported. For AutoCAD 2000+.
(defun c:dali (/ tHeight insPoint dtSet oldDisMode errFlag
sStr tAlignPt tAlignment disDelta dtList
oldStrDis)
(defun texAlign (item /)
(setq disDelta(- disDelta dali:strDis)); end setq
(vla-put-Alignment (car str) tAlignment)
(cond
((= tAlignment 0)
(vla-put-InsertionPoint (car str)
(vlax-3D-Point(car insPoint)
(+ disDelta(cadr insPoint))(nth 2 insPoint)))
)
((member tAlignment '(1 2 4 6 7 8 9 10 11 12 13 14))
(vla-put-TextAlignmentPoint (car str)
(vlax-3D-Point(car tAlignPt)
(+ disDelta(cadr tAlignPt))(nth 2 tAlignPt)))
)
((member tAlignment '(3 5))
(princ "\nCan't align string with Aligned or Fit alignment ")
)
); end cond
); end of texAlign
(if(not dali:disMode)(setq dali:disMode "S"))
(setq oldDisMode dali:disMode)
(if(not dali:strDis)(setq dali:strDis 4.167))
(setq oldStrDis dali:strDis)
(initget "S C")
(setq dali:disMode
(getkword
(strcat "\nSpecify distance between strings [Standard/Custom] <" dali:disMode ">: ")))
(if(null dali:disMode)(setq dali:disMode oldDisMode))
(if(= dali:disMode "C")
(progn
(setq dali:strDis(getdist(strcat "\nSpecify Custom distance <"(rtos dali:strDis) ">: ")))
(if(null dali:strDis)(setq dali:strDis oldStrDis))
(princ(strcat "\nCustom distance is "(rtos dali:strDis)))
); end progn
); end if
(princ "\n*** Select DText and press Enter *** ")
(if
(setq dtSet(ssget '((0 . "TEXT"))))
(progn
(setq dtList(vl-sort(mapcar
'(lambda (x)(list x
(+(cadr(vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint x))))
(cadr(vlax-safearray->list
(vlax-variant-value
(vla-get-TextAlignmentPoint x)))))))
(mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp
(mapcar 'cadr(ssnamex dtSet)))))
(function(lambda(a b)(>(cadr a)(cadr b)))))
tHeight(vla-get-Height (caar dtList))
insPoint(vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint (caar dtList))))
tAlignPt(vlax-safearray->list
(vlax-variant-value
(vla-get-TextAlignmentPoint (caar dtList))))
tAlignment(vla-get-Alignment (caar dtList))
dtList(cdr dtList)
disDelta 0.0
); end setq
(if(= dali:disMode "S")(setq dali:strDis(* 1.6668 tHeight)))
(foreach str dtList
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply 'texAlign (list str))))
(princ)
(setq errFlag T)
); end if
); end foreach
(if errFlag(princ "\n*** Some objects on Locked Layer ***"))
); end progn
(princ "\nString isn't selected. ")
); end if
(princ)
); end of dali
(vl-load-com)
(defun c:dali (/ tHeight insPoint dtSet oldDisMode errFlag
sStr tAlignPt tAlignment disDelta dtList
oldStrDis)
(defun texAlign (item /)
(setq disDelta(- disDelta dali:strDis)); end setq
(vla-put-Alignment (car str) tAlignment)
(cond
((= tAlignment 0)
(vla-put-InsertionPoint (car str)
(vlax-3D-Point(car insPoint)
(+ disDelta(cadr insPoint))(nth 2 insPoint)))
)
((member tAlignment '(1 2 4 6 7 8 9 10 11 12 13 14))
(vla-put-TextAlignmentPoint (car str)
(vlax-3D-Point(car tAlignPt)
(+ disDelta(cadr tAlignPt))(nth 2 tAlignPt)))
)
((member tAlignment '(3 5))
(princ "\nCan't align string with Aligned or Fit alignment ")
)
); end cond
); end of texAlign
(if(not dali:disMode)(setq dali:disMode "S"))
(setq oldDisMode dali:disMode)
(if(not dali:strDis)(setq dali:strDis 4.167))
(setq oldStrDis dali:strDis)
(initget "S C")
(setq dali:disMode
(getkword
(strcat "\nSpecify distance between strings [Standard/Custom] <" dali:disMode ">: ")))
(if(null dali:disMode)(setq dali:disMode oldDisMode))
(if(= dali:disMode "C")
(progn
(setq dali:strDis(getdist(strcat "\nSpecify Custom distance <"(rtos dali:strDis) ">: ")))
(if(null dali:strDis)(setq dali:strDis oldStrDis))
(princ(strcat "\nCustom distance is "(rtos dali:strDis)))
); end progn
); end if
(princ "\n*** Select DText and press Enter *** ")
(if
(setq dtSet(ssget '((0 . "TEXT"))))
(progn
(setq dtList(vl-sort(mapcar
'(lambda (x)(list x
(+(cadr(vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint x))))
(cadr(vlax-safearray->list
(vlax-variant-value
(vla-get-TextAlignmentPoint x)))))))
(mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp
(mapcar 'cadr(ssnamex dtSet)))))
(function(lambda(a b)(>(cadr a)(cadr b)))))
tHeight(vla-get-Height (caar dtList))
insPoint(vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint (caar dtList))))
tAlignPt(vlax-safearray->list
(vlax-variant-value
(vla-get-TextAlignmentPoint (caar dtList))))
tAlignment(vla-get-Alignment (caar dtList))
dtList(cdr dtList)
disDelta 0.0
); end setq
(if(= dali:disMode "S")(setq dali:strDis(* 1.6668 tHeight)))
(foreach str dtList
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply 'texAlign (list str))))
(princ)
(setq errFlag T)
); end if
); end foreach
(if errFlag(princ "\n*** Some objects on Locked Layer ***"))
); end progn
(princ "\nString isn't selected. ")
); end if
(princ)
); end of dali
(vl-load-com)