Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Лекция 16. Объектная модель САПР Kompas и COM автоматизация.






 

Для упрощения разработки приложений под КОМПАС, в состав последнего входит большое число модулей (заголовочных файлов) для различных языков программирования. В этих модулях содержится описание интерфейсов в соответствии с синтаксисом определенного языка. Располагаются эти модули в подкаталоге Include каталога SDK. Например, на моем компьютере они расположены здесь: «C: \Program Files\ASCON\KOMPAS-3D V8\SDK\Include\».

Среди всех модулей, находящихся в этом каталоге нас интересует всего два. ksTLB.pas – в нём содержится описание интерфейсов с их свойствами и методами. ksConstTLB.pas – в нём содержится описание большого числа констант, которые упоминаются в документации КОМПАС.

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

Сама система КОМПАС предоставляет интерфейс 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

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

 

Метод GetParamStruct

 

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

 

GetParamStruct(structType: Smallint): IDispatch;

 

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

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

Интерфейс ksDocumentParam описывает параметры графического документа. Получить его можно с помощью метода GetParamStruct интерфейса KompasObject для этого ему (методу) в качестве аргумента нужно передать значение ko_DocumentParam. Ниже приводится пример программы демонстрирующий получение этого интерфейса:

var

DocumentParam: ksDocumentParam;

begin

DocumentParam: = ksDocumentParam

(kompas.GetParamStruct(ko_DocumentParam));

 

Рассмотрим свойства и методы данного интерфейса (их немного). Начнем со свойств, их всего пять:

author - строка с именем автора документа;

comment – строка с комментарием к документу;

fileName - строка с именем файла документа;

regime – режим редактирования. Если данное свойство равно единице, то редактируемый документ не отображается на экране. Если же оно равно нулю, то он (документ) отображается на экране пользователя, как и при обычной работе с этим документом.

type – тип документа.

В таблице ниже представлены основные типы документов системы КОМПАС:

 

Имя типа Описание
ksDocumentUnknown Неизвестный_тип
ksDocumentDrawing Чертеж
ksDocumentFragment Фрагмент
ksDocumentSpecification Спецификация
ksDocumentPart Деталь
ksDocumentAssembly Сборка
ksDocumentTextual Текстовый_документ

 

Создание нового чертежа

 

Для работы с чертежом служит интерфейс ksDocument2D. Получить его можно из интерфейса KompasObject с помощью метода Document2D последнего. Данный метод не имеет входных параметров и возвращает нужный нам интерфейс (или nil в случае ошибки).

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

Во-вторых, у пользователя активным может быть какой-то свой документ, никак не связанный с вашей программой. Я не думаю, что пользователь сильно обрадуется тому, что ваша программа, не спросив его на то разрешение, начнет вносить какие-то изменения (пусть и чисто косметического характера) в его личный чертеж, стоивший ему уйму сил. А нервные клетки пользователей нужно беречь, как-никак они не восстанавливаются.

Исходя из всего вышесказанного, можно сделать вывод, что метод ActiveDocument2D без специальных мер предосторожности не может быть использован для получения интерфейса ksDocument2D. Поэтому мы, в качестве основного способа получения нужного нам интерфейса будем использовать первый способ (использование метода Document2D).

Для этого используется метод ksCreateDocument интерфейса ksDocument2D.

Вот его прототип:

 

ksCreateDocument(const par: IDispatch): WordBool;

 

В качестве единственного параметра он принимает интерфейс ksDocumentParam, который мы рассмотрели в прошлом разделе. Данный метод возвращает значение true в случае успешного создания чертежа и false в случае, если создать документ по какой-то причине не удалось.

var

//Переменные

Document2D: ksDocument2D;

DocumentParam: ksDocumentParam;

begin

//Получаем и заполняем интерфейс параметров документа

DocumentParam: =ksDocumentParam

(kompas.GetParamStruct(ko_DocumentParam));

DocumentParam.Init();

DocumentParam.type_: =ksDocumentDrawing;

//Получаем интерфейс документа

Document2D: =ksDocument2D(kompas.Document2D);

//Создаем новый чертеж

Document2D.ksCreateDocument(DocumentParam);

 

Открытие чертежа

 

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

Для осуществления этого вам нужно как-то открыть чертеж из шаблона в КОМПАСе и получить его интерфейс. Для этой цели у интерфейса ksDocument2D предусмотрен специальный метод: ksOpenDocument. Вот его прототип:

 

