Разработка программы – генератора параметрических моделей и чертежей, страница 3

(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, т.е. обе координаты точки оказались в пределах диапазона допустимых значений, тело цикла не выполняется и от пользователя не требуется повторного задания точки.

  1. Расчет параметров модели и чертежа на основе данных, полученных от пользователя:
  2. Построение 3D твердотельной модели.
  3. Подготовка шаблона чертежа.

Пример программы создания и проецирования купола.

Листинг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)