尘缘一生 发表于 2014-5-27 22:57:07

求文字与数字字符炸开程序!

本帖最后由 尘缘一生 于 2014-5-27 23:23 编辑

问题的提出:

    对于设计者来说,文字与数字、字符混编的内容炸开,多见与网上源码,炸开是单个汉字,单个数字字符的,其实,我们的最终目的,是炸开后,文字还是一串,数字与字符是一串,要单个的有什么用呢?为此特求高手编写源码LISP!

举例:

      《建筑结构荷载规范》《GB5009-2001》(2006年版)

      单个炸开结果为:“《”"建“ ”筑“ ”结“.........”5“ ”0“..........;此不可取!

      我们的目的是:”《“ ”建筑结构荷载规范“   ”《“ ”GB5009-2001"....... 这样子,一句话:汉字是一串,不要炸开,数字字符是一串,不要单个炸开,也就是按汉子与数字字符两类各自一串独立即可!


gaics 发表于 2014-5-28 07:55:31

您怎么什么都要炸啊

gaics 发表于 2014-5-28 08:18:39

用ascii码一个字一个字地判断呗。我觉得 llsheng_73 写的一个“倒置字符串”应该对你有帮助,原帖找不到了。我根据他的程序也写了一个“每20个汉字或19个半汉字插入40个空格的程序”,给你参考一下(defun strcut(str instr / a b ss i str2)
(setq ss '())
(if (and (>= (strlen str)0)(<= (strlen str)40))
    (setq b str)
    (progn
      (while (> (strlen str)40)
        (setq b "")
        (while(> str "")
          (if(<(ascii(substr str 1 1))129)
          (cond
              ((< (strlen b) 39)
             (setq b(strcat b(substr str 1 1))
                     str(substr str 2)
                     )
             (setq str2 str)
              )
              ((= (strlen b) 39)
             (setq b(strcat b(substr str 1 1))
                     str(substr str 2)
                     )
             (setq b(strcat b instr))
             (setq ss(cons b ss))
             (setq str2 str)
             (setq str "")
              )
          )
          (cond
              ((< (strlen b) 38)
             (setq b(strcat b(substr str 1 2))
                     str(substr str 3)
             )
             (setq str2 str)
              )
              ((= (strlen b) 38)
             (setq b(strcat b(substr str 1 2))
                     str(substr str 3)
                     )
             (setq b(strcat b instr))
             (setq ss(cons b ss))
             (setq str2 str)
             (setq str "")
              )
              ((= (strlen b) 39)
             (setq b(strcat b instr " "))
             (setq ss(cons b ss))
             (setq str2 str)
             (setq str "")
              )
          )
          )
        )
        (setq str str2)
        (while (and (> (strlen str)0)(<= (strlen str)40))
          (setq ss (cons str ss))
          (setq str "")
        )
      )
      (setq i 0
          b "")
      (setq ss(reverse ss))
      (while (< i (length ss))
        (setq b(strcat b (nth i ss)))
        (setq i(+ i 1))
      )
    )
)
b
)

mikewolf2k 发表于 2014-5-28 09:21:03

这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么处理呢?作为一个字符串的话,就违反了楼主自己说的汉字和数字分开的原则;分成“2006”和“年版”两个字符串,想必这也不是楼主自己需要的结果吧?
另外提供一下思路,很久以前我做过一个程序,把单个的字符合并,只需要框选需要合并的单个字符,例如 "建“ ”筑“ ”结“ ”5“ ”0“,最终合并成一个字符串 "建筑结50“。

尘缘一生 发表于 2014-5-28 09:58:05

gaics 发表于 2014-5-28 07:55 static/image/common/back.gif
您怎么什么都要炸啊

如今:设计软件太乱,PKPM,天正。。。。

    不同画图的文字系统也很乱,你拿来别人的图,文字不是错位就是压堆,你除非是和其他专业用的一套软件包,否则,你想完美修改,最好所有图素单个。

llsheng_73 发表于 2014-5-28 12:06:08

本帖最后由 llsheng_73 于 2014-5-28 14:45 编辑

(defun c:tt()
(setq a"这是一串7888乱七八糟的有汉字有数字5555")
(setq b(vl-string->list a)
        c""d""e""f""g""h"")
(foreach x b
    (cond((< -1 x 32)(setq c (strcat c(chr x))));;非打印字符
       ((< 31 x 48)(setq d (strcat d(chr x))))
       ((< 47 x 58)(setq e (strcat e(chr x))));;数字字符0-9
       ((< 57 x 65)(setq f (strcat f(chr x))))
       ((< 64 x 128)(setq g (strcat g(chr x))));;字母及一些符号
       ((> x 127)(setq h (strcat h(chr x))))));;以连续两个ascii表示一个全角字符
(list e h))

(defun tt(a / b c d e)
(setq b(vl-string->list a))
(while(cdr b)
    (setq a(car b)b(cdr b)c(car b)d(list a))
    (while(or(and(< -1 a 32)(< -1 c 32))
             (and(< 31 a 48)(< 31 c 48))
             (and(< 47 a 58)(< 47 c 58))
             (and(< 57 a 65)(< 57 c 65))
             (and(< 64 a 129)(< 64 c 129))
             (and(> a 128)(> c 128))
             (and(> a 128)(< c 129)(/=(length d)(*(/(length d)2)2))))
      (setq d(cons c d)a(car b)b(cdr b)c(car b)))
    (setq e(cons(reverse d)e)))
(mapcar'VL-LIST->STRING(reverse e))
)

C:TT
_$ (c:tt)
("78885555" "这是一串乱七八糟的有汉字有数字")
$ (tt"这是一串7888乱七八糟的55〓↓― ̄_ 55<>??~!$%^&*())■△+\/.")
("这是一串" "7888" "乱七八糟的" "55" "〓↓―" " ̄_" " " "55" "<>??" "~" "!$%" "^" "&*())" "■△" "+/.")
估计楼主是希望后边一种,不过tt还有点问题,返回的55后边两项应该是一项,因为它们都是全角字符,但一时弄不好了,自己想下办法吧

不过这文字其实没必要炸开它,能从里边获取是需要的信息就行了,非要把它弄成几个文字对象真没多大必要,当然,如果非要弄成几个文字也不是不可以,先是把文字对象的内容改成第一段,在它的后边生成第二段。。。。

gaics 发表于 2014-5-28 12:07:25

尘缘一生 发表于 2014-5-28 09:58 static/image/common/back.gif
如今:设计软件太乱,PKPM,天正。。。。

    不同画图的文字系统也很乱,你拿来别人的图,文字不是错 ...

提供具体的图纸可能会更好的解决

lyqiezi 发表于 2014-5-28 21:06:26

我反而觉得全部连起来的比较好,要编辑的时候,只需要编辑一个,如果一行字被炸开成n段文字,不但编辑次数增加,而且由于编辑后的文字长度变化,不同的段还要移动很多次
所以,我更喜欢探索者的连接成组的功能,天正的文字炸开后就是中英文分开的,我就用探索者把它们都连成组,便于段落编辑

mikewolf2k 发表于 2014-5-29 08:27:52

mikewolf2k 发表于 2014-5-28 09:21 static/image/common/back.gif
这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么 ...

请问“2006年版”怎么处理?
个人比较赞同8楼的观点,炸开了更加增加工作量。当然楼主所说的天正啥的,没见过,所以也不了解具体情况,不了解楼主的最终目的。
我以前做这个连接字符串的程序,就是因为碰到一种图,所有的字符都是单个的,如果要做插入删除字符串的修改工作,就费了老劲了,后面所有字符都得移动。这种图是怎么造成的,不清楚,个人猜想是一种“软”的防修改手段,要dwg源文件,给了,要文字还是字符状态而不是炸成线条,也符合了,嘿嘿,可就是让你不能直接修改!
另外印象中,论坛里有位高人做过一个程序,鼠标点击一个字符串,根据鼠标点击的具体位置的不同,返回点击点位置的单个字符。供楼主参考思路。不过具体位置记不得了,抱歉。

尘缘一生 发表于 2014-5-29 16:10:10

本帖最后由 尘缘一生 于 2014-5-29 16:27 编辑

为了说明问题,截图大家看看.



       这张文字图纸,为什么出现这个问题,原因就是,他每趟文本,都是左夹点字,而且汉字、数字一块,还是MTEXT写出的,

      你不愿意一行行从右往左调,就必须炸开,才快速处理它,就因为没有完美炸开程序,也只有炸开一个个的算啦,所以我才发帖找这样的程序。

         假如一个工程师要想自己设计的图,被世界各地打开都版面完美无缺,
          哪唯一结果就是:所有图素单个!

       假如你设计的图,你自己用没问题,自己设计院用没问题,你给别的人、别的设计院用,就打开有问题,或者你到打印部打印,人家打开就乱七八糟,哪么一句话:这位设计师,永远只是个自己得设计师,还早来。大家觉得我说的奇怪?你们有一万个理由:

       1:什么什么,交流现在不都PDF嘛?错,PDF不可编辑,人家要你的图干什么?唯一作用,看看,打印,二次要设计的,要用的。
       2:不会PDF2DWG吗?好,你能完美解决几个?
       3:如今的设计人员都自傲,对自己得图纸满意,可他根本不知道,别人拿到你的图,会一眼发现你的设计水平,需要给你改动很多的,又怕打击你的自尊,不好名言讲,而你那?好保密不传给DWG,当然传了也枉然,因为你的图乱七八糟,哪也省事多了,毕竟不用从头一笔笔画。

      你永远不可能叫所有人的CAD系统给你一样,一句话:只有适应社会,变你的CAD系统,适合说有人!文字系统适合所有人的结果之一,那就是:所有图素单个存在。


   
页: [1] 2 3
查看完整版本: 求文字与数字字符炸开程序!