Выбрать главу

Каждая внешняя функция Автолиспа может использоваться как команда Автокада путем введения ее в командную строку, если использована особая структура имени функции - с:имя_функции. Структура с: должна присутствовать обязательно, имя_функции определяет имя назначаемой команды Автокада. В такой функции список аргументов должен отсутствовать, локальные переменные могут быть указаны. Строго говоря, перечень аргументов или локальных переменных не всегда обязателен, поскольку они создаются автоматически при первом упоминании. Формат создаваемой функции:

(defun C:FUNCNAME ([ / переменные])

...... ; тело функции

).

Если локальные переменные отсутствуют, круглые скобки после имени функции обязательно сохраняются, т.е. формат функции в этом случае выглядит следующим образом:

(defun C:FUNCNAME ()

........

).

Работу в Автокаде над новым чертежом конструктор начинает с организации инструментария, в частности с создания нескольких необходимых слоев чертежам В прототипах чертежей acad.dwg (12-я), unnamed.dwg (13-я), drawing.dwg (14-я) и drawingN.dwg (15-я версия) заложен по умолчанию один нулевой слой с присущим ему белым цветом и сплошными линиями. Изначальная установка пределов изображения (limits) позволяет назначить границы экрана, но не исключает необходимости организации слоев. Заложенные в последних версиях готовые рамки с угловыми штампами, соответствующие международным и региональным стандартам, расположены в пространстве бумаги и не соответствуют стандартам отечественным. Разумеется, создание аналогичной графической базы, опирающейся на отечественные стандарты, не представляет сложностей, однако не лишним представляется и другой путь - программное описание необходимых установок.

Предлагаемая в качестве иллюстрации программа используется в практике выполнения графических работ как в учебных курсах компьютерной графики, так и в ряде специальных дисциплин. Цель программы заключается в выводе на экран стандартных рамок, соответствующих принятым в отечественной практике форматам A0...A4, и организации поля чертежа с заранее установленными характерными слоями. Программа рассматривается на примере формата A1.

3.3.1. Функция обрисовки рамки

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

(defun C:A1()

;;; Устанавливаем угловые точки внешней рамки,

(setq pt1 (list -20 -5)

(setq pt2 (polar pt1 0 840))

(setq pt3 (polar pt2 (/ pi 2) 594))

(setq pt4 (polar pt3 pi 840))

;;; Устанавливаем таковые для внутренней рамки.

(setq pt5 (list 0 0))

(setq pt6 (polar pt5 0 815))

(setq pt7 (polar pt6 (/ pi 2) 584))

(setq pt8 (polar pt7 pi 815))

)

После определения точек можно сразу ввести команду обрисовки рамки, но лучше для этого создать отдельную функцию, работающую аналогично процедуре в Паскале или подпрограмме- функции в Фортране. Целесообразность такого подхода будет ясна далее. Поскольку внешняя и внутренняя рамки отличаются шириной линии, учтём это в создаваемой функции, обрисовывая внешнюю рамку командой line, а внутреннюю - командой pline:

(defun ramka()

(command '‘Iine” pt1 pt2 pt3 pt4 “с”)

(command “pline” pt5 “w” “0.4” “” pt6 pt7 pt8 “с”)

)

Теперь достаточно добавить в исходную программу функцию ramka, и при вызове команды A1 произойдет автоматическая обрисовка рамки на чертеже.

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

(defun C:A1 ()

(setq pt1 (list -20 -5))

(setq pt2 (list 821 589))

(setq pt3 (list 0 0))

(setq pt4 (list 816 584))

(ramka)

)

А функция (ramka) предстанет в форме:

(defun ramka ()

(command "rectangle" pt1 pt2)

(command "rectangle" pt3 pt4)

(setq e1 (entlast))

(command "pedit" e1 "w" "0.4" "")

)

3.3.2. Создание слоев