明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5765|回复: 23

[已解答] 求文字与数字字符炸开程序!

[复制链接]
发表于 2014-5-27 22:57:07 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2014-5-27 23:23 编辑

问题的提出:

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

举例:

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

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

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



"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-5-28 07:55:31 | 显示全部楼层
您怎么什么都要炸啊

点评

如今:设计软件太乱,PKPM,天正。。。。 不同画图的文字系统也很乱,你拿来别人的图,文字不是错位就是压堆,你除非是和其他专业用的一套软件包,否则,你想完美修改,最好所有图素单个。  发表于 2014-5-28 10:04
发表于 2014-5-28 08:18:39 | 显示全部楼层
用ascii码一个字一个字地判断呗。我觉得 llsheng_73 写的一个“倒置字符串”应该对你有帮助,原帖找不到了。我根据他的程序也写了一个“每20个汉字或19个半汉字插入40个空格的程序”,给你参考一下
  1. (defun strcut(str instr / a b ss i str2)
  2.   (setq ss '())
  3.   (if (and (>= (strlen str)0)(<= (strlen str)40))
  4.     (setq b str)
  5.     (progn
  6.       (while (> (strlen str)40)
  7.         (setq b "")
  8.         (while(> str "")
  9.           (if(<(ascii(substr str 1 1))129)
  10.             (cond
  11.               ((< (strlen b) 39)
  12.                (setq b(strcat b(substr str 1 1))
  13.                      str(substr str 2)
  14.                      )
  15.                (setq str2 str)
  16.               )
  17.               ((= (strlen b) 39)
  18.                (setq b(strcat b(substr str 1 1))
  19.                      str(substr str 2)
  20.                      )
  21.                (setq b(strcat b instr))
  22.                (setq ss(cons b ss))
  23.                (setq str2 str)
  24.                (setq str "")
  25.               )
  26.             )
  27.             (cond
  28.               ((< (strlen b) 38)
  29.                (setq b(strcat b(substr str 1 2))
  30.                      str(substr str 3)
  31.                )
  32.                (setq str2 str)
  33.               )
  34.               ((= (strlen b) 38)
  35.                (setq b(strcat b(substr str 1 2))
  36.                      str(substr str 3)
  37.                      )
  38.                (setq b(strcat b instr))
  39.                (setq ss(cons b ss))
  40.                (setq str2 str)
  41.                (setq str "")
  42.               )
  43.               ((= (strlen b) 39)
  44.                (setq b(strcat b instr " "))
  45.                (setq ss(cons b ss))
  46.                (setq str2 str)
  47.                (setq str "")
  48.               )
  49.             )
  50.           )
  51.         )
  52.         (setq str str2)
  53.         (while (and (> (strlen str)0)(<= (strlen str)40))
  54.           (setq ss (cons str ss))
  55.           (setq str "")
  56.         )
  57.       )
  58.       (setq i 0
  59.             b "")
  60.       (setq ss(reverse ss))
  61.       (while (< i (length ss))
  62.         (setq b(strcat b (nth i ss)))
  63.         (setq i(+ i 1))
  64.       )
  65.     )
  66.   )
  67.   b
  68. )

点评

如今:设计软件太乱,PKPM,天正。。。。 不同画图的文字系统也很乱,你拿来别人的图,文字不是错位就是压堆,你除非是和其他专业用的一套软件包,否则,你想完美修改,最好所有图素单个。  发表于 2014-5-28 10:03
这个自定义函数很有意思  发表于 2014-5-28 08:26
发表于 2014-5-28 09:21:03 | 显示全部楼层
这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么处理呢?作为一个字符串的话,就违反了楼主自己说的汉字和数字分开的原则;分成“2006”和“年版”两个字符串,想必这也不是楼主自己需要的结果吧?
另外提供一下思路,很久以前我做过一个程序,把单个的字符合并,只需要框选需要合并的单个字符,例如 "建“ ”筑“ ”结“ ”5“ ”0“,最终合并成一个字符串 "建筑结50“。

点评

可以问题简化处理: 第一步:判断汉字出来,相邻的字一串,不炸开总行吧?在这步炸开其他非汉字所有图素! 第二步:判断非汉字图素,调用字符串合并(已经有现成的编程),在合并了它!  发表于 2014-5-28 10:02
 楼主| 发表于 2014-5-28 09:58:05 | 显示全部楼层
gaics 发表于 2014-5-28 07:55
您怎么什么都要炸啊

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

    不同画图的文字系统也很乱,你拿来别人的图,文字不是错位就是压堆,你除非是和其他专业用的一套软件包,否则,你想完美修改,最好所有图素单个。
发表于 2014-5-28 12:06:08 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-5-28 14:45 编辑

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

  13. (defun tt(a / b c d e)
  14.   (setq b(vl-string->list a))
  15.   (while(cdr b)
  16.     (setq a(car b)b(cdr b)c(car b)d(list a))
  17.     (while(or(and(< -1 a 32)(< -1 c 32))
  18.              (and(< 31 a 48)(< 31 c 48))
  19.              (and(< 47 a 58)(< 47 c 58))
  20.              (and(< 57 a 65)(< 57 c 65))
  21.              (and(< 64 a 129)(< 64 c 129))
  22.              (and(> a 128)(> c 128))
  23.              (and(> a 128)(< c 129)(/=(length d)(*(/(length d)2)2))))
  24.       (setq d(cons c d)a(car b)b(cdr b)c(car b)))
  25.     (setq e(cons(reverse d)e)))
  26.   (mapcar'VL-LIST->STRING(reverse e))
  27.   )


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

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

点评

非常感谢,其实,没必要100%完美的,能解决90%问题,已经很好的,也省了大量的精力。  发表于 2014-5-28 17:30
发表于 2014-5-28 12:07:25 | 显示全部楼层
尘缘一生 发表于 2014-5-28 09:58
如今:设计软件太乱,PKPM,天正。。。。

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

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

点评

不信你打开天正说明图看看,那个不是MTEXT写的,一堆?假如你的汉字库不行,它会超过表格很长很长,乱七八糟!  发表于 2014-5-28 17:45
设计人员的时间及其宝贵,要的功能,就一定在桌面,一键得到!  发表于 2014-5-28 17:41
如今,天正这些软件开发商,都不是设计人员开发,根本不知道设计人员要什么功能,造成了很大麻烦!比如:PKPM编辑平台,就没有,等距便宜复制,要吗?哪你还得:-->下拉菜单--->,你叫设计人员对于点了多少鼠标!   发表于 2014-5-28 17:41
它里面就设置文字、数字、字符是“双穴点”的,*.t图转过来,就是这个,为此,PKPM,还提供什么转化LISP,为了适应天正等其他,可笑之极,就因为我搞不到老版本R10版啦。  发表于 2014-5-28 17:38
恩,具体图纸也就是运用PKPM的工程师,在处理天正系列图时的问题! PKPM,CFG里面有个ACAD.DWG文件,这个文件的设置,是基于AUTOCAD R10版的,多年前,我有R10版,经常开发,修改这个原始文件,比如,  发表于 2014-5-28 17:35
发表于 2014-5-28 21:06:26 | 显示全部楼层
我反而觉得全部连起来的比较好,要编辑的时候,只需要编辑一个,如果一行字被炸开成n段文字,不但编辑次数增加,而且由于编辑后的文字长度变化,不同的段还要移动很多次
所以,我更喜欢探索者的连接成组的功能,天正的文字炸开后就是中英文分开的,我就用探索者把它们都连成组,便于段落编辑

点评

不矛盾,我的意思是:汉字是汉字,字符是字符,各自成块,不要炸开,为实现这可结果,不就得先炸开吗?要么就得先把这一趟分割了,怎么判断,分割的问题,最终结果不是一个个的。因为它是字符汉字一个内容,没分。  发表于 2014-5-29 15:54
发表于 2014-5-29 08:27:52 | 显示全部楼层
mikewolf2k 发表于 2014-5-28 09:21
这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么 ...

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

点评

2006年版不一样吗?2006 一块,年版一块即可。  发表于 2014-5-29 15:49
假如你不炸开,你修改其中一个内容,好办,你就解决不了这一行文字变长的问题,哪么怎么办?你只有点出夹点出来,从右边往左边拉回来!这会占用很多时间的,为啥,要知道,权威的PKPM,可都是“双穴点”。  发表于 2014-5-29 15:48
这不对了吗?你打开图是单个字符的,不是加密,是哪个设计人员编辑,没法,没本帖的程序,只能用单个炸开啦。为啥?因为不炸开,就会变得一陀螺很长很长,超过范围和表格,炸开就恢复应该的总长度!  发表于 2014-5-29 15:45
 楼主| 发表于 2014-5-29 16:10:10 | 显示全部楼层
本帖最后由 尘缘一生 于 2014-5-29 16:27 编辑

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



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

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

         假如一个工程师要想自己设计的图,被世界各地打开都版面完美无缺,

          哪唯一结果就是:所有图素单个!

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


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

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


   

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-5-24 14:04 , Processed in 0.212268 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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