Геометрические преобразования 3D модели на VLISP и DCL (Geometrical transformations of 3D models on VLISP and DCL))

Автор: | 05.02.2018

Постановка задачи
Алгоритм решения задачи
Интерфейс и возможности программы
Файлы приложения

Постановка задачи

Разработать программу моделирования любого из изображений антенны (см. рис.) по её параметрам формы и положения (см. табл.).

Алгоритм решения задачи

Для решения задачи рекомендуется использовать  три системы координат (СК) – мировая, Монжа и антенны. Проецирование изображений может осуществляться относительно любой из них (команда VPOINT).

В системе координат антенны XAYA ZA создается модель антенны (рис.) из поверхностей. Нижняя часть антенны определяется с помощью команды LINE. Предварительно определяются соответствующие уровень (Elevation) и толщина (Thickness) линии вдоль оси Z. Верхняя часть антенны (створ рупора) определяется командой 3DFACE.

Системы координат определяются в AutoCAD командой UCS в следующей последовательности. Относительно мировой системы координат XW YW ZW определяется СК Монжа XM YM ZM

Относительно СК Монжа определяется СК антенны XAYA ZA в следующей последовательности:

    • Перемещение СК на параметр p
    • Определение нового направления осей координат
    • Вращение СК на угол alpha
    • Вращение СК на угол beta
    • Вращение СК на угол gamma
    • Перемещение СК на параметр h

 

Интерфейс и возможности программы

Программа запускается командой RUPOR (предварительно загружается файл Rupor.lsp). Диалоговое окно, которое появляется при запуске программы, представлено на рисунке.

Оно позволяет:

    • модифицировать параметры антенны в подокнах редактирования;
    • настраивать масштаб изображения при помощи слайдера и подокна, которое демонстрирует изменение размеров рупора;
    • определять вид антенны, изменяя ориентацию осей текущей системы координат с помощью “компаса”;
    • делать текущей систему координат антенны, или систему координат Монжа;
    • осуществлять запись вариантов параметров антенны в файлы (Var_1.txt и Var_2.txt) и считывание параметров из этих файлов. При выборе кнопки «Запись» (см. основное диалоговое окно) вызывается другое диалоговое окно.

Файлы приложения

Загрузочный файл (Rupor.lsp) и директории с другими файлами программы (Dcl, Lsp, Sld, Txt) размещены в папке Rupor:

В директориях размещены:

  • в директории Dcl — файлы описания диалоговых окон на языке DCL (файлы R.dcl и V.dcl);
  • в директории Lsp – исходные файлы программы (файлы Ant.lsp, Dialog.lsp, read.lsp и write.lsp). В файле Ant.lsp, определяется положение системы координат Монжа и системы координат антенны, а также определяется форма антенны.  Файл Dialog.lsp управляет основным и дополнительным диалоговыми окнами. Файл Write.lsp создаёт текстовый файл (Var_1.txt, Var_2.txt, …) и записывает в него значения параметров из элементов Edit Boxes  диалогового окна. Файл Read.lsp считывает значения параметров из текстового файла в элементы Edit Boxes диалогового окна;
  • в директории Sld – слайды (файлы Frm.sld и Psn.sld) изображений, которые появляются в диалоговом окне. Слайды Frm.sld и Psn.sld  можно выполнить самостоятельно на основе AutoCAD изображений (команда MSLIDE);

в директории Txt – текстовые файлы (Var_1.txt, Var_2.txt, …), куда записываются (и откуда считываются) варианты параметров антенны.

 Rupor.LSP

