明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4759|回复: 49

[源码] 表达式计算修改版本,增加计算函数选择按钮[2019年1月23日更新]

  [复制链接]
发表于 2019-1-16 17:36 | 显示全部楼层 |阅读模式
本帖最后由 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以前配图














本帖子中包含更多资源

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

x

点评

楼主 好勤奋 越来越完美了!  发表于 2019-1-23 20:16
哇 越来越给力啊!!!绝对好宝贝!!!  发表于 2019-1-17 21:36

评分

参与人数 4明经币 +4 金钱 +50 收起 理由
fangmin723 + 1 + 50 很给力!
USER2128 + 1 很给力!
arcers + 1 很给力!
wayne_myles + 1 很给力!谢谢大大分享 十分感激

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-1-22 11:09 | 显示全部楼层
本帖最后由 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 "")
        (setq  GL-result (strcat GL-result "+" num))
        (setq  GL-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
)
回复 支持 1 反对 0

使用道具 举报

发表于 2019-1-17 08:12 | 显示全部楼层
本帖最后由 mokson 于 2019-1-23 08:48 编辑

表达式太强大了,向楼主学习!

点评

赞一个  发表于 2019-1-21 13:13
回复 支持 1 反对 0

使用道具 举报

发表于 2019-1-21 09:56 | 显示全部楼层
可以发一个你的计算器LSP版的吗,我用的微信登录,忘记密码换不到币无法买你的计算器,我的邮箱是335833868@qq.com

评分

参与人数 1明经币 +1 收起 理由
yaokui25 + 1 送给你

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-1-17 14:30 | 显示全部楼层
本帖最后由 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:想了想,还是加上关于按钮吧
回复 支持 1 反对 0

使用道具 举报

发表于 2019-1-16 18:12 | 显示全部楼层
谢谢您的分享
发表于 2019-1-16 18:17 | 显示全部楼层
楼主可否把 [资源] [源码]两条曲线之间绘制n条等分曲线这个帖子的源码发一份给我.  yaokui25@163.com
 楼主| 发表于 2019-1-16 18:20 | 显示全部楼层
之所以保留C:CAL的计算方法,是因为自带的CAL函数可以使用对象捕捉的关键参数和autolisp定义的变量值作为参数,具体示例如下:
可在算术表达式中使用 AutoLISP 变量。 变量必须是下列类型之一:实数、整数、二维或三维点(矢量)。
本例定义了距离 AutoLISP 变量中所存储的 A 点在 X 方向偏移 5 个单位,在 Y 方向偏移 1 单位的点。
A+[5,1]
如果在 CAL 命令中输入的 AutoLISP 变量名称中包含具有特殊含义的字符(例如 +、-、* 或 /),请用单引号 (') 将变量名称括起来,例如:
'number-of-holes'

给 AutoLISP 变量赋值
要给 AutoLISP 变量赋值,请在算术表达式前面加上变量名和等号 (=)。 变量赋值后,可将变量的值用于其他计算。
本例将两个表达式的值保存在 AutoLISP 变量 P1 和 R1 中。
命令: cal
>> 表达式: P1=cen+[1,0]
>> 选择图元用于 CEN 捕捉: 选择圆或圆弧
命令: cal
>> 表达式: R1=dist(end,end)/3
>> 选择图元用于 END 捕捉: 选择具有端点的对象
本例用到了变量 P1 和 R1 的值:
命令: circle
指定圆的圆心或 [三点(3P)/两点(2P)/相切、相切、半径(T)]: 'cal
>> 表达式: P1+[0,1]
指定圆的半径或 [直径(D)] <上一个>: 'cal
>> 表达式: R1+0.5

具体请查阅《命令参考和系统变量》这个chm的cal函数相关。


 楼主| 发表于 2019-1-16 18:26 | 显示全部楼层
yaokui25 发表于 2019-1-16 18:17
楼主可否把 [资源] [源码]两条曲线之间绘制n条等分曲线这个帖子的源码发一份给我.  yaokui25@1 ...

已发,请注意查收
发表于 2019-1-16 19:26 | 显示全部楼层

非常感谢楼主,帮了大忙
发表于 2019-1-16 22:04 | 显示全部楼层
谢谢! zixuan203344 分享程序!!!!
发表于 2019-1-16 23:55 | 显示全部楼层
本帖最后由 arcers 于 2019-1-17 12:08 编辑

谢谢分享。
问题1、“飞鸟函数”计算结果是整数,没有小数点及后面的数字。
问题2、CAD启动后,首次运行用“飞鸟函数”内核,程序会自动退出;只有用过一次“系统函数”才可使用。
问题3、不支持AUTOCAD2019。

建议1、增加历史记录、单行记录直接导出文字功能。
建议2、对话框的“关于”按钮丢了。




发表于 2019-1-17 07:13 | 显示全部楼层
很给力啊!!!!非常感谢大神升级,帮了大忙!!多谢多谢!!!!
发表于 2019-1-17 07:16 | 显示全部楼层
没金币了 麻烦大大发一份(表达式计算修改版本,增加计算函数选择按钮给我)吧!! 谢谢 879792799@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 21:24 , Processed in 0.576841 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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