求助贴:拜托各位,完善一下文本计算器
原贴:(引自明经);;文本计算器
(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")(setqstr1 (rtos (+ hh shzi) 2)))
(if (= yusf "2")(setqstr1 (rtos (- hh shzi) 2)))
(if (= yusf "3")(setqstr1 (rtos (* hh shzi) 2)))
(if (= yusf "4")(setqstr1 (rtos (/ hh shzi) 2)))
(if (= yusf "5")(setqstr1 (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)
)
看着有点眼熟,好像是本人的代码 自己顶一下,坐等热心人
页:
[1]