Получение указателя на пространство модели
Построение границы дорожки
|
| ||||
Получение указателя на пространство модели |
| ||||
При работе с функциями ActiveX необходимо иметь возможность переключаться между пространством модели и пространством листа, в которых могут быть созданы объекты. (в терминологии ActiveX слово "примитивы" обозначают объекты, однако в данном пособии употребляется термин "объект"). Для задания пространства, в котором требуется создать объект, нужно получить от AutoCAD указатель на это пространство. К сожалению, получение указателя на пространство модели осуществляется не в один этап. Следующий фрагмент кода показывает, как именно это деляется:
(vla-get-ModelSpace (vla-get-ActiveDocument (vlax?get?Acad?Object))) Функция vlax-get-Acad-Object работает внутри программы и возвращает указатель на AutoCAD. Указатель передается в функцию vla?get?ActiveDocument, которая затем возвращает его на текущий активный рисунок (документ) AutoCAD. Этот указатель служит аргументом функции vla-get-ModelSpace, результатом которой является указатель на пространство модели текущего рисунка. Естественно, каждый раз набирать это выражение не очень удобно. Например, посмотрим, насколько усложняется код для построения полилинии с помощью ActiveX, если в него включить целиком выражение для указателя на пространство модели: (setq pline (vla-addLightweightPolyline (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-Acad-Object) ) ) VLADataPts) ) (vla-put-closed pline T) Функция становится менее понятной. И дело не только в этом. Теперь при создании каждого объекта необходимо будет повторять одну и ту же последовательность вложенных функций. Это — один из тех немногих случаев, когда уместно использовать глобальные переменные. Приложение может строить множество объектов в пространстве модели (вспомним о плитках, которыми должна быть вымощена дорожка), поэтому объявим глобальную переменную для сохранения указателя на пространство модели: (setq *ModelSpace* (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-Acad-Object)))) Переменную *ModelSpace* можно использовать в вызове любой ActiveX-функции, предназначенной для создания объектов. Единственное, на что следует обратить внимание это то, что переменная *ModelSpace* должна быть определена до начала создания графических объектов. Поэтому функция setq, присваивающая значение данной переменной, должна выполняться в процессе загрузки, сразу же после функции vl-load-com. Вызовы этих функций следует поместить в тексте программы до самого первого объявления defun. В результате они будут выполняться на самом раннем этапе, в процессе загрузки файла.
|