根据您的示例图形,这里是一个良好的开端。
- (defun c:foo (/ lm:makereadable _colinear a b d out p pp s th)
- ;; RJP 05.03.2018
- ;; Labels exterior edges of 'stands' with edge length
- (defun _colinear (p1 p2 p3 f) (equal (+ (distance p1 p2) (distance p2 p3)) (distance p1 p3) f))
- ;; Make Readable - Lee Mac
- ;; Returns a given angle corrected for text readability
- (defun lm:makereadable (a)
- ((lambda (a)
- (if (and (< (* pi 0.5) a) (<= a (* pi 1.5)))
- (+ a pi)
- a
- )
- )
- (rem (+ a pi pi) (+ pi pi))
- )
- )
- (cond
- ((setq s (ssget '((0 . "lwpolyline") (8 . "BoothOutline"))))
- (setq th 500)
- (foreach pl (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
- (setq p (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget pl))))
- (setq p
- (mapcar '(lambda (a b)
- (list (polar a (angle a b) (* 0.5 (setq d (distance a b)))) a b (angle a b) d)
- )
- p
- (append (cdr p) (list (car p)))
- )
- )
- (setq out (cons p out))
- )
- (foreach pt (setq out (apply 'append out))
- (and
- (null (vl-remove-if-not
- '(lambda (x)
- (or (equal (car pt) (car x) 1e-1) (_colinear (cadr x) (car pt) (caddr x) 1e-1))
- )
- (vl-remove pt out)
- )
- )
- (setq pp (polar (car pt) (- (cadddr pt) (/ pi 2.)) th))
- (entmakex (list '(0 . "TEXT")
- '(100 . "AcDbEntity")
- '(8 . "BoothOutlineLength")
- '(100 . "AcDbText")
- (cons 10 pp)
- (cons 40 th)
- '(62 . 1)
- (cons 1 (rtos (/ (last pt) 1000.) 2 0))
- (cons 50 (lm:makereadable (cadddr pt)))
- '(72 . 1)
- (cons 11 pp)
- '(100 . "AcDbText")
- '(73 . 2)
- )
- )
- )
- )
- )
- )
- (princ)
- )
- (vl-load-com)
|