Постановка задачи
Алгоритм решения задачи
Интерфейс и возможности программы
Файлы приложения
Постановка задачи
Разработать программу моделирования любого из изображений антенны (см. рис.) по её параметрам формы и положения (см. табл.).
Алгоритм решения задачи
Для решения задачи рекомендуется использовать три системы координат (СК) – мировая, Монжа и антенны. Проецирование изображений может осуществляться относительно любой из них (команда 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
Автор: Николай Свирневский