明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4965|回复: 10

怎样提取MTEXT里的纯粹的文字内容?

  [复制链接]
发表于 2005-11-15 15:49:00 | 显示全部楼层 |阅读模式

MTEXT的1组码里的内容是这样的:

"正常{\\fSimSun|b0|i0|c134|p2;宋体内容\\fSimHei|b0|i0|c134|p2;黑体内容\\Ftxt.shx,gbcbig.shx|c134;\\H2x;大字内容\\H0.4x;小字内容}正常"

但我需要的是其中的纯粹的文字内容,需要剔除掉格式控制字符串,除了自己编一个字符串分析程序之外,各位大侠能给个简单的法子么?

 楼主| 发表于 2005-11-16 09:13:00 | 显示全部楼层
龙版主飞版主,飞龙在天,快帮忙想个法子吧,不然我就得开始做字符串分解函数了,头痛呀!
发表于 2005-11-16 09:27:00 | 显示全部楼层

不记得谁写的了,以前贴过

(defun UnFormat (Mtext KeepLF / Text Str)
  (vl-load-com)
  (cond
    ((= (type Mtext) 'VLA-Object))
    ((= (type Mtext) 'ENAME)
      (setq Mtext (vlax-ename->vla-object Mtext))
    )
    (1 (setq Mtext nil))
  )
  (and
    Mtext
    (= (vlax-get Mtext 'ObjectName) "AcDbMText")
    (setq Mtext (vlax-get Mtext 'TextString))
    (setq Text "")
    (while (/= Mtext "")
      (cond
        ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}`~]")
          (setq Mtext (substr Mtext 3)
                Text   (strcat Text Str)
          )
        )
        ((wcmatch (substr Mtext 1 1) "[{}]")
          (setq Mtext (substr Mtext 2))
        )
        ((and KeepLF (wcmatch (strcase (substr Mtext 1 2)) "\\P"))
          (setq Mtext (substr Mtext 3)
                Text  (strcat Text "\\P")
          )
        )
        ((wcmatch (strcase (substr Mtext 1 2)) "\\[LOP]")
          (setq Mtext (substr Mtext 3))
        )
        ((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
          (setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext))))
        )
        ((wcmatch (strcase (substr Mtext 1 2)) "\\S")
          (setq Str   (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
                Text  (strcat Text (vl-string-translate "#^\\" "   " Str))
                Mtext (substr Mtext (+ 4 (strlen Str)))
          )
          (print Str)
        )
        (1
          (setq Text (strcat Text (substr Mtext 1 1))
                Mtext (substr Mtext 2)
          )
        )
      )
    )
  )
  Text
)

 楼主| 发表于 2005-11-16 09:48:00 | 显示全部楼层

不错不错,正合我用.祝飞版主越飞越高.还得谢谢写这代码的那位无名英雄.

 楼主| 发表于 2005-11-16 11:01:00 | 显示全部楼层

有一点小问题:

Text  (strcat Text (vl-string-translate "#^\\" "   " Str))

这行代码并不完全正确,不过不是它的错,因为AUTOCAD的帮助文件里就是错的,MTEXT里的堆迭有三种,分别用 # ^ / 三个字符分割(第三个是正斜杠),帮助文件里写的是 # ^ \ 三个字符(第三个是反斜杠),实际上用反斜杠是不能产生堆迭文字的.所以正确的代码是:

Text  (strcat Text (vl-string-translate "#^/" "   " Str))

 楼主| 发表于 2005-11-16 11:33:00 | 显示全部楼层

还有一个问题,就是对少量凑巧的汉字会产生错误的结果,比如 "朶LAB",它得到的结果是 "朅B" ,因为 "朶" 字的第二个字节是 92, 恰好是 "\" 的ASCII 码,好在这样凑巧的字不多.再修正一下吧:

.....

        ((wcmatch (strcase (substr Mtext 1 2)) "\\S")
          (setq Str   (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
                Text  (strcat Text (vl-string-translate "#^/" "   " Str))
                Mtext (substr Mtext (+ 4 (strlen Str)))
          )
        )
 ((> (ascii Mtext) 127)
  (setq Text (strcat Text (substr Mtext 1 2))
        Mtext (substr Mtext 3)
        )
  )
        (1
          (setq Text (strcat Text (substr Mtext 1 1))
                Mtext (substr Mtext 2)
          )
        )

......

这样改可以完全兼容双字节汉字了,可是好象还有三字节、四字节的文字,不知道什么情况下会遇到,哪位大侠指点一二?

发表于 2005-11-16 14:39:00 | 显示全部楼层
楼上真够细心的,,,佩服!
发表于 2005-11-16 15:21:00 | 显示全部楼层

钻研问题就是要向楼上那样的细心,支持、顶一下。

发表于 2005-11-17 07:45:00 | 显示全部楼层

有一个很有效,准确率高的办法,如果你不嫌麻烦。。。

就是“炸”

发表于 2005-11-17 08:38:00 | 显示全部楼层

哈哈,你的这个方法不是已经被人驳过了吗?

多行的,就....

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 00:40 , Processed in 0.299112 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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