Тема: Radio_button и Lisp программа

Привет всем!! Подскажите пожайлуста как увязать переключатель с выражением Lisp. Суть в следующем нужно в появившемся окне выбрать пункт и по выбору должна нарисоваться рамка с видовым экраном. Программа рисующая рамку готова. Рисование рамок запускается командами A3v, A4v, A3g, A4g.
Вот мой DCL. Сразу попрошу не смеяться это первые опыты.
(defun show_tpos ( / dcl_id)
  (if (< (setq dcl_id (load_dialog "d_tpos.dcl")) 0)(exit))
  (if (not (new_dialog "np_tpos" dcl_id)) (exit))
  (start_dialog)
  (action_tile "A3v" (setq A3v$ $value))
  (action_tile "A4v" (setq A4v$ $value))
  (action_tile "A3g" (setq A3g$ $value))
  (action_tile "A4g" (setq A4g$ $value))
  (unload_dialog dcl_id)
    (princ)
)

Re: Radio_button и Lisp программа

И если можно поподробнее объяснить, что и как надо делать.

Re: Radio_button и Lisp программа

И тебе привет.
Приведенный код не DCL, а LISP.
Что значит 

должна нарисоваться рамка с видовым экраном.

Понятие видового экрана в ACAD несколько другое.
Грубейшая ошибка: функция (action_tile <key> <выражение>) имеет вторым аргументом строку
Мне больше нравится такой вариант
Вместо точек подставь что тебе нужно.

  (action_tile "A3v" "(done_dialog) (draw_A3v)")
  (action_tile "A4v" "(done_dialog) (draw_A4v)")
  (action_tile "A3g" "(done_dialog) (draw_A3g)")
  (action_tile "A4g" "(done_dialog) (draw_A4g)")
.........
.........
(defun draw_A3v ( / )
  ..........
  ..........
) ; defun draw_A3v
(defun draw_A4v ( / )
  ..........
  ..........
) ; defun draw_A4v
(defun draw_A3g ( / )
  ..........
  ..........
) ; defun draw_A3g
(defun draw_A4g ( / )
  ..........
  ..........
) ; defun draw_A4g

Либо вот так

  (action_tile "A3v" "(done_dialog) (draw_RAMKA /"A3v/")")
  (action_tile "A4v" "(done_dialog) (draw_RAMKA /"A4v/")")
  (action_tile "A3g" "(done_dialog) (draw_RAMKA /"A3g/")")
  (action_tile "A4g" "(done_dialog) (draw_RAMKA /"A4g/")")
.........
.........
(defun draw_RAMKA ( priznak / )
  (cond
    ((= priznak "A3v") ( ........ ))
    ((= priznak "A4v") ( ........ ))
    ((= priznak "A3g") ( ........ ))
    ((= priznak "A4g") ( ........ ))
  ) ; cond
) ; defun draw_RAMKA

Re: Radio_button и Lisp программа

Вот спасибо, буду пробовать

Re: Radio_button и Lisp программа

Если я правильно понял там где точки пишем текст программы рисующей рамку. А "A3v", "A4v", "A3g", "A4g" это ключи которые прописаны в в DCL файле

Re: Radio_button и Lisp программа

Вот DCL
Format_dcl: dialog{label="Выбор формата";
:column{label = "";
    width=40;height=15;
    :column {label = " "; width = 16; height = 2;
    :radio_button{label="Формат А3 книжный";key="A3v";value=1;}}
    :column {label = " "; width = 16; height = 0;
    :radio_button{label="Формат А3 альбомный";key="A3g";value=0;}}
    :column {label = " "; width = 16; height = 0;
    :radio_button{label="Формат А4 книжный";key="A4v";value=0;}}
    :column {label = " "; width = 16; height = 0;
    :radio_button{label="Формат А4 альбомный";key="A4g";value=0;}}
    :column {label = " "; width = 16; height = 0;ok_cancel;}
}}

Re: Radio_button и Lisp программа

> Electr
Правильно понял.

