明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2343|回复: 15

[提问] 求教:cal计算大整数时错误

[复制链接]
发表于 2018-10-16 19:56:24 | 显示全部楼层 |阅读模式
调用cal函数计算时,碰到大整数时计算错误。 cal 的bug: 整数必须介于 -32768 和 32767 之间。
请问各位大侠,怎么解决?谢谢!
发表于 2018-10-21 12:55:09 | 显示全部楼层
本帖最后由 Bao_lai 于 2018-10-21 13:13 编辑

  1. (defun C:CALCU (/ ss ssl i e str el nstr p p1 ll l)
  2.     ;(if (not (member "GEOMCAL.ARX" (MAPCAR ' strcase (arx)))) ;无用代码出错
  3.     ;      (arxload "geomcal.arx")
  4.     ;)
  5.    
  6.     (setq csd (getint "\n请指定计算结果小数位精度:<2>"))
  7.     (if (= csd nil)
  8.         (setq csd 2)
  9.     )
  10.     (if (and (setq ss (ssget '((0 . "TEXT,TCH_TEXT"))))
  11.              (setq p (getpoint "\n请输入标注点位置: "))
  12.         )
  13.     (progn
  14.         (setq ssl  (sslength ss)
  15.             i    -1
  16.         )
  17.         (command "cal")(command) ;先调用command函数,避免后面计算失败。
  18.         (repeat ssl
  19.               (setq el   (entget (ssname ss (setq i (1+ i))))
  20.                     str  (strcat "1.0*" (cdr (assoc 1 el))) ;调整型为实数,除Bug。
  21.                     l    (caadr (textbox (list (assoc 1 el) (assoc 40 el))))
  22.                     ll   (+ l (* 4. (/ l (strlen (cdr (assoc 1 el))))))
  23.               ;nstr (rtos (c:cal str) 2 csd)
  24.               )
  25.               (setq nstr (rtos (c:cal str) 2 csd))  ;把这个单独拿出来了
  26.               (setq el (subst (cons 10 p) (assoc 10 el) el))
  27.               (entmake el) ;写计算式
  28.               (setq el (subst (cons 1 nstr) (assoc 1 el) el)
  29.                     p1 (mapcar '+ (list ll 0. 0.) p)
  30.                     el (subst (cons 10 p1) (assoc 10 el) el)
  31.               )
  32.               (entmake el);写结果
  33.               (setq p (mapcar '+ p (list 0. (- (* 1.5 (cdr (assoc 40 el)))) 0.))) ;计算下一个插入点
  34.         
  35.         )
  36.       )
  37.     )
  38.     (princ)
  39. )

 楼主| 发表于 2018-10-18 18:52:38 | 显示全部楼层
(defun CALCU (/ ss ssl i e str el nstr p p1 ll l)
   (if (not (member "GEOMCAL.ARX" (MAPCAR 'strcase (arx))))
    (arxload "geomcal.arx")
  )
   (if (= csd nil)
       (setq csd 2))
   (if (and (setq ss (ssget '((0 . "TEXT,TCH_TEXT"))))
           (setq p (getpoint "\n请输入标注点位置: "))
      )
    (progn
      (setq ssl        (sslength ss)
            i        -1
      )
      (repeat ssl
        (setq el   (entget (ssname ss (setq i (1+ i))))
              str  (cdr (assoc 1 el))
              l           (caadr (textbox (list (assoc 1 el) (assoc 40 el))))
              ll   (+ l (* 4. (/ l (strlen (cdr (assoc 1 el))))))
              nstr (rtos (c:cal str) 2 csd)
        )
        (setq el (subst (cons 10 p) (assoc 10 el) el))
        (entmake el)
        (setq el (subst (cons 1 nstr) (assoc 1 el) el)
              p1 (mapcar '+
                         (list ll 0. 0.)
                         p
                 )
              el (subst (cons 10 p1) (assoc 10 el) el)
        )
        (entmake el)
        (setq
          p (mapcar '+ p (list 0. (- (* 1.5 (cdr (assoc 40 el)))) 0.))
        )
      )
    )
  )
  (princ)
)
发表于 2018-10-17 23:06:20 | 显示全部楼层
(defun c:ca()
   (SETVAR "CMDECHO" 0)       
   (setq en1 (entsel "\n请选择表达式: \n"))
   (setq en1_data (entget (car en1)))
   (setq text1 (cdr (assoc 1 en1_data)))

         ;感觉调用都不会出错(*@ο@*) 哇~
   (princ (strcat "\n" text1 "="))
         ;(princ (strcat "\n" text1 "*1.0="))

   (command "cal" text1 )
   (SETVAR "CMDECHO" 1) (PRINC)
)
 楼主| 发表于 2018-10-17 15:33:34 | 显示全部楼层
例如:53450+11850+9470 计算的结果为9234;
而直接用CAL命令计算的结果77470正确
发表于 2018-10-17 16:28:25 来自手机 | 显示全部楼层
本帖最后由 lisperado 于 2018-10-17 16:38 编辑

我也一样,整数限制正负16位元
(Cal "53450+11850+9470")
9234

实数就行
(Cal "53450.+11850.+9470.")
74770

干嘛不用Lisp函数 ‘+’?(+ 53450 11850 9470)
74770


 楼主| 发表于 2018-10-17 16:41:18 | 显示全部楼层
lisperado 发表于 2018-10-17 16:28
我也一样,只限16位元整数
(Cal "53450+11850+9470")
9234

确实对于如计算式 “53450+11850+9470" 改为 “53450.0+11850+9470" 则计算正确。
是否有不改计算式,通过程序解决的办法?
发表于 2018-10-17 17:02:04 | 显示全部楼层
nt8011 发表于 2018-10-17 16:41
确实对于如计算式 “53450+11850+9470" 改为 “53450.0+11850+9470" 则计算正确。
是否有不改计算式,通 ...

只是不解为何一定要用CAL呢?
 楼主| 发表于 2018-10-17 17:16:03 | 显示全部楼层
CAL方便用于各种不同的计算式
发表于 2018-10-17 22:14:48 | 显示全部楼层
我只有笨办法,将算式字符串拆分成计算数和运算符,对所有不带.的计算数字符串全部加.0,也就是把所有的计算数变成实数就可以了
发表于 2018-10-17 23:07:57 | 显示全部楼层
Bao_lai 发表于 2018-10-17 23:06
(defun c:ca()
   (SETVAR "CMDECHO" 0)       
   (setq en1 (entsel "\n请选择表达式: \n"))

请试一试,如果出错就用底下这个吧。
  1. (princ (strcat "\n" text1 "*1.0="))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 20:48 , Processed in 0.197418 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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