Главная »Статьи »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.

Свойства AcadObject
Описание
Доступ
Handle: WideString Handle объекта (строка с числом в шестнадцатиричном формате)
R
ObjectID: Integer идентификатор объекта
R
OwnerID: Integer идентификатор родителя объекта
R
ObjectName: WideString имя объекта (его AutoCAD class name), например: AcDbLine, AcDbCircle, AcDbArc, AcDbText
R
Application: IDispatch приложение
R
Document: IDispatch документ, который содержит данный объект
R
HasExtensionDictionary: WordBool равен True, если объект имеет расширенный словарь
R
Свойства AcadEntity
Описание
Доступ
TrueColor: AcadAcCmColor объект AcadAcCmColor — цвет примитива в формате True Color (см. раздел О цвете)
R/W
Layer: WideString имя слоя
R/W
Linetype: WideString имя стиля линии (из существующих в данном документе)
R/W
LinetypeScale: Double масштаб линии
R/W
Visible: WordBool видимость примитива
R
PlotStyleName: WideString имя стиля печати
R
Lineweight: AcLineWeight вес (ширина) линии (см. констатны AcLineWeight)
R/W
Hyperlinks: AcadHyperlinks коллекция гиперссылок
R/W
EntityName: WideString имя примитива (указывает его тип), например: AcDbLine, AcDbCircle, AcDbArc, AcDbText
R
EntityType: LongWord тип примитива (см. констатны AcEntityName)
R
Color: AcColor цвет примитива в формате AutoCAD Color Index
R/W
Отрезок, окружность, дуга

Методы создания:

// Возвращаемое значение объект 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 этапа:

  1. Собственно создание объекта штриховки;
  2. Передача созданному объекту границ штриховки;
  3. Построение штриховки — вычисление штриховки в ее границах.

Метод создания:

// Возвращаемое значение объект AcadHatch
function AddHatch(PatternType: TOleEnum; const PatternName: WideString;
                  Associativity: WordBool; HatchObjectType: TOleEnum): OleVariant;

Параметры:

  • PatternType — число перечислимого типа AcPatternType или AcGradientPatternType. Если значение HatchObjectType равно acHatchObject используется тип AcPatternType, если HatchObjectType равно AcGradientObject, то используется тип AcGradientPatternType.
  • PatternName — имя шаблона штриховки. Рассмотрим случаи:
    1. PatternType имеет тип AcPatternType. Если PatternType равно acHatchPatternTypePreDefined, то PatternName должно быть равно имени шаблона в файле acad.pat. Если PatternType равно acHatchPatternTypeCustomDefined, то PatternName должно быть равно имени шаблона в файле пользовательских штриховок .pat. Если PatternType равно acHatchPatternTypeUserDefined, то PatternName не используется, в качестве шаблона штриховки используется текущий тип линии.
    2. PatternType имеет тип AcGradientPatternType. Если PatternType равно acPreDefinedGradient, то PatternName должно быть равно одному из следующих значений: LINEAR, CYLINDER, INVCYLINDER, SPHERICAL, HEMISPHERICAL, CURVED, INVSPHERICAL, INVHEMISPHERICAL, или INVCURVED.
  • Associativity — если равно True создается ассоативная штриховка.
  • HatchObjectType — число перечислимого типа AcHatchObjectType. Если равно acHatchObject — используется обычная штриховка, если acGradientObject — градиентная, при этом PatternType должен быть типа AcGradientPatternType.
Если создается градиентная штриховка, для задания цвета используются свойства: 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.


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

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