ksOpenDocument(const nameDoc: WideString;

regim: WordBool): WordBool;

 

Рассмотрим параметры:

nameDoc – строка с именем файла, в котором хранится открываемый нами чертеж;

regim – режим открытия файла. Если значение данного параметра равно

true, то документ открывается в невидимом режиме, то есть его не видно.

Если же значение этого равно false, то документ открывается в обычном видимом режиме.

Данный метод возвращает true, если документ успешно открыт, и false – если открыть документ не удалось.

 

Закрытие и сохранение чертежа

 

Из своей программы вы можете закрыть документ, который стал вам больше не нужным. Для этого используется метод ksCloseDocument все того же интерфейса ksDocument2D. Данный метод не имеет входных параметров.

В случае успешного закрытия документа он возвращает true, а в случае ошибки false.

Обращаю ваше внимание на то, что данный метод закрывает данный документ без предложения сохранить документ. Это значит, что если ваша программа вносила в документ какие-то изменения, а потом закрыла его этим методом, то все сделанные изменения будут утеряны.

Поэтому лучше либо вообще не закрывать документ, предоставив пользователю возможность самому определить его дальнейшую участь, либо сохранить в какое-то предопределенное место. Причем, наилучшим вариантом будет такой, при котором пользователь сам решает куда лучше всего сохранить данный чертеж. Хотя это уже вопрос этичности программиста.

Для сохранения чертежа предусмотрено два метода ksSaveDocument и ksSaveDocumentEx интерфейса ksDocument2D. Начнем с первого, вот его прототип:

 

ksSaveDocument(const fileName: WideString): WordBool;

 

У него всего один параметр - это строка с именем файла, в который следует сохранить данный чертеж. Если файл успешно сохранен, то возвращается значение true, в противном случае возвращается значение false.

Если имя файла (параметр fileName) не задано, то используется имя файла из документа (см. интерфейс ksDocumentParam). Если оно также не задано, то происходит ошибка.

Метод ksSaveDocumentEx похож на метод ksSaveDocument и, по сути, является его расширенной версией. Вот его прототип:

 

ksSaveDocumentEx(const fileName: WideString;

SaveMode: Integer): WordBool;

 

Как видите, здесь добавился еще один параметр SaveMode, который указывает, в какой версии КОМПАС следует сохранить данный чертеж:

1 - чертеж сохраняется в предыдущую версию КОМПАСа, по отношению к той, в которой он в последний раз редактировался;

0 – в текущую версию КОМПАСа;

Во всем остальном данный метод полностью идентичен методу ksSaveDocument, рассмотренному ранее.

 

Параметры оформления листа документа (ksSheetOptions)

 

Интерфейс ksSheetOptions задает параметры оформления. Получить данный интерфейс с помощью уже знакомого нам метода GetParamStruct интерфейса KompasObject, для этого в качества параметра этого метода нужно передать константу ko_SheetOptions. Так мы сможем получить сам интерфейс, но он не будет привязан к какому-либо чертежу. То есть это будет абсолютно пустой интерфейс. Как получить параметры чертежа?

Для этого используется метод ksGetDocOptions интерфейса ksDocument2D. Вот прототип этого метода:

 

ksGetDocOptions(optionsType: Integer;

const param: IDispatch): Integer;

 

У него два параметра:

optionsType – тип настройки. Это числовой параметр, который говорит о том, какие именно настройки чертежа мы хотим получить;

param – интерфейс, в который будут записаны читаемые настройки чертежа. Тип этого интерфейса зависит от параметра OptionsType.

В случае успешного чтения параметров метод возвращает значение 1, а в случае ошибки значение 0.

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

Для установки параметров чертежа используется другой метод интерфейса ksDocument2D ksSetDocOptions. Вот его прототип:

 

ksSetDocOptions(optionsType: Integer;

const param: IDispatch): Integer;

 

Как видите, он имеет точно такой же прототип, как и метод ksGetDocOptions. Действительно единственная разница между ними состоит в том, что один читает текущие параметры чертежа, а второй устанавливает новые параметры.

Что ж с получением интерфейса будем считать, что разобрались. Теперь поговорим о самом интерфейсе ksSheetOptions. Вот его свойства:

layoutName – строка с именем библиотеки оформления;

sheetType – признак стандартности листа чертежа. Если значение данного свойства false, то лист чертежа имеет стандартный размер (A0, A1, A2, A3, A4 или A5). Если же значение данного свойства true, то лист чертежа имеет произвольный, устанавливаемый пользователем формат.

