找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5417|回复: 32

[LISP程序]:文本求和xtcal程序,支持文本中多个数字

[复制链接]
发表于 2004-1-4 21:01:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
文本数字求和xtcal程序
对选集中文本进行所有数字计算(支持选择集),支持text,mtext中有多个数字字符串,支持字符串中小数,负数:
;;返回: 如文本中有数字,数字相加后写文本,并返回求和数值(非字符串).无有效数字返回nil.
;;注意:文本中的数字必须为正常格式,对 3.2.1 返回错误结果(=3),对 . . 2.1 两个以上连续点返回错误. --1.6 不能连负号.

  1. (defun xtcal ( / ss filter mspace n e str asclst strs add pt txt txth)
  2.   (defun *error* (msg) (if ss (x_draw ss 4)) (setq *error* oerr))
  3.   (princ "\n文本数字求和-----------------------陌生人.2004.1")
  4.   (princ "\n选择要计算的文本(支持*TEXT选择集):")
  5.   (setq oerr *error*
  6.         ss (ssget '((0 . "*TEXT")))
  7.         filter "0123456789.-+"
  8.         mspace (vla-get-modelspace(vla-get-activedocument (vlax-get-acad-object)))
  9.         str nil strs nil)
  10.   (if ss
  11.     (repeat (setq n (sslength ss))
  12.       (x_draw ss 3)
  13.       (setq n (1- n)
  14.             e (ssname ss n)
  15.             str (vla-get-textstring(vlax-ename->vla-object e))
  16.             asclst (mapcar '(lambda (x) (if (vl-string-search  (chr x) filter) x 32)) (vl-string->list str))
  17.             strs (strcat (if strs strs " ") (apply 'strcat (mapcar 'chr asclst)) " "))
  18.       )
  19.     )
  20.   (if (and ss (/= "" strs))
  21.     (progn
  22.       (setq add (eval (read (strcat "(+ " strs ")"))))
  23.       (princ "\n文本数字和为: ")(princ add)
  24.       (if (setq pt (getpoint "\n标注位置<重新计算>:"))
  25.           (progn
  26.             (setq prec (getint "\n精度(小数位数):")
  27.                   txt (rtos add 2 prec)
  28.                   txth (getdist "\n字高:"))
  29.             (vla-addtext mspace txt (vlax-3D-point pt) txth)
  30.             (x_draw ss 4)
  31.             (princ) add)
  32.          (progn (if ss (x_draw ss 4))(xtcal));多次<重新计算>可以作为一个简易统计查看器.
  33.       )
  34.     )
  35.     (progn (princ "\n!空选集或文本中无有效数字!\n") nil)
  36.   )
  37. )
  38. ;;配套程序(x_draw ss key)
  39. (defun x_draw (ss key / n e)
  40.   (if (= 'PICKSET (type ss))
  41.     (repeat (setq n (sslength ss))
  42.       (setq n (1- n)
  43.             e (ssname ss n))
  44.       (redraw e key)
  45.     )
  46.   )
  47. )


其实取得数字文本的语句很简短,就是
(if ss
    (repeat (setq n (sslength ss))
      (setq n (1- n)
            e (ssname ss n)
            str (vla-get-textstring(vlax-ename->vla-object e))
            asclst (mapcar '(lambda (x) (if (vl-string-search  (chr x) filter) x 32)) (vl-string->list str))
            strs (strcat (if strs strs " ") (apply 'strcat (mapcar 'chr asclst)) " "))       )
    )


测试:
(xtcal)
选择要计算的文本(支持*TEXT选择集):
Select objects: 1 found
Select objects: Specify opposite corner: 1 found, 2 total
Select objects:
  (注明:此时选中两个文本 "afsda 234.5 暗暗-558.9啊 ab "   和  "-1622.000")
文本数字和为: -1946.4 (注: 234.5-558.9-1622.000=-1946.4)
标注位置<重新计算>:
精度(小数位数):3
字高: Specify second point: -1946.4 (注:-1946.4为返回值)

<embed src=http://www.xdcad.net/techcenter/upload/file/74488_20040104212511_tech.swf quality=high width=900 height=700 loop=true type="application/x-shockwave-flash">
</embed>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8779个

财富等级: 富甲天下

发表于 2004-1-4 21:37:48 | 显示全部楼层
你给的SWF文件下载链接怎么是美女头像啊?

现在的正常了,刚才不知是什么问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-4 21:41:17 | 显示全部楼层
程序下载
演示作的有点快。可按暂停对比演示中计算结果是否正确。

程序已经更新。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-4 21:42:04 | 显示全部楼层
最初由 zuicai 发布
[B]你给的SWF文件下载链接怎么是美女头像啊? [/B]

弄错了。已经更新
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-4 22:05:27 | 显示全部楼层
我测试用:所所扶绥发300.2
拷贝了三个计算结果是1464.6,你试试你那里是不是正常
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-4 22:32:38 | 显示全部楼层
Command: (xtcal)

文本数字求和-----------------------陌生人.2004.1
选择要计算的文本(支持*TEXT选择集):
Select objects: Specify opposite corner: 3 found

Select objects:

文本数字和为: 900.6
标注位置<重新计算>:
精度(小数位数):3

字高:3
900.6

我这里正常,不知道你那里是什么原因。是不是多选了其他文本?


!!!!!!注意,程序已经更新。加入对选集亮显以更能看清所选文本。并加入出错处理.!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-5 01:35:41 | 显示全部楼层
前面有讨论的.
用的是wcmatch
找找吧.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-5 11:08:29 | 显示全部楼层
注意,现发现mtext计算有错误,因为把格式符号如 |134 ...也当做数字计算进去了。忙,过两天改写。或者哪位有兴趣的可以完善。

已经解决mtext计数bug。--2004.1.17
  1. [color=blue]
  2. ;|(xtcal)= 文本计数求和;----------------------------------------------------------------陌生人.2004.1
  3. ;v1.1 2004.1.对mtext的bug修正。消除重复符号;支持-.5写法,排除"写.法" ".." "+-";
  4. 功能:对选集中文本进行所有数字计算,支持一个text,mtext中有多个数字字符串,支持字符串中小数,负数:
  5. 返回: 有数字,数字相加后写文本,并返回求和数值(非字符串).无有效数字返回nil.
  6. |;[/color]
  7. (defun xtcal ( / ss filter mspace n e str asclst strs add pt txt txth)
  8.   (defun *error* (msg) (if ss (x_draw ss 4)) (setq *error* oerr))
  9.   (princ "\n文本数字求和-----------------------陌生人.2004.1")
  10.   (princ "\n选择要计算的文本(支持*TEXT选择集):")
  11.   (setq oerr *error*
  12.         ss (ssget '((0 . "*TEXT")))
  13.         filter "0123456789.-+"
  14.         mspace (vla-get-modelspace(vla-get-activedocument (vlax-get-acad-object)))
  15.         str nil strs nil)
  16.   (if ss
  17.     (repeat (setq n (sslength ss))
  18.       (x_draw ss 3)
  19.       (setq n (1- n)
  20.             e (ssname ss n)
  21.             str (vla-get-textstring(vlax-ename->vla-object e))
  22.             strs (strcat (if strs strs " ") (x_txt2 str) " ")) [color=blue];;排除mtext bug.v1.1-2004.1[/color]
  23.       )
  24.     )
  25.   (if (and ss (/= "" strs))
  26.     (progn
  27.       (setq add (eval (read (strcat "(+ " strs ")"))))
  28.       (princ "\n文本数字和为: ")(princ add)
  29.       (if (setq pt (getpoint "\n标注位置<重新计算>:"))
  30.           (progn
  31.             (setq prec (getint "\n精度(小数位数):")
  32.                   txt (rtos add 2 prec)
  33.                   txth (getdist "\n字高:"))
  34.             (vla-addtext mspace txt (vlax-3D-point pt) txth)
  35.             (x_draw ss 4)
  36.             (princ) add)
  37.           (progn (if ss (x_draw ss 4))(xtcal))  ;多次<重新计算>可以作为一个简易统计查看器.
  38.       )
  39.     )
  40.     (progn (princ "\n!空选集或文本中无有效数字!\n") nil)
  41.   )
  42. )
  43. ;;
  44. (defun x_draw (ss key / n e)
  45.   (if (= 'PICKSET (type ss))
  46.     (repeat (setq n (sslength ss))
  47.       (setq n (1- n)
  48.             e (ssname ss n))
  49.       (redraw e key)
  50.     )
  51.   )
  52. )
  53. ;;
  54. (defun x_txt2 (str / i key str1)
  55.   (setq i 1)
  56.   (repeat (strlen str)
  57.    (cond
  58.      ((= "{\\f" (substr str i 3)) (setq i (+ 3 i) key T))
  59.      ((and T (= "}" (substr str i 1))) (setq key nil))   
  60.      ((not key)
  61.       (setq st (substr str i 1)
  62.             str1 (strcat (if (not str1) "" str1)
  63.       (cond ((= "." st)(if (wcmatch (substr str (1+ i) 1) "#") st " "))
  64.                                ((member st '("+" "-")) (if (wcmatch (substr str (1+ i) 1) "#,'.") st " "))
  65.                                (T (if (wcmatch filter (strcat "*" st "*")) st " "))
  66.                          )
  67.                          )))
  68.    )
  69.    (setq i (1+ i))
  70.   )
  71.   (setq str str1)
  72. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-30 09:46:18 | 显示全部楼层
非常感谢谢,真的好好用。越来越喜欢这里了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-2 13:31:45 | 显示全部楼层
陌生人:
我试了一下这个程序,发现还有bug。因为mtext的文字内容可能是下面这样的:
{\f@黑体|b0|i0|c134|p2;1324qrq324}
注意,分号后面的是有效的文字!

把x_txt段的代码改了一下:

(defun x_txt2 (str / i key1 key2 str1)
  (setq i 1 key2 nil)
  (repeat (strlen str)
   (cond
     ((= "{\\f" (substr str i 3)) (setq i (+ 3 i) key1 1 key2 1))
     ((and key1 (= "}" (substr str i 1))) (setq key1 nil key2 nil))
     ((and key1 (= ";" (substr str i 1))) (setq key2 nil))
     ((not key2)
      (setq st (substr str i 1)
            str1 (strcat (if (not str1) "" str1)
      (cond
        ((= "." st)(if (wcmatch (substr str (1+ i) 1) "#") st " "))
        ((member st '("+" "-")) (if (wcmatch (substr str (1+ i) 1) "#,'.") st " "))
        (T (if (wcmatch filter (strcat "*" st "*")) st " "))
      )
    ))
      )
   )
   (setq i (1+ i))
  )
  (setq str str1)
)

狗尾续貂,见笑了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-2 19:49:08 | 显示全部楼层
谢谢,确实疏忽了。应该以;号结束过滤
另外,本程序代码不够精简,拟近期重写一遍
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-5 11:30:07 | 显示全部楼层
注意数字的字体为中文字体的情况
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-8 20:27:35 | 显示全部楼层
如果能对尺寸标注求就更好了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-8 21:09:43 | 显示全部楼层
最初由 ywx0576 发布
[B]如果能对尺寸标注求就更好了。 [/B]

求标注和容易,文字求和中的MTEXT构造稍微复杂些

  1. ;;;标注求和
  2. (defun c:qbz (/ ss kk i)
  3. (setq ss (ssget '((0 . "DIMENSION"))) i 0  kk nil)
  4. (repeat (sslength ss)
  5.   (setq kk (cons (cdr(assoc 42(entget(ssname ss i)))) kk))
  6.         (setq i (1+ i))
  7.         )
  8.   (princ "\n******所选标注和为")(princ (apply '+ kk))(princ "******")
  9.   (princ)
  10.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 12:33:10 | 显示全部楼层
snsj斑竹的程序对于默认的标注值,求和结果正确。
但是对于人为改过的标注值,求和结果并不是标注值之和。
请斑竹改正,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 23:02 , Processed in 0.216446 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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