Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 6:

Программирование диалоговых окон на языке DCL

Переключатели 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):

Макет диалогового окна "Radio Buttons"

Рис. 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))  

Практическое построение диалогового окна

Сейчас попробуем соединить все изложенные выше отдельные сведения о программировании диалоговых окон. Необходимо построить такой DCL-файл, который позволил бы управлять большинством параметров чертежа.

Нарисуем многоугольник или окружность на выбранном нами слое. Выбранные нами опции должны быть сохранены как опции по умолчанию при следующем открытии программы. Если выбран многоугольник, нужно выбрать число сторон в popup_list. Список слоев должен быть помещен в list_box. Выбор фигуры должен производиться радиокнопкой radio_column. В элементе toggle нужно поставить флажки "Save Settings" сохранения опций. Наконец, нам будут нужны кнопки ОК и Cancel.

Список слоев, возможно, будет большим, - для него нужно отвести одну высокую колонку. Остальные элементы следует разместить во вторую колонку. В нижнем ряду будут помещены кнопки ОК и Cancel.

Скопируйте коды элементов из вышележащих материалов лекции.

SAMPLE : dialog { 
         label = "Sample Dialog Box"; 
          : column { 
            : row { 
              : boxed_column { 
                : radio_column  {key = "radios";
                  : radio_button {label = "Draw Circle";key = "drawcir"; value = "1";}  
                  : radio_button {label = "Draw Polygon"; key = "drawpol"; value = "0";}  
               		 }  
            : popup_list {key = "numsides"; label = "Number of Sides"; width = 25; fixed_width_font = true;}
                : toggle {key = "saveset"; label = "Save settings";}
              		}  
              : row  { 
                : list_box {label ="Select Layer";key = "layerList";height = 12;  width = 10;
                  multiple_select = false; fixed_width_font = true;value = "";}
             	 }}
            : row { 
              : button {key = "accept";label = " Okey "; is_default = true;}
              : button {key = "cancel";label = " Cancel ";is_default = false;is_cancel = true;} 
            		}}}

Сохраните файл как C:\Program Files\AutoCAD 2007\Support\Sample.dcl.

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

 (defun C:SAMPLE ()

  ;;;--- Load the dcl file
  (setq dcl_id (load_dialog "SAMPLE.dcl"))

  ;;;--- Load the dialog definition if it is not already loaded
  (if (not (new_dialog "SAMPLE" dcl_id))
    (progn
     (alert "The SAMPLE.DCL file could not be loaded!")
      (exit)
    )
  )
  ;;;--- If an action event occurs, do this function
  (action_tile "cancel" "(setq ddiag 1)(done_dialog)")
  (action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)") 

  ;;;--- Display the dialog box
  (start_dialog)
  ;;;--- Unload the dialog box
  (unload_dialog dcl_id)

  ;;;--- If the cancel button was pressed - display message
  (if (= ddiag 1)
    (princ "\n \n ...SAMPLE Cancelled. \n ")
  )

  ;;;--- If the "Okay" button was pressed
  (if (= ddiag 2)
    (princ "\n \n ...SAMPLE Complete!")
  )

  ;;;--- Suppress the last echo for a clean exit
  (princ)

) 

Сохраните файл как C:\Program Files\AutoCAD 2007\Support\Sample.lsp.

Загрузите файлы и запустите функция Sample. На экране должно появиться диалоговое окно (рис. 6.8)

 Предварительное построение диалогового окна

Рис. 6.8. Предварительное построение диалогового окна

Обратите внимание, что списки отсутствуют, а переключатель Draw Circle выделен (значение value=1). В элементе Toggle флажок не установлен, так как не задано значение value. Если нажать кнопку Cancel, то окно закроется. Если же нажать кнопку ОК, то будет выдано сообщение об ошибке: функция saveVars не определена.

Прежде всего составим списки числа сторон многоугольника и добавим их к элементу popup_list. Далее составим список слоев и заполним элемент list_box.

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

Чтение имен слоев чертежа:

  ;;;--- Set up a list to hold the layer names
  (setq layerList(list))

  ;;;--- Get the first layer name in the drawing
  (setq layer(tblnext "LAYER" T))

  ;;;--- Add the layer name to the list
  (setq layerList(append layerList (list(cdr(assoc 2 layer)))))

  ;;;--- Step though the layer table to get all layers
  (while (setq layer(tblnext "LAYER"))

    ;;;--- Save each layer name in the list
    (setq layerList(append layerList (list(cdr(assoc 2 layer)))))
  )
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия