IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов
AutoCAD – широко известный графический пакет для построения чертежей. Не секрет, что AutoCAD очень удобен для предприятий, специализирующихся на строительстве, продаже или аренде коммерческих и жилых площадей. В данной статье мы поговорим о ситуации, когда требуется расширить стандартные возможности пакета за счет написания программы на языке Delphi.
Например, это очень удобно, когда необходимо хранить информацию по чертежу в базе данных, осуществить привязку к чертежу документации, отражающей сдачу в аренду площадей различным организациям или предоставить рядовому пользователю, не владеющему знаниями AutoCAD, механизм, когда он за пару щелчков мышью сможет получить точную информацию о размере площади, предоставляемой клиенту, и различные сопутствующие числовые показатели. Объектная модель AutoCAD базируется на Visual Basic for Application, ее использование позволяет получить доступ ко всем элементам как чертежа, так и самой оболочки AutoCAD. В данной статье рассматривается связка Delphi 7 и AutoCAD 2004. Если у вас более поздняя версия какого-то из программных продуктов, то это не страшно, так как принцип работы останется тем же самым.

Подготовительный этап
Сначала импортируем библиотеку AutoCAD в Delphi. Для этого выберем пункт меню Project\Import Type Library, нажмем кнопку Add и добавим файл acax16enu.tlb (найти его можно по адресу C:\Program Files\Common Files\Autodesk Shared), после чего инсталлируем новый набор ActiveX компонентов в систему (рис. 1).
Нам станет доступно 5 новых компонентов:
- AcadAcCmColor
- AcadDataBase
- AcadSecurityParams
- AcadLayerStateManager
- AcadDocument
К сведению
Обязательно загляните в модуль AutoCAD_TLB.pas, который появится после установки новых компонентов: как разработчик, вы сможете почерпнуть из него много полезной информации, а также в файл справки AutoCAD - acad.chm. Особенное внимание уделите разделам ActiveX and VBA Developer's Guide и ActiveX and VBA Reference, где можно найти сведения о методах, свойствах и объектах AutoCAD.
Простые примеры
Разместим на форме компонент TAcadDocument, далее создадим обработчик события OnCreate для формы. В нем мы проверим, запущен ли на машине AutoCAD или нет (если нет, его придется запускать). Обязательно подключим модуль ComObj.
Подключение к AutoCAD
procedure TForm1.FormCreate(Sender: TObject);
var
AutoCAD: OleVariant;
begin
try
//Если AutoCAD запущен, то подсоединяемся к нему
AutoCAD := GetActiveOleObject('AutoCAD.Application');
AcadDocument1.ConnectTo((IDispatch(AutoCAD) as IAcadApplication).ActiveDocument);
except
//Иначе запускаем его
AcadDocument1.Connect;
end;
end;
Поговорим о следующей строчке кода:
AcadDocument1.ConnectTo((IDispatch(AutoCAD) as IAcadApplication).ActiveDocument);
В ней мы приводим переменную AutoCAD к типу IACadApplication, используя для этого специальный интерфейс IDIspatch. Теперь разместите на форме кнопку, назовите ее «Имя текущего документа» и напишите для нее в обработчике:
ShowMessage('Имя текущего документа: '+AcadDocument1.Name);
Идем дальше - начертим линию с помощью стандартного метода AutoCAD -AddLine():
AddLine(НачальныеКоординаты, КонечныеКоординаты)
, где НачальныеКоординаты - массив из трех точек (ось X, Y, Z), определяющий координаты начала линии.
, где КонечныеКоординаты - массив из трех точек (ось X, Y, Z), определяющий координаты конца линии.
Прежде чем передать массив в качестве аргумента, воспользуемся функцией VarArrayCreate, которая создаст его:
VarArrayCreate([Размерность],Тип данных)
Создание массива с заданной размерностью и заданным типом значений его элементов. Пример
V:= VarArrayCreate([0,2], varDouble)
Создание массива, состоящего из трех элементов типа Double.
Итак, необходимо разместить на форме еще одну кнопку. Назовем ее «Линия» и объявим две переменные FirstPoint и SecondPoint типа OleVariant. Теперь нам понадобится следующий код:
FirstPoint:=VarArrayCreate([0, 2], varDouble); //массив начальной точки
SecondPoint:=VarArrayCreate([0, 2], varDouble); //массив конечной точки
А сейчас можно задать и сами координаты линий, делается это таким образом:
FirstPoint[0]:=10; //начальная X координата
FirstPoint[1]:=10; //начальная Y координата
FirstPoint[2]:=10; //начальная Z координата
Далее нам будет нужна переменная AutoCadLine типа IAcadLine (хотя можно ее сделать и OleVariant, такой вариант тоже будет работать). В ней мы сохраним ссылку на созданную линию, чтобы в дальнейшем обращаться к этой фигуре, внося нужные изменения (о том, как это сделать, вы обязательно узнаете далее). А пока осталось начертить линию с помощью следующей строчки кода:
AutoCadLine:=AcadDocument1.ModelSpace.AddLine(FirstPoint, SecondPoint);
Стоит отметить, что для работы с графическими объектами я использовал коллекцию ModelSpace, которая позволяет обращаться ко всем графическим объектами чертежа. Можно также воспользоваться коллекцией PaperSpace, правда, в этом случае нам будут доступны только объекты, содержащиеся в активном на данный момент слое. На рисунке 3 вы можете видеть упрощенную схему объектной структуры AutoCAD.
Итак, продолжаем. Линия у нас уже есть, теперь проведем над ней одну манипуляцию: покрасим ее в красный цвет с помощью всего одной строчки кода:
AutoCadLine.color:=acRed;
После того как работа с чертежом окончена, нужно сообщить об этом AutoCAD. Делается это следующим образом:
AcadDocument1.Application.Update
Полный листинг для обработчика события OnClick кнопки «Линия» вы найдете в исходнике программы, расположенной на компакт-диске.