;**********************************************************************
; Rupor.LSP 
; By Svirnevskiy Khmelnitsky, 2016
; Программа создаёт изображение антенны по параметрам формы и положения
;**********************************************************************
; Команда RUPOR вызывает функции, которые определены в других файлах
(defun C:RUPOR()
 (load "E:/tmp/Rupor/Lsp/ant.lsp")
 (load "E:/tmp/Rupor/Lsp/dialog")
 (load "E:/tmp/Rupor/Lsp/read")
 (load "E:/tmp/Rupor/Lsp/write") 
 (command "Erase" "all" "") ; удаляются все примитивы
 (command "Osnap" "None") 
 (if (= pnkt nil) (setq pnkt 0 pnkt1 0)) ; pnkt - № варианта пар-ов
 (prm) ; см. определение функции в файле read.lsp
 (dlg_w1) ; см. определение функции в файле dialog.lsp
 ; повторный диалог в случае выбора другого варианта параметров
 (while (/= pnkt pnkt1)
 (prm) 
 (dlg_w1) 
 (setq pnkt1 pnkt)
 )
 ; повторный диалог в случае изменения ориентации осей
 (while (= Vp 1) ; Vp=1 в случае активизации кнопки "Ориент.осей"
 (command "Vpoint" "" pause ) ; вызывается компас
 (setq Vs (getvar "VIEWDIR")) ;VIEWDIR содержит точку взгляда
 (setq Vp 0)
 ( dlg_w1) ; управление диалог. окном
 )
 (if (= n 1) ; n=1 в случае активизации кнопки "OK"
 (progn (csmon) (csant) (rup) (vis_rup))
 ) ; см. определение функций в файле ant.lsp
)

R.dcl

r: dialog {
 label= "Рупорная антенна";
 :row {
 : boxed_column {
 label="Введите параметры формы";
 : image {
 color = -16; //цв. фона гр. экрана
 width = 10;
 aspect_ratio = 2.0;
 key = "form";
 }
 : edit_box {
 edit_width = 10;
 label = "L:";
 width = 9;
 key = "L_value";
 allow_accept = true;
 }
 : edit_box {
 edit_width = 10;
 label = "F:";
 width = 9;
 key = "F_value";
 }
 : edit_box {
 edit_width = 10;
 label = "A:";
 width = 9;
 key = "A_value";
 }
 : edit_box {
 edit_width = 10;
 label = "a:";
 width = 9;
 key = "a1_value";
 }
 : edit_box {
 edit_width = 10;
 label = "B:";
 width = 9;
 key = "B_value";
 }
 : edit_box {
 edit_width = 10;
 label = "b:";
 width = 9;
 key = "b1_value";
 }
 }
: boxed_column {
 label="Введите параметры положения";
 : image {
 color = -16;
 width = 10;
 aspect_ratio = 2.0;
 key = "pos";
 }
 : edit_box {
 edit_width = 10;
 label = "p:";
 width = 9; 
 key = "p_value";
 }
 : edit_box {
 edit_width = 10;
 label = "h:";
 width = 9;
 key = "h_value";
 } 
 : edit_box {
 edit_width = 10;
 label = "Угол alfa:";
 width = 9;
 key = "alfa";
 }
 : edit_box {
 edit_width = 10;
 label = "Угол beta:";
 width = 9;
 key = "beta";
 }
 : edit_box {
 edit_width = 10;
 label = "Угол gama:";
 width = 9;
 key = "gama";
 }
 : row {
 : button {
 label = "Ориентация осей";
 key = "Vpnt";
 fixed_width = true;
 alignment = centered;
 }
 : toggle {
 label = "ANT";
 key = "CS"; 
 }
 }
 } 
 }
 :row {
: boxed_row {
 label = "Увеличение изображения";
 mnemonic = "r";
 spacer_0;
 : column {
 spacer_0;
 fixed_width = true;
 : text {
 label = "Min Max";
 alignment = centered;
 }
 : slider {
 key = "aperture_slider";
 min_value = 7;
 max_value = 19;
 width = 20;
 height = 1;
 small_increment = 1;
 big_increment = 1;
 fixed_width = true;
 fixed_height = true;
 }
 spacer_0;
 }
 : image {
 key = "aperture_image";
 aspect_ratio = 1;
 height = 4;
 width = 10;
 color = -2;
 }
 spacer_0; 
}
 : boxed_column {
 label="Варианты";
 : row {  
 : popup_list {
 width = 10;
 list = "Var_0 \nVar_1 \nVar_2";
 key = "var_z";
 }
 } 
 : button {
 label = "Запись";
 key = "zap";
 fixed_width = true;
 alignment = centered;
 }
 } 
 ok_cancel; 
 }
}

V.dcl

v : dialog
{
label= "Запись варианта";
 : boxed_column {
 label="Введите имя ";
 : edit_box {
 label = "Файл:";
 edit_width = 10;
 width = 9;
 key = "zap_var";
 alignment = centered;
 }
 } 
ok_cancel;
}

