Главная » Delphi, OLE, САПР » Подключение к КОМПАСу из DELPHI

0

Для того чтобы работать с КОМПАСом нам нужно сначала как-то к нему подключиться.

Сама система КОМПАС предоставляет интерфейс KompasObject. Это ключевой интерфейс системы, из которого могут быть получены все другие. Получить этот интерфейс можно с помощью функции CreateOleObject, описанной в модуле ComObj. Вот прототип этой функции:

function CreateOleObject(const ClassName: string): IDispatch;

У нее всего один параметр – строковое имя класса объекта. Для использования системы КОМПАС с интерфейсом версии 5 в качестве такой строки нужно указать ‘Kompas.Application.5’.

В случае успеха данная функция вернет нам интерфейс, с которым мы сможем   работать.   При   этом   в   списке   процессов   появится   процесс

«Kompas.exe».

Если же она не смогла успешно завершиться по какой-то причине (например, в системе не установлено приложение КОМПАС), то она сгенерирует исключение класса EOleSysError.

Ниже приводится фрагмент листинга программы, демонстрирующий подключение к системе КОМПАС:

uses

//Модули, необходимые нам для работы

ksTLB, ComObj;

………………………

var

//переменная – интерфейс системы КОМПАС

kompas: KompasObject;

…………………………

begin

try

//Пытаемся подключиться к КОМПАСУ

kompas:=KompasObject(CreateOleObject(‘Kompas.Application.5’));

except

//Не удалось подключиться к КОМПАСУ

…………………………

Здесь мы выполняем преобразование типов. Дело в том, что функция CreateOleObject возвращает значение типа IDispatch, а мы преобразовываем его к типу KompasObject, который нам и нужен.

По идее после получения интерфейса KompasObject на экране должно появиться окно КОМПАСа, но оно не появляется. Почему? Дело в том, что оно  невидимо.  Нет,  серьезно,  невидимо.  Для  того  чтобы  сделать  его

видимым, нужно свойству Visible интерфейса KompasObject присвоит значение true. В итоге, окончательный код подключения к КОМПАСу будет выглядеть так (обработка ошибок опущена, но она подразумевается):

kompas:=KompasObject(CreateOleObject(‘Kompas.Application.5’)); kompas.Visible:=true;

Теперь вы точно должны увидеть окно приложения КОМПАС (если конечно все правильно сделали). Идем дальше.

Что произойдет, если на момент вызова функции CreateOleObject у пользователя уже будет запущен один или несколько экземпляров приложения КОМПАС? Будет создан еще один экземпляр этого приложения.

Если вы этого не хотите, то есть, если вы хотите получить интерфейс уже запущенного экземпляра приложения КОМПАС, тогда вместо функции CreateOleObject вам нужно использовать функцию GetActiveOleObject из того же модуля. Вот ее прототип:

function GetActiveOleObject(const ClassName: string): IDispatch;

Как видите, она имеет точно такой же прототип. В качестве единственного параметра она ожидает получить строковое имя класса объекта.

В случае ошибки (например, на момент ее вызова не запущено ни одного экземпляра приложения КОМПАС) она генерирует исключение с классом EOleSysError.

Код подключения к уже запущенному экземпляру приложения КОМПАС может выглядеть так:

kompas:=KompasObject(GetActiveOleObject(‘Kompas.Application.5’)); kompas.Visible:=true

«А зачем здесь нужно устанавливать видимость?» – наверняка спрашиваете вы. Здесь установка видимости выполняет другую задачу: сделать активным тот экземпляр приложения КОМПАС, к которому мы подключились.

Завершение работы КОМПАСа

Хорошо, мы разобрались с тем, как запускать КОМПАС и подключаться к нему. Теперь поговорим о том, как корректно завершить его работу.

В принципе вы можете этого и не делать. Действительно, в том, что после завершения работы вашей программы, система КОМПАС продолжит свою работу, лично я не вижу ничего плохого (хотя все зависит от решаемой задачи). Впрочем, все это лирика, вернемся на землю.

Для завершения работы системы КОМПАС у интерфейса KompasObject есть специальный метод Quit(). Если в данном экземпляре приложения был открыт один или несколько документов, то перед закрытием пользователю будет выдано сообщение с предложением сохранить изменения. Параметров, как и возвращаемых значений у данного метода нет. Вроде все просто.

Тогда такой вопрос: «что произойдет, если пользователь закроет приложение КОМПАС до того, как мы вызовем метод Quit?». В этом случае попытка вызова данного метода завершится ошибкой с уже знакомым нам классом EOleSysError. Поэтому будьте внимательными.

Метод GetParamStruct

У интерфейса KompasObject есть замечательный метод GetParamStruct, с которым мы не раз столкнемся в дальнейшем. Данный метод возвращает интерфейс параметров объектов нужного типа. С помощью него могут быть получены интерфейсы, описывающие параметры документа, штриховки, обозначения базы и много другого. Вот прототип этого метода:

GetParamStruct(structType: Smallint): IDispatch;

В качестве единственного параметра данный метод принимает тип объекта, интерфейс параметров которого мы хотим получить. Тип выражается в виде целого числа. Допустимые типы представлены в виде констант в соответствующем модуле.

В случае ошибки (если, например, указан ошибочный тип объекта), данный метод возвращает значение nil.

Так как метод GetParamStruct возвращает значение IDispatch, мы будем вынуждены каждый раз вручную преобразовывать1 тип интерфейса точно так же, как это делали при подключении к КОМПАСу.

Определение версии КОМПАСа

Достаточно часто программе необходимо знать, с КОМПАСом какой версии она сейчас работает. Для определения этого может быть использован метод ksGetSystemVersion интерфейса KompasObject. Ниже представлен прототип этого метода.

ksGetSystemVersion(

var iMajor: Integer;  //старшее слово версии

var iMinor: Integer;  //младшее слово версии

var iRelease: Integer; //номер выпуска внутри одной версии

var iBuild: Integer   //номер сборки внутри одного выпуска

): Integer;

В случае успеха данный метод возвращает значение 1.

Ниже представлен ключевой фрагмент исходного текста программы, демонстрирующей использование этого метода.

1 Вообще говоря явное преобразование типов мы вынуждены будем делать при получении любого интерфейса системы КОМПАС

var

kompas: KompasObject; Major,Minor,Release,Build: integer; str: string;

begin

//Подключаемся к КОМПАСу

kompas:=KompasObject(CreateOleObject(‘Kompas.Application.5′));

//Получаем версию КОМПАСа

kompas.ksGetSystemVersion(Major,Minor,Release,Build);

//Завершаем работу КОМПАСа (он больше не нужен) kompas.Quit(); str:=IntToStr(Major)+’.’+IntToStr(Minor)

+’ Release ‘ + IntToStr(Release)

+’ Build ‘  + IntToStr(Build); ShowMessage(str);

end;

На рисунке ниже показан пример вывода этой программы для КОМПАС 8.

В большинстве случаев достаточно знать старшее слово версии (iMajor).

Источник: Норсеев Сергей, «РАЗРАБОТКА ПРИЛОЖЕНИЙ ПОД КОМПАС В DELPHI»

По теме:

  • Комментарии