Рассмотрим теперь работу с СОМ-сервером, который не знаком Delphi. Для примера возьмем AutoCAD. Прежде всего, в проект необходимо импортировать библиотеку типов – Delphi должен узнать, какие методы и свойства есть в искомом COM-сервере. Создаем новый проект, в меню Project выбираем пункт Import Type Library. Открывается окно импорта библиотеки типов (Рис. 22.7).
Рис. 26.7 Окно импорта библиотеки типов.
В списке в верхней части окна перечислены все установленные на компьютере СОМ-серверы. В этот список надо добавить библиотеку типов AutoCAD. Для версии 2004 она живет в файле acax16enu.tlb, который находится в директории Program Files\Common Files\Autodesk Shared. Щелкаем по кнопке Add… и открываем файл acax16enu.tlb. В раскрывающемся списке Palette Page можно выбратьту страницу палитры компонентов, на которую будут добавлены новые компоненты для работы с AutoCAD. Можно выбратьстраницу Servers или предварительно создать отдельную страницу (щелчок правой кнопкой мыши над палитрой).
Указав файл и страницу, щелкаем по кнопке Install. Появляется окно Install (Рис. 22.8). В нем просто щелкаем по кнопке ОК.
Рис. 26.8 Окно установки компонентов.
Затем выводится окно компиляции (Рис. 22.9). Щелкаем по кнопке Compile. В процессе компиляции обычно на одной-двух строчках выскакивают ошибка – эти ошибки допущены разработчиками AutoCAD. Просто закомментируйте эти строчки. После успешной компиляции щелкните по кнопке Install. В результате в палитре компонентов на выбранной странице будет добавлен ряд новых компонентов, отвечающих за связь с AutoCAD.
Рис. 26.9 Окно компиляции.
Закрываем проект, создаем новый проект и помещаем на форму компонент AcadDocument и кнопку. В обработчике нажатия кнопки подключаемся к AutoCAD и проводим отрезок из точки (0;0;0) в точку (10;10;0):
procedure TForm1.Button1Click(Sender: TObject);
var
v : OleVariant;
BeginPoint, EndPoint: OleVariant;
Line: IAcadLine;
par,par1:OLEVariant;
begin
Try
// пытаемся присоединиться к уже запущенной копии AutoCad
v := GetActiveOleObject('AutoCAD.Application');
AcadDocument1.ConnectTo((IDispatch(v) as IAcadApplication).ActiveDocument);
Except
// если не получилось, то запускаем новую копию AutoCad
AcadDocument1.Connect
end;
// задаём массив из трёх вещественных чисел
BeginPoint:= VarArrayCreate([0, 2], varDouble);
EndPoint:= VarArrayCreate([0, 2], varDouble);
BeginPoint[0]:= 0.0; // координата X
BeginPoint[1]:= 0.0; // координата Y
BeginPoint[2]:= 0.0; // координата Z
EndPoint[0]:= 10.0; // координата X
EndPoint[1]:= 10.0; // координата Y
EndPoint[2]:= 0.0; // координата Z
// функция AddLine добавляет отрезок в чертеж
Line:= AcadDocument1.ModelSpace.AddLine(BeginPoint, EndPoint);
// поменять цвет отрезка
Line.color:= acRed;
// поменять толщину линии
Line.Lineweight:= acLnWt040;
// сохраним файл
par:=ExtractFilePath(Application.ExeName)+'1.dwg';
par1:=ac2004_dwg;
AcadDocument1.SaveAs(par,par1);
AcadDocument1.Close;
AcadDocument1.Disconnect;
MessageDlg('Вывод в AutoCAD завершен', mtInformation, [mbOK],0)
end;
Цвет и толщина линии задаются специальными константами вида acRed, acLnWt40 и т.д. Полный список этих констант можно найти в файле AutoCAD_TLB.pas, который был создан при подключении библиотеки типов и находится в директории Delphi\Imports.
Для упрощения кода программы введем функцию GetPoint, которая преобразует три вещественных числа (координаты точки) в массив типа OLEVariant:
Function GetPoint(X, Y, Z: double): OleVariant;
begin
Result:= VarArrayCreate([0, 2], varDouble);
Result[0]:= x;
Result[1]:= y;
Result[2]:= z;
end;
Попробуем нарисовать окружность. Для этого введем переменную C типа IAcadCircle:
VAR c:IAcadCircle;
…
// зеленая окружность с центром в (20;20;20) радиусом 10
c:=AcadDocument1.ModelSpace.AddCircle(GetPoint(20,20,0),10);
c.color:=acGreen;
c.Lineweight:=acLnWt040;
Аналогичным образом можно подключаться к таким программам, как Visio, SolidWorks, Компас, что позволяет использовать их как основу для разработки специализированных САПР.