Функции для работы с графическими элементами — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Функции для работы с графическими элементами

2021-06-30 50
Функции для работы с графическими элементами 0.00 из 5.00 0 оценок
Заказать работу

Элементы image и image_button являются графическими полями с прямоугольной зоной. Зона может быть заполнена

· одним цветом;

· слайдом;

· отрезками разных цветов.

Открывает процесс заполнения функция start_image, а завершает процесс заполнения функция end_image. Междунимирасполагаютсяфункции fill_image, slide_image, vector_image. Не допускается применять функцию set_tile. При указании координат в графическом окне предполагается, что левый верхний угол графического элемента находится в начале координат. Координаты правого нижнего угла могут быть получены с помощью функций dimx_tile и dimy_tile.

Функция start_image

Функция start_image открывает процесс заполнения графического элемента. Синтаксис:

(start_image <код>)

Аргумент <код> - значение атрибута key графического элемента. Возвращаемое значение - строка со значением аргумента, если операция выполнена успешно. В случае сбоя возвращается nil.

Функция end_image

Функция end_image завершает процесс формирования изображения. Синтаксис:

(end_image)

Возвращаемое значение - nil.

Вызову функции end_image должен обязательно предшествовать вызов функции start_image.

Функция fill_image

Функция fill_image заполняет прямоугольник внутри графического элемента одним цветом. Синтаксис:

(fill_image <x1><y1><ширина><высота><цвет>)

Аргументы:

· <x1><y1> - координаты верхнего левого угла заполняемого прямоугольника;

· <ширина><высота> - размеры заполняемого прямоугольника;

· <цвет> - индекс цвета.

Возвращаемое значение - значение аргумента <цвет>.

Пример: (fill_image 5 6 15 25 1) - заполняет красным (1) цветом прямоугольник с левым верхним углом в точке (5,6) и нижним правым углом в точке (15,25).

Функция slide_image

Функция slide_image заполняет графический элемент слайдом из отдельного SLD -файла или из библиотеки слайдов. Синтаксис:

(slide_image <x1><y1><ширина><высота><слайд>)

Аргументы <x1><y1><ширина><высота> аналогичны таковым для функции fill_image. Аргумент <слайд> - строка с именем файла слайда (расширение. sld не указывается) или с именем библиотеки слайдов (имя слайда из библиотеки указывается в круглых скобках).

Возвращаемое значение - строка со значением аргумента <слайд>.

Примеры:

(slide_image 0 0 50 32 "ring1") - заполняет графический элемент размером 50х30 слайдом из файла ring1. sld.

(slide_image 0 0 50 32 "lib23(nut8)") - заполняет графический элемент размером 50х30 слайдом nut8 из библиотеки слайдов lib23.

Функция vector_image

Функция vector_image рисует отрезок заданного цвета внутри графического элемента диалогового окна. Синтаксис:

(vector_image <x1><y1><x2><y2><цвет>)

Аргументы:

· <x1>, <y1> - координаты (в пикселях) начала отрезка;

· <x2>, <y2> - координаты (в пикселях) конца отрезка;

· <цвет> - индекс цвета

Пример:

(vector_image 5 11 33 11 2) - рисует отрезок желтого цвета из точки (5,11) в точку (33, 11).

Функция dimx_tile

Функция dimx_tile вычисляет горизонтальный размер графического элемента с данным кодом (точнее, размер элемента минус 1). Синтаксис:

(dimх_tile <код>)

Аргумент <код> - строка с кодом графического элемента. Возвращаемое значение - целое число с номером крайнего правого пикселя элемента (левый крайний пиксель имеет номер ноль).

Пример:

(dimx_tile "igp2") - может вернуть 50 (всего по горизонтали 51 пиксель)

Функция dimy_tile

Функция dimy_tile вычисляет вертикальный размер графического элемента с данным кодом (точнее, размер элемента минус 1). Синтаксис:

(dimy_tile <код>)

Аргумент <код> - строка с кодом графического элемента. Возвращаемое значение - целое число с номером крайнего нижнего пикселя элемента (верхний крайний пиксель имеет номер ноль)

Пример: (dimy_tile "igp2") - может вернуть 32 (всего по вертикали будет 33 пикселя).

Упражнения с элементами диалоговых окон

Построение элементов

Установите элементы диалогового окна согласно следующей программе:

// Установки элементов диалогового окна//elements: dialog {label="Установка элементов диалогового окна";:column{:row{:boxed_column{label="Элементы управления";:row{:boxed_column{label="Поле и выпадающий список";:edit_box {label="Edit_box";key="txt";value="0.00";edit_width=8;}:popup_list {label="Popup_list";key="pop";width="8";list="Иванов\nПетров\nСидоров";}}:boxed_column{label="Кнопкаишкала";:button {label="Button";key="but";color="1";width="8";}:slider {label="Slider";}}}:spacer{height=1;}:radio_row {label="Рядпереключателей (radio_row)";:radio_button {label="Radio_button 1";value=1;}:radio_button {label="Radio_button 2";value=0;} } }  :boxed_row{:column{label="Списокифлажок";:list_box {label="List_box";key="list";list="Иванов\nПетров\nСидоров";height="8";}:toggle {label="Toggle";value=1;} } }}  :boxed_row{label="Стандартнаякнопказакрытияокна"; ok_cancel_help_info;}}}

Сохранитефайлкак Elements. dcl впапке Support.

Создайтефайлзагрузки:

(defun c:show_elements (/ num ddiag) (if (< (setq num (load_dialog "elements.dcl")) 0)(prong(alert "The Elements.dcl file could not be loaded!") (exit))) (if (not (new_dialog "elements" num)) (exit)) (start_dialog) (unload_dialog num);;;--- If the user pressed the Cancel button (if (= ddiag 1) (princ "\n Window cancelled!"));;;--- If the user pressed the Okay button (if (= ddiag 2) (progn (princ "\n The user pressed Okey!"))) (princ));_defun

Сохранитефайлзагрузкикак Elements. dcl.

Запустите функцию show_elements из командной строки AutoCAD. На экране должно появиться диалоговое окно (рис. 6.3).


Рис. 6.3. Элементы диалогового окна

Программа может различить в наших действиях лишь нажатие кнопок ОК и Cancel.

Текстовые поля Edit_Box

Измените описание диалогового окна в файле rog. dcl:

//Диалоговое окно установки параметров рогаrog: dialog{label="Установка параметров рога";:edit_box{label="Радиусокружности ";key="rad";value="80.00"; edit_width=8;}:edit_box{label="Диаметрдуги, мм";key="diam";value="400.00";edit_width=8;}:edit_box{label="Толщинастенки, мм";key="thick";value="1.00";edit_width=6;}:spacer{height=1;}:edit_box{label="Индексцвета";key="col";value="2";edit_width=4;}:spacer{height=1;} ok_cancel;}

А теперь вернитесь к файлу rog. lsp. В функции qrog отклики на события в диалоговом окне описывались с помощью функции action_tile. Значения переменных сохранялись для каждого отдельного элемента. Опробуйте другой способ сохранения указанных данных - по нажатии кнопки ОК. В этом случае можно оставить значения величин по умолчанию, либо отредактировать их в текстовых полях диалогового окна.

Создайте в этом же файле новую функцию save_vars, которая будет вызываться после нажатия кнопки ОК. Содержимое текстовых полей прочитает функция get_tile.

Следует учесть, что в данном случае переменные rad1, diam1, thick1, col1 должны быть общими для функций qrog и save_vars, т.е. глобальными.

(defun save_vars () (setq rad1 (atof (get_tile "rad"))) (setq diam1 (atof (get_tile "diam"))) (setq thick1 (atof (get_tile "thick"))) (setq col1 (get_tile "col")))

Программа построения рога будет выглядеть следующим образом:

(defun c:qrog (/ cenrt1 circle1 arc1 rog1 angle1 endp1 dial)(setq centr1 '(0 0 0));                                исходная базовая точка (if (< (setq num (load_dialog "rog.dcl")) 0);         загружаем в память файл "rog.dcl"(progn (alert "Файл Rog.dcl не загружен!");                  сообщение о неудачной загрузке(exit))) (if (not (new_dialog "rog" num));;;;;функция new_dialog проверяет наличие в файле диалога "rog" (progn (alert "Диалог Rog не найден!");              сообщение о неудачном поиске файла(exit)));;;If an action event occurs, do this function (action_tile "accept" "(setq dial 2)(save_vars)(done_dialog)"); действияпринажатииОК(action_tile "cancel" "(setq dial 1)(done_dialog)"); действияпринажатии CANCEL (start_dialog);                                       активизируетдиалоговоеокно (unload_dialog num);                          выгружаемокноизпамяти (setq angle1 (* 55.0 (atan rad1 (* diam1 (/ pi 2))))); находимуголсужениятеларога(command "_view" "_top");               начинаем со стандартного вида (command "_view" "_swiso");            переходим к северо-западному виду (command "_circle" centr1 rad1 "");    строим базовую окружность (setq circle1 (entlast));              извлекаем имя сущности для базовой окружности (command "_ucs" "_x" "90" ""); поворачиваем ПСК (setq endp1 (list diam1 0.0));         находим координаты конечной точки дуги(command "_arc" centr1 "e" endp1 "a" "-180" ""); строимдугуизгибарога(setq arc1 (entlast));           извлекаем имя сущности для дуги и сохраняем его (command "_ucs" "_x" "-90");   совмещаем плоскость окружности с плоскостью XY (command "extrude" circle1 "" "t" angle1 "p" arc1 "");создаемтелорога(setq rog1 (entlast));           извлекаем имя сущности для рога и сохраняем его (command "_zoom" "e" "");    растягиваем изображение на весь экран (command "_vscurrent" "_r" ""); устанавливаем текущий визуальный стиль realistic(command "_chprop" "_all" "" "_color" col1 ""); закрашиваемцветом col1 (command "_view" "_bottom" ""); устанавливаемвидснизу (command "_solidedit" "_body" "_shell" rog1 centr1 "" thick1 "" ""); делаемполость(command "_erase" arc1 "");      удаляем ненужную образующую дугу;;;If the user pressed the Okey Or Cancel button(if(= dial 2)(alert "Congratulations!"));     поздравление при успешном построении(if(= dial 1)(alert "Alas!"));                        увы! - при неудачном построении (princ);                       тихий выход)

В качестве варианта введите операции сохранения значений переменных в функцию qrog. Сделайте все переменные локальными. Функция save_vars тогда не нужна.

Рассмотрим теперь более подробно работу с отдельными элементами диалоговых окон: с кнопками, со списками, с флажками и с радиокнопками.

Кнопки Button

Создадим DCL -файл описания диалогового окна с тремя кнопками Button и одной кнопкой Cancel. Каждая из трех кнопок должна выдать послание при нажатии.

Расположите кнопки в колонку друг под другом в две группы:

But:dialog {label="Работа с кнопками Button";:column{:boxed_column {  :button {key="but1";label="Button1";is_default="false";}  :button {key="but2";label="Button2";is_default="false";}  :button {key="but3";label="Button3";is_default="false";}                          }:boxed_row{ok_cancel; }   }}

Сохранитефайлкак But. dcl впапке …\Support.

А теперь составьте файл But. lsp для загрузки dcl -файла и описания сценария отклика на события в диалоговом окне. Он будет состоять из двух функций:

(defun C:But1();;;--- Load the dcl file(setq dcl_id (load_dialog "But.dcl"));;;--- Load the dialog definition if it is not already loaded(if (not (new_dialog "But" dcl_id)) (progn (alert "The But.dcl file could not be loaded!")(exit)));;;--- If an action event occurs, do this function(action_tile "but1" "(doButton 1)")(action_tile "but2" "(doButton 2)")(action_tile "but3" "(doButton 3)")(action_tile "cancel" "(done_dialog)");;;--- Display the dialog box (start_dialog);;;--- Unload the dialog box(unload_dialog dcl_id);;;--- Suppress the last echo for a clean exit(princ)) (defun doButton(a) (cond ((= a 1)(alert "Button 1 was pressed!")) ((= a 2)(alert "Button 2 was pressed!")) ((= a 3)(alert "Button 3 was pressed!"))))

На экране должна быть картинка, подобная рис. 6.4.


Рис. 6.4. Диалоговое окно с кнопками

Работа со списками list_box

Составьте файл List. dcl с описанием диалогового окна с двумя списками в верхнем ряду и кнопкой ОК и Cancel в нижнем ряду. Сохраните его в папке …\Support.

list: dialog {label = "Работа со списками list_box";: column {: boxed_row {: text { key = "text1"; value = "Nothing selected"; }}: boxed_row {: list_box {key = "mylist1"; label ="Choose Item"; height = 9; width = 8; multiple_select = false; fixed_width_font = true;list="Лимон\nЛист\nНебо\nСажа\nСнег\nЯблоко";}: boxed_row {: popup_list { key = "mylist2"; label ="Choose Color"; width = 8; multiple_select = false;fixed_width_font = true; list="red\nyellow\ngreen\ncyan\nwhite\nblack";}}}: boxed_row {: button { key = "accept"; label = "Okey "; is_default = true; }: button { key = "cancel";label = "Cancel "; is_default = false; is_cancel = true; }}} }

Заполнение спискoв здесь произведено с помощью атрибута list. Однако, если бы мы написали атрибуты value = "";, то списки были бы пустыми. В этом случае они заполняются при запуске файла List. lsp так, как это показано ниже.

Составьте теперь загрузочный файл List. lsp. Строки, относящиеся к загрузке списков, закомментированы. Если списки уже заполнены, то эти строки можно удалить. Если их раскомментировать, то старое содержимое в списках будет удалено, а новые записи установлены.

(defun C:list ();;; (setq myList1(list "Лимон" "Лист" "Небо" " Сажа" "Снег" "Яблоко"));;; (setq myList2(list "red" "yellow" "green" "cyan" "white" "black"));;;--- Load the dcl file (setq dcl_id (load_dialog "list.dcl"));;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "list" dcl_id)) (progn (alert "The List.DCL file could not be loaded!") (exit)));;; (start_list "mylist1" 3);;; (mapcar 'add_list myList1);;; (end_list);;; (start_list "mylist2" 3);;; (mapcar 'add_list myList2);;; (end_list);;;--- If an action event occurs, do this function(action_tile "mylist2" "(saveVars)") (action_tile "accept" "(setq ddiag 2)(done_dialog)") (action_tile "cancel" "(setq ddiag 1)(done_dialog)");;;--- Display the dialog box (start_dialog);;;--- Unload the dialog box (unload_dialog dcl_id);;;--- If the user pressed the Cancel button (if(= ddiag 1) (princ "\n List cancelled!"));;;--- If the user pressed the Okay button (if(= ddiag 2) (progn (princ "\n The user pressed Okay!")))(princ))(defun saveVars ()(setq numstrlist (atoi (get_tile "mylist1"))) (princ numstrlist) (setq word_list (cond          ((= numstrlist 0) "Лимон")          ((= numstrlist 1) "Лист")          ((= numstrlist 2) "Небо")          ((= numstrlist 3) "Сажа")          ((= numstrlist 4) "Снег")          ((= numstrlist 5) "Яблоко")          (Т "")         );_конец cond);_ конец setq (setq numstrpop (atoi (get_tile "mylist2"))) (princ numstrpop) (setq word_pop (cond            ((= numstrpop 0) "red")            ((= numstrpop 1) "yellow")            ((= numstrpop 2) "green")            ((= numstrpop 3) "cyan")            ((= numstrpop 4) "white")            ((= numstrpop 5) "black")            (Т "")         );_конец cond);_ конец setq (setq myStr (strcat word_list " имеетцвет " word_pop)) (set_tile "text1" myStr))