Ant.lsp

;Функция CSMON определяет и формирует систему координат MON
(defun csmon() 
 (graphscr)
 (setvar "worldview" 1)
 ; установка начальных параметров чертежа
 (command "ucs" "d" "mon")
 (command "limits" "0,0" "420,300")
 (command "limits" "off")
 (command "vpoint" "-1,-4,1")
 (command "zoom" "a")
 ; определение системы координат
 (command "ucs" "w")
 (command "ucs" "3" "420,300,0" "@-1,0,0" "@0,-1,0")
 (command "ucs" "s" "mon")
 ; рисование осей координат
 (command "color" "green")
 (command "line" "0,0,0" "300,0,0" "")
 (command "line" "0,0,0" "0,200,0" "")
 (command "line" "0,0,0" "0,0,100" "")
 (command "line" "290,5,5" "300,0,0" "290,-5,-5" "")
 (command "line" "5,190,5" "0,200,0" "-5,190,-5" "")
 (command "line" "5,5,90" "0,0,100" "-5,-5,90" "")
)
;Функция CSANT определяет и формирует систему координат ANT
(defun csant() 
 (command "ucs" "d" "ant") 
 (command "redraw")
 ; определение системы координат
 (command "ucs" "r" "mon")
 (command "ucs" "o" (list 0 0 p))
 (command "ucs" "3" "0,0,0" "0,-1,0" "0,0,-1")
 (command "ucs" "y" (- al))
 (command "ucs" "x" (+ bet))
 (command "ucs" "z" (- gam))
 (command "ucs" "o" (list 0 0 h))
 (command "ucs" "s" "ant")
 ; рисование осей координат
 (command "color" "red")
 (command "line" "0,0,0" "40,0,0" "")
 (command "line" "0,0,0" "0,25,0" "")
 (command "line" "0,0,0" "0,0,15" "")
 (command "line" "35,3,3" "40,0,0" "35,-3,-3" "")
 (command "line" "3,20,3" "0,25,0" "-3,20,-3" "")
 (command "line" "3,3,10" "0,0,15" "-3,-3,10" "")
 (command "redraw")
)
; Функция RUP определяет форму антенны в системе координат ANT
(defun rup() 
 (command "redraw")
 (command "ucs" "r" "ant")
 (setq x (* f (- 1 (/ a1 a)))) ; X=f*(1-a1/a)
 (command "elev" (- l) (- l x))
 (setq a (/ a 2))
 (setq b (/ b 2))
 (setq a1 (/ a1 2))
 (setq b1 (/ b1 2))
 (command "color" "blue")
 (command "line" (list a1 b1) (list a1 (- b1)) (list (- a1) (- b1))
 (list (- a1) b1) "C")
 (command "elev" "0" "0")
 (command "3dface" (list a1 b1 (- x)) (list a b 0)
 (list a (- b) 0) (list a1 (- b1) (- x)) 
 (list (- a1) (- b1) (- x)) (list (- a) (- b) 0)
 (list (- a) b 0) (list (- a1) b1 (- x)) 
 (list a1 b1 (- x)) (list a b 0) "")
 (command "line" (list 0 0 0) (list 0 0 (- h)) "")
)
; Функция VIS_RUP определяет вид антенны по установкам в диалог.окне
(defun vis_rup () 
 (command "redraw")
 (if (= csa 0) (command "ucs" "r" "mon") (command "ucs" "r" "ant"))
 (setvar "worldview" 0)
 (command "Vpoint" (setq Vs Vs))
 (command "ucs" "r" "ant")
 (command "zoom" "c" "0,0,0" (/ 2000 ap_size))
 (if (= csa 0) (command "ucs" "r" "mon") (command "ucs" "r" "ant"))
 (command "hide")
)

Dialog.lsp

