Метод AutoCAD ActiveX IntersectWith возвращает неверный результат - PullRequest
0 голосов
/ 05 мая 2020

У меня проблемы с методом IntersectWith технологии AutoCAD ActiveX. Чтобы проиллюстрировать проблему, я буду использовать пример ниже:

Toy example

Очевидно, пока x> 0 выиграла горизонтальная линия не пересекаются с вертикальной. Однако для небольших значений x точка B приближается к вертикальной линии, а IntersectWith возвращает пересечение в (0,0) . Я знаю, что этого можно было бы ожидать, если бы использовалась опция acExtendThisEntity, но ExtendOption, который я передаю, это acExtendNone. Согласно документации ActiveX , эти константы определены как значения 1 и 0 соответственно.

Вот мой код:

from pyautocad import Autocad, APoint

acad = Autocad()

A = APoint(-2, 0)
C = APoint(0, 1)
D = APoint(0, -1)
line_CD = acad.model.AddLine(C, D)

header = 'x             acExtendNone      acExtendThisEntity '
print(header + '\n' + '-'*len(header))
for n in range(1, 11):
    x = 1/10**n
    B = APoint(-x, 0)
    line_AB = acad.model.AddLine(A, B)
    coords_0 = line_AB.IntersectWith(line_CD, 0)
    coords_1 = line_AB.IntersectWith(line_CD, 1)
    print(f'{x:.10f}  {repr(coords_0):16}  {coords_1}')

И результат, который я получаю:

x             acExtendNone      acExtendThisEntity 
---------------------------------------------------
0.1000000000  ()                (-2.220446049250313e-16, 0.0, 0.0)
0.0100000000  ()                (-2.220446049250313e-16, 0.0, 0.0)
0.0010000000  ()                (-2.220446049250313e-16, 0.0, 0.0)
0.0001000000  ()                (0.0, 0.0, 0.0)
0.0000100000  ()                (0.0, 0.0, 0.0)
0.0000010000  ()                (-2.220446049250313e-16, 0.0, 0.0)
0.0000001000  ()                (0.0, 0.0, 0.0)
0.0000000100  (0.0, 0.0, 0.0)   (0.0, 0.0, 0.0)
0.0000000010  (0.0, 0.0, 0.0)   (0.0, 0.0, 0.0)
0.0000000001  (0.0, 0.0, 0.0)   (0.0, 0.0, 0.0)

Данные выше показывают, что когда точка B равна 10 -8 или меньше от вертикальная линия line_AB.IntersectWith(line_CD, 0) возвращает точку пересечения. Как мне этого избежать?

...