nt8011 发表于 2018-10-18 18:54:54

Bao_lai 发表于 2018-10-17 23:07
请试一试,如果出错就用底下这个吧。

你的程序测试后结果准确,能否帮忙修改下上面程序?非常感谢!

Bao_lai 发表于 2018-10-21 12:55:09

本帖最后由 Bao_lai 于 2018-10-21 13:13 编辑

(defun C:CALCU (/ ss ssl i e str el nstr p p1 ll l)
    ;(if (not (member "GEOMCAL.ARX" (MAPCAR ' strcase (arx)))) ;无用代码出错
    ;      (arxload "geomcal.arx")
    ;)
   
    (setq csd (getint "\n请指定计算结果小数位精度:<2>"))
    (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
      )
      (command "cal")(command) ;先调用command函数,避免后面计算失败。
      (repeat ssl
            (setq el   (entget (ssname ss (setq i (1+ i))))
                  str(strcat "1.0*" (cdr (assoc 1 el))) ;调整型为实数,除Bug。
                  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 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)
)

Bao_lai 发表于 2018-10-21 13:09:01

本帖最后由 Bao_lai 于 2018-10-21 13:11 编辑

已编辑改正,注意查收.

nt8011 发表于 2018-10-22 14:47:03

本帖最后由 nt8011 于 2018-10-22 14:48 编辑

Bao_lai 发表于 2018-10-21 13:09
已编辑改正,注意查收.
经使用,完全解决了问题!   非常感谢!

菜卷鱼 发表于 2018-10-25 17:08:02

(c:cal (strcat "1.0*" num))

ww8658 发表于 2019-6-22 13:36:27

整形数溢出错。只支持到32767,如果要用CAL函数,可以在表达式前面加一个“0.0+”或者“1.0*”,强制转为浮点数。
页: 1 [2]
查看完整版本: 求教:cal计算大整数时错误