Главная »Статьи »AutoCAD и Delphi »Дуговые сегменты AcadLWPolyline
Дуговые сегменты AcadLWPolyline

Дуга полилинии характеризуется координатами точек начала и конца, их порядком и кривизной (Bulge, выпуклостью). Массив координат (X, Y) узлов полилинии (в объектной системе координат) находится в свойстве Coordinates:

property Coordinates: OleVariant;

Получение массива:

var
  Coords, Entity: OleVariant;
  Obj: IDispatch;
. . .
  Acad.ActiveDocument.Utility.GetEntity(Obj, BasePnt, #13'Выделите полилинию: ');
  Entity:= Obj;
  Coords:= Entity.Coordinates;

Теперь переменная Coords содержит массив чисел типа Double; четные члены — координаты X, нечетные — Y.

Значения нижнего и верхнего индексов этого массива находится с помощью функций:

function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;
function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;

Количество сегментов рассчитывается и их координаты извлекаются с учетом "замкнутости" полилинии:

var
  N, K, LBnd, HBnd: Longint;
  P1, P2: OleVariant; // Координаты начала и конца сегмента
. . .
  LBnd:= VarArrayLowBound(Coords, 1);
  HBnd:= VarArrayHighBound(Coords, 1);
  K:= ((HBnd - LBnd) - 1) div 2;
  if Entity.Closed then
    N:= K + 1
  else
    N:= K;
  for i:= 0 to N - 1 do
  begin
    P1:= Entity.Coordinate[i];
    if i = K then
      P2:= Entity.Coordinate[0]
    else
      P2:= Entity.Coordinate[i + 1];
    . . .  
  end;

Кривизна — есть тангенс четверти внутреннего угла. Чтобы указать кривизну сегмента необходимо использовать метод GetBulge:

function GetBulge(Index: Integer): Double;

Параметр Index — номер сегмента. Если возвращаемое значение Bulge = 0 — это прямой сегмент, при Bulge = 1 дуга представляет собой полуокружность. Отрицательное значение Bulge означает, что дуга строится по часовой стрелке (CW).

Формулы, необходимые для получения радиуса и координат центра дуги:

В этих формулах присутствует неоднозначность ввиде знаков ±. Для ее устранения необходимо рассматривать угловой размер дуги (меньше или больше Pi) совместно со знаком кривизны:

Здесь показаны соответствующие знаки при dX и dY.

Как было упомянуто выше координаты узлов полилинии хранятся в объектной системе координат, поэтому полученное значение координат центра дуги следует пересчитать в мировые, используя функцию TranslateCoordinates объекта AcadUtility:

function TranslateCoordinates(Point: OleVariant; FromCoordSystem: AcCoordinateSystem; 
  ToCoordSystem: AcCoordinateSystem; Displacement: SYSINT; OCSNormal: OleVariant): OleVariant;

Наименьшее значение Bulge

Кривизна назначается всем сегментам полилинии, тогда каково ее пороговое значение, необходимое для принятия решения что рассматриваемый сегмент дуговой? В прилагаемом примере строится гигантская полилиния с дуговым сегментом, расстояние между концами которого равно 1 000 000 000, а кривизна равна  -0,000 000 1. И такой сегмент AutoCAD дуговым не считает! Только увеличение кривизны на порядок (до -0,000 001) приводит к тому, что AutoCAD распознает его как дуговой с радиусом 250 000 000 000 250.

К статье прилагается пример на Delphi 7.


Внимание! Запрещается воспроизведение данной статьи или ее части без согласования с автором. Если вы желаете разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Вершинин И.В.

 
Используются технологии uCoz