npo_naprav: dialog {label = "Настройка данных направляющих";
:edit_box {label = "Ширина направляющей"; key = "kWid"; value = "40"; edit_width = 6;}
:edit_box {label = "Длина секции направляющей"; key = "kLen"; value = "600"; edit_width = 6;}
:edit_box {label = "Расстояние между направляющими"; key = "kDist"; value = "180"; edit_width = 6;}
:spacer {height = l;}
:edit_box {label = "Количество секций в каждой направляющей"; key = "kNumsection";
value = "6"; edit_width = 6;}
:edit_box {label = "Шаг расположения дросселей в секции направляющей"; key = "kStep";
value = "50"; edit_width = 6;}
:spacer {height = l;}
:radio_row {label = "Дроссели располагаются в секции направляющей";
:radio_button {label = "в один ряд"; key = "kOnerow"; value = "l";}
:radio_button {label = "в два ряда"; key = "kTworow"; value = "0"; }
}
:spacer {height = l;}
ok_cancel;
}
(DEFUN show_naprav (/ dcl_id)
(IF (< (SETQ dcl_id (LOAD_DIALOG "//Server/учебная/БМЕ 11-01/для 6 лабыПГПИО/Example_D1.dcl")) 0) (EXIT))
(IF (NOT (NEW_DIALOG "npo_naprav" dcl_id)) (EXIT))
(START_DIALOG)
(UNLOAD_DIALOG dcl_id)
(PRINC)
)
ser:dialog {label = "Ввод фамилии пользователя";
:column{
:edit_box {label = "Фамилия"; edit_width = 40; alignment = centered;
value = ""; key = "usfam";
}// конец edit_box
:spacer {height = 1;}
:text {label = "Bы6op из списков подразделений";alignment = centered;}
:row {
:text {label = "Подразделение 001"; key = "s1";}
:popup_list {key = "p1"; is_enabled = true; label = ""; list = ""; width = 20;}
} // конец row
:row {
:text {label = "Подразделение 002"; key = "s2";}
:popup_list {key ="p2"; is_enabled = true; label = ""; list = ""; width = 20;}
} // конец row
:row {
:text {label = "Подразделение 003"; key = "s3";}
:popup_list {key = "p3"; is_enabled = true; label = ""; list = " "; width = 20;}
} // конец row
:row {
:text {label = "Подразделение 004"; key = "s4";}
:popup_list {key= "p4"; is_enabled = true; label = ""; list = ""; width = 20;}
}// конец row
:spacer {height = 1;}
ok_cancel;
}// конец column
defun usn (/ dcl_id fpolz i plist nlist spi str nsubd);Задание функции пользователя
;введенная фамилия заносится в глобальную переменную pv
(if (not pv) (setq pv ""));проверка пустого ввода
(if (< (setq dcl_id (load_dialog "//Server/учебная/Ручкин/Прикладные подсистемы САПР/Лабораторные работы ППС/Лаб_№6/Example_D2.dcl")) 0) (exit));загрузка диалога
(if (not (new_dialog "user" dcl_id)) (exit));начало диалога
(setq plist nil nlist nil i 0)
;Чтение файлов polz01.txt, polz02.txt, polz03.txt, polz04.txt
;количество подразделений - 4
(repeat 4
(setq spi nil)
(setq i (1+ i) fpolz (strcat "//Server/учебная/Ручкин/Прикладные подсистемы САПР/Лабораторные работы ППС/Лаб_№6/polz0" (itoa i) ".txt"));itoa переводит i из int в строку, strcat собирает строку
(if (findfile fpolz);поиск файла в доступных директориях
(progn
(setq fd (open (findfile fpolz) "r"));открываем файл для чтения
(setq str (read-line fd));чтение первой строки - названия подразделения
(setq nlist (append nlist (list str))); создание списка подразделений
(if str
(while (setq str (read-line fd));цикл чтения файла до конца
(setq spi (append spi
(list str)))
);while
);if str
(close fd);закрыли файл
(setq fd nil)
);prong
(setq nlist (append nlist (list nil)))
);if findfile
(setq plist (append plist (list spi)));формирование списка сотрудников
);repeat
;Заполнение списков диалогового окна
(setq i -1)
(repeat 4
(setq i (1+ i))
(if
(setq nsubd (nth i nlist))
(progn
;С помощью функции set_tile стандартные наименования подразделений
;меняются на элементы списка nlist
(set_tile (strcat "s" (itoa (1+ i))) nsubd)
(if (setq spi (nth i plist))
(progn
(start_list (strcat "p" (itoa (1+ i))))
(mapcar 'add_list spi)
(end_list)
) ;progn
);if
) ;progn
;гашение списка, если файл с фамилиями не найден,
;или число подразделенй меньше 4
(progn
(mode_tile (strcat "s" (itoa (1+ i))) 1)
(mode_tile (strcat "p" (itoa (1+ i))) 1)
);progn
);if
) ; repeat
;== Нужно добавить действия кнопок Инфо и Помощь
;;;косая черта для ввода кавычек ",т.е. (get_tile \"usfam\")
;;;вернет текущее имя пользователя,
;;;установленное в редактируемом поле (при выборе не из списка)
;;;или = пустой ввод => ДО: Фамилия не задана,
;;;иначе конец диалога => OK (код accept)
(action_tile "accept"
(strcat
"(if
(= (setq pv (get_tile \"usfam\"))
\"\")"
"(alert \"Фамилия не задана\")"
"(done_dialog))"
) ; strcat
); action-tile accept
(action_tile "cancel" "(done_dialog)")
;;;Переменная $value, используемая функцией action_tile
;;;для раскрывающегося списка popup_list принимает значения
;;;с номером выбранного пользователем элемента списка
(action_tile "p1" "(set_tile \"usfam\" (nth (atoi $value) (nth 0 plist)))")
(action_tile "p2" "(set_tile \"usfam\" (nth (atoi $value) (nth 1 plist)))")
(action_tile "p3" "(set_tile \"usfam\" (nth (atoi $value) (nth 2 plist)))")
(action_tile "p4" "(set_tile \"usfam\" (nth (atoi $value) (nth 3 plist)))")
(start_dialog)
(unload_dialog dcl_id)
(princ)
);defun usn
…………………………………………………………………………….
//Пример временного выхода из диалогового окна
texp:dialog {lаbеl = "Задание точки";
:text {label = "Введите координаты";}
:text {label = "или укажите точку на экране";}
:spacer {height=1;}
:row {
:column {
:edit_box {label = "X:"; value = "0"; key = "xp";}
:edit_box {label = "Y:"; value= "0"; key = "yp";}
:edit_box {label="Z:"; value="0"; key="zp";}
}//end of column
:button {label = "указать <"; key = "mousep"; height = 6;
fixed_width = true; action = "(done_dialog 3)";}
//Для достижения эффекта временного выхода из окна в атрибуте
//action кнопки с кодом mousep использована функция done_dialog
// с аргументом 3
}//end of row
:spacer {height = 1;}
ok_button;
}
;;;Пример программы управлением временным выходом
;;;из диалогового окна для задания координат точки
(defun text_point (/ dcl_id step pt)
(setq dcl_id (load_dialog "C:/LVR/MyDOCeducat/ПГП/Лекции ПГП/Диал_окна/Example_D3.dcl"))
(setq step 2)
(if (null pt) (setq pt (list 0.0 0.0 0.0)))
(while (>= step 2)
(if (null (new_dialog "texp" dcl_id)) (exit))
;rtos возвращает строку с числом,
;;где атрибуты: 2 - децимальные единицы, 2 - точность
(set_tile "xp" (rtos (car pt) 2 2))
(set_tile "yp" (rtos (cadr pt) 2 2))
(set_tile "zp" (rtos (caddr pt) 2 2))
(action_tile "accept"
(strcat
"(setq x (atof (get_tile \"xp\")))"
"(setq у (atof (get_tile \"yp\")))"
"(setq z (atof (get_tile \"zp\")))"
"(setq pt (list x у z))"
"(done_dialog 1)"
);strcat, atof возвращает число из строки "15"=>15
);action_tile
(setq step (start_dialog))
(cond
((= step 3) (setq pt (getpoint "\nУкажите точку: ")))
((= step 1)
(princ "\nТочка: (")
(princ (rtos x 2 2)) (princ " ")
(princ (rtos у 2 2)) (princ " ")
(princ (rtos z 2 2)) (princ ")")
);= step 1
);cond
);while
(unload_dialog dcl_id)
(princ)
)
dia1: dialog {label = "Диалоговое окно первого уровня";
:edit_box {label = "Ввод названия:"; key = "t1";}
:button {label = "Вызвать следующее окно"; key = "b1";}
ok_button;
}
dia2: dialog {label = "Диалоговое окно второго уровня";
:text {label = "Это вложенное окно"; key = "t2";}
:ok_button {label = "Вернуться";}
}
pass: dialog {label = "Диалоговое окно с паролем";
:edit_box {label = "Введите пароль:"; key= "e1"; password_char = "*";}
ok_button;
}
(defun show4 (/ dcl_id)
(if (< (setq dcl_id (load_dialog "C:/LVR/MyDOCeducat/ПГП/Лекции ПГП/Диал_окна/Example_D4.dcl")) 0) (exit))
(if (not (new_dialog "dia1" dcl_id)) (exit))
(action_tile "t1" "(setq mytxt $value)")
(action_tile "b1" "(opendia2 dcl_id)")
(start_dialog)
(unload_dialog dcl_id)
(princ)
); defun dia1
(defun opendia2 (dc /)
(if (not (new_dialog "dia2" dc)) (exit))
(start_dialog)
);defun dia2
Вывод:
Мы просмотрели файлы и отредактировали пути доступа к этим файлам: Example_D1, Example_D2, Example_D3, Example_D4, Example_D5, Show_D1, Show_D2, Show_D4, text_point.
Создали файлы: polz01, polz02, polz03, polz04.Благодаря этому изучили элементы языка DCL (Dialog Control Language).