;**********************************************************************
;Функция dlg_w1 управляет диалоговым окном, описанным в файле r.dcl
(defun dlg_w1 () 
 (setq dcl_id (load_dialog "E:/tmp/Rupor/DCL/r")) ;загрузить DCL-файл
 (if (not (new_dialog "r" dcl_id)) (exit)) ;инициализировать диалог 
 ;вызов слайдов-изображений в подокнах
 (start_image "form")
 (mode_tile "form" 4)
 (setq x (dimx_tile "form")) ;Слайд
 (setq y (dimy_tile "form")) ; "форма
 (slide_image 0 0 x y "E:/tmp/Rupor/SLD/frm") ; антенны"
 (end_image) 
 (start_image "pos")
 (mode_tile "pos" 4)
 (setq x (dimx_tile "pos")) ; Слайд
 (setq y (dimy_tile "pos")) ; "Положение
 (slide_image 0 0 x y "E:/tmp/Rupor/SLD/psn") ; антенны"
 (end_image)
 
 ;Установка начальных числовых значений параметров в подокнах
 (set_tile "var_z" (itoa pnkt))
 (set_tile "L_value" (rtos l 2 1)) 
 (set_tile "F_value" (rtos f 2 1))
 (set_tile "A_value" (rtos a 2 1))
 (set_tile "a1_value"(rtos a1 2 1))
 (set_tile "B_value" (rtos b 2 1))
 (set_tile "b1_value"(rtos b1 2 1)) 
 (set_tile "p_value" (rtos p 2 1))
 (set_tile "h_value" (rtos h 2 1))
 (set_tile "alfa" (rtos al 2 1))
 (set_tile "beta" (rtos bet 2 1))
 (set_tile "gama" (rtos gam 2 1))
 ;Назначение действия (присвоение значения параметра)
 ; при выборе подокон для ввода параметров
 (action_tile "var_z" "(setq pnkt (atoi $value))")
 (action_tile "L_value" "(setq l (atof $value))")
 (action_tile "F_value" "(setq f (atof $value))") 
 (action_tile "A_value" "(setq a (atof $value))") 
 (action_tile "a1_value" "(setq a1 (atof $value))")
 (action_tile "B_value" "(setq b (atof $value))")
 (action_tile "b1_value" "(setq b1 (atof $value))")
 (action_tile "p_value" "(setq p (atof $value))")
 (action_tile "h_value" "(setq h (atof $value))") 
 (action_tile "alfa" "(setq al (atof $value))") 
 (action_tile "beta" "(setq bet (atof $value))")
 (action_tile "gama" "(setq gam (atof $value))")
 ; Управление кнопкой переключателя ANT
 (if (= CSA nil) (setq CSA 0)) ; CSA=0 при текущей сист.коорд. ANT
 (set_tile "CS" (itoa CSA)) ; CSA=1 при текущей сист.коорд. MON
 (action_tile "CS" "(setq CSA (atoi $value))") 
 ; Управление скользящей шкалой,
 ; которая регулирует увеличение изображения
 (action_tile "aperture_slider"
 "(draw_size (setq ap_size (atoi $value)))" 
 ) ; см. ниже определение функции draw_size
 (setq ap_size 7)
 (setq x_aperture (dimx_tile "aperture_image"))
 (setq y_aperture (dimy_tile "aperture_image"))
 (set_tile "aperture_slider" (itoa ap_size)) 
 (draw_size ap_size) ; см. ниже определение функции draw_size
 ; Управление подокном выбора и записи вариантов
 (action_tile "zap" "(dlg_w2) (zp_prm)" ) ; см. ниже определение функций
 (action_tile "Vpnt" "(Setq vp 1) (Done_dialog) (unload_dialog dcl_id)")
 ; Управляющие функции кнопок "OK" и "Отмена" 
 (action_tile "accept" "(Setq n 1) (Done_dialog) (unload_dialog dcl_id)")
 (action_tile "cancel" "(Setq n 0) (Done_dialog) (unload_dialog dcl_id)")
 
 (start_dialog) ; начать диалог(выполняются все описанные ранее функции)
)
;Функция draw_size определяет форму и размеры рупора
; (рядом со скользящей шкалой)
(defun draw_size (intsize)
 (setq x1 (- (/ x_aperture 2) (1+ intsize) ))
 (setq x2 (+ (/ x_aperture 2) (1+ intsize) ))
 (setq y1 (- (/ y_aperture 2) (1+ intsize) ))
 (setq y2 (+ (/ y_aperture 2) (1+ intsize) )) 
 (setq xr1 (+ x1 (/ (- x2 x1) 3)))
 (setq xr2 (+ xr1 (/ (- x2 x1) 3)))
 (setq yr (+ y1 (/ (- y2 y1) 2))) 
 (start_image "aperture_image")
 (fill_image 0 0 x_aperture y_aperture -2) 
 (vector_image x1 y1 x2 y1 -1)
 (vector_image x2 y1 xr2 yr -1)
 (vector_image xr2 yr xr2 y2 -1)
 (vector_image xr2 y2 xr1 y2 -1)
 (vector_image xr1 y2 xr1 yr -1)
 (vector_image xr1 yr x1 y1 -1) 
 (end_image)
)
;Функция dlg_w2 управляет диалоговым окном,
; описанным в файле V.dcl
(defun dlg_w2 ()
 (setq dcl_id2 (load_dialog "E:/tmp/Rupor/DCL/v")) ;загрузить DCL-файл 
 (if (not (new_dialog "v" dcl_id2)) (exit)) ;инициал-ть диалог 
 (if (= sp nil) (setq sp 0 nvr "Var_1"))
 (set_tile "zap_var" nvr)
 (action_tile "zap_var" "(setq nvr $value)")
 (action_tile "accept" "(Setq zp 1)(Done_dialog) (unload_dialog dcl_id2)") 
 (action_tile "cancel" "(Setq zp 0)(Done_dialog) (unload_dialog dcl_id2)")
 (start_dialog) ; начать диалог
)

read.lsp

;**********************************************************************
; Функция prm устанавливает один из вариантов параметров антенны
(defun prm ()
 (if (= pnkt 0) ; pnkt - № варианта
 (setq l 90.0 f 75.0 a 60.0 b 40.0 a1 30.0 b1 15.0
 p 35.0 h 150.0 al 30.0 bet 30.0 gam 30.0)
 (progn ;формируется имя файла для считывания параметров
(setq name_f (strcat "E:/tmp/Rupor/txt/var_" (itoa pnkt) ".txt"))
 (rf name_f) ; см. ниже определение функции
 )
 ) 
)
; Функция rf считывает параметры из файла
(defun rf (name_f) ; Пример файла данных
 (setq ff (open name_f "r")) 
 (read-line ff) ; Параметры формы
 (setq l (atof (read-line ff))) ; 60
 (setq f (atof (read-line ff))) ; 50
 (setq a (atof (read-line ff))) ; 40
 (setq b (atof (read-line ff))) ; 20
 (setq a1 (atof (read-line ff))) ; 20
 (setq b1 (atof (read-line ff))) ; 10
 (read-line ff) ; Параметры положения
 (setq p (atof (read-line ff))) ; 45
 (setq h (atof (read-line ff))) ; 120
 (setq al (atof (read-line ff))) ; 30
 (setq bet (atof (read-line ff))) ; 75
 (setq gam (atof (read-line ff))) ; 45
 (close ff)
)

write.lsp

; Функции zp_prm и zf обеспечивают запись параметров в файл
(defun zp_prm ()
 (if (= zp 1) (progn ;формируется имя файла для записи параметров
 (setq name_fz (strcat "E:/tmp/Rupor/txt/" nvr ".txt"))
 (zf name_fz) ; см. ниже определение функции
 )
 ) 
)
(defun zf (name_fz) ; Пример записи в файл данных:
 (setq fz (open name_fz "w")) 
 (write-line "Параметры формы" fz) ; Параметры формы
 (write-line (rtos l 2 1) fz) ; 60
 (write-line (rtos f 2 1) fz) ; 50
 (write-line (rtos a 2 1) fz) ; 40
 (write-line (rtos b 2 1) fz) ; 20
 (write-line (rtos a1 2 1) fz) ; 20
 (write-line (rtos b1 2 1) fz) ; 10
 (write-line "Параметры положения" fz) ; Параметры положения
 (write-line (rtos p 2 1) fz) ; 45
 (write-line (rtos h 2 1) fz) ; 120
 (write-line (rtos al 2 1) fz) ; 30
 (write-line (rtos bet 2 1) fz) ; 75
 (write-line (rtos gam 2 1) fz) ; 45
 (close fz)
)

Var_1.txt

Параметры формы
90
75
60
40
30
15
Параметры положения
35
150
30
30
30

Var_2.txt

Параметры формы
90
75
60
40
30
15
Параметры положения
35
150
30
30
30

 

Автор: Николай Свирневский