明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1197|回复: 6

[源码] 普通文本完美转换到多重文本

[复制链接]
发表于 2016-1-27 20:42 | 显示全部楼层 |阅读模式
本帖最后由 kozmosovia 于 2016-1-30 13:05 编辑

普通文本有%%U、%%O和%%K的控制符,分别对应多重文本的\\O 、\\L和\\K控制符。
一般的文本转多重文本命令,包括ET的命令,均没有考虑这些控制符,在转换带有控制符的普通文本时,生成的多重文本内容面目全非。
本函数充分考虑了普通文本内的控制符并将其正确的转换到多重文本,实现完美的转换。

可使用普通文本内容 d%%Pfd%%O%%Kfhgs%%Ktdfd\%%Unsf%%Kns%%Odg%%Cg%%%%%O{}ad%%D%%Us%%O%%Kff
做个验证

  1. ;;; Name:                _TEXT2MTEXT(2)
  2. ;;; Descryption:        Convert a text into a mtext at very same position
  3. ;;; Argu(1):                Text object
  4. ;;; Argu(2):                Erase text object flag
  5. ;;; ------------------------------------------------------------------------------------------- ;;;
  6. ;;; RetValue(OK)        MTEXT object ename
  7. ;;; RetValue(FAIL)        NIL
  8. (Defun _TEXT2MTEXT (obj flg / _STR2LIST LL MT P0 P1 PX0 PX1 REG STR UR)
  9.   (Defun _STR2LIST (str sep / POS RTN)
  10.     (setq rtn str)
  11.     (cond ((and        (= (type str) (type sep) 'str)
  12.                 (> (strlen sep) 0)
  13.            )
  14.            (if (setq pos (vl-string-search sep str))
  15.              (setq rtn (cons (substr str 1 pos)
  16.                              (_STR2LIST
  17.                                (substr str (+ (strlen sep) pos 1))
  18.                                sep
  19.                              )
  20.                        )
  21.              )
  22.              (setq rtn (list str))
  23.            )
  24.           )
  25.           ((= (type str) 'list)
  26.            (setq rtn (car str))
  27.            (foreach xxx        (cdr str)
  28.              (setq rtn (strcat rtn sep xxx))
  29.            )
  30.           )
  31.     )
  32.     (if        (= (type rtn) (type str) 'str)
  33.       (setq rtn (list rtn))
  34.     )
  35.     rtn
  36.   )
  37.   (setq        obj (entget obj)
  38.         str (cdr (assoc 1 obj))
  39.         reg (vlax-create-object "Vbscript.RegExp")
  40.         px0 1e99
  41.         px1 0
  42.   )
  43.   (foreach abc '("%%U" "%%K" "%%O" "%%u" "%%k" "%%o")
  44.     (setq abc (_STR2LIST str abc)
  45.           px0 (fix (min px0 (strlen (car abc))))
  46.     )
  47.     (if        (= (length abc) 2)
  48.       (setq px1 (fix (max px1 (strlen str))))
  49.       (setq px1 (fix (max px1 (- (strlen str) (strlen (last abc))))))
  50.     )
  51.   )
  52.   (if (< px0 px1)
  53.     (setq str (strcat
  54.                 (substr str 1 px0)
  55.                 (chr 1)
  56.                 (substr str (1+ px0) (- px1 px0))
  57.                 (chr 2)
  58.                 (substr str (1+ px1))
  59.               )
  60.     )
  61.   )
  62.   (vlax-put-property reg "IgnoreCase" 0)
  63.   (vlax-put-property reg "Global" 1)
  64.   (foreach el (list (cons "%%%" (chr 3))
  65.                     (cons "\\\" (chr 4))
  66.                     (cons "{" (chr 5))
  67.                     (cons "}" (chr 6))
  68.                     (cons "%%(U|u)" "\\L")
  69.                     (cons "%%(K|k)" "\\K")
  70.                     (cons "%%(O|o)" "\\O")
  71.                     (cons "\n" "\\P")
  72.                     (cons (chr 1) "{")
  73.                     (cons (chr 2) "}")
  74.                     (cons (chr 3) "%")
  75.                     (cons (chr 4) "\\\")
  76.                     (cons (chr 5) "\\{")
  77.                     (cons (chr 6) "\\}")
  78.               )
  79.     (vlax-put-property reg "Pattern" (car el))
  80.     (setq str (vlax-invoke-method reg "Replace" str (cdr el)))
  81.   )
  82.   (foreach abc '("\\k" "\\l" "\\o")
  83.     (setq px0 0
  84.           px1 ""
  85.     )
  86.     (foreach acc (_STR2LIST str (strcase abc))
  87.       (cond ((= px0 0)
  88.              (if (= px1 "")
  89.                (setq px1 acc)
  90.                (setq px1 (strcat px1 abc acc))
  91.              )
  92.             )
  93.             ((= px0 1)
  94.              (setq px1 (strcat px1 (strcase abc) acc))
  95.             )
  96.       )
  97.       (setq px0 (abs (1- px0)))
  98.     )
  99.     (setq str px1)
  100.   )
  101.   (vlax-release-object reg)
  102.   (entmake (list (cons 0 "MTEXT")
  103.                  (cons 8 (cdr (assoc 8 obj)))
  104.                  (cons 100 "AcDbEntity")
  105.                  (cons 100 "AcDbMText")
  106.                  (cons 10 (cdr (assoc 10 obj)))
  107.                  (cons 40 (cdr (assoc 40 obj)))
  108.                  (cons 41 0)
  109.                  (cons 71 1)
  110.                  (cons 72 5)
  111.                  (cons 1 str)
  112.                  (cons 7 (cdr (assoc 7 obj)))
  113.                  (list 11 1.0 0.0 0.0)
  114.                  (cons 50 (cdr (assoc 50 obj)))
  115.            )
  116.   )
  117.   (setq        obj (cdr (assoc -1 obj))
  118.         mt  (entlast)
  119.   )
  120.   (vla-getboundingbox (vlax-ename->vla-object obj) 'll 'ur)
  121.   (setq        ll (vlax-safearray->list ll)
  122.         ur (vlax-safearray->list ur)
  123.         p1 (vlax-3d-point (list (car ll) (cadr ur)))
  124.   )
  125.   (vla-getboundingbox (vlax-ename->vla-object mt) 'll 'ur)
  126.   (setq        ll (vlax-safearray->list ll)
  127.         ur (vlax-safearray->list ur)
  128.         p0 (vlax-3d-point (list (car ll) (cadr ur)))
  129.   )
  130.   (vla-move (vlax-ename->vla-object mt) p0 p1)
  131.   (if flg
  132.     (entdel obj)
  133.   )
  134.   mt
  135. )

评分

参与人数 2明经币 +2 金钱 +10 收起 理由
USER2128 + 1 很给力!
lucas_3333 + 1 + 10 神马都是浮云

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2016-1-27 21:09 | 显示全部楼层
赞一个
发表于 2016-1-28 14:55 | 显示全部楼层
还好我普通文本没控制符
发表于 2016-1-30 08:10 | 显示全部楼层
普通文本变成多重文本,一般问题都可以解决,控制符不太好弄啊!,不知道这个怎么做的
发表于 2016-1-30 12:24 | 显示全部楼层
代码没贴全啊,怎么验证?
 楼主| 发表于 2016-1-30 13:06 | 显示全部楼层
网站代码系统有问题,修改代码后,后面的代码被砍掉了。
已经补回来
发表于 2016-2-1 08:47 | 显示全部楼层
我读书少,是不是普通文本转多重文本的情况比较少?更多的情况是从多重文本转普通文本?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 01:31 , Processed in 0.366718 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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