РефератыИнформатика, программированиеITIT-практикум: DELPHI и AutoCAD

IT-практикум: DELPHI и AutoCAD

Андрей Шкрыль


Организация связи двух популярных программных комплексов


Autocad - широко известный графический пакет для построения чертежей. Не секрет, что autocad очень удобен для предприятий, специализирующихся на строительстве, продаже или аренде коммерческих и жилых площадей. В данной статье мы поговорим о ситуации, когда требуется расширить стандартные возможности пакета за счет написания программы на языке delphi. Например, это очень удобно, когда необходимо хранить информацию по чертежу в базе данных, осуществить привязку к чертежу документации, отражающей сдачу в аренду площадей различным организациям или предоставить рядовому пользователю, не владеющему знаниями autocad, простой механизм получения точной информации о размере площади, предоставляемой клиенту, и различные сопутствующие числовые показатели. Объектная модель autocad базируется на visual basic for application, ее использование позволяет получить доступ ко всем элементам как чертежа, так и самой оболочки autocad. В данной статье рассматривается связка delphi 7 и autocad 2004. Если у вас более поздняя версия какого-то из программных продуктов, то это не страшно, так как принцип работы останется тем же самым.


Подготовительный этап


Сначала импортируем библиотеку AutoCAD в Delphi. Для этого выберем пункт меню ProjectMmportType Library, нажмем кнопку Add и добавим файл acax16enu.tlb (найти его можно по адресу C:Program Files Common FilesAutodesk Shared), после чего инсталлируем новый набор ActiveX компонентов в систему (рис. 1).


Нам станет доступно 5 новых компонентов:


1. AcadAcCmColor


2. AcadDataBase


3. AcadSecurityParams


4. AcadLayerStateManager


5. AcadDocument


Простые
примеры


Разместим на форме компонент TAcadDocument, далее создадим обработчик события OnCreate для формы. В нем мы проверим, запущен ли на машине AutoCAD или нет (если нет, его придется запускать). Обязательно подключим модуль ComObj.


Подключение к AutoCAD


procedureTForml.Formereate(Sender:


TObject);


var


AutoCAD: OleVariant; begin


//Если AutoCAD запущен, то подсоединяемся к нему


AutoCAD := GetActive01eObject('Aut ~ oCAD. Application');


AcadDocument l.ConnectTo((IDisp atch (AutoCAD) as lAcadApplication). ActiveDocument) ; ZI except


//Иначе запускаем его AcadDocument 1. Connect; end; ZZ end;


Поговорим о следующей строчке кода:


AcadDocumentl.ConnectTo((IDispat


К сведению


Обязательно загляните в модуль AutoCADJLB.pas, который появится после установки новых компонентов: как разработчик, вы сможете почерпнуть из него много полезной информации, а также в файл справки AutoCAD-acad. chm. Особенное внимание уделите разделам ActiveX and VBA Developer's Guide и ActiveX and VBA Reference, где можно найти сведения о методах, свойствах и объектах AutoCAD (рис.2).


ch(AutoCAD) as lAcadApplication). ActiveDocument);


В ней мы приводим переменную AutoCAD к типу lACadApplication, используя для этого специальный интерфейс IDispatch. Теперь разместите на форме кнопку, назовите ее «Имя текущего документа» и напишите для нее в обработчике: ShowMessage('l/ta текущего документа: '+AcadDocument1 .Name); Идем дальше — начертим линию с помощью стандартного метода AutoCAD -AddLine():


АddLine(НачальныеКоординаты, КонечныеКоординаты), где НачальныеКоординаты — массив из трех точек (ось X, Y, I), определяющий координаты начала линии, где КонечныеКоординаты — массив из трех точек (ось X, Y, I), определяющий координаты конца линии.


Прежде чем передать массив в качестве аргумента, воспользуемся функцией VarArrayCreate, которая создаст его:


УаrАrrауСrеаtе([Размерность],Тип данных) Создание массива с заданной размерностью и заданным типом значений его элементов. Пример:


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 типа lAcadLine (хотя можно ее сделать и OleVariant, такой вариант тоже будет работать). В ней мы сохраним ссылку на созданную линию, чтобы в дальнейшем обращаться к этой фигуре, внося нужные изменения (о том, как это сделать, вы обязательно узнаете далее). А пока осталось начертить линию с помощью следующей строчки кода:


