求文字与数字字符炸开程序!
本帖最后由 尘缘一生 于 2014-5-27 23:23 编辑问题的提出:
对于设计者来说,文字与数字、字符混编的内容炸开,多见与网上源码,炸开是单个汉字,单个数字字符的,其实,我们的最终目的,是炸开后,文字还是一串,数字与字符是一串,要单个的有什么用呢?为此特求高手编写源码LISP!
举例:
《建筑结构荷载规范》《GB5009-2001》(2006年版)
单个炸开结果为:“《”"建“ ”筑“ ”结“.........”5“ ”0“..........;此不可取!
我们的目的是:”《“ ”建筑结构荷载规范“ ”《“ ”GB5009-2001"....... 这样子,一句话:汉字是一串,不要炸开,数字字符是一串,不要单个炸开,也就是按汉子与数字字符两类各自一串独立即可!
您怎么什么都要炸啊 用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
) 这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么处理呢?作为一个字符串的话,就违反了楼主自己说的汉字和数字分开的原则;分成“2006”和“年版”两个字符串,想必这也不是楼主自己需要的结果吧?
另外提供一下思路,很久以前我做过一个程序,把单个的字符合并,只需要框选需要合并的单个字符,例如 "建“ ”筑“ ”结“ ”5“ ”0“,最终合并成一个字符串 "建筑结50“。 gaics 发表于 2014-5-28 07:55 static/image/common/back.gif
您怎么什么都要炸啊
如今:设计软件太乱,PKPM,天正。。。。
不同画图的文字系统也很乱,你拿来别人的图,文字不是错位就是压堆,你除非是和其他专业用的一套软件包,否则,你想完美修改,最好所有图素单个。
本帖最后由 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后边两项应该是一项,因为它们都是全角字符,但一时弄不好了,自己想下办法吧
不过这文字其实没必要炸开它,能从里边获取是需要的信息就行了,非要把它弄成几个文字对象真没多大必要,当然,如果非要弄成几个文字也不是不可以,先是把文字对象的内容改成第一段,在它的后边生成第二段。。。。 尘缘一生 发表于 2014-5-28 09:58 static/image/common/back.gif
如今:设计软件太乱,PKPM,天正。。。。
不同画图的文字系统也很乱,你拿来别人的图,文字不是错 ...
提供具体的图纸可能会更好的解决 我反而觉得全部连起来的比较好,要编辑的时候,只需要编辑一个,如果一行字被炸开成n段文字,不但编辑次数增加,而且由于编辑后的文字长度变化,不同的段还要移动很多次
所以,我更喜欢探索者的连接成组的功能,天正的文字炸开后就是中英文分开的,我就用探索者把它们都连成组,便于段落编辑 mikewolf2k 发表于 2014-5-28 09:21 static/image/common/back.gif
这个很难有一个通用的程序,就拿楼主自己举的例子说吧,楼主只说了前面两段的例子,第三段“2006年版”怎么 ...
请问“2006年版”怎么处理?
个人比较赞同8楼的观点,炸开了更加增加工作量。当然楼主所说的天正啥的,没见过,所以也不了解具体情况,不了解楼主的最终目的。
我以前做这个连接字符串的程序,就是因为碰到一种图,所有的字符都是单个的,如果要做插入删除字符串的修改工作,就费了老劲了,后面所有字符都得移动。这种图是怎么造成的,不清楚,个人猜想是一种“软”的防修改手段,要dwg源文件,给了,要文字还是字符状态而不是炸成线条,也符合了,嘿嘿,可就是让你不能直接修改!
另外印象中,论坛里有位高人做过一个程序,鼠标点击一个字符串,根据鼠标点击的具体位置的不同,返回点击点位置的单个字符。供楼主参考思路。不过具体位置记不得了,抱歉。 本帖最后由 尘缘一生 于 2014-5-29 16:27 编辑
为了说明问题,截图大家看看.
这张文字图纸,为什么出现这个问题,原因就是,他每趟文本,都是左夹点字,而且汉字、数字一块,还是MTEXT写出的,
你不愿意一行行从右往左调,就必须炸开,才快速处理它,就因为没有完美炸开程序,也只有炸开一个个的算啦,所以我才发帖找这样的程序。
假如一个工程师要想自己设计的图,被世界各地打开都版面完美无缺,
哪唯一结果就是:所有图素单个!
假如你设计的图,你自己用没问题,自己设计院用没问题,你给别的人、别的设计院用,就打开有问题,或者你到打印部打印,人家打开就乱七八糟,哪么一句话:这位设计师,永远只是个自己得设计师,还早来。大家觉得我说的奇怪?你们有一万个理由:
1:什么什么,交流现在不都PDF嘛?错,PDF不可编辑,人家要你的图干什么?唯一作用,看看,打印,二次要设计的,要用的。
2:不会PDF2DWG吗?好,你能完美解决几个?
3:如今的设计人员都自傲,对自己得图纸满意,可他根本不知道,别人拿到你的图,会一眼发现你的设计水平,需要给你改动很多的,又怕打击你的自尊,不好名言讲,而你那?好保密不传给DWG,当然传了也枉然,因为你的图乱七八糟,哪也省事多了,毕竟不用从头一笔笔画。
你永远不可能叫所有人的CAD系统给你一样,一句话:只有适应社会,变你的CAD系统,适合说有人!文字系统适合所有人的结果之一,那就是:所有图素单个存在。