给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)
本帖最后由 作者 于 2007-11-6 9:06:55 编辑 <br /><br /> <p>CAD2005以后版本中就有了背景遮罩功能,但其默认值为1.5多数情况下不太合适</p><p>在<font face="Times New Roman">Autodesk</font>官方网站技术支持知识库查询,其中关于多行文字的背景遮罩边界偏移因子默认值修改的问题(问题<font face="Times New Roman">ID</font>号<font face="Times New Roman">TS1059918</font>),其解释为“<font face="Times New Roman">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.</font>”意为在背景遮罩对话框中,边界偏移因子的默认值为<font face="Times New Roman">1.5</font>,在当前的<font face="Times New Roman">AutoCAD</font>版本中,该默认值是不能修改的。<p></p></p><p></p><p></p><p>所以写了此程序</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0;">解决问题的基本思路为:选取文本<font face="Times New Roman">></font>若是单行文本,先转换为多行文本<font face="Times New Roman">></font>若多行文本已启用背景遮罩功能,修改其边界偏移因子为<font face="Times New Roman">1.1</font>,填充颜色使用图形背景颜色;若未启用,增加该功能,设定其边界偏移因子为<font face="Times New Roman">1.1</font>,填充颜色使用图形背景颜色。
<p></p></p><p></p><p></p><p>我加上了详细注解,觉得有用的话拿去吧.</p><p>注意:单行文本转多行文本时文本宽度的计算要选取适当系数</p><p>bg_mask.lsp</p><p>-----------------------------程序代码--------------------------------------------</p><p>;这个lisp程序的作用是,将单行文本转换为多行文本,为多行文本设置背景遮罩<br/>;背景遮罩边界偏移因子为1.1,使用图形背景颜色填充。<br/>;s1选择集名称,i m n 计数器,addlist增加的组码<br/>;entname 图元名,nlist 图元数据,tid 图元标志(若为TEXT则表示为单行文本),tt 文本,th文本高度<br/>;pt 文本基点,tang 文本旋转角度,ttlen 文本大致长度,tstr 相对坐标形式的多行文本的另一点</p><p><br/>(defun c:bg()<br/> ;首先要对图形进行一些设置,否则将会影响程序的使用。在程序结束前将会恢复这些设置!<br/> (setq sysosnap (getvar "OSMODE")) ;取得对象捕捉设置<br/> (setvar "OSMODE" 16384) ;关闭对象捕捉<br/> (setq sysang (getvar "ANGDIR")) ;取得角度方向(顺时针/逆时针)<br/> (setvar "ANGDIR" 0) ;设置为逆时针方向<br/> (setq sysabase (getvar "ANGBASE")) ;取得方向的基准角度<br/> (setvar "ANGBASE" 0) ;设置方向的基准角度为东<br/> (command "ucs" "") ;设置为wcs<br/> </p><p> (setq s1 (ssget)) ;选取单行文本或多行文本,构造非空选择集<br/> (if (/= s1 nil) (print) ;构造选择集成功,继续<br/> (progn ;构造失败,恢复设置退出<br/> (setvar "OSMODE" sysosnap) ;恢复对象捕捉设置<br/> (setvar "ANGDIR" sysang) ;恢复角度方向<br/> (setvar "ANGBASE" sysabase) ;恢复方向的基准角度<br/> (command "ucs" "p") ;恢复ucs<br/> (exit) ;退出<br/> )<br/> )</p><p><br/> (setq i 0 m 0 n 0) ;设置计数器,m为转换单行文本个数,n为多行文本个数<br/> (repeat (sslength s1)<br/> (setq entname (ssname s1 i))<br/> (setq nlist (entget entname))<br/> (setq tid (cdr (assoc 0 nlist))) ;判断是单行文本或多行文本<br/> (if (= tid "TEXT") ;如果是单行文本,先转换为多行文本<br/> (progn<br/> (setq m (1+ m)) ;计数器<br/> (setq tt (cdr (assoc 1 nlist))) ;取得文字<br/> (setq th (cdr (assoc 40 nlist))) ;取得文字高度<br/> (setq pt (cdr (assoc 10 nlist))) ;取得文字插入点<br/> (setq ang (cdr (assoc 50 nlist))) ;取得文字旋转角度<br/> (setq ttlen (strlen tt)) ;取得文字长度<br/> (setq twid (* (* th 0.7) ttlen)) ;计算文字宽度,不同字体、CAD版本、图形,文字高度与宽度关系可能不同,可直接修改系数0.7为适当值<br/> (setq tang (/ (* 180 (+ ang (atan(/ th twid)))) pi)) ;计算多行文本对角点的旋转角度<br/> (setq tlen (sqrt (+ (* th th) (* twid twid)))) ;计算多行文本对角线的长度<br/> (setq tstr (strcat "@" (rtos tlen) "<" (rtos tang))) ;对角点的相对坐标<br/> (setq ang (/ (* ang 180) pi)) ;转换弧度为角度<br/> (command "-mtext" pt "h" th "r" ang tstr tt "") ;在原位置以原角度原高度生成多行文本<br/> (entdel entname) ;删除单行文本</p><p> (setq entname (entlast)) ;取出最近转换成的多行文本<br/> (setq nlist (entget entname))<br/> (setq addlist (list(cons 45 1.1))) ;背景遮罩边界偏移因子为1.1<br/> (setq addlist (cons (cons 63 256) addlist));填充颜色使用图形背景颜色<br/> (setq addlist (cons (cons 90 3) addlist)) ;表示使用背景颜色,另外组码441为背景的透明度,目前版本无法使用,系统会自动增加该组码<br/> (if (= (assoc 45 nlist) nil) ;如果多行文本未使用背景遮罩,增加组码<br/> (progn<br/> (setq nlist (append nlist addlist)) ;增加上面3个组码<br/> (entmod nlist) ;更新显示<br/> )<br/> (progn ;如果已使用背景遮罩,直接更改组码<br/> (setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上<br/> (setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist))<br/> (setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist))<br/> (entmod nlist)<br/> )<br/> )<br/> )<br/> (progn<br/> (if (= tid "MTEXT") ;如果是多行文本<br/> (progn<br/> (setq n (1+ n)) ;计数器<br/> (setq addlist (list(cons 45 1.1))) ;背景遮罩边界偏移因子为1.1<br/> (setq addlist (cons (cons 63 256) addlist)) ;填充颜色使用图形背景颜色<br/> (setq addlist (cons (cons 90 3) addlist)) ;表示使用背景颜色,另外组码441为背景的透明度,目前版本无法使用,系统会自动增加该组码<br/> (if (= (assoc 45 nlist) nil) ;如果多行文本未使用背景遮罩,增加组码<br/> (progn<br/> (setq nlist (append nlist addlist)) ;增加上面3个组码<br/> (entmod nlist) ;更新显示<br/> )<br/> (progn ;如果已使用背景遮罩,直接更改组码<br/> (setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上<br/> (setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist))<br/> (setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist))<br/> (entmod nlist)<br/> )<br/> )<br/> )<br/> )<br/> )<br/> )<br/> (setq i (1+ i)) <br/> )</p><p><br/> (setvar "OSMODE" sysosnap) ;恢复对象捕捉设置<br/> (setvar "ANGDIR" sysang) ;恢复角度方向<br/> (setvar "ANGBASE" sysabase) ;恢复方向的基准角度<br/> (command "ucs" "p") ;恢复ucs<br/> (prompt (strcat "转换单行文本" (itoa m) "个,多行文本" (itoa n) "个。请验证是否正确!")) </p><p>)</p><p>--------------------------------------------------------------------------------------------------</p> 楼主这段代码很厉害。向楼主请教个问题,怎么用Lisp给多重引线打开文字遮罩啊? 好工具,收下了,学习一下 好东西,感谢分享 没人识货呀。。。。。。。。 <p>不错。高手!呵呵。</p><p></p> <p>先收下了</p><p>很少用到这个,回头再用</p> <p>谢谢分享!非常感谢!下来学习。</p> <p>刚好不知道怎么批量修改呢,这个程序不错,谢谢!</p> <p>不知能不能,直接把多行文字的宽度改成为,现有文字的宽度!</p><p>有时,多行文字的宽度太大或者太小了,背景遮罩就会太小或太大</p><p>panshengze4@sohu.com</p> <p>很有用的工具 </p> 很好! 谢谢分享!