乐筑天下

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

[编程交流] Autocad不准确和问题

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 22:10:59 | 显示全部楼层 |阅读模式
大家好,
 
我一直在使用autolisp从我在autocad中创建的模型中提取数据。数据与线交点和它们的角度有关。它基本上是一个管网,根据连接方式,我得到“三通”、“弯头”等。
 
问题是,当我复制元素时,Autocad似乎引入了一些不精确性。假设我每隔5米复制一个相同的分支,类似于单向阵列。不幸的是,当我运行lisp程序时,它给出了错误的结果。如果我不这样复制元素,代码是正确的,并给出正确的结果。这意味着通过使用OSNAP(手动单击每个目标点)进行复制,我会得到预期的结果。
 
有人遇到过这样的问题吗?有什么方法可以纠正吗?
谢谢
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 22:17:59 | 显示全部楼层
用代码和示例图进行解释。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 22:23:24 | 显示全部楼层
你在用整数除吗?
 
您是否在代码中重写/使用OSNAP?
 
正如塔瓦特所建议的那样,发布代码和示例是最好的起点。
 
-大卫
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
319
发表于 2022-7-5 22:26:02 | 显示全部楼层
尝试将模型设置为俯视图
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 22:31:43 | 显示全部楼层
 
我知道有时Autocad在顶级模式下的表现比3D好,但这没有任何区别。这是因为正如我所说,代码是正确的,但当输入值而不是osnap点时,模型似乎有一些不准确。
 
很难再现整个问题,因为它并非总是发生。
 
我注意到,复制的成员距离越远,错误可能越大。这意味着,当选择一条连接到节点的线,然后每5个单元复制一次时,就像一个单向阵列,每个单元的距离为5xn,它得到的最远可能是它所处的点不是完全预期的,例如不是15,5,10,而是15.0000000000000000001。我想这与Autocad的准确性有关,但我的lisp代码中的一些标准因此不能很好地工作。
 
有人遇到过Autocad精度问题吗?
 
就我的代码而言,它很长,我认为有人浏览它没有意义,但基本上我要做的是解析每个节点上的网络,在该节点上创建一个线的选择集,然后在选择中查找两条线之间的角度,如下所示:
 
  1. (setq A (distance (cdr (assoc 10 (entget (ssname s 0)))) (cdr (assoc 11 (entget (ssname s 0))))))
  2. (setq B (distance (cdr (assoc 10 (entget (ssname s 1)))) (cdr (assoc 11 (entget (ssname s 1))))))
  3. (setq C1 (distance (cdr (assoc 10 (entget (ssname s 0)))) (cdr (assoc 11 (entget (ssname s 1))))))
  4. (setq C2 (distance (cdr (assoc 10 (entget (ssname s 0)))) (cdr (assoc 10 (entget (ssname s 1))))))
  5. (setq C3 (distance (cdr (assoc 11 (entget (ssname s 0)))) (cdr (assoc 11 (entget (ssname s 1))))))
  6. (setq C4 (distance (cdr (assoc 11 (entget (ssname s 0)))) (cdr (assoc 10 (entget (ssname s 1))))))
  7. (setq C (max C1 C2 C3 C4))
  8. (setq ang (* (/ 180 pi) (acos (/ (- (+ (* A A) (* B B)) (* C C)) (* 2 (* A B))))))
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 22:35:06 | 显示全部楼层
这不仅仅是autocad,而是计算机存储实数的方式。常见15位有效数字(非小数)
 
(rtos)在准确性方面有这个限制,即使您可以指定15位小数(rtos c1 2 15),它也在估计超过15位有效数字的任何内容
 
因此,1234.56789012345与通常存储的一样准确。autolisp(equal nnn nnn fuzz)可以成为您最好的朋友。
 
因此,舍入函数可能也会有所帮助。
 
-大卫
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-5 22:41:36 | 显示全部楼层
从您提供的不完整代码片段来看,您似乎在尝试检查节点之间的几个距离,然后计算角度,作为距离a、B和C1到c4的最大值的函数。我假设acos函数是您的自定义函数。注意,对于小角度,acos函数将产生更多误差。也就是说,当acos接近1(0°)时,acos参数的微小变化会产生更大的角度差。例如,从0.0到0.1的角度变化为(90-84.26…~5.74°,而从acos.9到acos(1)的变化为25.84°。当您接近acos(1)时,灵敏度会增加。
此外,角度的精度还取决于计算中使用的距离的相对大小(距离越大越好)和相对于WCS基准的线位置(0,0,0)(当您离开原点时,精度仍然是15个有效数字,但最小步长更大)。
我建议不要使用trig进行计算,而应坚持使用向量计算(向量的x、y和z分量基本上是余弦)。也许只需要取向量AB和另一个向量的点积就可以得到你需要的。
如果您需要的话,一张有标签的点图片和您试图确定的内容将帮助我提供更多详细信息。
~ lrm
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 22:46:21 | 显示全部楼层
如上所述,我不会这样做(/180 pi),但我会(/180.0 pi),这可以帮助实/int计算问题。
 
此外,我会在开始时执行(setq pt1(cdr(assoc 10(entget(ssname s 0 kЮЮ)Ю)))然后执行(距离pt1 pt2)
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-5 22:49:19 | 显示全部楼层
AutoCAD数据库是双精度的(15位有效数字),AutoLISP也是双精度的,因此我认为“精度”问题不是由于AutoCAD的精度,而是由于计算中使用的方法。我想了解更多关于OP尝试做什么的信息。
 
顺便说一句,混合模式运算(int/real)会自动转换为实数学,因此尽管包含小数点(/180.0 pi)是一种良好的做法,但它不会影响计算结果。
 
(setq a(/1 3))-->产生0
(setq b(/1 3.))-->收益率0.333333
(setq b(/1.3.)-->收益率0.333333
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 22:56:17 | 显示全部楼层
但你的例子正好说明了问题的1/3
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 06:36 , Processed in 0.472338 second(s), 72 queries .

© 2020-2025 乐筑天下

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