logo
Компьютерная графика / МАШ_ГРАФИКА

§5. Параметрические функции гбд

Ниже приведен текст функции trap, выполняющей вычер-чивание трапеции по параметрам, указанным пользо-вателем. Стандартные наборы параметров вводятся по номеру типоразмера автоматически из пакетного файла trap.dat, нестандартные – непосредственно по запросам с клавиатуры. Параметры привязки вводятся пользователем в диалоговом режиме. Данная функция использует вспомо-гательную функцию mas , которая по заданному номеру типоразмера считывает из списка набор геометрических параметров объекта.

(defun c:trap()

(setq a nil b nil h nil)

; Запрос о типе вводимых параметров

(setq v (getint "Введите тип параметров(0-

стандартные, иначе – нестандартные):"))

; Ввод нестандартных параметров c клавиатуры

(if (/= v 0)

(setq a (getreal "Введите a:")

b (getreal "Введите b:") h (getreal "Введите h:"))

)

; Ввод стандартных параметров из файла trap.dat

(if (= v 0) (prong

; 1. Переписывание файла trap.dat в список sp

(setq fl (open "c:\\ACAD\\mas\\trap.dat" "r") sp nil dl nil)

(while (setq dl (read-line fl))

(setq sp (cons (read dl) sp)) ) (close fl)

(setq sp (reverse sp) fl nil)

; 2. Поиск в списке sp строки параметров по

161

; заданному типоразмеру и запись их в список mas1

(mas "Введите типоразмер трапеции" 0 sp)

; 3.Присваивание переменным а,b,h значений из mas1

(setq a (nth 1 mas1) b (nth 2 mas1) h (nth 3 mas1))

) )

; Ввод параметров вставки с клавиатуры (экрана)

(setq pp (getpoint "Введите точку вставки"))

(setq u (getreal "Введите угол вставки"))

; Перевод значения угла вставки в радианы

(setq u (* u (/ pi 180)) d (* 0.5 (- b a)) fi (atan (/ h d)) )

(setq

ps (polar pp (+ u (* 1.5 pi)) (* 0.5 h))

; Расчёт координат вершин (р1,р2,р3,р4)

p1 (polar ps (+ u pi) (* 0.5 b))

p2 (polar p1 (+ u fi) (/ h (sin fi)))

p3 (polar p2 u a)

p4 (polar p3 (+ u (- (* 2 pi) fi)) (/ h (sin fi)))

; Расчёт точек для осей (ра1,ра2,рb1,рb2)

pa1 (polar pp (+ u pi) (* 0.6 (+ a b)))

pa2 (polar pp u (* 0.6 (+ a b)))

pb1 (polar pp (+ u (* 1.5 pi)) (* 0.8 h))

pb2 (polar pp (+ u (* 0.5 pi)) (* 0.8 h))

)

; Запоминание текущего слоя

(setq currsl (getvar "clayer"))

; Открытие нового слоя для изображения трапеции

(command "layer" "m" "trp" "c" "white" "" "l" "continuous" "" "s" "trp" ""

; Вычерчивание трапеции

"line" p1 p2 p3 p4 "c"

; Открытие нового слоя для изображения осей трапеции

"layer" "m" "osi" "c" "magenta" "" "l" "center" "" "s" "osi" ""

; Вычерчивание осей

"line" pa1 pa2 ""

162

"line" pb1 pb2 ""

; Возврат в исходный слой, перерисовка экрана

"layer" "s" currsl "" "redraw"

)

)

; Вспомогательная функция для поиска параметров в

; списке х по запрашиваемому типоразмеру

(defun mas (text a x)

(setq c 0 mas1 nil)

(while (= mas1 nil)

; Выдача запроса о типоразмере в командную строку

(princ "\n") (princ text)(princ "<") (princ a) (princ ">:")

(setq param (getint))

; Присваивание типоразмера по умолчанию

(if (= param nil) (setq param a))

; Поиск в х строки, у которой позиция с содержит

; значение param и запись её в mas1

(foreach n x (if (= (nth c n) param) (setq mas1 n)))

; Проверка найденных параметров

(if (= mas1 nil) (princ "Неверное значение"))

) )

Очевидно, универсальная функция mas может быть использована не только с рассмотренной выше функцией trap, но и с другими аналогичными параметрическими функциями.

Параметрическая функция orth для вычерчивания прямоугольников может быть создана аналогично. Текст её приведен в Приложении.