找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3658|回复: 9

[原创]:给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解

[复制链接]
发表于 2007-11-6 09:08:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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) "个。请验证是否正确!"))

)

--------------------------------------------------------------------------------------------------
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-11-10 08:53:34 | 显示全部楼层
谢谢楼主提供源码和解释,虽程序用不上,但源码值得学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-11-10 10:52:37 | 显示全部楼层
很详细的注解..谢谢楼主!值的学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-4-15 19:16:52 | 显示全部楼层
支持支持....
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 33个

财富等级: 招财进宝

发表于 2019-1-31 17:54:25 | 显示全部楼层
感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 61个

财富等级: 招财进宝

发表于 2019-2-22 07:26:11 | 显示全部楼层
写得好详细啊  好好学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 158个

财富等级: 日进斗金

发表于 2019-2-22 12:52:03 | 显示全部楼层
谢谢楼主提供源码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-5-21 14:08:26 | 显示全部楼层
谢谢分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2021-1-30 12:55:43 | 显示全部楼层
请问楼主,加载后提示(命令: ap APPLOAD 已成功加载 bg_mask.lsp。
命令: ; 错误: 输入的字符串有缺陷)是什么原因?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-2-16 18:00:14 | 显示全部楼层
能否先将多行文本的宽度调整为0,再添加遮罩,这样遮罩不受文本框的大小影响。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 14:52 , Processed in 0.378695 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表