表达式计算修改版本,增加计算函数选择按钮[2019年1月23日更新]
本帖最后由 zixuan203344 于 2019-1-23 19:52 编辑;修改by 晗子轩 QQ:515357067
2019年1月23日 更新
;根据原作者wowan1314的回复,修复系统内核溢出和1/3=0的bug,再次感谢
;调整单删和清空时动作,将计算行的值清空********************************************************************************************************************************************************************************************************
****************************************************************************************************
2019年1月22日 更新
;仔细修改控件界面,相似控件放一起,界面更加美观
;引用飞鸟大师的建议,修复飞鸟内核1/3=0的bug
;根据飞鸟大师的回复,增加VbScript内核
界面视图已更新
********************************************************************************************************************************************************************************************************
****************************************************************************************************
2019年1月17日 更新
修复问题:“飞鸟函数”计算结果是整数,没有小数点及后面的数字。
修复问题:CAD启动后,首次运行用“飞鸟函数”内核,程序会自动退出;只有用过一次“系统函数”才可使用。
增加按钮:“关于”
感谢 @arcers 测试过程中提出上述问题。
********************************************************************************************************************************************************************************************************
****************************************************************************************************
关于表达式计算的功能
联动http://bbs.mjtd.com/thread-178845-1-1.html帖子
使用系统C:CAL函数时候,如果字符串参与运算的都是整数,比如“9999*9999”,那么结果一定会溢出,
表达式为“9999.0*9999.0”,里面有小数,结果不会溢出。
但是给字符串数字中的一部分加.0很蛋疼,所以我搜索了一下,有飞鸟大师的函数可以正常计算。
针对原作品http://bbs.mjtd.com/thread-110081-1-1.html
我做了修改
添加了计算内核按钮
2019-1-23配图
2019-1-22以前配图
本帖最后由 wayne_myles 于 2019-1-22 11:30 编辑
这个计算器不错 我输入9999*9999直接提示表达式不正确 6666
http://bbs.mjtd.com/thread-111059-1-1.html
我们一起学习 一下
;阿甘CAD计算器 命令ad
;结果自动复制到剪贴板,支持天正文字、天正标高
(setq GL-precision 3);3为计算结果保留位数 自己根据需要修改
(setq GL-text "D:/历史记录.txt" ) ;历史记录文件路径,注意路径为反斜杠“/”,可根据需要修改位置
;不出现对话框,直接计算 命令:y1=加法 y2=减法 y3=乘法 y4=除法
(defun c:y1() (GL:jiafa))
(defun c:y2() (GL:jianfa))
(defun c:y3() (GL:chengfa))
(defun c:y4() (GL:chufa))
;阿甘CAD计算器
(vl-load-com)
(command "cal")(command) ;先调用cal,否则后面cal函数无法使用
(setq GL-result "") ;计算结果,全局变量
(setq GL-lst (list ""))
(defun c:ad(/ file)
(if (not (setq file (open GL-text "r")))
(progn
(setq file (open GL-text "w" ))
(close file)
)
(close file)
)
(GL-xxjsq)
)
(defun GL-xxjsq (/ fname fn x dclid lin re file txt value reason)
(if (not GL-result)
(setq GL-result "")
)
(setq fname (vl-filename-mktemp nil nil ".dcl" ))
(setq fn (open fname "w" ))
(foreach x '(
"xxjsq : dialog{"
"label=\"阿甘CAD计算器V1.1\";"
":boxed_column{"
"label=\"自动计算\";"
":row {"
" :button{key=\"1\";label=\"+\";width=4;}"
" :button{key=\"2\";label=\"-\";width=4;}"
" :button{key=\"3\";label=\"*\";width=4;}"
" :button{key=\"4\";label=\"/\";width=4;}"
"}"
"spacer_1;"
"}"
":boxed_column{"
"label=\"手动计算\";"
":row {"
" :edit_box{width=35;key =\"5\";allow_accept = true;}"
" :button{key=\"6\";label=\"计算\";width=4;}"
"}"
"spacer_1;"
":row {"
" :button{key=\"11\";label=\"C↑\";width=4;}"
" :button{key=\"12\";label=\"C↓\";width=4;}"
" :button{key=\"8\";label=\"拾取\";width=4;}"
" :button{key=\"10\";label=\"插算式\";width=4;}"
" :button{key=\"7\";label=\"插结果\";width=4;}"
"}"
"spacer_1;"
"}"
":list_box {key=\"9\";label=\"历史记录\";width=40;height=10;}"
" cancel_button;"
"}"
)
(princ x fn)
(write-line "" fn)
)
(close fn)
(setq fn (open fname "r" ))
(setq dclid (load_dialog fname))
(while (or (eq (substr (setq lin (vl-string-right-trim "\" fn)" (vl-string-left-trim "(write-line \"" (read-line fn)))) 1 2) "//" ) (eq (substr lin 1 (vl-string-search " " lin)) "" ) (not (eq (substr lin (+ (vl-string-search " " lin) 1) 9) " : dialog" ))))
(new_dialog (substr lin 1 (vl-string-search " " lin)) dclid)
(start_list "9")
(if (equal GL-lst (list ""))
(progn
(setq file (open GL-text "r")
txt (read-line file)
)
(while (/= txt nil)
(setq GL-lst (append GL-lst (list txt)))
(setq txt (read-line file))
)
(close file)
(setq GL-lst (cdr GL-lst))
(setq GL-lst (reverse GL-lst))
)
)
(mapcar 'add_list GL-lst)
(end_list)
(set_tile "5" GL-result)
(mode_tile "5" 2)
(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{End}")
(action_tile "5" "(setq GL-result $Value)")
(action_tile "1" "(done_dialog 1)" )
(action_tile "2" "(done_dialog 2)" )
(action_tile "3" "(done_dialog 3)" )
(action_tile "4" "(done_dialog 4)" )
(action_tile "6" "(GL:key6)")
(action_tile "7" "(done_dialog 7)" )
(action_tile "8" "(done_dialog 8)" )
(action_tile "9" "(GL:update-edit $value $reason)")
(action_tile "10" "(done_dialog 10)" )
(action_tile "11" "(GL:key11)" )
(action_tile "12" "(GL:key12)" )
(action_tile "cancel" "(done_dialog 0)" )
(setq re (start_dialog))
(cond
((= re 1) (GL:jiafa)(GL:update)(GL-xxjsq))
((= re 2) (GL:jianfa)(GL:update)(GL-xxjsq))
((= re 3) (GL:chengfa)(GL:update)(GL-xxjsq))
((= re 4) (GL:chufa)(GL:update)(GL-xxjsq))
((= re 7) (GL:crjswz GL-result))
((= re 8) (GL:key8))
((= re 10) (GL:crjswz (strcat GL-Num "=" GL-result)))
)
(unload_dialog dclid)
(close fn)
(vl-file-delete fname)
(princ)
)
(defun GL:jiafa ()(GL:Galculate (GL:GetNumber "+")))
(defun GL:jianfa ()(GL:Galculate (GL:GetNumber "-")))
(defun GL:chengfa ()(GL:Galculate (GL:GetNumber "*")))
(defun GL:chufa ()(GL:Galculate (GL:GetNumber "/")))
;手动计算
(defun GL:key6 ()
(setq GL-result (get_tile "5"))
(if (/= GL-result "")
(progn
(if (GL:Galculate GL-result)
(progn
(set_tile "5" GL-result)
(mode_tile "5" 2)
(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{End}")
(GL:update)
))
))
)
;拾取
(defun GL:key8 (/ num)
(if (setq num (GL:GetNumber "+"))
(progn
(if (/= GL-result "")
(setqGL-result (strcat GL-result "+" num))
(setqGL-result (strcat GL-result num))
)
))
(GL-xxjsq)
)
;清空计算框
(defun GL:key11 ()
(set_tile "5" "")
(mode_tile "5" 2)
(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{End}")
)
;清空历史记录
(defun GL:key12 ()
(if (GL-qrdhk)
(progn
(setq GL-lst (list ""))
(start_list "9")
(mapcar 'add_list GL-lst)
(end_list)
(setq file (open GL-text "w"))
(write-line "" file)
(close file)
)
)
(mode_tile "5" 2)
(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{End}")
)
;提取数字和运算符
(defun GL:GetNumber (ope / en num i regex ss text tn)
(setq regex (vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
(vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
(vlax-put-property regex "Global" 1) ;全文匹配,而不是只匹配第一处
(setq ss (ssget '((0 . "*TEXT,TCH_ELEVATION")))) ;只拾取文字、天正标高
(if ss
(progn
(setq i 0 Num "")
(repeat (sslength ss)
(setq en (ssname ss i))
(setq GL-ed (entget en))
(setq text (cdr (assoc 1 GL-ed)))
(vlax-put-property regex "Pattern" "[^0-9\\+\\-\\*\\/\\.\\(\\)]") ;匹配数字和运算符
(setq text (vlax-invoke-method regex "Replace" text ""))
(if (/= text "")
(progn
(if (= Num "") ;表达式加括号
(if (wcmatch text "*`+*,*`-*,*`**,*`/*")
(setq Num (strcat"(" text ")") TN nil)
(setq Num text TN nil)
)
(setq TN T)
)
(if TN ;表达式加括号
(if (wcmatch text "*`+*,*`-*,*`**,*`/*")
(setq Num (strcat Num ope "(" text ")"))
(setq Num (strcat Num ope text))
)
)
;(if (= Num "")(setq Num text TN nil)(setq TN T));表达式不加括号
;(if TN (setq Num (strcat Num ope text)));表达式不加括号
)
)
(setq i (1+ i))
)
))
Num
)
;计算
(defun GL:Galculate (Num)
(if Num
(progn
(if (setq GL-result (cal (strcat Num "*" "1.0"))) ;*1.0将整数转换为小数,整数只能介于-32768和32767之间
(progn
(setq GL-result (rtos GL-result 2 GL-precision))
(set-clip-string GL-result) ;向系统剪贴板写入文字
(setq GL-Num Num)
(princ (strcat "\n表达式:" Num "=" GL-result ">>>>计算结果:" GL-result))
(princ)
)
(alert (strcat Num " 表达式语法错误!"))
)))
)
;向系统剪贴板写入文字
(defun set-clip-string (STR / HTML RESULT)
(and (= (type STR) 'STR)
(setq HTML (vlax-create-object "htmlfile"))
(setq RESULT (vlax-invoke
(vlax-get (vlax-get HTML 'PARENTWINDOW)
'CLIPBOARDDATA
)
'SETDATA
"Text"
STR
)
)
(vlax-release-object HTML)
)
)
;插入计算文字
(defun GL:crjswz (GL-result / h la pt sc st ty tzbl)
(if (/= GL-result "")
(if (setq pt (getpoint "\n请点取插入点:"))
(if GL-ed
(progn
(setq ty (cdr (assoc 0 GL-ed));字体类型
st (cdr (assoc 7 GL-ed));字体样式
la (cdr (assoc 8 GL-ed));图层
h (cdr (assoc 40 GL-ed));文字高度
sc (cdr (assoc 47 GL-ed));天正比例
;ar (cdr (assoc 41 GL-ed));文字宽高比
;co (cdr (assoc 62 GL-ed));颜色
)
(if (wcmatch ty "TCH_*")
(entmake (list
'(0 . "TEXT")
(cons 1 GL-result)
(cons 7 st)
(cons 8 la)
(cons 10 pt)
(cons 40 (* h sc))
(cons 41 0.8)
)
)
(entmake (list
'(0 . "TEXT")
(cons 1 GL-result)
(cons 7 st)
(cons 8 la)
(cons 10 pt)
(cons 40 h)
(cons 41 0.8)
)
)
)
)
(progn
;(setq h (getvar 'textsize)) ;当前样式文字高度
(setq tzbl (getvar "HPSCALE") ;天正比例
h (* tzbl 3)
)
(entmake (list
'(0 . "TEXT")
(cons 1 GL-result)
(cons 10 pt)
(cons 40 h)
)
)
))))
)
;更新历史记录数据,并保存
(defun GL:update (/ file ex)
(if GL-result
(progn
(setq ex (strcat GL-Num "=" GL-result))
(setq GL-lst (append (list ex) GL-lst))
(start_list "9")
(mapcar 'add_list GL-lst)
(end_list)
(setq file (open GL-text "a"))
(write-line ex file)
(close file)
)
)
)
;将历史记录上到计算框
(defun GL:update-edit (value reason / a b ex i len)
(if (= reason 4)
(progn
(setq ex (nth (atoi value) GL-lst)
len (strlen ex)
i 1 b ""
)
(while (<= i len)
(setq a (substr ex i 1))
(if (= a "=")
(setq i (1+ len))
(setq b (strcat b a))
)
(setq i (1+ i))
)
(set_tile "5" b)
(mode_tile "5" 2)
(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{End}")
))
)
(defun GL-qrdhk (/ fname fn x dclid lin re YorN)
(setq fname (vl-filename-mktemp nil nil ".dcl" ))
(setq fn (open fname "w" ))
(foreach x '(
"qrdhk : dialog{"
"spacer_1;"
" :text{key=\"2\";label=\"是否清除历史记录\";}"
"spacer_1;"
":row {"
" :button{key=\"1\";label=\"是\";width=8;}"
"spacer_1;"
" cancel_button;"
"}"
"spacer_1;"
"}"
)
(princ x fn)
(write-line "" fn)
)
(close fn)
(setq fn (open fname "r" ))
(setq dclid (load_dialog fname))
(while (or (eq (substr (setq lin (vl-string-right-trim "\" fn)" (vl-string-left-trim "(write-line \"" (read-line fn)))) 1 2) "//" ) (eq (substr lin 1 (vl-string-search " " lin)) "" ) (not (eq (substr lin (+ (vl-string-search " " lin) 1) 9) " : dialog" ))))
(new_dialog (substr lin 1 (vl-string-search " " lin)) dclid)
(action_tile "1" "(done_dialog 1)" )
(action_tile "cancel" "(done_dialog 0)" )
(setq re (start_dialog))
(cond
((= re 1) (setq YorN T))
)
(unload_dialog dclid)
(close fn)
(vl-file-delete fname)
YorN
) 本帖最后由 mokson 于 2019-1-23 08:48 编辑
表达式太强大了,向楼主学习!
可以发一个你的计算器LSP版的吗,我用的微信登录,忘记密码换不到币无法买你的计算器,我的邮箱是335833868@qq.com 本帖最后由 zixuan203344 于 2019-1-17 14:40 编辑
arcers 发表于 2019-1-16 23:55
谢谢分享。
问题1、“飞鸟函数”计算结果是整数,没有小数点及后面的数字。
问题2、CAD启动后,首次运行 ...
问题1:已修复
问题2:已修复
问题3:多次测试,2019正常使用,本人电脑装有08、12、14、18、19均正常使用
建议1:不想多折腾,见谅
建议2:想了想,还是加上关于按钮吧 谢谢您的分享 楼主可否把 [资源] [源码]两条曲线之间绘制n条等分曲线这个帖子的源码发一份给我.yaokui25@163.com 之所以保留C:CAL的计算方法,是因为自带的CAL函数可以使用对象捕捉的关键参数和autolisp定义的变量值作为参数,具体示例如下:
可在算术表达式中使用 AutoLISP 变量。 变量必须是下列类型之一:实数、整数、二维或三维点(矢量)。 本例定义了距离 AutoLISP 变量中所存储的 A 点在 X 方向偏移 5 个单位,在 Y 方向偏移 1 单位的点。 A+ 如果在 CAL 命令中输入的 AutoLISP 变量名称中包含具有特殊含义的字符(例如 +、-、* 或 /),请用单引号 (') 将变量名称括起来,例如:'number-of-holes'
给 AutoLISP 变量赋值
要给 AutoLISP 变量赋值,请在算术表达式前面加上变量名和等号 (=)。 变量赋值后,可将变量的值用于其他计算。本例将两个表达式的值保存在 AutoLISP 变量 P1 和 R1 中。命令: cal >> 表达式: P1=cen+ >> 选择图元用于 CEN 捕捉: 选择圆或圆弧 命令: cal >> 表达式: R1=dist(end,end)/3 >> 选择图元用于 END 捕捉: 选择具有端点的对象 本例用到了变量 P1 和 R1 的值:命令: circle 指定圆的圆心或 [三点(3P)/两点(2P)/相切、相切、半径(T)]: 'cal >> 表达式: P1+ 指定圆的半径或 [直径(D)] <上一个>: 'cal >> 表达式: R1+0.5
具体请查阅《命令参考和系统变量》这个chm的cal函数相关。
yaokui25 发表于 2019-1-16 18:17
楼主可否把 [资源] [源码]两条曲线之间绘制n条等分曲线这个帖子的源码发一份给我.yaokui25@1 ...
已发,请注意查收 zixuan203344 发表于 2019-1-16 18:26
已发,请注意查收
非常感谢楼主,帮了大忙 谢谢! zixuan203344 分享程序!!!! 本帖最后由 arcers 于 2019-1-17 12:08 编辑
谢谢分享。
问题1、“飞鸟函数”计算结果是整数,没有小数点及后面的数字。
问题2、CAD启动后,首次运行用“飞鸟函数”内核,程序会自动退出;只有用过一次“系统函数”才可使用。
问题3、不支持AUTOCAD2019。
建议1、增加历史记录、单行记录直接导出文字功能。
建议2、对话框的“关于”按钮丢了。
很给力啊!!!!非常感谢大神升级,帮了大忙!!多谢多谢!!!! 没金币了 麻烦大大发一份(表达式计算修改版本,增加计算函数选择按钮给我)吧!! 谢谢 879792799@qq.com