shtType – целое число, которое задает тип основной надписи чертежа. Теперь обсудим эти свойства подробнее.

 

Для того чтобы понять их назначение запустите приложение КОМПАС и создайте в нем какой-нибудь новый документ. Теперь откройте Менеджер документа (меню «Сервис/Менеджер документа» или на панели инструментов). Появится приблизительно такое окно:

Ну так вот, поле layoutName задает имя библиотеки из колонки «Бибилиотека оформлений». То есть для данного примера там должно быть указано значение 'graphic.lyt'.

 

 

Поле shtType хранит в себе значение колонки «Номер» соответствующее нужному нам стилю оформления. Например, для стиля «Чертеж констр. Первый лист. ГОСТ 2.104-68» (выделен на изображении выше) в этом поле должно храниться значение 1.

 

 

Внимательный читатель может спросить: «как изменить формат листа?». Действительно, интерфейс ksSheetOptions не предоставляет возможность указать формат листа (A0, A1, A2 и т.д.). Для этих целей может быть использован интерфейс ksStandartSheet.

 

Параметры стандартного листа (ksStandartSheet)

 

Данный интерфейс может быть получен из интерфейса ksSheetOptions. Для этого используется метод GetSheetParam последнего.

 

GetSheetParam(type_: WordBool): IDispatch;

 

Параметр type_ - задает признак формата листа. Если данный параметр равен false то используется стандартный формат листа, в противном случае используется произвольный формат листа.

Обращаю ваше внимание на то, что значение данного параметра должно совпадать со значение поля sheetType интерфейса ksSheetOptions

В зависимости от значения параметра type_ данная функция возвращает либо интерфейс ksStandartSheet (type_=false), который описывает параметры стандартного листа, либо интерфейс ksSheetSize (type_=true), который описывает параметры листа произвольного размера (рассматривать его мы не будем), либо nil, в случае ошибки. Вообще в отношении данного метода в документации говорится буквально следующее: «осталась для совместимости со старыми библиотеками». Однако найти другой способ (более современный) работы с интерфейсом ksStandartSheet мне так и не удалось. Теперь поговорим о самом интерфейсе.

Вот его свойства:

direct – задает ориентацию листа. Если значение этого свойства равно false, то лист располагается вертикально, если же оно равно true, то горизонтально.

format – формат листа. Задается следующим образом: 0 – A0, 1 - A1, 2 – A2, 3 – A3 и так далее.

multiply – кратность формата.

Метод у данного интерфейса всего один: Init(), который сбрасывает значения всех свойств интерфейса.

 

Простой текст

Для написания текстов на листе чертежа используется метод ksText интерфейса ksDocument2D. Вот его прототип:

function ksText(

x: Double; //координата x выводимого текста

y: Double; //координата y выводимого текста

ang: Double; //угол наклона текста

hStr: Double; //высота текста

ksuStr: Double; //растяжение текста

bitVector: Integer; //набор флагов выводимого текста

const s: WideString //выводимая строка

): Integer;

 

Теперь подробнее.

Параметр ksuStr задает коэффициент растяжения текста по горизонтали. Для большей ясности взгляните на рисунок ниже. На нем первая строка отображена без растяжения, а вторая – с двойным (ksuStr=2).

 

Параметр bitVector задает тип выводимого текста. Для обычного текста он должен быть равен нулю. Работу с этим

 

Document2D.ksText(100, 100,

0, //без наклона

5, //пятым шрифтом

0, //без растяжения

0, //обычный текст

‘Выводимый текст’);

 

Const

ITALIC_OFF = 128;

BOLD_ON = 256;

UNDERLINE_ON = 1024;

……

Var

Document2D: ksDocument2D;

……

Begin

Document2D.ksText(100, 100, 0, 5, 0, 0, 'Обычный шрифт');

Document2D.ksText(100, 90, 0, 5, 0, ITALIC_OFF,

'Шрифт без наклона');

Document2D.ksText(100, 80, 0, 5, 0, BOLD_ON, 'Полужирный шрифт');

Document2D.ksText(100, 70, 0, 5, 0, UNDERLINE_ON,

'Подчеркнутый шрифт');

 

Верхнее и нижнее отклонения

Для вывода верхнего и нижнего отклонений предусмотрено два значения параметра bitVector: UPPER_DEVIAT (4), который говорит о том, что выводимый текст является верхним отклонением; и LOWER_DEVIAT (5), которое говорит о том, что выводимый текст является нижним отклонением.

 