Разместим на форме еще одну кнопку, назовем ее «Линия с запросом». С помощью нее мы нарисуем такую же обычную линию, предварительно запросив координаты у пользователя. Для этого используется объект Utility и его метод GetPoint(). Снова зададим две локальные переменные StartPoint и SecondPoint с типом OleVariant. Сделаем для них такие же массивы и напишем код:
FirstPoint:=AcadDocument1.Utility.GetPoint(EmptyParam, 'Укажите начальную координату: ');
SecondPoint:=AcadDocument1.Utility.GetPoint(EmptyParam, 'Укажите конечную координату: ');
Как начертить линию, имея ее координаты, вы уже знаете, и разбирать этот процесс нет смысла, поэтому протестируем готовый код. Запустите программу, нажмите кнопку «Линия с запросом» и переключитесь в окно AutoCAD. Обратите внимание: в командной строке, расположенной в нижней части окна AutoCAD, появился текст «Укажите начальную координату».
Сделаем это, щелкнув мышью в понравившемся нам месте на холсте чертежа. Появится надпись «Укажите конечную координату». В результате, из указанных нами точек появится линия. Вот оно, чудо взаимодействия программы и программиста! Однако не будем отступать от главного - перейдем на следующий уровень. На подходе фигура посложнее - полилиния. С помощью нее можно строить всевозможные многоугольники. Для начала построим четырехугольник. Стоит отметить, что в этом случае нам достаточно задать две координаты X и Y. Размещаем на форме кнопку, назовем ее «Четырехугольник», далее создадим вариантный массив Points, рассчитанный на 10 значений, и зададим нужные координаты, например:
Points[0]:= 646.0351;
Points[1]:= 847.318;
Points[2]:= 1167.2274;
Points[3]:= 847.318;
Points[4]:= 1167.2274;
Points[5]:= 542.6844;
Points[6]:= 646.0351;
Points[7]:= 542.6844;
Points[8]:= 646.0351;
Points[9]:= 847.318;
Объявим переменную AutoCADPolyline типа OleVariant и последний штрих:
AutoCADPolyline:= AcadDocument1.ModelSpace.AddLightWeightPolyline(Points);
Протестируем программу и нарисуем новую фигуру. Пришло время поговорить немного и о самом AutoCAD. Кликнем по только что сформированному прямоугольнику (в чертеже), он станет активным и на экране появиться окно свойств.
Обратите внимание на содержимое выпадающего списка, расположенного в самом верху. В нем мы имеем честь наблюдать тип своей фигуры: в данном случае это polyline, т.е. что мы и рисовали. Если кликнуть мышкой по свойству Vertex, в нем появятся две стрелки, с помощью которых вы можете переключаться между отдельными вершинами фигуры. Соответственно, в этот момент будут меняться свойства VertexX и VertexY, отвечающие за координаты. А вот в свойстве Area можно получить значение площади созданной вами фигуры, удобно, не так ли? Я думаю, имеет смысл вывести эту информацию в окне нашей программы:
ShowMessage('Площадь фигуры: :'+FloatToStr(AutoCADPolyline.Area));
Добавим еще одну кнопку на форму, назовем ее «Круг». Для работы с этой фигурой надо задать три точки - координаты центра круга и его радиус, а затем использовать следующий метод:
AddCircle(КоординатыЦентра, Радиус)
Разнообразим чертеж текстом, добавляющимся с помощью процедуры AddText():
AddText(Текст, Координаты, Высота);
, где Текст - выводимый текст, заключенный в кавычки.
, где Координаты - это две точки: X и Y, в которых начнется вывод текста.
, где Высота - высота текста.
Слои
При работе с чертежом может возникнуть необходимость присвоения имени отдельным объектам или их группам, что позволит быстро обращаться к ним в дальнейшем. Этот механизм реализован в AutoCAD посредством слоев. Итак, создайте новый чертеж, нарисуйте в нем два прямоугольника и многогранник (с помощью полилинии), а в каждой фигуре проставьте текст «Комната 1», «Комната 2», «Комната 3» (вы можете найти чертеж в исходниках программы, он называется Планировка.dwg).
Выберите пункт меню Format\Layer, появится окно Layer Property Manager. Нажмите кнопку New и введите текст FirstRoom. Точно таким же образом создаются слои SecondRoom и ThirdRoom.
После двойного клика на первой комнате появится окно PROPERTIES. В свойстве Layer установим для выбранной фигуры слой FirstRoom, назначим остальным фигурам одноименные слои.

