明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1896|回复: 6

论坛里面有Autodesk的人吗?有个Bug请反映给Autodesk

[复制链接]
发表于 2019-4-1 17:02:53 | 显示全部楼层 |阅读模式
本帖最后由 cairunbin 于 2019-4-2 20:41 编辑

ObjectArx的Curve.GetDistAtPoint方法,一直存在bug,调用前,都需要先调用GetClosestPointTo()方法,将点位尽量计算到曲线上。但是,我现在碰到一个bug,即使事先调用了GetClosetPointTo方法,AutoCAD依然会抛出eInvalidInput异常。下面两行代码,运行到第二行line.GetDistAtPoint方法时,AutoCAD抛出eInvalidInput异常。
这里说明一句,下面两行语句里面有三个点:(695939.053,3919395.056,0),(695937.577789435,3919396.40646429,0),(695938.134733118,3919395.8966167,0)。其中,第三个点的的确确位于头两个点的连线上,三点共线。也就是说,从理论上,下面两行语句完全没问题。

  1. Line line = new Line(new Point3d(695939.053,3919395.056,0), new Point3d(695937.577789435,3919396.40646429,0));
  2. line.GetDistAtPoint(new Point3d(695938.134733118,3919395.8966167,0));
复制代码


我将上述代码改进,加入GetClosestPointTo调用,如下:
  1. Line line = new Line(
  2.                       new Point3d(695939.053,3919395.056,0),
  3.                       new Point3d(695937.577789435,3919396.40646429,0)
  4.                     );
  5. Point3d ptOnCurve = line.GetClosestPointTo(new Point3d(695938.134733118, 3919395.8966167, 0), false);
  6. line.GetDistAtPoint(ptOnCurve);
复制代码

但是AutoCAD2020依然抛出异常。
请AutoDesk公司的大侠帮忙看看,看看是不是AutoCAD自身的bug,或者是我的代码自身有问题。


另外,我说一件让人哭笑不得的事情:我在Autodesk的论坛里面,发布了关于这个问题的帖子。题目用了AutoCAD's Bug等字眼,结果帖子发出没两分钟,就不见了。弄得我摸不到头脑,还以为没法出去,或者发出去了自己找不到了。然后,我又费了九牛二虎之力,又发了一份类似的帖子(英语水平限制,写篇帖子这个费劲)。结果大家猜得到,没两分钟,第二份帖子也被Autodesk和谐了。这和谐的速度,可比兔子快得多。经过这两次,我好像明白了什么,第三份帖子,就没敢出现Bug这个词,结果,顺利发出,并得到了回复。
这件事,元芳,你怎么看?
 楼主| 发表于 2019-4-2 11:09:24 | 显示全部楼层
本帖最后由 cairunbin 于 2019-4-2 11:13 编辑

我在Autodesk公司的论坛提问了同样的问题。他们给我如下回复:
Hi
This is a well known issue due to a lack of accuracy when working with big coordinates (far away from the origin).
You can try to move the line closer to the origin, make your computations and move back the line and your result.
  1. Line line = new Line(
  2.                       new Point3d(695939.053, 3919395.056, 0),
  3.                       new Point3d(695937.577789435, 3919396.40646429, 0)
  4.                     );
  5.             Point3d point = new Point3d(695938.134733118, 3919395.8966167, 0);
  6.             Vector3d vector = line.StartPoint.GetAsVector();
  7.             Matrix3d disp = Matrix3d.Displacement(vector.Negate());
  8.             line.TransformBy(disp);
  9.             Point3d ptOnCurve = line.GetClosestPointTo(point.TransformBy(disp), false);
  10.             double distance = line.GetDistAtPoint(ptOnCurve);
  11.             line.TransformBy(Matrix3d.Displacement(vector));
复制代码

虽然,这个方案可以解决问题。但是,当文件很大时,如果需要遍历整个数据库,这种方法还是很费时的。
我怀疑,之所以出现这个问题,是Curve.GetDistAtPoint()方法的实现算法不完善造成的。Curve.GetDistAtPoint()方法是virtual的,其子类应各自实现这一方法。而Line类在实现这一方法时,明显没有考虑到Tolerance.Global,因为,我在运行前,已经将Tolerance.Global设置为(0.000001, 0.0001),这已经很大了。而Line、Point3d等类的成员,均使用double类型,double类型的有效数字位可达15-17位。如果考虑了Tolerance.Global的设置,完全不应该出现问题。另外,如果在我的代码中,将Line类型替换为Polyline类型,则不会出现问题。这从另一个侧面也说明了Line.GetDistAtPoint()的编码实现存在问题。


发表于 2019-4-16 18:27:35 来自手机 | 显示全部楼层
大坐标1e9,你小数位的精度只能到1e-7,甚至更大。
 楼主| 发表于 2019-4-17 19:54:05 | 显示全部楼层
xinxirong 发表于 2019-4-16 18:27
大坐标1e9,你小数位的精度只能到1e-7,甚至更大。

4123456.789, 20456789.123
这是标准的测量坐标了。
最大,小数点前面8位。
小数点后面,不需要e-7,有e-3,最多e-4足够了。
所以,就不需要然后了。
发表于 2019-6-6 09:44:37 | 显示全部楼层
同样是2015, 这个问题存在,求交点时碰到,抛出eInvalidInput错误,追溯到GetDistAtPoint函数,有时正确有时报错,确实无奈。
发表于 2019-8-29 16:23:10 | 显示全部楼层
如果是正版,直接找售后反映,如果是D版......
 楼主| 发表于 2019-8-30 07:43:00 | 显示全部楼层
本帖最后由 cairunbin 于 2019-8-30 07:45 编辑
Leo1980 发表于 2019-8-29 16:23
如果是正版,直接找售后反映,如果是D版......

你把Autodesk想象的太完美了。我们连年购买AutoCAD使用权,然而都是没有用的。

某种方面来说,Autodesk和microsoft都是及其傲慢和低效率的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 03:34 , Processed in 0.179121 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表