(while <условие> <выражение 1> [<выражение 2> …[<выражение N>]…])
В листинге 1.2 условие имеет следующий вид
(not (and (< Xmin (car p1)) (> Xmax (car p1)) (< Ymin (cadr p1)) (> Ymax (cadr p1))))
Здесь функции car и cadr извлекают координаты точки p1. Функции сравнения < и > сравнивают значения координат с границами диапазона, например, (< Ymin (cadr p1)) проверяет превышает ли значение ординаты точки p1 нижнюю границу Ymin диапазона допустимых значений. Функции сравнения возвращают логические значения T или nil.
Функция and определяет есть ли выход текущих значений координат за какую-либо из границ диапазона, т.е. есть ли хотя бы одно значение nil, возвращенное какой-либо из функций сравнения. Если есть выход за границы диапазона, то функция and возвращает значение nil, которое инвертируется в T с помощью функции not. В этом случае, когда условие равно T, происходит переход к выполнению тела цикла, позволяющего пользователю повторно ввести значения. Запрос повторного ввода будет продолжатся до тех пор, пока пользователь не задаст точку находящуюся в пределах указанного диапазона.
Если при вычислении условия было получено значение nil, т.е. обе координаты точки оказались в пределах диапазона допустимых значений, тело цикла не выполняется и от пользователя не требуется повторного задания точки.
Пример программы создания и проецирования купола.
Листинг2.1 Основной файл проекта (*.LSP).
(defun torad (degree)
(* pi (/ degree 180.0))
)
(defun profile ()
(command "-osnap" "none") ;turning off object snap mode to avoid changes of input coordinates
(command "_arc" "0,0" "c" (setq p0 (list (- 0 rad) 0)) "a" (- 0 ang)) ; top arc creation
(command "_arc" "c" (setq p1 (polar p0 (- 0 (torad ang)) (* 2 rad)))
(setq p3 (polar p1 pi rad)) "a" (- 0 ang)) ; middle arc creation
(command "_arc" "c" (list 0 (cadr p1)) p3 "a" 90)
; bottom arc creation r1=2r(1-cos(ang))
(command "_mirror" "all" "" "0,0" "0,-1" "") ; mirror part creation
(command "_region" "all" "") ; conversion of contour to region
(command "_zoom" "e") ;zooming to extents
)
(defun write_script ()
(setq fscr (open "Z:\projection.scr" "w"))
(write-line "_PSPACE" fscr) ;switching to paper space
(write-line "_SOLVIEW" fscr) ;calling of SOLid VIEW command
;to start projection procedure
(write-line "_u" fscr) ;type of projection: main view
(write-line "" fscr) ;current UCS will be used for main view
(write-line "0.5" fscr) ;view scale
(write-line "120,240" fscr) ; view center in the paper space
(write-line "" fscr) ; view center OK
(write-line "90,280" fscr) ; the first corner of viewport
(write-line "150,200" fscr) ; the second corner of viewport
(write-line "main" fscr) ; name of the first view
(write-line "_o" fscr) ;type of projection: orthogonal view
(write-line "120,280" fscr) ; to select a side to project
; (on the frame of previous viewport)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.