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

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

(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. Действие пустой строки аналогично предыдущему.