明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16120|回复: 56

[【高飞鸟】] 【飞鸟集】数字文本的四则运算和统计(更新到2020.11.09)

  [复制链接]
发表于 2007-5-22 11:46 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2020-11-9 20:20 编辑

本帖所附程序已经更新到2020.11.09.
==============================================



2020.11.09 更新特点:                                         
1.还有一个非世界坐标系(WCS)下文本插入点跑远问题得到修正。
==============================================

2019.07.13 更新特点:                                         
1.增加了天正类物体,并修正了崩溃问题。                          
2.修正了非世界坐标系(WCS)下文本插入点跑远问题。               
3.修正了以前的64位的ScriptControl创建为nil的问题。              
4.修正64位也可能无法创建用来计算表达式的时候采用自己的mycal程序

==============================================
2013.12.19 更新特点:
1.更改了操作方式,使得程序更易用。
2.修正了几个bug,包括64位CAD的错误问题。
3.可以计算文本中的算术表达式,譬如:1*2-sin(3)之类。
4.增加了对天正文字,斯维尔文本的支持。
5.统计命令改为stat,所有文本加减乘除某个数的命令改为++,--,**,//这个更方便记忆。

===============================================


应一个网友的 要求写了这个一个小程序,但愿各位能用的着。
在绘图过程中,经常会对数字文本进行四则运算,或者统计数字,在现有的CAD命令中没有直接命令与之相关,用计算器又麻烦。所以编写了一个小程序。

用法:
1、先加载程序,首先会提示你如何用这个程序。

2、然后你输入计算结果的精度,即小数点位数:这个只要在开始的时候输入就可以了,以后的命令你不用输入精度,如果你要调整精度,随时输入命令JD.
3、下面为它的具体用法,你可以选择多个文字,如果是除法,劝你最好不要选择0数字,否则会出错。而且命令可以连用,直到你空输入(没有选择或者取点)为止。
+ - * / 命令不用多说。
++,--,**,// 命令为对所选文字同时加减乘除某个数。StatSet为设置。
4、统计的命令为stat。其速度是很快的,我曾对十万级的数字验证,求结果既快又准。

5、这个程序适用于各个版本,我甚至觉得可以用于DOS的CAD版本。
各位有什么建议或好的想法可以回帖,在此致谢。





本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tigcat + 1 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

 楼主| 发表于 2013-12-25 22:54 | 显示全部楼层
