函数 textbox 返回文字对象矩形边框的对角点坐标。该函数的唯一参数是一个图元定义表,该表的格式与 entget 返回表(组码及其值的关联表)的类型相同。该表可以包含文字对象的完整关联表,也可以仅包括描述文字字符串的表。
函数 textbox 返回的点描述了文字对象的边框(一个假想的包含文字对象的框),假定它的插入点位于 (0,0,0),且它的旋转角度为 0。返回的第一个表是点 (0.0 0.0 0.0),除非文字对象是斜的或垂直的,或者它包含下行字符(例如 g 和 p)。第一个点表的值指定从文字插入点到边框左下角的距离,该边框是包含此文字对象的最小矩形。第二个点表指定该边框的右上角。所返回的点表总是该边框的左下角点和右上角点,而与文字测量的方向无关。
下例中,列举了 textbox 可以接受的最小的图元定义表。由于没有附加信息,所以 textbox 使用当前缺省的文字样式和高度。
命令: (textbox '((1 . "Hello world")) )
((0.0 0.0 0.0) (2.80952 1.0 0.0))
textbox 的实际返回值会因当前文字样式不同而有所变化
不管文字方向或样式如何,由 textbox 返回的点是用原点位于文字插入点(组码 10)的对象坐标系 (OCS) 来表示的。当把由 textbox 返回的坐标转换为定义了文字实际区域的点时,这个点可以被参照。无论选定文字的方向如何,下列两个例程都调用 textbox 在文字周围放置边框。
第一个例程调用函数 textbox 在选定文字周围绘制边框。
- (defun C:TBOX ( / textent tb ll ur ul lr)
- (setq textent (car (entsel "\nSelect text: ")))
- (command "ucs" "Object" textent)
- (setq tb (textbox (list (cons -1 textent)))
- ll (car tb)
- ur (cadr tb)
- ul (list (car ll) (cadr ur))
- lr (list (car ur) (cadr ll))
- )
- (command "pline" ll lr ur ul "Close")
- (command "ucs" "p")
- (princ)
- )
第二个例程通过调用 AutoLISP 函数 sin 和 cos 进行几何计算后,完成了与第一个程序相同的操作。只有在当前 UCS 平行于文字对象所在平面时,它的结果才是正确的。
- (defun C:TBOX2 ( / textent ang sinrot cosrot
- t1 t2 p0 p1 p2 p3 p4)
- (setq textent (entget (car (entsel "\nSelect text: "))))
- (setq p0 (cdr (assoc 10 textent))
- ang (cdr (assoc 50 textent))
- sinrot (sin ang)
- cosrot (cos ang)
- t1 (car (textbox textent))
- t2 (cadr (textbox textent))
- p1 (list
- (+ (car p0)
- (- (* (car t1) cosrot)(* (cadr t1) sinrot))
- )
- (+ (cadr p0)
- (+ (* (car t1) sinrot)(* (cadr t1) cosrot))
- )
- )
- p2 (list
- (+ (car p0)
- (- (* (car t2) cosrot)(* (cadr t1) sinrot))
- )
- (+ (cadr p0)
- (+ (* (car t2) sinrot)(* (cadr t1) cosrot))
- )
- )
- p3 (list
- (+ (car p0)
- (- (* (car t2) cosrot)(* (cadr t2) sinrot))
- )
- (+ (cadr p0)
- (+ (* (car t2) sinrot)(* (cadr t2) cosrot))
- )
- )
- p4 (list
- (+ (car p0)
- (- (* (car t1) cosrot)(* (cadr t2) sinrot))
- )
- (+ (cadr p0)
- (+ (* (car t1) sinrot)(* (cadr t2) cosrot))
- )
- )
- )
- (command "pline" p1 p2 p3 p4 "c")
- (princ)
- )
|