明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1845|回复: 2

[提问] 求助贴:拜托各位,完善一下文本计算器

[复制链接]
发表于 2013-7-23 20:02 | 显示全部楼层 |阅读模式
原贴:(引自明经)
;;文本计算器
(defun C:tadd ( / sa k ss str yusf n shzi h hh)
(princ "\n 选择所有文字:")
(setq ss (ssget  '((0 . "text")))
      str (getstring "\n 输入四则运算及数值:")
     yusf (substr str 1 1)
     shzi (atof (substr str 2))
        n (sslength ss) k 0 )
(while (< k n)
      (setq names (ssname ss k)
               sa (entget names)
                h (assoc '1 sa)
        hh (atof(cdr h)))
        (if (= yusf "1")(setq  str1 (rtos (+ hh shzi) 2)))
        (if (= yusf "2")(setq  str1 (rtos (- hh shzi) 2)))
        (if (= yusf "3")(setq  str1 (rtos (* hh shzi) 2)))
        (if (= yusf "4")(setq  str1 (rtos (/ hh shzi) 2)))
        (if (= yusf "5")(setq  str1 (rtos (expt hh shzi) 2)))
(setq h1 (cons 1 str1))
        (setq sa (subst h1 h sa))
        (entmod sa)
        (setq k (+ k 1))
)(princ)
)

要求:
1、在运行开始加入一个对精度的选择。默认为3,运行中则默认为上次输入。
2、+,-,*,/,^要求能在快捷菜单中用鼠标进行选择。后附坛中找到的另一份样本。(该样本太繁杂,操作不利)


附参照:

(defun C:Suan (/ ss si nn txt txt_DXFtid nummode tmp oldtotal newtotal)
;;;★更新说明★
;;;1、将所选择的文字对象(单行文本、多行文本、属性[不包括块中的属性])统一 [加/减/乘/除] 某个数值(只计算其中的可以转换为数值的文本)
;;;2、可以指定计算后保留的小数点位数。
;;;3、可以选择消除或保留计算后文本中的后续零(若保留后续的零,则按第2点中指定的小数点位数保留)。
;;;4、加入了除数为0时的判断。
;;;5、加入了显示计算前和计算后所选数字的求和的功能。

(defun *error* (msg)
  (princ (strcat "" msg))
  (if DZIN (progn (setvar "DIMZIN" DZIN) (setq DZIN nil)));判断如果 DZIN 的值不为 nil ,则将 DIMZIN 系统变量的值设置成 DZIN 的值,同时将 DZIN 的值设置成 nil
  (princ)
)

(setq DZIN (getvar 'DIMZIN));设置 DIMZIN 系统变量的值到变量 DZIN 中
(setq nummode (getvar 'LUNITS))

(princ "\n将所选择的文字对象(只计算其中的可以转换为数值的文本)统一 [加(+)/减(-)/乘(*)/除(/)] 某个数值")

(if (not CalculateSymbol) (setq CalculateSymbol "加"))
(initget "+ - * / _加 减 乘 除")
(setq tmp (getkword (strcat "\n输入要执行的运算方式 [加(+)/减(-)/乘(*)/除(/)] <" CalculateSymbol ">:")));输入计算的方式
(if tmp (setq CalculateSymbol tmp))


(if (not numprecision) (setq numprecision (getvar 'LUPREC)))
(if (not val) (setq val 0))
(setq tmp (getreal (strcat "\n输入要进行 \"" CalculateSymbol "法\" 计算的数值<" (rtos val nummode numprecision) ">:")));输入要计算的数值
(if tmp (setq val tmp))
(while (and (equal val 0) (equal CalculateSymbol "除"))
  (setq tmp (getreal (strcat "\n除数不能为 0 ,请重新输入要进行 \"" CalculateSymbol "法\" 计算的数值<" (rtos val nummode numprecision) ">:")));输入要计算的数值
  (if tmp (setq val tmp))
  )

(setq tmp (getint (strcat "\n输入小数点后保留几位数<" (itoa numprecision)">:" )));指定小数点后保留的位数
(if tmp (setq numprecision tmp))

(if (not DZBoo) (setq DZBoo (if (equal 8 (getvar 'DIMZIN)) "Yes" "No")))
(initget "Yes No")
(setq tmp (getkword (strcat "\n是否消除文本中的后续零[是(Y)/否(N)]<" DZBoo ">:")));指定是否消除文本中的后续零
(if tmp (setq DZBoo tmp))
(if (equal DZBoo "Yes") (setvar "DIMZIN" 8) (setvar "DIMZIN" 1));根据 DZBoo 的值设置系统变量 DIMZIN 的值

(setq ss (ssget ' ((-4 . "<OR") (0 . "MTEXT") (0 . "TEXT") (0 . "ATTDEF") (-4 . "OR>"))));ss为选择集名称
(setq nn (sslength ss));nn为选择集长度
(setq i 0)
(setq oldtotal 0.0)
(setq newtotal 0.0)
(repeat nn
          (cond
                        ((equal (cdr (assoc 0 (entget (ssname ss i)))) "MTEXT") (setq txt_DXFtid 1))
                        ((equal (cdr (assoc 0 (entget (ssname ss i)))) "TEXT") (setq txt_DXFtid 1))
                        ((equal (cdr (assoc 0 (entget (ssname ss i)))) "ATTDEF") (setq txt_DXFtid 2))
                  )
          (setq txt;将获得的文本的值存放到变量txt
                 (cdr
                  (assoc txt_DXFtid;获得对象的文字信息
                         (setq si (entget (ssname ss i)));设置变量 si 为第 i 个对象(图元)的定义数据
                  )
                 )
          )
            ;计算表达式.
          (if (distof txt);判断txt是否能转换为数值,如果能,则进行计算
                  (progn
                  (setq oldtotal (+ (distof txt) oldtotal))
                  (cond
                        ((equal CalculateSymbol "加") (setq txt (+ (distof txt) val)))
                        ((equal CalculateSymbol "减") (setq txt (- (distof txt) val)))
                        ((equal CalculateSymbol "乘") (setq txt (* (distof txt) val)))
                        ((equal CalculateSymbol "除") (setq txt (/ (distof txt) val)))
                  )
                  (setq newtotal (+ txt newtotal))
                        (entmod (setq si (subst (cons txt_DXFtid (rtos txt nummode numprecision)) (assoc txt_DXFtid si) si)));修改第i个文本图元列表的数值并更新
                  (entmod (subst (cons 8 (rtos val nummode numprecision)) (assoc 8 si) si));修改第i个文本图元列表的图层并更新
                  )
             )
            (setq i (1+ i))
          (princ)
)
(princ (strcat "所选择的文字计算前求和为: " (rtos oldtotal nummode numprecision) ";所选择的文字计算后求和为: " (rtos newtotal nummode numprecision)))
(setvar "DIMZIN" DZIN);将 DIMZIN 系统变量的值设置成 DZIN 的值,即设置 DIMZIN 系统变量为运行前的值
(setq DZIN nil);将变量 DZIN 的值设置为 nil
(princ)
)



本帖子中包含更多资源

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

x
发表于 2013-7-24 03:30 | 显示全部楼层
看着有点眼熟,好像是本人的代码
 楼主| 发表于 2013-7-24 10:38 | 显示全部楼层
自己顶一下,坐等热心人
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 17:14 , Processed in 0.257264 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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