程序已经更新。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-21 17:33 | 显示全部楼层
;我计算楼梯过程中,核对踏步宽度高度是否正确,做的一个小程序,选中带符号的文字,将计算结果放置在右下角,图层为当前图层。
;感谢高飞大神

  1. (defun c:CAt (/ box Els ent i lst nls num p1 p2 p3 p4 sel strlst wcs wz_jd wz_obj wz_zg)
  2.   
  3.   (if
  4.     (or
  5.       (setq wcs (vlax-create-object "Aec32BitAppServer.AecScriptControl.1"))
  6.       (setq wcs (vlax-create-object "ScriptControl"))
  7.     )
  8.     (vlax-put-property wcs "language" "VBScript")
  9.   )
  10.   (setq i 0)
  11.   (setq sel (ssget '((0 . "text"))))
  12.   (repeat (sslength sel)
  13.     (setq ent (ssname sel i))
  14.     (command "ucs" "e" ent)
  15.     (setq wz_obj (vlax-ename->vla-object ent))
  16.     (setq wz_jd (vlax-get-property wz_obj 'Rotation)) ;取得角度
  17.     (setq wz_zg (vlax-get-property wz_obj 'Height)) ;取得字高
  18.     (setq lst (entget ent))
  19.     (setq box (textbox lst))  ;取得文字的外框坐标
  20.     (setq p1 (car box))
  21.     (setq p3 (cadr box))
  22.     (setq p2 (list (car p3) (cadr p1)));p2为文字插入坐标
  23.                 (setq p2 (trans p2 1 0))
  24.     (setq p4 (list (car p1) (cadr p3)))
  25.    
  26.     (setq num (cdr (assoc 1 lst)))
  27.     (if (wcmatch (cdr (assoc 0 lst)) "*_TEXT")
  28.       (setq num (atof num))
  29.       (progn
  30.         (foreach s '("㎡" "平方米" "米")
  31.           (while (/= num (setq num (vl-string-subst "" s num))))
  32.         )
  33.         (while (/= num (setq num (vl-string-subst "*" "×" num))))
  34.         (setq num (vl-string-translate "xX" "**" num))
  35.         ;;优先使用CAD的cal函数计算.
  36.         (if CAL               
  37.           (setq num (float (cal (strcat num "+0.0"))))    ;这个地方需要转化为浮点,不然cal函数会出错
  38.           ;;然后采用vbs计算
  39.           (if wcs
  40.             (setq num (vlax-invoke wcs 'eval num))
  41.             (setq num (CAL:Expr2Value Num))
  42.           )
  43.         )
  44.       )
  45.     )
  46.     ;;;    (setq Els (cons ent Els))
  47.     ;;;    (setq Nls (cons num Nls))
  48.     (entmake (list '(0 . "TEXT") (cons 1 (rtos num)) (cons 10 p2) (cons 40 (* 0.3 wz_zg))))
  49.     (setq i (1+ i))
  50.   )
  51.   (command "ucs" "")
  52.   ;;;  (list
  53.   ;;;    (reverse Els)
  54.   ;;;    (reverse Nls)
  55.   ;;;  )
  56.   (prin1)
  57. )

  58. (prompt "\n根据高飞大神四则运算进行修改<c:cat>")
  59. (prin1)

发表于 2021-12-21 14:23 | 显示全部楼层
有点尴尬的是我用“stat"命令,进行了统计计算,其实我只想在旁边写出一个结果就好:例:"3*5",我想的是输入命令单击它后在旁边出现一个文字15就行。不知道直接操作怎么实现,看来要利用高飞大神的函数自己稍微改造下?或是原来就带的有呢?
发表于 2007-5-22 23:38 | 显示全部楼层

能否改一下?对尺寸标注的文本也能计算,插入计算结果。

实际运用中很多时候会用到。

TKS!

发表于 2007-6-4 12:03 | 显示全部楼层

不错,楼主花了不少功夫

MTEXT对象不受支持

发表于 2007-6-17 15:40 | 显示全部楼层

R14底下怎么不能用

发表于 2007-6-21 09:18 | 显示全部楼层
我也来一个。有什么问题,请指教!
输入tt选择多个文本,在文本末尾进行整数四则运算
  1. (defun right-string-number (str / stringlength mantissa)
  2.   (setq stringlength (1- (strlen str)))
  3.   (setq mantissa (vl-string-elt str stringlength))
  4.   (if (and (>= mantissa 48) (<= mantissa 57))
  5.     (progn
  6.       (setq string (vl-string-right-trim "0123456789" str))
  7.       (setq n (vl-string-mismatch string str))
  8.       (setq number (substr str (1+ n) (1+ stringlength)))
  9.       (list string number)
  10.     )
  11.     (if (princ (strcat "\n" str "末尾不是数字!"))
  12.       nil
  13.     )
  14.   )
  15. )
  16. (defun jw:szys (sign numlst /)
  17.   (if (= sign "+")
  18.     (setq result (apply '+ numlst))
  19.   )
  20.   (if (= sign "-")
  21.     (setq result (apply '- numlst))
  22.   )
  23.   (if (= sign "*")
  24.     (setq result (apply '* numlst))
  25.   )
  26.   (if (= sign "/")
  27.     (setq result (apply '/ numlst))
  28.   )
  29.   result
  30. )
  31. ;;;格式化输入整数
  32. (defun jw:int ()
  33.   (if (= nil orig_int)
  34.     (setq orig_int 1)
  35.     (setq orig_int int)
  36.   )
  37.   (setq int
  38.   (getint
  39.     (strcat "\n请输入增值<" (itoa orig_int) ">:")
  40.   )
  41.   )
  42.   (if (= nil int)
  43.     (setq int orig_int)
  44.   )
  45.   int
  46. )
  47. (defun jw:sign ()
  48.   (if (= nil orig_sign)
  49.     (setq orig_sign "+")
  50.     (setq orig_sign sign)
  51.   )
  52.   (initget "+ - * /")
  53.   (setq sign
  54.   (getkword
  55.     (strcat "\n四则运算[/]or[*]or[-]or[+] <"
  56.      orig_sign
  57.      ">:"
  58.     )
  59.   )
  60.   )
  61.   (if (= nil sign)
  62.     (setq sign orig_sign)
  63.   )
  64.   sign
  65. )
  66. (princ "\n输入tt选择多个文本,在文本末尾整数进行四则运算")
  67. (princ)
  68. (defun c:tt ()
  69.   (if (jw:sign)
  70.     (if (jw:int)
  71.       (if (setq ss (ssget '((0 . "*text"))))
  72. (progn
  73.    (setq slen (- (sslength ss) 1)
  74.   i    0
  75.    )
  76.    (while (<= i slen)
  77.      (setq na   (ssname ss i)
  78.     data (entget na)
  79.     str  (cdr (assoc 1 data))
  80.      )
  81.      (if (right-string-number str)
  82.        (progn
  83.   (setq string (car (right-string-number str))
  84.         number (cadr (right-string-number str))
  85.         num    (jw:szys sign (list (atoi number) int))
  86.         str    (strcat string (itoa num))
  87.         data   (subst (cons 1 str) (assoc 1 data) data)
  88.   )
  89.   (entmod data)
  90.        )
  91.      )
  92.      (setq i (+ i 1))
  93.    )
  94. )
  95.       )
  96.     )
  97.   )
  98.   (princ)
  99. )
发表于 2010-10-12 08:37 | 显示全部楼层
谢谢楼上的分享,参考下,很感激
发表于 2011-7-1 21:18 | 显示全部楼层
carrot1983 发表于 2007-6-21 09:18
我也来一个。有什么问题,请指教!
输入tt选择多个文本,在文本末尾进行整数四则运算

能否设置一下小数位数啊,不要全整数
发表于 2011-9-9 15:15 | 显示全部楼层
不错,功能挺多的
发表于 2012-5-10 23:14 | 显示全部楼层
谢谢楼主,功能很实用。
也谢谢5楼,支持多文本,文本+数字,非常好
发表于 2012-7-28 23:45 | 显示全部楼层
能否实现2*3/2+1-3  求值呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 23:02 , Processed in 0.222627 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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