> Electr
При такой организации DCL, программа будет несколько иной.

  (action_tile "A3v" "(setq aaa /"A3v/")")
  (action_tile "A4v" "(setq aaa /"A4v/")")
  (action_tile "A3g" "(setq aaa /"A3g/")")
  (action_tile "A4g" "(setq aaa /"A4g/")")
  .........
  .........
  (done_dialog)
  (draw_RAMKA aaa)
) ; defun show_tpos
(defun draw_RAMKA ( priznak / )
  (cond
    ((= priznak "A3v") ( ........ ))
    ((= priznak "A4v") ( ........ ))
    ((= priznak "A3g") ( ........ ))
    ((= priznak "A4g") ( ........ ))
  ) ; cond
) ; defun draw_RAMKA

Re: Radio_button и Lisp программа

Пишет что ошибка

; warning: too many arguments: (ACTION_TILE "A3v" "(setq aaa /" A3V/ ... )
; warning: too many arguments: (ACTION_TILE "A4v" "(setq aaa /" A4V/ ... )
; warning: too many arguments: (ACTION_TILE "A3g" "(setq aaa /" A3G/ ... )
; warning: too many arguments: (ACTION_TILE "A4g" "(setq aaa /" A4G/ ... )
.
; error: extra right paren on input
; Check done.

Re: Radio_button и Lisp программа

  (action_tile "A3v" "(setq aaa \"A3v\")")
  (action_tile "A4v" "(setq aaa \"A4v\")")
  (action_tile "A3g" "(setq aaa \"A3g\")")
  (action_tile "A4g" "(setq aaa \"A4g\")")

Re: Radio_button и Lisp программа

Прошу прощения но моя программа не работает. Дайте пинка чтобы разобраться окончательно

