Главная »Статьи »AutoCAD и Delphi » |
В объектной модели AutoCAD при задании координат точек любых примитивов обязательно указываются все три координаты, даже если чертится двумерный объект. Координаты задаются вариантным массивом (где 0 и 2 — это индексы его нижнего и верхнего элементов): var Pt: OleVariant; begin Pt:= VarArrayCreate([0, 2], varDouble); . . . end; Соответственно Pt[0] — это X; Pt[1] — это Y; Pt[2] — Z. Для упрощения задания координат точки пригодится такая функция: function AcadPoint(X, Y: Double; Z: Double = 0): OleVariant; begin Result:= VarArrayCreate([0, 2], varDouble); Result[0]:= X; Result[1]:= Y; Result[2]:= Z; end; Графические объекты создаются в пространстве модели, листа или в блоке. Чтобы узнать какое из пространств в данный момент активно, необходимо воспользоваться свойством ActiveSpace текущего документа. Следующая функция возвращает текущее пространство: function ActiveSpace: OleVariant; begin if not VarIsClear(Acad) then begin if Acad.ActiveDocument.ActiveSpace = acModelSpace then Result:= Acad.ActiveDocument.ModelSpace else Result:= Acad.ActiveDocument.PaperSpace; end; end; Пример использования: ActiveSpace.AddLine(AcadPoint(0, 0), AcadPoint(100, 100)); |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Предок всех графических объектов — AcadEntity, его родитель — AcadObject.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Методы создания: // Возвращаемое значение объект AcadLine function AddLine(StartPoint: OleVariant; EndPoint: OleVariant): OleVariant; // Возвращаемое значение объект AcadCircle function AddCircle(Center: OleVariant; Radius: Double): OleVariant; // Возвращаемое значение объект AcadArc // Углы задаются в радианах, направление против часовой стрелки function AddArc(Center: OleVariant; Radius: Double; StartAngle: Double; EndAngle: Double): OleVariant; Пример использования: const r: Double = 50; sa: Double = 10 * Pi / 180; ea: Double = 190 * Pi / 180; begin if not VarIsClear(Acad) then begin Acad.ActiveDocument.ModelSpace.AddLine(AcadPoint(0, 0), AcadPoint(100, 150)); Acad.ActiveDocument.ModelSpace.AddCircle(AcadPoint(0, 0), r); Acad.ActiveDocument.ModelSpace.AddArc(AcadPoint(0, 0), r, sa, ea); Acad.Update; end; end; Координаты концов созданного отрезка можно изменить используя свойства StartPoint и EndPoint — координаты соответственно начальной и конечной точки (вариантный массив из 3-х элементов). Узнать длину отрезка можно из свойства Length, а свойство Angle возвращает угол наклона относительно оси X (исчисляется против часовой стрелки). Координаты центра окружности можно узнать и изменить используя свойств Center. Интересны свойства Radius, Diameter, Circumference, Area. Все они позволяют не только узнать соответствующее значение, но и изменить его. Свойства StartPoint и EndPoint, как и для отрезка — координаты соответственно начальной и конечной точки (вариантный массив из 3-х элементов), но используются только для чтения. Длину дуги можно прочесть из свойства ArcLength. Свойства StartAngle и EndAngle позволяют изменить начальный и конечный углы, а свойство Center — координаты центра дуги. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Методы создания: // Возвращаемое значение объект AcadPolyline. Метод является устаревшим и оставлен // только для совместимости. Рекомендуется использовать метод AddLightWeightPolyline. // VerticesList - вариантный массив чисел, представляющих X, Y, Z координаты узловых точек // (при этом Z координата игнорируется). function AddPolyline(VerticesList: OleVariant): OleVariant; // Возвращаемое значение объект AcadLWPolyline - 2D полилиния. // VerticesList - вариантный массив чисел, представляющих X, Y координаты узловых точек function AddLightWeightPolyline(VerticesList: OleVariant): OleVariant; // Возвращаемое значение объект Acad3DPolyline - 3D полилиния. // VerticesList - вариантный массив чисел, представляющих X, Y, Z координаты узловых точек. function Add3DPoly(PointsArray: OleVariant): OleVariant; Пример использования AddLightWeightPolyline для рисования стрелки: var pt, Points, Polyline: OleVariant; begin if not VarIsClear(Acad) then begin pt:= AcadPoint(0, 0); Points:= VarArrayCreate([0, 5], VarDouble); Points[0]:= pt[0]; Points[1]:= pt[1]; Points[2]:= pt[0] + 4; Points[3]:= pt[1]; Points[4]:= pt[0] + 10; Points[5]:= pt[1]; Polyline:= Acad.ActiveDocument.ModelSpace.AddLightWeightPolyline(Points); Polyline.SetWidth(0, 0, 2); Acad.Update; end; end; Полилиния создается из прямых сегментов. Чтобы указать дуговые сегменты необходимо использовать метод SetBulge: procedure SetBulge(Index: Integer; Bulge: Double); Параметры: Index — номер узла, от которого начинается дуга; Bulge — величина выпуклости, как угол образованный указанным узлом и следующим за ним. Значение Bulge = 0 означает прямой сегмент, при Bulge = 1 дуга представляет собой полуокружность. Отрицательное значение Bulge означает, что дуга строится по часовой стрелке относительно указанного узла. Пример использования: var pt, Points, Polyline: OleVariant; begin if not VarIsClear(Acad) then begin pt:= AcadPoint(0, 0); Points:= VarArrayCreate([0, 9], VarDouble); Points[0]:= pt[0]; Points[1]:= pt[1]; Points[2]:= pt[0] + 1; Points[3]:= pt[1]; Points[4]:= pt[0] + 1; Points[5]:= pt[1] + 0.5; Points[6]:= pt[0] + 2; Points[7]:= pt[1] + 2.5; Points[8]:= pt[0] + 3; Points[9]:= pt[1] + 2.5; Polyline:= Acad.ActiveDocument.ModelSpace.AddLightWeightPolyline(Points); Polyline.SetBulge(2, -0.5); Acad.Update; end; end; Строит такую полилинию: Пример использования Add3Dpoly для рисования объемной спирали Архимеда: const aSize = 360; var Points: OleVariant; i: Integer; F, R: Double; begin if not VarIsClear(Acad) then begin Points:= VarArrayCreate([0, aSize * 3 - 1], VarDouble); F:= 0; R:= 1; i:= 0; while i < aSize * 3 do begin Points[i]:= cos(F) * R; Inc(i); Points[i]:= sin(F) * R; Inc(i); Points[i]:= R; Inc(i); F:= F + 0.1; R:= R + 0.1; end; Acad.ActiveDocument.ModelSpace.Add3Dpoly(Points); Acad.Update; end; end; А это результат: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Метод создания: // Возвращаемое значение объект AcadText function AddText(const TextString: WideString; InsertionPoint: OleVariant; Double): OleVariant; Параметры: TextString — собственно текст; InsertionPoint — точка вставки текста. Создание текста обычно сопровождается установкой выравнивания относительно опорной точки. Возможные значения приведены ниже: В качестве опорной точки используется InsertionPoint для всех типов выравнивания, кроме acAlignmentAligned и acAlignmentFit. При создании текста значение выравнивания по-умолчанию acAlignmentLeft. Иное значение должно быть установлено после создания: var AcadText: OleVariant; begin if not VarIsClear(Acad) then begin AcadText:= Acad.ActiveDocument.ModelSpace.AddText('Hello, World!', AcadPoint(0, 0), 5); AcadText.Alignment:= acAlignmentCenter; Acad.Update; end; end; При выравнивании acAlignmentFit текст вписывается по ширине между двумя
точками, при выравнивании acAlignmentAligned текст вписывается между двумя
точками по ширине и высоте. Поэтому в качестве опорных используются 2 точки
— InsertionPoint и TextAlignmentPoint:
var AcadText: OleVariant; begin if not VarIsClear(Acad) then begin AcadText:= Acad.ActiveDocument.ModelSpace.AddText('Hello, World!', AcadPoint(0, 0), 5); AcadText.Alignment:= acAlignmentAligned; AcadText.TextAlignmentPoint:= AcadPoint(20, 0); Acad.Update; end; end; Текст создается с использованием текущего текстового стиля. Чтобы сменить текстовый стиль созданного объекта, необходимо использовать его свойство StyleName: var txt: OleVariant; begin txt:= Acad.ActiveDocument.ModelSpace.AddText('Hello, Word!', AcadPoint(0, 0), 5); txt.StyleName:= 'style1'; txt.Update; end; Текстовый стиль с присваиваемым именем должен существовать. Если стиля с таким именем не существует, выдается ошибка EOleException с сообщением "Key not found".
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Метод создания: // Возвращаемое значение объект AcadMText function AddMText(InsertionPoint: OleVariant; Width: Double; const Text: WideString): OleVariant; Параметры: InsertionPoint — точка вставки текста; Width — ширина ограничивающего прямоугольника (а его высота определяется автоматически исходя из параметров шрифта: гарнитуры, высоты символов, междустрочного интервала); Text — собственно текст. Выравнивание MText осуществляется иначе, чем для однострочного текста, а именно, под выравниванием понимается положение текста внутри ограничивающего прямоугольника, соответственно имеется 9 возможных значений. Для установки выравнивания используется свойство AttachmentPoint. Изменение AttachmentPoint не изменяет позицию ограничивающего прямоугольника — изменяется выравнивание текста внутри этого прямоугольника. Напротив, изменение InsertionPoint сдвигает ограничивающий прямоугольник, так что позиция AttachmentPoint смещается в точку InsertionPoint. Рассмотрим код: AcadMText:= Acad.ActiveDocument.ModelSpace.AddMText(AcadPoint(0, 0), 15, 'Hello, World!'); AcadMText.AttachmentPoint:= acAttachmentPointMiddleCenter; AcadMText.InsertionPoint:= AcadPoint(10, 0);
Параметр Text может содержать символы Unicode и управляющие коды, например: Acad.ActiveDocument.ModelSpace.AddMText(AcadPoint(0, 0), 20, '\A1;{Hello, \H0.6x;\SWord/@;}!'); Результат: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Создание штриховки выполняется в 3 этапа:
Метод создания: // Возвращаемое значение объект AcadHatch function AddHatch(PatternType: TOleEnum; const PatternName: WideString; Associativity: WordBool; HatchObjectType: TOleEnum): OleVariant; Параметры:
Если создается градиентная штриховка, для задания цвета используются свойства: GradientColor1 и GradientColor2 типа AcadAcCmColor. Подробнее см. раздел О цвете.
Метод создания границ штриховки: procedure AppendOuterLoop(ObjectArray: OleVariant); // определяет внешний контур procedure AppendInnerLoop(ObjectArray: OleVariant); // определяет внутренний контур Параметр ObjectArray — вариантный массив объектов, составляющих контур. Объектами могут быть Line, Polyline, Circle, Ellipse, Spline или Region. Если используются несколько объектов, их концы должны совпадать. Внешний контур должен быть задан раньше, чем внутренний!
Метод вычисления штриховки в ее границах: procedure Evaluate; Пример создания штриховки: var Hatch, OuterLoop, InnerLoop, Color1, Color2: OleVariant; begin if not VarIsClear(Acad) then begin // границы внешнего контура OuterLoop:= VarArrayCreate([0, 0], varDispatch); OuterLoop[0]:= Acad.ActiveDocument.ModelSpace.AddCircle(AcadPoint(0, 0), 50); // границы внутреннего контура (треугольник внутри окружности) InnerLoop:= VarArrayCreate([0, 2], varDispatch); InnerLoop[0]:= Acad.ActiveDocument.ModelSpace.AddLine(AcadPoint(-26, 15), AcadPoint(0, -30)); InnerLoop[1]:= Acad.ActiveDocument.ModelSpace.AddLine(AcadPoint(0, -30), AcadPoint(26, 15)); InnerLoop[2]:= Acad.ActiveDocument.ModelSpace.AddLine(AcadPoint(26, 15), AcadPoint(-26, 15)); // штриховка Hatch:= Acad.ActiveDocument.ModelSpace.AddHatch(acPreDefinedGradient, 'CYLINDER', True, acGradientObject); // задать градиентную заливку Color1:= Hatch.GradientColor1; Color1.SetRGB(255, 0, 0); Hatch.GradientColor1:= Color1; Color2:= Hatch.GradientColor2; Color2.SetRGB(0, 255, 0); Hatch.GradientColor2:= Color2; // определить границы Hatch.AppendOuterLoop(OuterLoop); Hatch.AppendInnerLoop(InnerLoop); // вычислить Hatch.Evaluate; Acad.Update; end; end; Результат: К статье прилагаются примеры на Delphi 7. Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором. |