Const

UPPER_DEVIAT = 4;

LOWER_DEVIAT = 5;

Var

Document2D: ksDocument2D;

Begin

Document2D.ksText(100, 100, 0, 5, 0, 0,

'Текст перед отклонениями');

Document2D.ksText(175, 100, 0, 5, 0, UPPER_DEVIAT,

'Верхнее отклонение');

Document2D.ksText(175, 100, 0, 5, 0, LOWER_DEVIAT,

'Нижнее отклонение');

Document2D.ksText(225, 100, 0, 5, 0, 0,

'Текст после отклонений');

Дробь

Вывод дроби очень похож на вывод отклонений. Разница состоит только в том, что используются другие константы: NUMERATOR (1) для числителя и DENOMINATOR (2) для знаменателя.

Взглянем на небольшой пример:

 

Const

NUMERATOR = 1;

DENOMINATOR = 2;

……

Var

Document2D: ksDocument2D;

……

Begin

Document2D.ksText(100, 100, 0, 5, 0, 0, 'Текст перед дробью');

Document2D.ksText(160, 100, 0, 5, 0, NUMERATOR, 'Числитель');

Document2D.ksText(160, 100, 0, 5, 0, DENOMINATOR,

'Знаменатель');

Document2D.ksText(195, 100, 0, 5, 0, 0, 'Текст после дроби');

 

Прямая

 

Для построения прямой линии используется метод ksLine интерфейса ksDocument2D. Вот его прототип:

 

ksLine(x: Double; y: Double; angle: Double): Integer;

 

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

Обращаю ваше внимание на то, что данный метод не позволяет указать стиль линий. Он используется для построения вспомогательных прямых. Пример я приводить не буду, так как здесь все предельно просто и затруднений возникнуть не должно.

 

Для построения отрезка используется метод ksLineSeg интерфейса

ksDocument2D. Вот его прототип:

 

ksLineSeg(x1: Double; y1: Double;

x2: Double; y2: Double;

style: Integer): Integer;

 

Здесь параметров больше. Но они все простые:

x1, y1 – координаты первой точки отрезка;

x2, y2 – координаты второй точки отрезка;

style – стиль линии отрезка.

В случае успеха данный метод возвращает указатель на отрезок, а в случае ошибки – нуль.

 

Окружность

 

Для построения окружности используется метод ksCircle интерфейса

ksDocument2D. Вот его прототип:

 

ksCircle(

xc: Double; yc: Double; //координаты центра окружности

rad: Double; //радиус окружности

style: Integer //стиль линии окружности

): Integer;

 

В случае успеха данный метод возвращает указатель на окружность, а в случае ошибки нуль.

 

 

Параметры прямоугольника (ksRectangleParam)

 

Параметры прямоугольника задаются интерфейсом KsRectangleParam. Получить его можно с помощью метода GetParamStruct интерфейса KompasObject, для этого надо в качестве параметра передать ему константу ko_RectangleParam.

Ниже представлены свойства этого интерфейса.

ang – угол наклона прямоугольника к горизонтальной оси;

height – высота прямоугольника;

style – стиль линии;

width – ширина прямоугольника;

x и y – координаты левого нижнего угла прямоугольника.

 

 

Построение прямоугольника

 

Для построения прямоугольника используется метод ksRectangle интерфейса ksDocument2D. Вот его прототип:

 

ksRectangle(

const par: IDispatch; //интерфейс ksRectangleParam

centre: Smallint //признак обозначения центра

): Integer;

 

 

Параметр Smallint задает обозначение центра прямоугольника (точку пересечения его диагоналей). Он может принимать одно из значений, представленных в таблице ниже:

Значение Описание
  никак не обозначать центр
  маленьким крестиком
  горизонтальная ось
  и горизонтальная и вертикальная оси

 

Var

kompas: KompasObject;

Document2D: ksDocument2D;

RectangleParam: ksRectangleParam;

……

Begin

……

//Заполняем параметры прямоугольника

RectangleParam: =ksRectangleParam

(kompas.GetParamStruct(ko_RectangleParam));

RectangleParam.ang: =30;

RectangleParam.height: =20;

RectangleParam.style: =1;

RectangleParam.width: =50;

RectangleParam.x: =100;

RectangleParam.y: =100;

//Строим сам прямоугольник без обозначения центра

Document2D.ksRectangle(RectangleParam, 0);

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.037 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал