新人写的文字取整的LISP源码,求高手指点
本帖最后由 scream2658 于 2013-8-8 01:47 编辑由于工作中经常要对文本数字按十位数取整。自己写了个LISP程序,但是这个LISP有个BUG:
如果是框选的文字范围不大的话,还能较好的实现我的要求。但是框选的数目比较多的时候就不执行了。
求大神帮忙指点下。作为一个新人真的不知道这个问题出在哪了。谁帮我看下?
程序有的时候能执行,有的时候又不能执行,特别是在框选的时候,经常是执行不了。求解惑。
2013.08.08 夜里睡不着,想了半天终于想出解决的办法了。因为有网友的提示,加上自己的一点思考,我发现问题的症结确实就是对于非纯数字字符串的处理没弄好,才导致取整数的LISP 在选择集中包含有非纯数字文本时会出错。针对这个问题,我又查了下关于字符串的函数,偶然在VLISP函数看到 vl-string->list 这个函数,将字符串转换为字符代码表。试想如果一个字符串是纯数字文本的话,它对应的字符码就应该在0~9这几个字符码之间。何不用一个 IF AND 0< X<9来判断是不是纯数字文本呢?
抱着试一试的心态,粗略写了一个判断字符串是否为纯文本的函数。没想到居然解决问题了。哈哈,真是松了一口大气啊。虽然很晚了。但是心里很开心。哈哈。 现在我把我修改后的LISP源代码发上来给大家帮我测试测试。 希望能发现什BUG最好。
谢谢那位网友的提点,真的很感谢你!
函数虽然写出来,但还是很粗糙,还希望有高手帮我优化下。 一路走来,如蹒跚学步。点滴成长,亦如一笔难得的财富。虽不比千金宝马,亦足矣撩人欣慰。谢谢明经通道让我学到了很多,也谢谢那位热心的网友,你的提示简直就是神来之笔呀! 还得有原图(Dwg)做调试验证之用 (if (/= a c)
(setq d (+ 10 c))
(setq d (fix a))
)
测试了一下,出问题的时候都是因为存在选取的数据已经是整10的时候
因此判断是在上面这段出了问题,后来才发现,你用了itoa这个函数,而d在a=c的时候,是实数而不是整数,所以在你的赋值语句上增加了一个fix,转成整数,后面就可以了
另外,你的统计结果是直接采用选择集的长度,似乎不太合适,应该是修改一次增加1。这样修改的次数才是正确的。
还有改颜色这个,我只知道用command来改,嘿嘿,change命令 本帖最后由 scream2658 于 2013-8-8 00:35 编辑
lyqiezi 发表于 2013-8-7 22:46 static/image/common/back.gif
(if (/= a c)
(setq d (+ 10 c))
(setq d (fix a))
谢谢你的回复,是的,对于原文字是个整数有这个问题。你很细心。我后来把这句加上去了。在测试,如果选择的对象全部都是纯数字的话,函数基本上都能很好的完成。但是又有个新问题,就是如果我的选择集里面包含 非纯数字的文字的话,程序又会出现问题了。
我现在能感觉出来的疑问就是,如果选择集里面的字符串有不是纯数字的话,我的这个LISP没有给出处理的办法。不知道是不是这出现了问题。因为,我发现当有选择含有包含非纯数字的字符串时,程序虽然是取整了。但是我最后加的那个统计个数的回显没有显示。也就是说,最后的语句没有执行。我不知道为什么会没执行,这点是我想不通的。
我现在的办法就是给出一个,当选择集里面包含有非纯数字的文字时,该如何解决。 我 之前提取字符串的数字的时候用的函数是 (setq a (distof text_old)) 而没有用(setq a (atof text_old))
我的想法就是这个过程中就过滤掉那些包含其它字符的非纯数字组成的文字。但是貌似就是这个地方出现问题了。不知道哪个函数可以判断字符串是否是纯数字,还是包含其它字符串的数字?? 求解惑! 如果放弃用子函数,你的统计功能和变色功能还是很容易实现的。 好工具,要学习 下面是简化后的程序;文本数字按十位数取整的函数
;日期:2013.08.06
;作者:CADMAN
;子函数对纯数字文字取整
(defun c:qzs ( / text_old text_new text_el i x nr ss)
(princ "\n请框选要取整的数字:")
(setq ss (ssget '((0 . "TEXT"))))
(setq i 0 text_list nil)
(repeat (setq x (sslength ss))
(setq text_el (entget (ssname ss i)))
(setq txt_old (cdr(assoc 1 text_el))) ;提取文本内容并赋值给变量TEXT_OLD
(if (shuzi text_old) (progn ;如果是数字改内容,否则什么也不做
(setq text_new (itoa (* (fix (/ (+ (atof text_old) 9) 10)) 10))) ;对文本内容取整
(if (assoc 62 text_el);改过的文本变红
(setq text_el (subst '(62 . 1) (assoc 62 text_el) text_el))
(setq text_el (append '((62 . 1))))
)
(entmod (subst (cons 1 text_new) (assoc 1 text_el) text_el));取整后的图元组码修改及图元的生成
))
(setq i (1+ i))
);结束repeat
(princ "总共选择了N=")(princ x) ;统计输出修改了多少个数字
(princ)
)
;子函数,判断一个字符串是否全部为数字
(defun shuzi (text_old / num_list i el)
(setq num_list nil i 0)
(setq num_list (vl-string->list text_old))
(setq n (length num_list))
(foreach el num_list
(if (and (<= el 57) (>= el 48))
(setq i (1+ i))
)
)
(= i n) ;这样可直接返回T或nil
)
测试了楼主的程序,很好用。但是测试ZZXXQQ版主的程序,发现改不了数字,这是为什么? ZZXXQQ版主的程序中text_old少了个字母e,改正后,好像还是不行
页:
[1]
2