Если остановиться на вычерчивании за один прием участка полилинии, проходящего через две точки, то соответствующая функция будет выглядеть, например, следующим образом:
(defun otr ()
(command “pline” pt1 “w” “0” “” pt2 “”)
).
Теперь можно написать полностью программу, обрабатывающую файл результатов расчета любой длины.
;;; ==============================================
(defun cdraw ()
;;; ==============================================
;;; подавление вывода текста на экран
(setq svar_old (getvar “cmdecho”))
(setvar “cmdecho” 0)
;;; загрузка штрих-пунктирной линии
(if (tblsearch "ltype" "Acad_ISO04w100")
(princ)
(command "linetype" "load"
"Acad_ISO04w100" "acadiso.lin" "" "")
)
;;; сохранение текущего слоя
(setq lay_old (getvar "clayer"))
;;; создание нового слоя в чертеже
(command "layer" "new" "cam"
"c" "magenta" "cam"
"I" "Acad_ISO04w100" "cam"
"s" "cam" "")
;;; вызов файла и чтение первой строки
(setq get_F (getstring "Введите имя файла:"))
(setq file1 (open (strcat get_F) "r"))
(setq t1 (pnt))
;;; организация цикла счета строк файла
(setq k 0)
(while (read-line file1)
(setq k (+ k 1))
)
(close file1)
;;; чтение файла и обрисовка профиля
(setq file1 (open get_F “г”))
(repeat (- k 1)
(setq t2 (pnt))
(otr)
(setq t1 t2)
)
(close file1)
(command “layer” “s” lay_old)
(setvar “cmdecho” svar_old)
(princ)
)
Разумеется, в текст программы должны быть включены функции, описанные в этом параграфе (имеются в виду функции pnt и otr).
Приведенный пример представляет собой фрагмент программы, используемой для автоматической обрисовки центрового профиля кулачка. Дополнительно реальная программа выполняет операции объединения сегментов полилинии, генерирования типа линии, размещения изображения профиля в нужном месте чертежа и поворота изображения на заданный угол. To обстоятельство, что профиль очерчивается отрезками прямых, не играет существенной роли, так как при малом шаге счета (он в реальной программе принят равным одному угловому градусу, а может быть установлен сколь угодно малым) визуально профиль не отличается от такового, построенного с помощью сплайна.
И последнее замечание. Приведенный фрагмент содержит два цикла: while и repeat. Это сделано лишь для иллюстрации принципов их построения. В реальной программе достаточно одного цикла while.
8. ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ
8.1. Вывод сообщений
Ранее рассматривались принципы организации запросов для ввода оператором информации во время работы программы. Иногда бывает необходимо записать в файл необходимые данные, вывести на экран запрос или сообщение, не связанные с функциями getxxx, и т.п. Автолисп содержит четыре функции, отвечающие этим требованиям: prompt, print, prin1 и princ.
(prompt строка). Функция выводит строку в поле сообщений экрана и возвращает nil. В режиме двухэкранной работы сообщение выводится на оба экрана.
Следует иметь в виду, что аргумент строка должен обязательно быть строковой константой. Аргументы другого типа не принимаются. Например:
(prompt "Hello") вызывает на экран Hellonil,
(prompt hello) сообщает error: bad argument type.
(prin1 [выражение [дескриптор_файла]]). Функция выводит выражение в командную строку или записывает его в открытый для записи файл, определенный дескриптором, возвращая выражение в поле сообщений. Таким образом, адрес записи выражения определяется наличием или отсутствием аргумента дескриптор_файла. Примеры [5]:
(prin1 "Hello" f) записывает "Hello" в файл f и возвращает "Hello" в поле сообщений,
(prin1 "Hello") записывает "Hello" в командную строку и одновременно возвращает в поле сообщений, в результате чего "Hello" в текстовом поле экрана появляется дважды.
Если функция вызывается без аргументов, она возвращает (и записывает) пустую строку. При использовании prin1 в качестве последнего выражения пользовательской функции эта пустая строка обеспечивает "мягкий" выход из приложения.
(princ [выражение [дескриптор_файла]]). Функция работает аналогично предыдущей. Разница заключается в том, что при записи в файл строковой константы princ снимает ее признак (открывающие и закрывающие кавычки), тем самым делая ее доступной для чтения с помощью функции read-Iine. Действие пустой строки аналогично предыдущему.