В этот же файл занесена функция saveVars, которая определяет отклики на события диалогового окна. Событие состоит в выборе слова в левом списке и слова в правом списке. Оба выбранных слова занесем в строку text по щелчку в правом списке. Если щелкнуть по кнопке ОК, то окно закроется.

При чтении значения списка функция get_tile возвращает номер строки, которые нумеруются с нуля. Поэтому далее нужно в цикле или с помощью функции cond найти соответствие между номером строки и значением элемента.

Диалоговое окно списков показано на рис. 6.5. Выбранная запись отражена в нередактируемом текстовом поле text в верхней части окна.


Рис. 6.5. Окно с двумя списками

Работа с элементами toggle

Составьте программу построения диалогового окна с колонкой флажков. Сохраните файл как …\Support\ Toggle. dcl

Toggle: dialog { label = "Работа с элементами toggle";: column {: boxed_row {: text { key = "text1"; value = "Nothing selected"; }}: boxed_column { label = "Choose your lucky charms:";: toggle { key = "tog1";label = "Hearts"; value = "0";}: toggle { key = "tog2";label = "Moons"; value = "0";}: toggle { key = "tog3";label = "Stars"; value = "0";}: toggle { key = "tog4";label = "Clovers";value = "0";}}: boxed_row {: button { key = "accept"; label = "Okey "; is_default = true; }: button { key = "cancel";label = "Cancel "; is_default = false; is_cancel = true; }}}}

