本帖最后由 作者 于 2007-11-6 9:06:55 编辑
CAD2005以后版本中就有了背景遮罩功能,但其默认值为1.5多数情况下不太合适 在Autodesk官方网站技术支持知识库查询,其中关于多行文字的背景遮罩边界偏移因子默认值修改的问题(问题ID号TS1059918),其解释为“In the Background Mask dialog box, the default value for the Border Offset factor is 1.5000. In current AutoCAD® releases, it is not possible to define a different default value for this setting.”意为在背景遮罩对话框中,边界偏移因子的默认值为1.5,在当前的AutoCAD版本中,该默认值是不能修改的。
所以写了此程序 解决问题的基本思路为:选取文本>若是单行文本,先转换为多行文本>若多行文本已启用背景遮罩功能,修改其边界偏移因子为1.1,填充颜色使用图形背景颜色;若未启用,增加该功能,设定其边界偏移因子为1.1,填充颜色使用图形背景颜色。
我加上了详细注解,觉得有用的话拿去吧. 注意:单行文本转多行文本时文本宽度的计算要选取适当系数 bg_mask.lsp -----------------------------程序代码-------------------------------------------- ;这个lisp程序的作用是,将单行文本转换为多行文本,为多行文本设置背景遮罩 ;背景遮罩边界偏移因子为1.1,使用图形背景颜色填充。 ;s1选择集名称,i m n 计数器,addlist增加的组码 ;entname 图元名,nlist 图元数据,tid 图元标志(若为TEXT则表示为单行文本),tt 文本,th文本高度 ;pt 文本基点,tang 文本旋转角度,ttlen 文本大致长度,tstr 相对坐标形式的多行文本的另一点 (defun c:bg() ;首先要对图形进行一些设置,否则将会影响程序的使用。在程序结束前将会恢复这些设置! (setq sysosnap (getvar "OSMODE")) ;取得对象捕捉设置 (setvar "OSMODE" 16384) ;关闭对象捕捉 (setq sysang (getvar "ANGDIR")) ;取得角度方向(顺时针/逆时针) (setvar "ANGDIR" 0) ;设置为逆时针方向 (setq sysabase (getvar "ANGBASE")) ;取得方向的基准角度 (setvar "ANGBASE" 0) ;设置方向的基准角度为东 (command "ucs" "") ;设置为wcs
(setq s1 (ssget)) ;选取单行文本或多行文本,构造非空选择集 (if (/= s1 nil) (print) ;构造选择集成功,继续 (progn ;构造失败,恢复设置退出 (setvar "OSMODE" sysosnap) ;恢复对象捕捉设置 (setvar "ANGDIR" sysang) ;恢复角度方向 (setvar "ANGBASE" sysabase) ;恢复方向的基准角度 (command "ucs" "p") ;恢复ucs (exit) ;退出 ) ) (setq i 0 m 0 n 0) ;设置计数器,m为转换单行文本个数,n为多行文本个数 (repeat (sslength s1) (setq entname (ssname s1 i)) (setq nlist (entget entname)) (setq tid (cdr (assoc 0 nlist))) ;判断是单行文本或多行文本 (if (= tid "TEXT") ;如果是单行文本,先转换为多行文本 (progn (setq m (1+ m)) ;计数器 (setq tt (cdr (assoc 1 nlist))) ;取得文字 (setq th (cdr (assoc 40 nlist))) ;取得文字高度 (setq pt (cdr (assoc 10 nlist))) ;取得文字插入点 (setq ang (cdr (assoc 50 nlist))) ;取得文字旋转角度 (setq ttlen (strlen tt)) ;取得文字长度 (setq twid (* (* th 0.7) ttlen)) ;计算文字宽度,不同字体、CAD版本、图形,文字高度与宽度关系可能不同,可直接修改系数0.7为适当值 (setq tang (/ (* 180 (+ ang (atan(/ th twid)))) pi)) ;计算多行文本对角点的旋转角度 (setq tlen (sqrt (+ (* th th) (* twid twid)))) ;计算多行文本对角线的长度 (setq tstr (strcat "@" (rtos tlen) "<" (rtos tang))) ;对角点的相对坐标 (setq ang (/ (* ang 180) pi)) ;转换弧度为角度 (command "-mtext" pt "h" th "r" ang tstr tt "") ;在原位置以原角度原高度生成多行文本 (entdel entname) ;删除单行文本
(setq entname (entlast)) ;取出最近转换成的多行文本 (setq nlist (entget entname)) (setq addlist (list(cons 45 1.1))) ;背景遮罩边界偏移因子为1.1 (setq addlist (cons (cons 63 256) addlist));填充颜色使用图形背景颜色 (setq addlist (cons (cons 90 3) addlist)) ;表示使用背景颜色,另外组码441为背景的透明度,目前版本无法使用,系统会自动增加该组码 (if (= (assoc 45 nlist) nil) ;如果多行文本未使用背景遮罩,增加组码 (progn (setq nlist (append nlist addlist)) ;增加上面3个组码 (entmod nlist) ;更新显示 ) (progn ;如果已使用背景遮罩,直接更改组码 (setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上 (setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist)) (setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist)) (entmod nlist) ) ) ) (progn (if (= tid "MTEXT") ;如果是多行文本 (progn (setq n (1+ n)) ;计数器 (setq addlist (list(cons 45 1.1))) ;背景遮罩边界偏移因子为1.1 (setq addlist (cons (cons 63 256) addlist)) ;填充颜色使用图形背景颜色 (setq addlist (cons (cons 90 3) addlist)) ;表示使用背景颜色,另外组码441为背景的透明度,目前版本无法使用,系统会自动增加该组码 (if (= (assoc 45 nlist) nil) ;如果多行文本未使用背景遮罩,增加组码 (progn (setq nlist (append nlist addlist)) ;增加上面3个组码 (entmod nlist) ;更新显示 ) (progn ;如果已使用背景遮罩,直接更改组码 (setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上 (setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist)) (setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist)) (entmod nlist) ) ) ) ) ) ) (setq i (1+ i)) ) (setvar "OSMODE" sysosnap) ;恢复对象捕捉设置 (setvar "ANGDIR" sysang) ;恢复角度方向 (setvar "ANGBASE" sysabase) ;恢复方向的基准角度 (command "ucs" "p") ;恢复ucs (prompt (strcat "转换单行文本" (itoa m) "个,多行文本" (itoa n) "个。请验证是否正确!"))
) -------------------------------------------------------------------------------------------------- |