找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1576|回复: 11

[求助] [求助]:如何使mtext写出的多行文字具有背景遮罩功能?

[复制链接]
发表于 2006-5-17 14:38:02 | 显示全部楼层 |阅读模式

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

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

×
求一程序?
如何使mtext写出的文本就具有背景遮罩功能?用lisp实现,而不是有mtext对话框中点右键实现?

(defun c:mt()
  (princ "\n*<创建多行文本>*  指定文字起点:")
  (setvar "cmdecho" 0)
  (setvar "textsize" 300)
  (command "mtext" pause "L" "a" "1x" "s" "standard" "w" "0")
  (princ)
)

上面这代码只能实现在命令行输入宽度为0的多行文本,如何能在这代码中加入背景遮罩?

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

已领礼包: 6个

财富等级: 恭喜发财

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

使用道具 举报

发表于 2006-5-18 21:02:57 | 显示全部楼层
如有可能,请给出一个例子,贴个图
如下是一个autocad高手编的给多个Mtext加Mask的程序,说不定可以改成你需要的,或者你直接就可以用的,对Mask用的不多,和wipeout有什么区别
[php]
;; Written by: Lee Ambrosius
;; Created on: 4/7/2004

;; This program allows you to add Background Mask to several Mtext objects
;; at one time instead of using the Mtext editor for each object or the Properties Palette.

;; The Properties Palette in 2005 doesn't allow you to set Background Color or Border Offset.

