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>