CALCAD 发表于 2022-7-6 14:48:44

用于高精度distan的Lisp

对于好奇的人来说,这个lisp显示了拾取点之间的X、Y、Z和3D距离,最多可显示15个位置。根据帮助文件,RTOS函数的精度参数对应于LUPREC系统变量。但LUPREC的精度限制为8位,而RTOS的精度可以设置为15位。
该lisp是使用Intellicad开发的,并在Intellicad上进行了测试。我没有Autocad可以试用。我认为它会起作用。我想知道它是否不起作用或不显示所有15个位置。如果您喜欢在警报框中显示结果而不是在命令历史记录中显示结果,则可以重写此命令。
 
(defun c:pdx (/ *ERROR* p1 p2 xp1 yp1 zp1 xp2 yp2 zp2 dx dy dz d3d dxst dyst dzst d3dst dtstr)
    (defun *ERROR* (msg)
    (princ " - interrupted function ")
    (princ)
    )
   (setq p1 (getpoint "\nFirst point"))
   (setq p2 (getpoint p1 "\nSecond point"))
   (setq xp1 (car p1))
   (setq p1 (cdr p1))
   (setq yp1 (car p1))
   (setq p1 (cdr p1))
   (setq zp1 (car p1))
   (setq xp2 (car p2))
   (setq p2 (cdr p2))
   (setq yp2 (car p2))
   (setq p2 (cdr p2))
   (setq zp2 (car p2))
   (setq dx (- xp2 xp1))
   (setq dy (- yp2 yp1))
   (setq dz (- zp2 zp1))
   (setq d3d (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))
   (if (minusp dx)
   (setq dxst (strcat "DX = " (rtos dx 2 15)))
   (setq dxst (strcat "DX =" (rtos dx 2 15)))
   )
   (if (minusp dy)
   (setq dyst (strcat "DY = " (rtos dy 2 15)))
   (setq dyst (strcat "DY =" (rtos dy 2 15)))
   )
   (if (minusp dz)
   (setq dzst (strcat "DZ = " (rtos dz 2 15)))
   (setq dzst (strcat "DZ =" (rtos dz 2 15)))
   )
   (setq d3dst (strcat "D3D =" (rtos d3d 2 15)))
   (setq dtstr (strcat dxst "\n " dyst "\n " dzst "\n" d3dst))
   (princ "\n")(princ dtstr)
   (princ)
   )

lpseifert 发表于 2022-7-6 14:57:37

运行了您的代码。。。结果如下
我的Luprec=4
我做了一些实验,如果你感兴趣的话,如果你把结果发送到一个警报框,它会显示相同数量的小数点。

Lee Mac 发表于 2022-7-6 15:13:25

为什么使用IF语句?根据代码,两种方式都不一样吗?

Lee Mac 发表于 2022-7-6 15:18:25

您可以更简洁地将其改写为:
 

(defun c:pdx (/ p1 p2)
(while (and (setq p1 (getpoint "\nFirst point"))
             (setq p2 (getpoint p1 "\nSecond point")))
   (alert
   (strcat "Distances: \n"
             "\nDX= " (rtos (abs (- (car p1) (car p2))) 2 15)
             "\nDY= " (rtos (abs (- (cadr p1) (cadr p2))) 2 15)
             "\nDZ= " (rtos (abs (- (caddr p1) (caddr p2))) 2 15)
             "\nD3D = " (rtos (distance p1 p2) 2 15))))
(princ))

CALCAD 发表于 2022-7-6 15:26:47

lpseifert,在结果中,精度参数似乎是作为字段宽度,而不是小数点后的精度。奇怪的在Intellicad中,显示始终位于小数点后15位。谢谢你花时间玩这个。
 
李,谢谢你对密码的提问。不知何故,lisp代码的格式被搞砸了,并删除了一些关键空格。我的目的是为减号提供一列,并将数字对齐,而不考虑符号。您的代码显示绝对值,这可能是您想要的。但我想展示一个消极的方向,如果这就是拣选单产生的结果。当我第一次尝试时,我的代码往往过于明确,以便于我理解!我可能会通过重写来加强它。
 
代码部分应如下所示:
 
(if (minusp dx)
(setq dxst (strcat "DX = " (rtos dx 2 15)))
(setq dxst (strcat "DX =" (rtos dx 2 15)))
)
(if (minusp dy)
(setq dyst (strcat "DY = " (rtos dy 2 15)))
(setq dyst (strcat "DY =" (rtos dy 2 15)))
)
(if (minusp dz)
(setq dzst (strcat "DZ = " (rtos dz 2 15)))
(setq dzst (strcat "DZ =" (rtos dz 2 15)))
)
(setq d3dst (strcat "D3D =" (rtos d3d 2 15)))

 
我在第一篇文章中更新了代码。

Lee Mac 发表于 2022-7-6 15:35:52

哦,我明白了,那么也许是这个?
 

(defun c:pdx (/ p1 p2 dx dy dz)
(while (and (setq p1 (getpoint "\nFirst point"))
             (setq p2 (getpoint p1 "\nSecond point")))
   (setq dx (- (car p2) (car p1))
         dy (- (cadr p2) (cadr p1))
         dz (- (caddr p2) (caddr p1)))
   (alert
   (strcat "Distances: \n"
             "\nDX   = " (if (not (minusp dx)) (chr 32) "") (rtos dx 2 15)
             "\nDY   = " (if (not (minusp dy)) (chr 32) "") (rtos dy 2 15)
             "\nDZ   = " (if (not (minusp dz)) (chr 32) "") (rtos dz 2 15)
             "\nD3D = " (rtos (distance p1 p2) 2 15))))
(princ))

CALCAD 发表于 2022-7-6 15:41:08

非常紧凑,现在可以连续运行。美好的谢谢李。

Lee Mac 发表于 2022-7-6 15:56:11

 
没问题,我只是想让事情简洁明了。。。
页: [1]
查看完整版本: 用于高精度distan的Lisp