;;; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; + get_group_boundingbox.lsp +
;;; + Created by C. Alan Butler +
;;; + Copyright 2005 +
;;; + by Precision Drafting & Design All Rights Reserved. +
;;; + Contact at ab2draft@TampaBay.rr.com +
;;; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;;
;;; Get a bounding box for a group of bounding boxes
;;; Use the base of the first box as a referance angle that will be
;;; the base angle of the box returned
;;;
;;; argument 'all; is a list of 4 point lists defining the group of boxes
(defun get_group_boundingbox (all / ld lb rd rb bd bb td tb tmp refpt angr
ang angr s1 s2 pt anglst intersect dist)
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; return intersect point between two borders
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(defun intersect (s1 s2 ang / angr)
(if (>= ang (* pi 1.5)) ; ANGLE PLUS 90 DEG
(setq angr (- ang (* pi 1.5))) ; -270 deg
(setq angr (+ ang (/ pi 2))) ; +90 deg
)
(inters s1 (polar s1 angr 10) s2 (polar s2 ang 10) nil)
) ; end defun
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; calc distance & perpenduclar point on border
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(defun dist (p1 ang p3 p4 / p2 p5 d angp1p5)
(setq p2 (polar p1 ang 10) ; point on line at angle
p5 (inters p1 p2 p3 p4 nil) ; perpendicular point
d (distance p1 p5)
)
;; this is needed when angp1p5 is = 2pi
(if (equal (angle p1 p5) (* 2 pi) 0.00001)
(setq angp1p5 0.0)
(setq angp1p5 (angle p1 p5))
)
(if (equal angp1p5 ang 0.00001)
(list (distance p1 p5) p5)
(list (- (distance p1 p5)) p5)
)
;; returns (dist point)
) ; end defun
;; /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
;; start of get_group_boundingbox
;; \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\
(setq ld 0 ; ld Left Distance : lb Left Broder pt
rd 0
td 0
bd 0
;; constant referance point for calcs, it is within the first box
refpt (polar (caar all) (angle (caar all) (caddar all))
(/ (distance (caar all) (caddar all)) 2))
ang (angle (caar all) (cadar all)) ; constant angle for calcs
angr (if (>= ang (* pi 1.5)) ; ANGLE PLUS 90 DEG
(- ang (* pi 1.5)) ; -270 deg
(+ ang (/ pi 2)) ; +90 deg
)
)
;; this is needed when ang is = 2pi
(if (equal ang (* 2 pi) 0.00001)
(setq ang 0.0)
)
;; find point on outer most border
(foreach pt all
;; Right Border (ll lr ur ul) -> lr ur -> (cadr pt) (caddr pt)
(if (>= (car (setq tmp (dist refpt ang (cadr pt) (caddr pt)))) rd)
(setq rb (cadr tmp) ; new border point
rd (car tmp) ; new distance
)
)
;; Left Border (ll lr ur ul) -> ll ul -> (car pt) (cadddr pt)
(if (<= (car (setq tmp (dist refpt ang (car pt) (cadddr pt)))) ld)
(setq lb (cadr tmp) ; new border point
ld (car tmp) ; new distance
)
)
;; Top Border (ll lr ur ul) -> ur ul -> (cadr pt) (caddr pt)
(if (>= (car (setq tmp (dist refpt angr (caddr pt) (cadddr pt)))) td)
(setq tb (cadr tmp) ; new border point
td (car tmp) ; new distance
)
)
;; Bottom Border (ll lr ur ul) -> ll lr -> (car pt) (cadddr pt)
(if (<= (car (setq tmp (dist refpt angr (car pt) (cadr pt)))) bd)
(setq bb (cadr tmp) ; new border point
bd (car tmp) ; new distance
)
)
) ; foreach
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; get intersect point between two borders
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; Left Border & Bottom Border = Lower left pt
(list (intersect lb bb ang) ; ll
(intersect rb bb ang) ; lr
(intersect rb tb ang) ; ur
(intersect lb tb ang) ; ul
)
;; returns (ll lr ur ul)
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
) ; end defun get_group_boundingbox
;;; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; + box_text +
;;; + Created by C. Alan Butler +
;;; + Copyright 2005 +
;;; + by Precision Drafting & Design All Rights Reserved. +
;;; + Contact at ab2draft@TampaBay.rr.com +
;;; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;;
;;; VERSION
;;; 1.2 Jan 24, 2006 UCS corrections
;;; 1.3 Nov 26, 2008 Fixed Bug when text was rotated
;;;
;;; FUNCTION
;;; Return Box coordinates for an dtext object in any UCS, any angle.
;;;
;;; USAGE
;;; (box_text ent)
;;;
;;; ARGUMENTS
;;; ent = text ename
;;;
;;; RETURNS
;;; list of 4 points for box, (ll lr ur ul)
;;;
;;; PLATFORMS
;;; 2000+ Tested in 2000 only
;;; FUNCTION
(defun box_dtext (ent / i ename elist lst lst2 tb tb1 tb2 tlen thi ll lr
ur ul ang angg UCSang llx lrx urx ulx lly lry ury uly all
avg err cntlst
)
(setq UCSang (angle (trans '(0.0 0.0 0.0) 1 0)
(trans '(1.0 0.0 0.0) 1 0)
)
)
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; get the bounding box
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(setq elist (entget ent)
ang (cdr (assoc 50 elist)) ; text angle
tb (textbox elist) ; Note that I had some problems with this
;tb (textbox (list (assoc 1 elist) (assoc 40 elist)(assoc 7 elist)));(textbox (list (assoc 1 elist))) ; CAB 11.11.08
tb1 (car tb) ; Lower Left Relative to text
tb2 (cadr tb) ; Upper Right relative to text
tlen (- (car tb2) (car tb1))
thi (- (cadr tb2) (cadr tb1))
)
(setq ang (- ang UCSang) ; correct for UCS
ll (polar (trans (cdr (assoc 10 elist)) 0 1)
(+(angle '(0 0) tb1) ang) (DISTANCE '(0 0) tb1)) ; CAB 11.26.2008
lr (polar ll ang tlen)
ur (polar ll (+ ang (angle tb1 tb2)) (distance tb1 tb2))
ul (polar ll (+ ang (/ pi 2)) thi)
) ;setq
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(list ll lr ur ul)
) ; end defun box_dtext
;;; x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
Test the drawing with the code.
(defun C:TT ()
(setq BOX_PTS '())
(setq SS (ssget '((0 . "TEXT"))))
(repeat (setq I (sslength SS))
(and (setq E (ssname SS (setq I (1- I))))
(setq BOX (BOX_DTEXT E))
(setq BOX_PTS (cons BOX BOX_PTS))
)
)
(setq 4PTS (GET_GROUP_BOUNDINGBOX BOX_PTS))
)