乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 52|回复: 7

[编程交流] 用于高精度distan的Lisp

[复制链接]

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 14:48:44 | 显示全部楼层 |阅读模式
对于好奇的人来说,这个lisp显示了拾取点之间的X、Y、Z和3D距离,最多可显示15个位置。根据帮助文件,RTOS函数的精度参数对应于LUPREC系统变量。但LUPREC的精度限制为8位,而RTOS的精度可以设置为15位。
该lisp是使用Intellicad开发的,并在Intellicad上进行了测试。我没有Autocad可以试用。我认为它会起作用。我想知道它是否不起作用或不显示所有15个位置。如果您喜欢在警报框中显示结果而不是在命令历史记录中显示结果,则可以重写此命令。
 
  1. (defun c:pdx (/ *ERROR* p1 p2 xp1 yp1 zp1 xp2 yp2 zp2 dx dy dz d3d dxst dyst dzst d3dst dtstr)
  2.     (defun *ERROR* (msg)
  3.     (princ " - interrupted function ")
  4.     (princ)
  5.     )
  6.    (setq p1 (getpoint "\nFirst point"))
  7.    (setq p2 (getpoint p1 "\nSecond point"))
  8.    (setq xp1 (car p1))
  9.    (setq p1 (cdr p1))
  10.    (setq yp1 (car p1))
  11.    (setq p1 (cdr p1))
  12.    (setq zp1 (car p1))
  13.    (setq xp2 (car p2))
  14.    (setq p2 (cdr p2))
  15.    (setq yp2 (car p2))
  16.    (setq p2 (cdr p2))
  17.    (setq zp2 (car p2))
  18.    (setq dx (- xp2 xp1))
  19.    (setq dy (- yp2 yp1))
  20.    (setq dz (- zp2 zp1))
  21.    (setq d3d (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))
  22.    (if (minusp dx)
  23.    (setq dxst (strcat "DX = " (rtos dx 2 15)))
  24.    (setq dxst (strcat "DX =  " (rtos dx 2 15)))
  25.    )
  26.    (if (minusp dy)
  27.    (setq dyst (strcat "DY = " (rtos dy 2 15)))
  28.    (setq dyst (strcat "DY =  " (rtos dy 2 15)))
  29.    )
  30.    (if (minusp dz)
  31.    (setq dzst (strcat "DZ = " (rtos dz 2 15)))
  32.    (setq dzst (strcat "DZ =  " (rtos dz 2 15)))
  33.    )
  34.    (setq d3dst (strcat "D3D =  " (rtos d3d 2 15)))
  35.    (setq dtstr (strcat dxst "\n " dyst "\n " dzst "\n" d3dst))
  36.    (princ "\n")(princ dtstr)
  37.    (princ)
  38.    )
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 14:57:37 | 显示全部楼层
运行了您的代码。。。结果如下
我的Luprec=4
我做了一些实验,如果你感兴趣的话,如果你把结果发送到一个警报框,它会显示相同数量的小数点。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:13:25 | 显示全部楼层
为什么使用IF语句?根据代码,两种方式都不一样吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:18:25 | 显示全部楼层
您可以更简洁地将其改写为:
 
  1. (defun c:pdx (/ p1 p2)
  2. (while (and (setq p1 (getpoint "\nFirst point"))
  3.              (setq p2 (getpoint p1 "\nSecond point")))
  4.    (alert
  5.      (strcat "Distances: \n"
  6.              "\nDX  = " (rtos (abs (- (car p1) (car p2))) 2 15)
  7.              "\nDY  = " (rtos (abs (- (cadr p1) (cadr p2))) 2 15)
  8.              "\nDZ  = " (rtos (abs (- (caddr p1) (caddr p2))) 2 15)
  9.              "\nD3D = " (rtos (distance p1 p2) 2 15))))
  10. (princ))
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:35:52 | 显示全部楼层
哦,我明白了,那么也许是这个?
 
  1. (defun c:pdx (/ p1 p2 dx dy dz)
  2. (while (and (setq p1 (getpoint "\nFirst point"))
  3.              (setq p2 (getpoint p1 "\nSecond point")))
  4.    (setq dx (- (car p2) (car p1))
  5.          dy (- (cadr p2) (cadr p1))
  6.          dz (- (caddr p2) (caddr p1)))
  7.    (alert
  8.      (strcat "Distances: \n"
  9.              "\nDX   = " (if (not (minusp dx)) (chr 32) "") (rtos dx 2 15)
  10.              "\nDY   = " (if (not (minusp dy)) (chr 32) "") (rtos dy 2 15)
  11.              "\nDZ   = " (if (not (minusp dz)) (chr 32) "") (rtos dz 2 15)
  12.              "\nD3D = " (rtos (distance p1 p2) 2 15))))
  13. (princ))
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 15:41:08 | 显示全部楼层
非常紧凑,现在可以连续运行。美好的谢谢李。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:56:11 | 显示全部楼层
 
没问题,我只是想让事情简洁明了。。。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 22:27 , Processed in 1.123290 second(s), 79 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表