(defun format ( / dcl_id)
  (if (< (setq dcl_id (load_dialog "Format_all.DCL")) 0)(exit))
  (if (not (new_dialog "Format_dcl" dcl_id)) (exit))
  (start_dialog)
(action_tile "A3v" "(setq aaa \"A3v\")")
  (action_tile "A4v" "(setq aaa \"A4v\")")
  (action_tile "A3g" "(setq aaa \"A3g\")")
  (action_tile "A4g" "(setq aaa \"A4g\")")
   (done_dialog)
  (unload_dialog dcl_id)
   (draw_RAMKA aaa)
;;;    (princ)
);defun format
 (defun draw_RAMKA ( priznak / )
  (cond
    ((= priznak "A3v") (DEFUN draw_A3v (/)
  (setq swidth 0.6)
(setq old_ortho (getvar "ORTHOMODE")
  old_snap (getvar "SNAPMODE")
  old_osnap (getvar "OSMODE"))
  (setvar "orthomode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  (command "_.layer" "_m" "_Format" "")
   (command "_rectang" "0,0" "297,420" "")
(command "_rectang" "5,5" "292,400" "")
  (command "_-vports" "5,5" "292,400" "")
(setvar "ORTHOMODE" old_ortho)
(setvar "SNAPMODE" old_snap)
(setvar "OSMODE" old_osnap)
))
    ((= priznak "A4v") (DEFUN draw_A4v (/)
  (setq swidth 1)
(setq old_ortho (getvar "ORTHOMODE")
  old_snap (getvar "SNAPMODE")
  old_osnap (getvar "OSMODE"))
  (setvar "orthomode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  (command "_.layer" "_m" "_Format" "")
   (command "_rectang" "0,0" "210,297" "")
(command "_rectang" "20,5" "205,292" "")
  (command "_-vports" "20,5" "205,292" "")
(setvar "ORTHOMODE" old_ortho)
(setvar "SNAPMODE" old_snap)
(setvar "OSMODE" old_osnap)
))
    ((= priznak "A3g") (DEFUN draw_A3g (/)
  (setq swidth 0.6)
(setq old_ortho (getvar "ORTHOMODE")
  old_snap (getvar "SNAPMODE")
  old_osnap (getvar "OSMODE"))
  (setvar "orthomode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  (command "_.layer" "_m" "_Format" "")
   (command "_rectang" "0,0" "420,297" "")
(command "_rectang" "20,5" "415,292" "")
  (command "_-vports" "20,5" "415,292" "")
(setvar "ORTHOMODE" old_ortho)
(setvar "SNAPMODE" old_snap)
(setvar "OSMODE" old_osnap)
))
    ((= priznak "A4g") (DEFUN draw_A4g ()
  (setq swidth 0.6)
(setq old_ortho (getvar "ORTHOMODE")
  old_snap (getvar "SNAPMODE")
  old_osnap (getvar "OSMODE"))
  (setvar "orthomode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  (command "_.layer" "_m" "_Format" "")
   (command "_rectang" "0,0" "297,210" "")
(command "_rectang" "20,5" "292,205" "")
  (command "_-vports" "20,5" "292,205" "")
(setvar "ORTHOMODE" old_ortho)
(setvar "SNAPMODE" old_snap)
(setvar "OSMODE" old_osnap)
  ))
  ) ; cond
) ; defun draw_RAMKA

Re: Radio_button и Lisp программа

Спокойно.
Файл DCL

Format_dcl:
dialog{label="Выбор формата";
:column{label = "";width=40;height=15;
:radio_column{
  :radio_button {label="Формат А3 книжный";key="A3v";}
  :radio_button {label="Формат А3 альбомный";key="A3g";}
  :radio_button {label="Формат А4 книжный";key="A4v";}
  :radio_button {label="Формат А4 альбомный";key="A4g";}
  }
ok_cancel;}
}

Файл LSP

(defun format ( / aaa what dcl_id old_ortho old_snap old_osnap )
  (if (< (setq dcl_id (load_dialog "Format_all.DCL")) 0)(exit))
  (if (not (new_dialog "Format_dcl" dcl_id)) (exit))
  (setq aaa "A3v") ; инициализация, если не трогали radio_button
  (action_tile "A3v" "(setq aaa \"A3v\")")
  (action_tile "A4v" "(setq aaa \"A4v\")")
  (action_tile "A3g" "(setq aaa \"A3g\")")
  (action_tile "A4g" "(setq aaa \"A4g\")")
  (setq what (start_dialog)) ; для проверки выхода по ОК
  (done_dialog)
  (unload_dialog dcl_id)
  (setq old_ortho (getvar "ORTHOMODE")
        old_snap (getvar "SNAPMODE")
        old_osnap (getvar "OSMODE"))
  (setvar "orthomode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  (if (= 1 what) (draw_RAMKA aaa))
  (setvar "orthomode" old_ortho)
  (setvar "snapmode" old_snap)
  (setvar "osmode" old_osnap)
;;;    (princ)
);defun format
(defun draw_RAMKA ( priznak / )
  (cond
    ((= priznak "A3v")
      (command "_.layer" "_m" "_Format" "")
      (command "_rectang" "0,0" "297,420" "")
      (command "_rectang" "5,5" "292,400" "")
    )
    ((= priznak "A4v")
      (command "_.layer" "_m" "_Format" "")
      (command "_rectang" "0,0" "210,297" "")
      (command "_rectang" "20,5" "205,292" "")
    )
    ((= priznak "A3g")
      (command "_.layer" "_m" "_Format" "")
      (command "_rectang" "0,0" "420,297" "")
      (command "_rectang" "20,5" "415,292" "")
    )
    ((= priznak "A4g")
      (command "_.layer" "_m" "_Format" "")
      (command "_rectang" "0,0" "297,210" "")
      (command "_rectang" "20,5" "292,205" "")
    )
  ); cond
  (vl-cmdf "_.ZOOM" "_E" "")
) ; defun draw_RAMKA

Re: Radio_button и Lisp программа

Все хорошо, только после выбора формата рисуется одна рамка и программа выполняет последнюю выполненную команду. (аналогично нажатию пробела)

Re: Radio_button и Lisp программа

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