Дополнительная информация
9. В технологии ActiveX объектная модель работающего приложения представляется как совокупность объектов, свойств, методов и событий. Для каждого из элементов этой модели имеется своя реализация в виде данных новых типов (структур) и функций, обеспечивающих взаимодействие с пользователем.
10. Для использования расширения языка AutoLISP, реализующее в системе AutoCAD технологию ActiveX, необходимо использовать функцию (vl-load-com).
Эта функция загружает большое количество функций, входящих в расширение AutoLISP. Возвращаемого значения у функции нет.
11. Чтобы получить указатель корневого объекта иерархии AutoCAD (имя объекта – Application) используйте функцию (vlax-get-acad-object).
Возвращаемое значение – VLA-объект.
12. Функция (vla-get-activedocument)
возвращает указатель открытого документа.
13. Функции (vla-get-modelspace) и (vla-get-paperspace) возвращают соответственно указатели на пространство модели рисунка и пространство листа документа.
14. Пример функции AutoLISP, которая обеспечивает подготовку к работе с ActiveX:
(defun begin_activex ( /)
(vl-load-com)
(setq acad_application (vlax-get-acad-object)
(setq active_document (vla-get-activedocument acad_application))
(setq model_space (vla-get-modelspace activedocument))
); defun
15. Создать указатель на объект приложения перед его запуском можно используя функцию
(vlax-create-object <имя>)
Аргумент <имя>
- строка, определяющая тип объекта. Может быть одно из следующих видов: “<приложение>.<тип>.<версия>”
или “<приложение>.<тип>”. Например “<CadDev>.<Lab5>”.
Возвращаемое значение – VLA-объект.
16. Функция вычисляет указатель для объекта приложения или самого приложения:
(vlax-get-object <имя>)
Аргумент <имя>
- строка, определяющая тип объекта. (Описание см. п.7).
17. Функция, которая вычисляет указатель объекта приложения или создает его, если такого указателя не было:
(vlax-get-or-create-object <имя>)
Аргумент <имя>
- строка, определяющая тип объекта. (Описание см. п.7).
18. Функция (vlax-invoke-method) применяет метод с указанным именем.
(vlax-invoke-method <объект> <метод> <арг1> [<арг2> … [аргN] … ]))
Возвращаемое значение определяется вызываемым методом.
19. Функция, которая вычисляет свойство объекта.
(vlax-get-property <объект> <свойство>)
20. Функция, которая присваивает значение свойству объекта.
(vlax-put-property <объект> <свойство>)
21. Функция импортирует информацию из библиотеки типов:
(vlax-import-type-library :tlb-filename <файл> [:methods-prefix <мпрефикс> :properties-prefix <спрефикс> :constants-prefix <конпрефикс>])
Аргумент <файл>
может быть строкой с именем файла библиотеки типов.
Аргумент <мпрефикс>
– строка, которая будет добавляться при импорте к формируемым именам функций, соответствующих методам. По умолчанию имеет значение пустой строки.
Аргумент <свпрефикс>
– строка, которая будет добавляться при импорте к формируемым именам функций чтения и модификации свойств (например, для префикса xxx- и свойства Radius генерируются имена xxx-get-radius и xxx-put-radius). По умолчанию имеет значение пустой строки.
Аргумент <конпрефикс>
– строка, которая будет добавляться при импорте у формируемым именам констант. По умолчанию имеет значение пустой строки.
Пример,
(defun InitCadDev ( / CadDev_DLLPath)
(progn
;; Если используется NT
платформа, то необходимо
;; жестко прописать путь к библиотеке (рекомендация)
(setq CadDev_DLLPath
(strcat (getenv "systemdrive")
"\\Program Files\\Cad Developer Labs\\")
)
;; Если мы нашли библиотеку ...
(if (findfile (strcat CadDev_DLLPath "caddev5.dll"))
;; Импортируем её
(vlax-Import-Type-Library
:tlb-filename (strcat CadDev_DLLPath "caddev5.dll")
:methods-prefix "cdm-"
:properties-prefix "cdp-"
:constants-prefix "cdk-"
)
;; Если не находим - сообщаем пользователям
(alert (strcat "Не найдено:\n" CadDev_DLLPath "caddev5.dll"))
)
)
)
Справочную информацию о AutoLISP и VisualLISP можно найти на страничке http://caddev.narod.ru/download.html.
(код 1):
procedure StartAutoCAD;
var
AcadApplication: OleVariant;
begin
AcadApplication := CreateOleObject(‘AutoCAD.Application.16’);
// Код, необходимый для решения поставленной задачи
end;
(код 2):
var
...
AcadDocument: OleVariant;
begin
...
AcadDocument := AcadApplication.ActiveDocument;
...
end;
(код 3):
procedure CreateAutoCADDocument;
var
AcadDocument: OleVariant;
begin
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
// Выполнение необходимой задачи
AcadDocument.Save; // Сохранение документа
AcadDocument.Application.Quit; //Завершение работы и выход из AutoCAD
end;
(код 4):
var
StartPoint, EndPoint,
AcadDocument, LineObj: OleVariant;
begin
StartPoint := VarArrayCreate([0, 2], varDouble);
EndPoint := VarArrayCreate([0, 2], varDouble);
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
StartPoint[0] := 0; StartPoint[1] := 0; StartPoint[2] := 0;
EndPoint[0] := 30; EndPoint[1] := 20; EndPoint[2] := 0;
LineObj := AcadDocument.ModelSpace.AddLine(StartPoint, EndPoint);
end;
(код 5):
var
StartPoint, EndPoint,
AcadDocument, ModelSpace, LineObj: OleVariant;
begin
StartPoint := VarArrayCreate([0, 2], varDouble);
EndPoint := VarArrayCreate([0, 2], varDouble);
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
ModelSpace := AcadDocument.ModelSpace;
StartPoint[0] := 0; StartPoint[1] := 0; StartPoint[2] := 0;
EndPoint[0] := 30; EndPoint[1] := 20; EndPoint[2] := 0;
LineObj := ModelSpace.AddLine(StartPoint, EndPoint);
end;
(код 6):
var
AcadDocument, LayerCollection: OleVariant;
begin
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
LayerCollection := AcadDocument.Layers;
// Выполнение необходимой задачи
end;
(код 7):
var
AcadDocument, MenuGroupsCollection: OleVariant;
begin
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
MenuGroupsCollection := AcadDocument.Application.MenuGroups;
// Выполнение необходимой задачи
end;
(код 8):
var
AcadDocument, NewLayer: OleVariant;
begin
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
NewLayer := AcadDocument.Layers.Add(‘MyNewLayer’);
// Выполнение необходимой задачи
end;