Главная »Статьи »AutoCAD и Delphi » |
Дуга полилинии характеризуется координатами точек начала и конца, их порядком и кривизной (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. Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором. |