MJLM 发表于 2022-7-5 22:10:59

Autocad不准确和问题

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

Tharwat 发表于 2022-7-5 22:17:59

用代码和示例图进行解释。

David Bethel 发表于 2022-7-5 22:23:24

你在用整数除吗?
 
您是否在代码中重写/使用OSNAP?
 
正如塔瓦特所建议的那样,发布代码和示例是最好的起点。
 
-大卫

motee-z 发表于 2022-7-5 22:26:02

尝试将模型设置为俯视图

MJLM 发表于 2022-7-5 22:31:43

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

David Bethel 发表于 2022-7-5 22:35:06

这不仅仅是autocad,而是计算机存储实数的方式。常见15位有效数字(非小数)
 
(rtos)在准确性方面有这个限制,即使您可以指定15位小数(rtos c1 2 15),它也在估计超过15位有效数字的任何内容
 
因此,1234.56789012345与通常存储的一样准确。autolisp(equal nnn nnn fuzz)可以成为您最好的朋友。
 
因此,舍入函数可能也会有所帮助。
 
-大卫

lrm 发表于 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

BIGAL 发表于 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 发表于 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

BIGAL 发表于 2022-7-5 22:56:17

但你的例子正好说明了问题的1/3
页: [1] 2
查看完整版本: Autocad不准确和问题