Лекции и лабораторные работы по AutoCAD'у

Дополнительная информация


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;

Содержание раздела