Группы пользователей Autodesk

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


Построение границы дорожки

 

Построение границы дорожки 
 

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



При работе с функциями 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. В результате они будут выполняться на самом раннем этапе, в процессе загрузки файла.

 



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