IT-практикум: DELPHI і AutoCAD h2>
Андрій Шкриль p>
Організація
зв'язки двох популярних програмних комплексів p>
Autocad
- Широко відомий графічний пакет для побудови креслень. Не секрет, що
autocad дуже зручний для підприємств, що спеціалізуються на будівництві,
продажу або оренди комерційних і житлових площ. У цій статті ми поговоримо
про ситуацію, коли потрібно розширити стандартні можливості пакета за рахунок
написання програми мовою delphi. Наприклад, це дуже зручно, коли
необхідно зберігати інформацію за кресленням в базі даних, здійснити прив'язку до
кресленням документації, що відображає здачу в оренду площ різним організаціям
або надати звичайному користувачеві, який не володіє знаннями autocad, простий
механізм отримання точної інформації про розмір площі, яка надається
клієнту, і різні супутні числові показники. Об'єктна модель
autocad базується на visual basic for application, її використання дозволяє
отримати доступ до всіх елементів як креслення, так і самої оболонки autocad. У
даній статті розглядається зв'язка delphi 7 і autocad 2004. Якщо у вас більше
пізня версія якогось із програмних продуктів, то це не страшно, тому що
принцип роботи залишиться тим же самим. p>
Підготовчий етап h2>
Спочатку
імпортуємо бібліотеку AutoCAD у Delphi. Для цього виберемо пункт меню
ProjectMmportType Library, натиснемо кнопку Add і додамо файл acax16enu.tlb
(знайти його можна за адресою C: Program Files Common FilesAutodesk Shared),
після чого інсталюємо новий набір ActiveX компонентів в систему (рис. 1). p>
Нам
стане доступно 5 нових компонентів: p>
1. AcadAcCmColor p>
2. AcadDataBase p>
3. AcadSecurityParams p>
4. AcadLayerStateManager p>
5. AcadDocument p>
Прості b> b> приклади b> p>
Розмістимо
на формі компонент TAcadDocument, далі створимо обробник події OnCreate
для форми. У ньому ми перевіримо, чи запущений на машині AutoCAD чи ні (якщо ні,
його доведеться запускати). Обов'язково підключимо модуль ComObj. P>
Підключення
до AutoCAD p>
procedure TForml.Formereate (Sender: p>
TObject); p>
var p>
AutoCAD:
OleVariant; begin p>
// Якщо
AutoCAD запущений, то приєднується до нього p>
AutoCAD: = GetActive01eObject ( 'Aut ~
oCAD. Application'); p>
AcadDocument l.ConnectTo ((IDisp atch
(AutoCAD) as lAcadApplication). ActiveDocument); ZI except p>
// Інакше запускаємо його
AcadDocument 1. Connect; end; ZZ end; p>
Поговоримо
про наступну рядку коду: p>
AcadDocumentl.ConnectTo ((IDispat p>
До уваги h2>
Обов'язково
загляньте в модуль AutoCADJLB.pas, який з'явиться після установки нових
компонентів: як розробник, ви зможете почерпнути з нього багато корисної
інформації, а також у файл довідки AutoCAD-acad. chm. Особливу увагу
приділіть розділам ActiveX and VBA Developer's Guide і ActiveX and VBA Reference,
де можна знайти відомості про методи, властивості і об'єктах AutoCAD (рис.2). p>
ch (AutoCAD) as lAcadApplication).
ActiveDocument); p>
В
ній ми наводимо змінну AutoCAD до типу lACadApplication, використовуючи для цього
спеціальний інтерфейс IDispatch. Тепер розмістіть на формі кнопку, назвіть її
«Ім'я поточного документа» і напишіть для неї в обробнику: ShowMessage ( 'l/ta
поточного документа: '+ AcadDocument1. Name); Йдемо далі - накреслити лінію з
допомогою стандартного методу AutoCAD-AddLine (): p>
АddLine (НачальниеКоордінати,
КонечниеКоордінати), де НачальниеКоордінати - масив з трьох точок (вісь X, Y,
I), який визначає координати початку лінії, де КонечниеКоордінати - масив з
трьох точок (вісь X, Y, I), який визначає координати кінця лінії. p>
Перш
ніж передати масив як аргумент, скористаємося функцією
VarArrayCreate, яка створить його: p>
УаrАrrауСrеаtе ([Розмірність], Тип
даних) Створення масиву із заданою розмірністю і заданим типом значень його
елементів. Приклад: p>
V: =
VarArrayCreate ([0,2], varDouble) Створення масиву, що складається з трьох елементів
типу Double. p>
Отже,
необхідно розмістити на формі ще одну кнопку. Назвемо її «лінія» і оголосимо
дві змінні FirstPoint і SecondPoint типу OleVariant. Тепер нам знадобиться
наступний код: p>
FirstPoint: = VarArrayCreate ([0,
2], p>
varDouble);
//масив початкової точки SecondPoint: = VarArrayCreate ([0, 2], p>
varDouble);
//масив кінцевої точки p>
А
зараз можна задати і самі координати ліній, робиться це таким чином: p>
FirstPoint [0]: = 10;
//початкова X координата p>
FirstPoint
[1]: = 10;// початкова Y координата p>
FirstPoint [2]: = 10;
//початкова Z координата p>
Далі
нам буде потрібна мінлива AutoCadLine типу lAcadLine (хоча можна її зробити і
OleVariant, такий варіант теж буде працювати). У ній ми збережемо посилання на
створену лінію, щоб надалі звертатися до цієї фігури, вносячи потрібні зміни
(про те, як це зробити, ви обов'язково дізнаєтеся далі). А поки залишилося
накреслити лінію за допомогою наступної рядки коду: p>
AutoCadLine: = AcadDocumentl.
ModelSpace.AddLine (FirstPoint, SecondPoint); p>
Варто
відзначити, що для роботи з графікою я використав колекцію
ModelSpace, яка дозволяє звертатися до всіх графічним об'єктами креслення.
Можна також скористатися колекцією PaperSpace, правда, в цьому випадку нам
будуть доступні тільки об'єкти, що містяться в активному на даний момент шарі.
На малюнку 3 ви можете бачити спрощену схему об'єктної структури AutoCAD. P>
Отже,
продовжуємо. Лінія у нас вже є, тепер проведемо над нею одну маніпуляцію:
пофарбувати їх в червоний колір з допомогою всього одного рядка коду: p>
AutoCadLine.
color: = acRed; p>
Після
того, як робота з кресленням закінчена, потрібно повідомити про це AutoCAD. Робиться
це в такий спосіб: p>
AcadDocumentl.
Application. Update; p>
Повний
лістинг для обробника події OnClick кнопки «Лінія» ви знайдете в исходники
програми, розташованої на компакт-диску. p>
Розмістимо
на формі ще одну кнопку, назвемо її «Лінія із запитом». За допомогою неї ми
намалюємо таку ж звичайну лінію, попередньо запросив координати у
користувача. Для цього використовується об'єкт Utility і його метод GetPointQ.
Знову поставимо два локальні змінні StartPoint і SecondPoint з типом
OleVariant. Зробимо для них такі ж масиви і напишемо код: p>
FirstPoint
: = AcadDocumentl. Utility. P>
GetPoint (EmptyParam,
'Вкажіть початкову координату:'); p>
SecondPoint: = AcadDocumentl.
Utility. GetPoint (EmptyParam, 'Вкажіте координату:'); p>
Як
накреслити лінію, маючи її координати, ви вже знаєте, і розбирати цей процес
немає сенсу, тому протестуємо готовий код. Запустіть програму, натисніть
кнопку «Лінія із запитом» і перейдіть у вікно AutoCAD. Зверніть увагу: у
командному рядку, розташованої в нижній частині вікна AutoCAD, з'явився текст
«Вкажіть початкову координату», рис. 4. P>
Зробимо
це, клацнувши мишею у вподобаному нам місці на полотні креслення. З'явиться
напис «Вкажіте координату». У результаті з вказаних нами точок
з'явиться лінія. Ось воно, чудо взаємодії програми і програміста! Однак
не будемо відступати від головного - перейдемо на наступний рівень. На підході
фігура складніше - полілінію. За допомогою неї можна будувати всілякі
багатокутники. Для початку побудуємо чотирикутник. Варто відзначити, що в цьому
випадку нам досить задати дві координати X та Y. Розміщуємо на формі кнопку,
назвемо її «чотирикутника», далі створимо варіантний масив Points,
розрахований на 10 значень, і задамо потрібні координати, наприклад: p>
Points [0 ]:= p>
646.0351; p>
Points [1]: = p>
847.318; p>
Points [2 ]:= p>
1167.2274; p>
Points [3 ]:= p>
847.318; p>
Points [4 ]:= p>
1167.2274; p>
Points [5]: = p>
542.6844; p>
Points [6 ]:= p>
646.0351; p>
Points [7 ]:= p>
542.6844; p>
Points [8 ]:= p>
646.0351; p>
Points [9 ]:= p>
847.318; p>
Оголосимо
змінну AutoCADPolyline типу OleVariant і останній штрих: p>
AutoCADPolyline: = AcadDocumentl. p>
ModelSpace.AddLightWeightPolyline (Po p>
ints); p>
протестуємо
програму і намалюємо нову фігуру. Прийшов час поговорити трохи і про самого
AutoCAD. Клацніть по тільки що сформованому прямокутника (в кресленні), він
стане активним і на екрані з'явитися вікно властивостей, рис.5. Зверніть увагу на
вміст списку, що випадає, розташованого в самому верху. У ньому ми маємо
честь спостерігати тип своєї фігури: в даному випадку це polyline, тобто що ми і
малювали. Якщо клікнути мишкою по властивості Vertex, в ньому з'являться дві стрілки,
за допомогою яких ви можете перемикатися між окремими вершинами фігури.
Відповідно, в цей момент будуть мінятися властивості VertexX і VertexY,
що відповідають за координати. А ось у властивості Area можна отримати значення площі
створеної вами фігури, зручно, чи не так? Я думаю, має сенс вивести цю
інформацію у вікні нашої програми: p>
ShowMessage ( 'Площа
фігури:: '+ FloatT oStr (AutoCADPolyline.Area )); p>
Додамо
ще одну кнопку на форму, назвемо її «Круг». Для роботи з цією фігурою треба
задати три точки - координати центру кола і його радіус, а потім використовувати
наступний метод: p>
AddCircle
(КоордінатиЦентра, Радіус); p>
Різноманітність
креслення текст, додавати за допомогою процедури AddText (): p>
AddText (Teкст,
Координати, Висота), де Текст-виводиться текст, укладений в лапки, де
Координати - це дві точки: X і Y, в яких розпочнеться виведення тексту, де Висота
- Висота тексту. P>
Шари h2>
При
роботі з кресленням може виникнути необхідність присвоєння імені окремим
об'єктам або їх груп, що дозволить швидко звертатися до них в подальшому.
Цей механізм реалізований у AutoCAD за допомогою шарів. Отже, створіть новий
креслення, намалюйте в ньому два прямокутника і багатогранник (за допомогою
полілінію), а в кожній фігурі проставте текст «Комната1», «Комната2», «Кімната
3 »(можна знайти креслення у вихідні коди програми, він називається Планіровка.dwg),
рис. 6. P>
Виберіть пункт меню
Formatl_ayer, з'явиться вікно Layer Property Manager. Натисніть
кнопку New і напишіть FirstRoom, рис. 7. Точно таким же чином створюються
шари SecondRoom і ThirdRoom. Після подвійного кліка на першій кімнаті з'явиться
вікно PROPERTIES. У властивості Layer встановимо для вибраної фігури шар
FirstRoom, призначимо іншим фігурам однойменні шари. Останній штрих-в
метою експерименту накреслив просту лінію і коло. Все, підготовчі
дії виконані, приступаємо до Кодинг-нашим завданням буде одержання в
програмі даних стільки що створеному кресленні. Розмістимо на формі TListBox і
кнопку «Прочитати креслення» (повний лістинг обробника-в вихідного, тут ми
розглянемо тільки найважливіші моменти). Спочатку потрібно організувати цикл,
перебирати всі графічні об'єкти, що належать кресленням: p>
for i: = 0 to
AcadDocumentl.ModelSpace. Count-1 do p>
Перевіряючи
назва фігури, ми будемо здійснювати необхідні дії. Так як окремі
фігури мають різний набір властивостей і кількість координат, наприклад, лінія
задається двома точками, кожна з яких проектується в тривимірної системі
(вісь X, Y, Z), а от кожна точка полілінію позиціонується лише в осі X і Y, то
ці моменти обов'язково треба враховувати. Тому для кожної фігури доведеться
писати свій власний обробник. Я розгляну описаний вище момент на
наступному прикладі: p>
if AutoCadObject. p>
EntityName = 'AcDbCircle' then begin p>
// Координати центру кола p>
t: = (AutoCadObject as lAcadCircle).
Center; p>
ListBoxl.Items.Add ('06beKT - Круг'); p>
Li stBoxl. Items. Add ( 'Координати центру X-' + IntToStr (t [0]) + 'Y-' + IntToStr (t [1]) + '
Z-'+ IntToStr (t [2])); p>
t: = (AutoCadObject as lAcadCircle).
Radius; p>
ListBoxl.Items.АсШСРадіус кола R = '+ IntToStr (t)); end; p>
Круг
за поняттями AutoCAD називається AcDBCircle. Щоб звернутися до його властивостями,
потрібно привести об'єкт AutoCADObject, який посилається на оброблювану в
даний момент фігуру до типу lAcadCircle, а далі все просто: з властивості Center
витягуємо координати центру, з властивості Radius - довжину радіусу. Зверніть
увагу, в процесі обробки полілінію перед нами постане практично
філософське питання: «Як дізнатися кількість точок, з яких вона складається?».
Справа в тому, що це може бути звичайний прямокутник, який буде містити 4
точки або ламана фігура, що складається з 10. Спосіб рішення простий - для
варіантного масиву є спеціальна функція VarArrayHighBoundQ, якої в
як перший параметр передаємо ім'я масиву, а в якості другого --
одиницю. p>
Корисні можливості h2>
Пропоную
не зупинятися на досягнутому. Намалюємо коло і заштріхуем його. Для цього
служить метод AddHatch (), що належить колекції ModelSpace. Отже, розмістимо на
формі кнопку, назвемо її p>
«Штриховка»
і впишемо в її обробник наступний код: p>
AutoCADHatch, Zalivka: OleVariant; p>
TypeColorl, TypeColor2: OleVariant; p>
Points: 01eVariant; begin p>
Points: = VarArrayCreate ([0, 2],
VarDouble); p>
Points [0]: = 400; Points [l]: = 700;
Points [2]: = 500; p>
// Задаємо кордону штрихування p>
Zalivka: = VarArrayCreate ([0, 0],
varDispatch); p>
Zalivka [0]: = AcadDocumentl.
ModelSpace.AddCircle (Points, 500); p>
// Задаємо параметри штрихування p>
AutoCADHatch: = AcadDocumentl.
ModelSpace. AddHatch (acPreDefinedGradie nt, 'LINEAR', True, acGradientObject); p>
// Задаємо кольору заливки p>
TypeColorl: = AutoCADHatch. GradientColorl; p>
TypeColorl.SetRGB (200, 50, 200); p>
AutoCADHatch.GradientColorl: =
TypeColorl; p>
TypeColor2: = AutoCADHatch.
GradientColor2; p>
TypeColor2.SetRGB (0, 250, 0); p>
AutoCADHatch.GradientColor2: =
TypeColor2; p>
// Передаємо кордону заливки p>
AutoCADHatch. AppendOuterLoop (Zal
ivka); p>
// Здійснюємо заливку p>
AutoCADHatch.Evaluate; p>
// Повідомляємо
про зроблені зміни в AutoCAD p>
AcadDocumentl.Application.Update;
end; p>
Зверніть
увагу на другий параметр функції AddHatch (). Він відповідає за шаблон штрихування
і може приймати такі значення: p>
- LINEAR p>
- CYLINDER p>
- INVCYLINDER p>
- SPHERICAL p>
- HEMISPHERICAL p>
- CURVED p>
--
INVSPHERICAL p>
--
INVHEMISPHERICAL p>
--
INVCURVED p>
Методом
RGB () ми ставимо два кольори штрихування, які потім змішаються відповідно до
вказаним шаблоном. Розглянемо створення власного шару з можливістю
малювання в ньому фігури. У вирішенні цього завдання нам допоможе наступна строчка
коду: p>
AcadDo
cumentl. Layers. AddTMyLayer'); p>
Ось
і все - хіба чтоперед малюванням буде потрібно його активувати. Для нашого
наступного прикладу знадобиться кнопка з назвою «Вибрати об'єкт», натискання на
неї дозволить користувачеві простим клацанням мишки вказувати фігуру на кресленні,
після чого вона буде виділена жовтим кольором. Необхідний лістинг ви знайдете в
вихідні коди програми. І на закуску: додайте дві кнопки "Перевірити наявність
змін »і« Зберегти ». За допомогою першого ми будемо дізнаватися, чи був змінений
поточний креслення з моменту його відкриття, використовуючи системну змінну AutoCAD --
DBMOD. Якщо вона містить 0, то креслення не був змінений, інакше - був. Друга
кнопка дозволить нам зберегти креслення. p>
З історії створення AutoCAD h2>
В
квітні 1982 року була організована компанія Autodesk - автор нині популярного
програмного продукту для автоматизованого проектування AutoCAD. У той
час вона складалася всього лише з 15 програмістів. Новий продукт кардинально
змінив положення справ у сфері розробки конструкторської документації. У
Нині AutoCAD використовують мільйони людей по всьому світу, він переведений
більш ніж на 18 мов. До речі, одним із чинників популярності, яку AutoCAD
придбав у Росії, є та обставина, що компанія Autodesk перевела
свій продукт на російську мову ще на початку просування перших версій програми. p>
Версії AutoCAD h2>
Версія
1.0 (Release 1) Декабрь1982г p>
Версія
1.2 (Release 2) Квітень 1983 р p>
Версія
1.3 (Release 3) Август1983г p>
Версія
1.4 (Release 4) Жовтень 1983 р p>
Версія
2.0 (Release 5) Жовтень 1984 р. p>
Версія
2.1 (Release 6) Травень 1985 р. p>
Версія
2.5 (Release 7) Червень 1986 р p>
Версія
2.6 (Release 8) Квітень 1987 р p>
Версія
9 - Вересень 1987 р p>
Версія
10 - Жовтень 1988 р p>
Версія
11 - Жовтень 1990 р p>
Версія
12-Червень 1992 р. (останній випуск для Apple Macintosh) p>
Версія
13-листопада 1994 р (останній випуск для Unix, MS-DOS і Windows 3.11) p>
Версія
14 - Лютий 1997 р. p>
AutoCAD
2000 (R15.0) - березень 1999 р p>
AutoCAD 2000I (R15.1) - липень 2000р p>
AutoCAD 2002 (R15.6) - червень 2001р p>
AutoCAD
2004 (R16.0) - березень 2003р p>
AutoCAD
2005 (R16.1) - березень 2004р p>
AutoCAD
2006 (R16.2) - березень 2005р p>
AutoCAD
2007 (R17.0) - березень 2006р p>
AutoCAD
2008 (R17.1) - березень 2007р p>
Список літератури h2>
IT
спец № 07 ЛИПЕНЬ 2007 p>