Теперь составьте файл загрузки и обработки Toggle. lsp. В этом файле создано две функции: chkToggle и Toggle:

(defun chkToggle() (setq tog1(atoi(get_tile "tog1"))) // 0 = not chosen 1 = chosen (setq tog2(atoi(get_tile "tog2"))) // 0 = not chosen 1 = chosen (setq tog3(atoi(get_tile "tog3"))) // 0 = not chosen 1 = chosen (setq tog4(atoi(get_tile "tog4"))) // 0 = not chosen 1 = chosen (setq myStr "") (if(= tog1 1)(setq myStr(strcat myStr " Hearts"))) (if(= tog2 1)(setq myStr(strcat myStr " Moons"))) (if(= tog3 1)(setq myStr(strcat myStr " Stars"))) (if(= tog4 1)(setq myStr(strcat myStr " Clovers")));;;--- If nothing was selected... (if(= myStr "")(setq myStr "Nothing Selected!"));;;--- Now set the text control to display the string (set_tile "text1" myStr)) (defun C:Toggle();;;--- Load the dcl file (setq dcl_id (load_dialog "Toggle.dcl"));;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "Toggle" dcl_id)) (exit));;;--- If an action event occurs, do this function  (action_tile "tog1" "(chkToggle)") (action_tile "tog2" "(chkToggle)") (action_tile "tog3" "(chkToggle)") (action_tile "tog4" "(chkToggle)") (action_tile "cancel" "(done_dialog)");;;--- Display the dialog box (start_dialog);;;--- Unload the dialog box (unload_dialog dcl_id);;;--- Suppress the last echo for a clean exit(princ))

Ha экране диалоговое окно выглядит так, как на рис. 6.6.


Рис. 6.6. Диалоговое окно с флажками

Переключатели Radio Buttons

Постройте диалоговое окно с четырьмя переключателями. Из всей группы только один из переключателей может быть выделен. Он должен быть определен при нажатии кнопки ОК.

Составьте DCL -файл для колонки из четырех переключателей. Внизу окна поместите кнопки OK и Cancel. Сохраните файл как С:\Program Files\AutoCAD 2010\Support\Radio. dcl. Файл можно сохранить и в другом каталоге. Тогда загрузить его в чертеж нужно по команде Tools - AutoLISP - Load Application. Загрузить можно и непосредственно из среды Visual LISP.

Radio: dialog {label = "Переключатели RadioButtons";: column {             : radio_column {key = "mychoice";: radio_button {key = "but1"; label = "Apples"; value =1;}: radio_button {key = "but2"; label = "Oranges";}: radio_button {key = "but3"; label = "Bananas";}: radio_button {key = "but4"; label = "Lemons";}   }: boxed_column {  : button {key = "accept";label = " Okey ";is_default = true;}        : button {key = "cancel";label = " Cancel ";is_default = false;is_cancel = true;}   }}}

Далее создайте LSP -файл загрузки:

(defun C:Radio();;;--- Load the dcl file (setq dcl_id (load_dialog "Radio.dcl"));;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "Radio" dcl_id)) (progn (alert "The Radio.DCL file could not be loaded!") (exit)));;;--- If an action event occurs, do this function (action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)") (action_tile "cancel" "(setq ddiag 1)(done_dialog)");;;--- Display the dialog box (start_dialog);;;--- Unload the dialog box (unload_dialog dcl_id);;;--- If the user pressed the Cancel button (if(= ddiag 1) (princ "\n Radio cancelled!"));;;--- If the user pressed the Okay button (if(= ddiag 2) (progn (princ "\n The user pressed Okay!")));;;--- Suppress the last echo for a clean exit(princ))