AutoCadLine:=AcadDocumentl. ModelSpace.AddLine(FirstPoint, SecondPoint);


Стоит отметить, что для работы с графическими объектами я использовал коллекцию ModelSpace, которая позволяет обращаться ко всем графическим объектами чертежа. Можно также воспользоваться коллекцией PaperSpace, правда, в этом случае нам будут доступны только объекты, содержащиеся в активном на данный момент слое. На рисунке 3 вы можете видеть упрощенную схему объектной структуры AutoCAD.


Итак, продолжаем. Линия у нас уже есть, теперь проведем над ней одну манипуляцию: покрасим ее в красный цвет с помощью всего одной строчки кода:


AutoCadLine. color:=acRed;


После того как работа с чертежом окончена, нужно сообщить об этом AutoCAD. Делается это следующим образом:


AcadDocumentl. Application. Update;


Полный листинг для обработчика события OnClick кнопки «Линия» вы найдете в исходнике программы, расположенной на компакт-диске.


Разместим на форме еще одну кнопку, назовем ее «Линия с запросом». С помощью нее мы нарисуем такую же обычную линию, предварительно запросив координаты у пользователя. Для этого используется объект Utility и его метод GetPointQ. Снова зададим две локальные переменные StartPoint и SecondPoint с типом OleVariant. Сделаем для них такие же массивы и напишем код:


FirstPoint :=AcadDocumentl. Utility.


GetPoint(EmptyParam, 'Укажите начальную координату: ');


SecondPoint :=AcadDocumentl. Utility. GetPoint(EmptyParam, 'Укажите конечную координату: ');


Как начертить линию, имея ее координаты, вы уже знаете, и разбирать этот процесс нет смысла, поэтому протестируем готовый код. Запустите программу, нажмите кнопку «Линия с запросом» и переключитесь в окно AutoCAD. Обратите внимание: в командной строке, расположенной в нижней части окна AutoCAD, появился текст «Укажите начальную координату», рис. 4.


Сделаем это, щелкнув мышью в понравившемся нам месте на холсте чертежа. Появится надпись «Укажите конечную координату». В результате из указанных нами точек появится линия. Вот оно, чудо взаимодействия программы и программиста! Однако не будем отступать от главного — перейдем на следующий уровень. На подходе фигура посложнее — полилиния. С помощью нее можно строить всевозможные многоугольники. Для начала построим четырехугольник. Стоит отметить, что в этом случае нам достаточно задать две координаты 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:= AcadDocumentl.


ModelSpace.AddLightWeightPolyline(Po


ints);


Протестируем программу и нарисуем новую фигуру. Пришло время поговорить немного и о самом AutoCAD. Кликнем по только что сформированному прямоугольнику (в чертеже), он станет активным и на экране появиться окно свойств, рис.5. Обратите внимание на содержимое выпадающего списка, расположенного в самом верху. В

нем мы имеем честь наблюдать тип своей фигуры: в данном случае это polyline, т.е. что мы и рисовали. Если кликнуть мышкой по свойству Vertex, в нем появятся две стрелки, с помощью которых вы можете переключаться между отдельными вершинами фигуры. Соответственно, в этот момент будут меняться свойства VertexX и VertexY, отвечающие за координаты. А вот в свойстве Area можно получить значение площади созданной вами фигуры, удобно, не так ли? Я думаю, имеет смысл вывести эту информацию в окне нашей программы:


ShowMessage('Площадь фигуры: :'+FloatT oStr(AutoCADPolyline.Area));


Добавим еще одну кнопку на форму, назовем ее «Круг». Для работы с этой фигурой надо задать три точки — координаты центра круга и его радиус, а затем использовать следующий метод:


AddCircle (КоординатыЦентра, Радиус) ;


Разнообразим чертеж текстом, добавляющимся с помощью процедуры AddText():


AddText(Teкст, Координаты, Высота), где Текст— выводимый текст, заключенный в кавычки, где Координаты — это две точки: X и Y, в которых начнется вывод текста, где Высота — высота текста.