(defun c:MTextMASK ( / kWordBackgroundMaskCurrent dOffsetCurrent ssMtext dxf90 dxf63 dxf45 dxf441)
  (prompt "\nApply Mtext Mask")

  (if (= kWordBackgroundMask nil)
    (setq kWordBackgroundMask "Background" kWordBackgroundMaskCurrent "Background")
    (setq kWordBackgroundMaskCurrent kWordBackgroundMask)
  )

  (initget "None Background Color")
  (setq kWordBackgroundMask (getkword (strcat "\nSpecify Background Mask: [None/Background/Color] <" kWordBackgroundMask ">: ")))

  (if (= kWordBackgroundMask nil)
    (setq kWordBackgroundMask kWordBackgroundMaskCurrent)
  )

  (cond ((= kWordBackgroundMask "Color")
            (if (or (= maskClr nil) (/= (type maskClr) 'LIST))
               (setq maskClr (acad_truecolorcli 1))
               (if (= (assoc 420 maskClr) nil)
                 (setq maskClr (acad_truecolorcli (cdr (assoc 62 maskClr))))
                 (setq maskClr (acad_truecolorcli (assoc 420 maskClr)))
               )
            )
        )
        ((= kWordBackgroundMask "Background")(setq maskClr 256))
        ((= kWordBackgroundMask "None")(setq maskClr 0 dOffset 1.0))
  )

  (if (/= maskClr nil)
    (progn
      (if (/= kWordBackgroundMask "None")
        (progn
          (setq dOffsetCurrent dOffset)

          (if (= dOffsetCurrent nil)
            (setq dOffset 1.0 dOffsetCurrent 1.0)
            (setq dOffsetCurrent dOffset)
          )

          (setq dOffset (getreal (strcat "\nSpecify border offset factor: <" (rtos dOffsetCurrent 2 3) ">: ")))
   
          (if (= dOffset nil)
            (setq dOffset dOffsetCurrent)
          )

          (if (> dOffset 5)(setq dOffset nil))
          (if (< dOffset 1)(setq dOffset nil))

          (while (= dOffset nil)
            (setq dOffset (getreal (strcat "\nSpecify border offset factor: <" (rtos dOffsetCurrent 2 3) ">: ")))

            (if (> dOffset 5)(setq dOffset nil))
            (if (< dOffset 1)(setq dOffset nil))
          )
        )
        (if (= dOffset nil)
          (setq dOffset 1.0)
        )
      )

      (if (setq ssMtext (ssget (list (cons 0 "MTEXT"))))
        (progn
          (cond ((= kWordBackgroundMask "None")
                    (setq mask_list (list (cons 90 2)(cons 63 0)(cons 45 dOffset)(cons 441 0))
                          dxf90 2
                          dxf63 nil
                          dxf45 nil
                          dxf441 nil
                    )
                )
                ((and (= kWordBackgroundMask "Color")(/= (assoc 420 maskClr) nil))
                    (setq mask_list (list (cons 90 1)(cons 63 1)(cons 421 (cdr (assoc 420 maskClr)))(cons 45 dOffset)(cons 441 (cdr (assoc 420 maskClr))))
                          dxf90 1
                          dxf63 2
                          dxf45 dOffset
                          dxf441 (cdr (assoc 420 maskClr))
                    )
                )
                ((and (= kWordBackgroundMask "Color")(= (assoc 420 maskClr) nil))
                    (setq mask_list (list (cons 90 1)(cons 63 (cdr (assoc 62 maskClr)))(cons 45 dOffset)(cons 441 2146608))
                          dxf90 1
                          dxf63 (cdr (assoc 62 maskClr))
                          dxf45 dOffset
                          dxf441 nil
                    )
                )
                ((= kWordBackgroundMask "Background")
                    (setq mask_list (list (cons 90 3)(cons 63 3)(cons 45 dOffset)(cons 441 0))
                          dxf90 3
                          dxf63 256
                          dxf45 dOffset
                          dxf441 0
                    )
                )
          )

          (setq emax (sslength ssMtext)
                sscount 0
          )

          (while (< sscount emax)
            (setq EN (entget (ssname ssMtext sscount))
                  tempEN nil)

            (if (/= dxf90 nil)
              (progn
                (if (/= (assoc 90 EN) nil)
                  (setq EN (subst (cons 90 dxf90) (assoc 90 EN) EN))
                  (setq EN (append EN (list (cons 90 dxf90))))
                )
              )
              (progn
                (setq CNT 0
                      nMembers (member (assoc 90 EN) EN))

                (if (= nMembers nil)
                  (setq nMembers 0)
                  (setq nMembers (length nMembers))
                )
                (repeat (- (length EN) nMembers)
                  (setq tempEN (append tempEN (list (nth cnt EN))))
                  (setq CNT (1+ CNT))
                )

                (if (> nMembers 0)
                  (progn
                    (setq CNT 1)
                    (repeat (- nMembers 1)
                      (setq tempEN (append tempEN (list (nth cnt (member (assoc 90 EN) EN)))))
                      (setq CNT (1+ CNT))
                    )
                  )
                )
                (setq EN tempEN
                      tempEN nil)
              )
            )

            
            (if (/= dxf63 nil)
              (progn
                (if (/= (assoc 63 EN) nil)
                  (setq EN (subst (cons 63 dxf63) (assoc 63 EN) EN))
                  (setq EN (append EN (list (cons 63 dxf63))))
                )
              )
              (progn
                (setq CNT 0
                      nMembers (member (assoc 63 EN) EN))

                (if (= nMembers nil)
                  (setq nMembers 0)
                  (setq nMembers (length nMembers))
                )
                (repeat (- (length EN) nMembers)
                  (setq tempEN (append tempEN (list (nth cnt EN))))
                  (setq CNT (1+ CNT))
                )

                (if (> nMembers 0)
                  (progn
                    (setq CNT 1)
                    (repeat (- nMembers 1)
                      (setq tempEN (append tempEN (list (nth cnt (member (assoc 63 EN) EN)))))
                      (setq CNT (1+ CNT))
                    )
                  )
                )
                (setq EN tempEN
                      tempEN nil)
              )
            )

            (if (/= dxf45 nil)
              (progn
                (if (/= (assoc 45 EN) nil)
                  (setq EN (subst (cons 45 dxf45) (assoc 45 EN) EN))
                  (setq EN (append EN (list (cons 45 dxf45))))
                )
              )
              (progn
                (setq CNT 0
                      nMembers (member (assoc 45 EN) EN))

                (if (= nMembers nil)
                  (setq nMembers 0)
                  (setq nMembers (length nMembers))
                )
                (repeat (- (length EN) nMembers)
                  (setq tempEN (append tempEN (list (nth cnt EN))))
                  (setq CNT (1+ CNT))
                )

                (if (> nMembers 0)
                  (progn
                    (setq CNT 1)
                    (repeat (- nMembers 1)
                      (setq tempEN (append tempEN (list (nth cnt (member (assoc 45 EN) EN)))))
                      (setq CNT (1+ CNT))
                    )
                  )
                )
                (setq EN tempEN
                      tempEN nil)
              )
            )

            (if (/= dxf441 nil)
              (progn
                (if (/= (assoc 441 EN) nil)
                  (setq EN (subst (cons 441 dxf441) (assoc 441 EN) EN))
                  (setq EN (append EN (list (cons 441 dxf441))))
                )
              )
              (progn
                (setq CNT 0
                      nMembers (member (assoc 441 EN) EN))

                (if (= nMembers nil)
                  (setq nMembers 0)
                  (setq nMembers (length nMembers))
                )
                (repeat (- (length EN) nMembers)
                  (setq tempEN (append tempEN (list (nth cnt EN))))
                  (setq CNT (1+ CNT))
                )

                (if (> nMembers 0)
                  (progn
                    (setq CNT 1)
                    (repeat (- nMembers 1)
                      (setq tempEN (append tempEN (list (nth cnt (member (assoc 441 EN) EN)))))
                      (setq CNT (1+ CNT))
                    )
                  )
                )
                (setq EN tempEN)
              )
             
            )

            (entmod EN)
            (setq sscount (1+ sscount))
          )
        )
      )
    )
  )
(princ)
)

(prompt "\nType MTEXTMASK to run the command")
(princ)

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

使用道具 举报

 楼主| 发表于 2006-5-18 23:29:57 | 显示全部楼层
最初由 snoopychen 发布
[B]如有可能,请给出一个例子,贴个图
如下是一个autocad高手编的给多个Mtext加Mask的程序,说不定可以改成你需要的,或者你直接就可以用的,对Mask用的不多,和wipeout有什么区别
[php]
;; Written by: Lee Ambrosius
;;... [/B]


具体可以看看这个帖子!
http://www.xdcad.net/forum/showthread.php?s=&threadid=558660

谢谢!
[iframe h=600 w=100%]http://www.xdcad.net/forum/showthread.php?s=&threadid=558660[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 12:24:23 | 显示全部楼层
昨天才装了个07,知道了楼主的意思,经过查询,发现这个mask存在以下几个dxf代码中,
63(颜色),90, 45(边框), 441
本来替换就挺容易的,但是楼主这句
(command "mtext" pause "L" "a" "1x" "s" "standard" "w" "0")里面的pause使的子程序始终无法进行
暂时改成一个getstring,不过这个不能够输入空格和多行,需要再改进

代码如下,可试试,在07下通过
[php]
;;; first by andyhua5240
;;;test by qjchen
(defun c:mt2()
(setvar "cmdecho" 0)
(setvar "textsize" 300)
(setq fff (getpoint "the start point"))
(setq ddd (getstring "the mtext number"))
(command "mtext" fff "L" "a" "1x" "s" "standard" "w" "0" ddd "")
(setq a (entget (entlast)))
(setq a (xd-modent a (list (cons 63 256) (cons 90 3) (cons 45 1.7) (cons 441 0))))
(princ)
)


;;;;;eachy版主的程序
(defun xd-modent (el tylst / c)
  (foreach n tylst
    (if        (setq c (assoc (car n) el))
     (setq el (subst n c el))
      (setq el (append el (list n)))
    )
  )
  (entmod el)
)
  
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 13:55:39 | 显示全部楼层
;; 加一个反应器,在mtext执行之后,马上给实体添加文本遮罩。
[php]
(defun mtfil (a b)
  (if (= "MTEXT" (car b))
    (vla-put-BackgroundFill (vlax-ename->vla-object (entlast)) :vlax-true))
)
(vla-add (vlr-command-reactor nil '((:vlr-commandEnded . mtfil))))
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 16:07:28 | 显示全部楼层

  1. ;;沒那麼簡單的,還要調整MTEXT範圍(未改)
  2. (defun MTFIL (A B)
  3.   (if (wcmatch (car B) "*MTEXT")
  4.     (vla-put-backgroundfill
  5.       (vlax-ename->vla-object (entlast))
  6.       :vlax-true
  7.     )
  8.   )
  9.   (princ)
  10. )
  11. (if (not MTFILL)
  12.   (vlr-command-reactor NIL '((:vlr-commandended . MTFIL)))
  13. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 16:51:24 | 显示全部楼层
原来这个pause会导致这么复杂的问题啊
对于1楼楼主的问题,我觉得要不就等快要出图的时候,再用match实现mask不更好(当然,mtext的写法最好是象楼主那样写的)
不然,mask对于后建立的实体也是不起作用的,似乎挺麻烦的。
现在还是不大搞得清楚et中的textmask和这个mask的关系,3楼程序中的那种mask好像在04中也能用。早期的wipeout好像也是这种功能啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-24 00:25:51 | 显示全部楼层
楼上的大侠们!
小弟我只懂一点点lisp皮毛,还算不上是lisp的小小毛毛虫。看了楼上那么多王牌大侠们回帖,我不胜感激!但是偶还是不明白,不怎么如何是好?因为我就不懂呀!
楼上的大哥们,哪位行行好。能不能把意见整理综合一下。能让偶下载一个附件呀?
谢谢啦!太感谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 375个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 09:27 , Processed in 0.560798 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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