Последний штрих - в целях эксперимента начертим простую линию и круг. Все, подготовительные действия выполнены, приступаем к кодингу – нашей задачей будет получение в программе данных о только что созданном чертеже. Разместим на форме TListBox и кнопку «Прочитать чертеж» (полный листинг обработчика - в исходниках, здесь мы рассмотрим только самые важные моменты). Сначала нужно организовать цикл, перебирающий все графические объекты, принадлежащие чертежу:
for i:=0 to AcadDocument1.ModelSpace.Count-1 do
Проверяя название фигуры, мы будем осуществлять необходимые действия. Так как отдельные фигуры имеют разный набор свойств и количество координат, например, линия задается двумя точками, каждая из которых проецируется в трехмерной системе (ось X,Y,Z), а вот каждая точка полилинии позиционируется лишь в оси X и Y, то эти моменты обязательно надо учитывать. Поэтому для каждой фигуры придется писать свой собственный обработчик. Я рассмотрю описанный выше момент на следующем примере:
if AutoCadObject.EntityName='AcDbCircle' then
begin
//Координаты центра круга
t:=(AutoCadObject as IAcadCircle).Center;
ListBox1.Items.Add('Объект - Круг');
ListBox1.Items.Add('Координаты центра X-'+IntToStr(t[0])+' Y-'+IntToStr(t[1])+' Z-'+IntToStr(t[2]));
t:=(AutoCadObject as IAcadCircle).Radius;
ListBox1.Items.Add('Радиус круга R='+IntToStr(t));
end;
Круг по понятиям AutoCAD называется AcDBCircle. Чтобы обратиться к его свойствам, нужно привести объект AutoCADObject, который ссылается на обрабатываемую в данный момент фигуру к типу IAcadCircle, а далее все просто: из свойства Center вытаскиваем координаты центра, из свойства Radius - длину радиуса. Обратите внимание, в процессе обработки полилинии перед нами встанет практически философский вопрос: «Как узнать количество точек, из которых она состоит?». Дело в том, что это может быть обычный прямоугольник, который будет содержать 4 точки или ломаная фигура, состоящая из 10. Способ решения прост - для вариантного массива есть специальная функция VarArrayHighBound(), которой в качестве первого параметра передаем имя массива, а в качестве второго - единицу.
Полезные возможности
Предлагаю не останавливаться на достигнутом. Нарисуем круг и заштрихуем его. Для этого служит метод AddHatch(), принадлежащий коллекции ModelSpace. Итак, разместим на форме кнопку, назовем ее «Штриховка» и впишем в ее обработчик следующий код:
var
AutoCADHatch, Zalivka: OleVariant;
TypeColor1, TypeColor2: OleVariant;
Points:OleVariant;
begin
Points:= VarArrayCreate([0, 2], VarDouble);
Points[0]:= 400;
Points[1]:= 700;
Points[2]:= 500;
//Задаем границы штриховки
Zalivka:= VarArrayCreate([0, 0], varDispatch);
Zalivka[0]:= AcadDocument1.ModelSpace.AddCircle(Points,500);
//Задаем параметры штриховки
AutoCADHatch:= AcadDocument1.ModelSpace.AddHatch(acPreDefinedGradient,
'LINEAR',
True,
acGradientObject);
//Задаем цвета заливки
TypeColor1:= AutoCADHatch.GradientColor1;
TypeColor1.SetRGB(200, 50, 200);
AutoCADHatch.GradientColor1:= TypeColor1;
TypeColor2:= AutoCADHatch.GradientColor2;
TypeColor2.SetRGB(0, 250, 0);
AutoCADHatch.GradientColor2:= TypeColor2;
//Передаем границы заливки
AutoCADHatch.AppendOuterLoop(Zalivka);
//Осуществляем заливку
AutoCADHatch.Evaluate;
//Сообщаем о совершенных изменениях в AutoCAD
AcadDocument1.Application.Update;
end;
Обратите внимание на второй параметр функции AddHatch(). Он отвечает за шаблон штриховки и может принимать следующие значения:
- LINEAR
- CYLINDER
- INVCYLINDER
- SPHERICAL
- HEMISPHERICAL
- CURVED
- INVSPHERICAL
- INVHEMISPHERICAL
- INVCURVED
Методом RGB() мы задаем два цвета штриховки, которые затем смешаются в соответствии с указанным шаблоном.
Рассмотрим создание собственного слоя с возможностью рисования в нем фигуры. В решении этой задачи нам поможет следующая строчка кода:
AcadDocument1.Layers.Add('MyLayer');
Вот и все – разве что перед рисованием будет нужно его активировать.
Для нашего следующего примера понадобится кнопка с названием «Выберите объект», нажатие на нее позволит пользователю простым щелчком мыши указывать фигуру на чертеже, после чего она будет выделена желтым цветом. Необходимый листинг вы найдете в исходниках программы. И на закуску: разместите две кнопки «Проверить наличие изменений» и «Сохранить». С помощью первой мы будем узнавать, был ли изменен текущий чертеж с момента его открытия, используя системную переменную AutoCAD – DBMOD. Если она содержит 0, то чертеж не был изменен, иначе - был. Вторая кнопка позволит нам сохранить чертеж.
Полезные ресурсы
Из истории создания AutoCAD
В апреле 1982 года была организованна компания Autodesk - автор ныне популярного программного продукта для автоматизированного проектирования AutoCAD. В то время она состояла всего лишь из 15 программистов. Новый продукт кардинально изменил положение дел в сфере разработки конструкторской документации. В настоящее время AutoCAD используют миллионы людей по всему миру, он переведен более чем на 18 языков. Кстати, одним из факторов популярности, которую AutoCAD приобрел в России, является то обстоятельство, что кампания Autodesk перевела свой продукт на русский язык еще в начале продвижения первых версий программы.
|
Обсуждение статьи
|
|
|
|
RE: IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов да уж..... это в точности я давно уже видел....
видать никто нового придумать не может |
|
RE: IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов for i:=0 to AcadDocument1.ModelSpace.Count-1 do Выдает ошибку 'no database' так же попытка приконнектить AcadDatabase к документу.. Как и чем лечить такие проблемы? - Кто-нибудь знает? (AutoCAD 2002, Delphi7) |
|
RE: IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов As you know, Puma shoes and jerseys are word -class international brands, the quality of puma is guaranteed, with the develop of puma company technology, more and more series puma shoes and jersey was come on market,, Zapatillas puma, calzoncillos calvin klein are all popular in the market.feiduhuilan Naruto, Sailor Moon and Velvet are all well-known in Asia,a lot od young poeple are crazy on this cartoon and playing cosplay.,naruto costumes, sailor moon costume, velvet cloak became the most popular costume among the youth. |
|
RE: IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов Optical8 is a store specialised in fasionable glasses and cheap eyeglasses.Take some time in Optical8 and you'll find some ideal glasses in style and fashion. Enjoy your shopping! |
|
RE: IT-практикум: Delphi и AutoCAD. Организация связи двух популярных программных комплексов Статья интересная) спасибо автору!) |
|
|
Keywords: zPOSTz zCODEz z10106z
Для Авторов: edit delete
Автор: Андрей Шкрыль aka Littlebudda web site Дата: 15.06.2009 19:00:17©
|