Слои


При работе с чертежом может возникнуть необходимость присвоения имени отдельным объектам или их группам, что позволит быстро обращаться к ним в дальнейшем. Этот механизм реализован в AutoCAD посредством слоев. Итак, создайте новый чертеж, нарисуйте в нем два прямоугольника и многогранник (с помощью полилинии), а в каждой фигуре проставьте текст «Комната1», «Комната2», «Комната 3» (вы можете найти чертеж в исходниках программы, он называется Планировка.dwg), рис. 6.


Выберите пункт меню Formatl_ayer, появится окно Layer Property Manager. Нажмите кнопку New и введите текст FirstRoom, рис. 7. Точно таким же образом создаются слои SecondRoom и ThirdRoom. После двойного клика на первой комнате появится окно PROPERTIES. В свойстве Layer установим для выбранной фигуры слой FirstRoom, назначим остальным фигурам одноименные слои. Последний штрих —в целях эксперимента начертим простую линию и круг. Все, подготовительные действия выполнены, приступаем к кодингу— нашей задачей будет получение в программе данных столько что созданном чертеже. Разместим на форме TListBox и кнопку «Прочитать чертеж» (полный листинг обработчика— в исходниках, здесь мы рассмотрим только самые важные моменты). Сначала нужно организовать цикл, перебирающий все графические объекты, принадлежащие чертежу:


for i:=0 to AcadDocumentl.ModelSpace. Count-1 do


Проверяя название фигуры, мы будем осуществлять необходимые действия. Так как отдельные фигуры имеют разный набор свойств и количество координат, например, линия задается двумя точками, каждая из которых проецируется в трехмерной системе (ось X,Y,Z), а вот каждая точка полилинии позиционируется лишь в оси X и Y, то эти моменты обязательно надо учитывать. Поэтому для каждой фигуры придется писать свой собственный обработчик. Я рассмотрю описанный выше момент на следующем примере:


if AutoCadObject.


EntityName='AcDbCircle' then begin


//Координаты центра круга


t:=(AutoCadObject as lAcadCircle). Center;


ListBoxl.Items.Add('06beKT — Круг');


Li stBoxl. Items. Add ('Координаты центра X-'+IntToStr(t[0])+' Y-'+IntToStr (t [1]) +' Z-'+IntToStr (t [2])) ;


t:=(AutoCadObject as lAcadCircle). Radius;


ListBoxl.Items.АсШСРадиус круга R='+IntToStr(t)); end;


Круг по понятиям AutoCAD называется AcDBCircle. Чтобы обратиться к его свойствам, нужно привести объект AutoCADObject, который ссылается на обрабатываемую в данный момент фигуру к типу lAcadCircle, а далее все просто: из свойства Center вытаскиваем координаты центра, из свойства Radius — длину радиуса. Обратите внимание, в процессе обработки полилинии перед нами встанет практически философский вопрос: «Как узнать количество точек, из которых она состоит?». Дело в том, что это может быть обычный прямоугольник, который будет содержать 4 точки или ломаная фигура, состоящая из 10. Способ решения прост — для вариантного массива есть специальная функция VarArrayHighBoundQ, которой в качестве первого параметра передаем имя массива, а в качестве второго — единицу.


Полезные возможности


Предлагаю не останавливаться на достигнутом. Нарисуем круг и заштрихуем его. Для этого служит метод AddHatch(), принадлежащий коллекции ModelSpace. Итак, разместим на форме кнопку, назовем ее


«Штриховка» и впишем в ее обработчик следующий код:


AutoCADHatch, Zalivka: OleVariant;


TypeColorl, TypeColor2: OleVariant;


Points:01eVariant; begin


Points:= VarArrayCreate([0, 2], VarDouble);


Points[0]:= 400; Points[l]:= 700; Points[2]:= 500;


//Задаем границы штриховки


Zalivka:= VarArrayCreate([0, 0], varDispatch);


Zalivka[0]:= AcadDocumentl. ModelSpace.AddCircle(Points,500);


//Задаем параметры штриховки


AutoCADHatch:= AcadDocumentl. ModelSpace. AddHatch (acPreDefinedGradie nt, 'LINEAR', True, acGradientObject);