Загрузите файлы и запустите команду "Radio". На экране появится диалоговое окно, в котором работают лишь кнопки OK и Cancel (рис.6.7):


Рис. 6.7. Макет диалогового окна "Radio Buttons"

При нажатии кнопки ОК вызывается функция saveVars, которая запускает сценарий отклика на событие выделения переключателя. Составим эту функцию и поместим ее в LSP -файл:

(defun saveVars();;;--- Get the key of the choice made;;; [ returns "but1" "but2" "but3" or "but4" whichever is selected.] (setq myChoice(get_tile "mychoice"));;;--- Get the value of each item (setq choice1(atoi(get_tile "but1"))) // 0 = not chosen 1 = chosen   (setq choice2(atoi(get_tile "but2"))) // 0 = not chosen 1 = chosen (setq choice3(atoi(get_tile "but3"))) // 0 = not chosen 1 = chosen (setq choice4(atoi(get_tile "but4"))) // 0 = not chosen 1 = chosen)(defun C:Radio();;;--- Load the dcl file (setq dcl_id (load_dialog "Radio.dcl"));;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "Radio" dcl_id)) (progn (alert "The Radio.DCL file could not be loaded!") (exit)));;;--- If an action event occurs, do this function (action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)") (action_tile "cancel" "(setq ddiag 1)(done_dialog)");;;--- Display the dialog box (start_dialog);;;--- Unload the dialog box (unload_dialog dcl_id);;;--- If the user pressed the Cancel button (if(= ddiag 1) (princ "\n Radio cancelled!"));;;--- If the user pressed the Okey button (if(= ddiag 2) (progn;;;--- Inform the user of his selection using the radio_column data (princ "\n Using Radio_column data...You chose ") (cond   ((= myChoice "but1")(princ "Apples!"))   ((= myChoice "but2")(princ "Oranges!"))   ((= myChoice "but3")(princ "Bananas!"))   ((= myChoice "but4")(princ "Lemons!")));;;--- Inform the user of his selection using the radio_buttons data (princ "\n Using Radio_buttons data...You chose ") (cond   ((= Choice1 1)(princ "Apples!"))   ((= Choice2 1)(princ "Oranges!"))   ((= Choice3 1)(princ "Bananas!"))   ((= Choice4 1)(princ "Lemons!")))));;;--- Suppress the last echo for a clean exit(princ))

Поделиться с друзьями:

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.045 с.