Что это значит, когда за вершиной dxf с коэффициентом выпуклости не следует конечная точка?

У меня есть файл DXF, который был экспортирован из чертежа простой дуги, которая начинается в (0, 0), заканчивается в (2, 0) и имеет радиус 1.0. Я ожидаю, что LWPOLYLINE будет состоять из двух вершин, первая из которых содержит начальную точку и коэффициент выпуклости, а вторая точка просто содержит конечную точку. Однако конечная точка также содержит фактор выпуклости. Как интерпретировать эту точку выпуклости? Не должны ли за всеми вершинами с выпуклостью следовать еще одна точка, определяющая конечную точку?

AcDbPolyline
 90
        2
 70
     0
 43
0.0
 10
0.0  -----------------> x1
 20
0.0  -----------------> x2
 42
0.9999999999999998 ---> p1 to p2 w/ bulge = 1, makes sense
 10
2.0  -----------------> x2
 20
0.0  -----------------> y2
 42
1.330537671996453 ----> why does p2 have a bulge? Shouldn't all vertices w/ 
                        a bulge be followed by another point (to define the 
                        end point)?
  0
ENDSEC

person Darien Shannon    schedule 22.03.2018    source источник


Ответы (2)


Лучший способ узнать такие детали — это протестировать. Если у вас нет приложения AutoCAD, попробуйте Autodesk TrueView, это бесплатно.

В ходе тестирования я обнаружил следующее: последнее значение выпуклости ничего не делает, вы можете изменить его на любое значение, которое хотите, или просто удалить его, LWPOLYLINE всегда выглядит одинаково.

РЕДАКТИРОВАТЬ:

Это верно только в том случае, если LWPOLYLINE не закрыта.

Если LWPOLINE закрыта, код группы 70=1, последняя выпуклость, а также последнее значение начальной и конечной ширины применяются к закрывающему сегменту от последней вершины до первой вершины, ваш пример в виде замкнутой полилинии выглядит следующим образом:

введите описание изображения здесь

person mozman    schedule 22.03.2018

Группа 70 DXF кодируется битами, причем бит 1 указывает, что объект LWPolyline закрыт (обратите внимание, что это не то же самое, что LWPolyline имеет совпадающие конечные точки).

При установленном бите 1 коэффициент выпуклости (группа DXF 42) и значения начальной и конечной ширины (группы DXF 40 и 41) определяют, как должен выглядеть закрывающий сегмент (т. е. сегмент, охватывающий последнюю вершину и первую вершину).

Вы можете наблюдать эффект этого значения в следующих примерах:

Следующее выражение entmake с опущенной последней записью группы 42 DXF (и поэтому интерпретируется как 0) создает ломаную линию, как показано на рисунке:

(entmake
   '(
        (000 . "LWPOLYLINE")
        (100 . "AcDbEntity")
        (100 . "AcDbPolyline")
        (090 . 3)
        (070 . 1)
        (010 0.0 0.0)
        (010 1.0 1.0)
        (010 1.0 0.0)
    )
)

Нулевая выпуклость

Принимая во внимание, что следующее выражение entmake с последней записью группы 42 DXF, установленной на -1 (=tan(-pi/4)), создает полилинию, как показано на рисунке:

(entmake
   '(
        (000 . "LWPOLYLINE")
        (100 . "AcDbEntity")
        (100 . "AcDbPolyline")
        (090 . 3)
        (070 . 1)
        (010 0.0 0.0)
        (010 1.0 1.0)
        (010 1.0 0.0)
        (042 . -1.0)
    )
)

Ненулевая выпуклость

person Lee Mac    schedule 22.03.2018
comment
Итак, если группа 70 = 0, коэффициент выпуклости конечной вершины не имеет значения? - person Darien Shannon; 22.03.2018
comment
@DarienShannon Если ломаная линия открыта, то да, окончательный коэффициент выпуклости и начальная/конечная ширина не имеют значения. Однако, поскольку группа 70 является битовым значением, вы не можете просто проверить наличие 0, а скорее проверить, установлен ли бит 1. Я не уверен, какой язык вы используете, но в AutoLISP это будет (zerop (logand 1 (cdr (assoc 70 <dxf-data>)))) - person Lee Mac; 22.03.2018
comment
Идеальный. Я просто анализирую .dxf в Julia, чтобы преобразовать полилинии в массив точек. При этом код будет просто строкой. - person Darien Shannon; 23.03.2018