//Задаем цвета заливки


TypeColorl:= AutoCADHatch. GradientColorl;


TypeColorl.SetRGB(200, 50, 200);


AutoCADHatch.GradientColorl:= TypeColorl;


TypeColor2:= AutoCADHatch. GradientColor2;


TypeColor2.SetRGB(0, 250, 0);


AutoCADHatch.GradientColor2:= TypeColor2;


//Передаем границы заливки


AutoCADHatch. AppendOuterLoop(Zal ivka);


//Осуществляем заливку


AutoCADHatch.Evaluate;


//Сообщаем о совершенных изменениях в AutoCAD


AcadDocumentl.Application.Update; end;


Обратите внимание на второй параметр функции AddHatch(). Он отвечает за шаблон штриховки и может принимать следующие значения:


- LINEAR


- CYLINDER


- INVCYLINDER


- SPHERICAL


- HEMISPHERICAL


- CURVED


- INVSPHERICAL


- INVHEMISPHERICAL


- INVCURVED


Методом RGB() мы задаем два цвета штриховки, которые затем смешаются в соответствии с указанным шаблоном. Рассмотрим создание собственного слоя с возможностью рисования в нем фигуры. В решении этой задачи нам поможет следующая строчка кода:


AcadDo cumentl. Layers. AddTMyLayer');


Вот и все — разве чтоперед рисованием будет нужно его активировать. Для нашего следующего примера понадобится кнопка с названием «Выберите объект», нажатие на нее позволит пользователю простым щелчком мыши указывать фигуру на чертеже, после чего она будет выделена желтым цветом. Необходимый листинг вы найдете в исходниках программы. И на закуску: разместите две кнопки «Проверить наличие изменений» и «Сохранить». С помощью первой мы будем узнавать, был ли изменен текущий чертеж с момента его открытия,используя системную переменную AutoCAD — DBMOD. Если она содержит 0, то чертеж не был изменен, иначе — был. Вторая кнопка позволит нам сохранить чертеж.


Из истории создания AutoCAD


В апреле 1982 года была организованна компания Autodesk - автор ныне популярного программного продукта для автоматизированного проектирования AutoCAD. В то время она состояла всего лишь из 15 программистов. Новый продукт кардинально изменил положение дел в сфере разработки конструкторской документации. В настоящее время AutoCAD используют миллионы людей по всему миру, он переведен более чем на 18 языков. Кстати, одним из факторов популярности, которую AutoCAD приобрел в России, является то обстоятельство, что компания Autodesk перевела свой продукт на русский язык еще в начале продвижения первых версий программы.


Версии AutoCAD


Версия 1.0 (Release 1)Декабрь1982г


Версия 1.2 (Release 2) Апрель 1983 г


Версия 1.3 (Release 3)Август1983г


Версия 1.4 (Release 4) Октябрь 1983 г


Версия 2.0 (Release 5) Октябрь 1984 г


Версия 2.1 (Release 6) Май 1985 г


Версия 2.5 (Release 7) Июнь 1986 г


Версия 2.6 (Release 8) Апрель 1987 г


Версия 9 - Сентябрь 1987 г


Версия 10 - Октябрь 1988 г


Версия 11 - Октябрь 1990 г


Версия 12-Июнь 1992 г (последний выпуск для Apple Macintosh)


Версия 13-Ноябрь 1994 г (последний выпуск для Unix, MS-DOS и Windows 3.11)


Версия 14 - Февраль 1997 г


AutoCAD 2000 (R15.0)- Март 1999г


AutoCAD 2000I (R15.1)- Июль 2000г


AutoCAD 2002 (R15.6)- Июнь 2001г


AutoCAD 2004 (R16.0)- Март 2003г


AutoCAD 2005 (R16.1)- Март 2004г


AutoCAD 2006 (R16.2)- Март 2005г


AutoCAD 2007 (R17.0)- Март 2006г


AutoCAD 2008 (R17.1)- Март 2007г


Список литературы


IT спец № 07 ИЮЛЬ 2007

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: IT-практикум: DELPHI и AutoCAD

Слов:2092
Символов:18404
Размер:35.95 Кб.