Тема: Как связать DCL и LISP?

Помогите пожалуйста разобраться, я в этом деле новичок,а тут срочно понадобилось.
Вобщем написал на DCL диалог и программу на LISP, теперь не знаю как их связать. Чтоб в программа выполнялась, причём брала значения из edit_box-ов
DCL

Fractal : dialog {label="Введите значения"; width=50; children_alignment=centered;
:column {children_alignment=centered;
    :edit_box{label="Угол"; key="angle"; edit_width=3; edit_limit=3; fixed_width=true; value="";}
    :edit_box{label="Радиус"; key="radius"; edit_width=3; edit_limit=3; fixed_width=true; value="";}
    :edit_box{label="Радиус"; key="radius1"; edit_width=3; edit_limit=3; fixed_width=true; value="";}
    }
:ok_button{label="Построить"; key="accept"; fixed_width=true;}
}

LISP

(defun c:Fractal (/ Dcl_Id%)
  (princ "\nFractal")(princ)
  ; Загрузка диалога
  (setq Dcl_Id% (load_dialog "fractal.dcl"))
  (new_dialog "Fractal" Dcl_Id%)
  ; Диалог в действии
  (start_dialog)
(action_tile
 "accept"
 "(progn (setq i 142 )
(defun okr( f )
(setq a (cos f))
(setq b (sin f))
(setq x (* r a))
(setq y (* r b))
(setq pc (list x y ))
(command "circle" pc r1)
)
(repeat 3
(setq f (atoi (angle)))
(setq r (atoi (radius)))
(setq r1 (atoi (radius1)))
(setq i (+ i 10))
(command "_.color" i )
(repeat 20
(okr f)
(setq f (+ f (/ pi 10)))
)
))")
  ; Выгрузка диалога
  (unload_dialog Dcl_Id%)
  (princ)
)

Re: Как связать DCL и LISP?

Как-то так:
DCL

Fractal : dialog {label="Введите значения";children_alignment=centered;
:column {children_alignment=centered;
  :edit_box{label="Угол"; key="angle";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";}
  :edit_box{label="Радиус"; key="radius";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";}
  :edit_box{label="Радиус"; key="radius1";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";}
  }
:ok_button{label="Построить"; key="accept"; fixed_width=true;}
}

LSP

(defun c:Fractal (/ Dcl_Id% r r1 f)
  (princ "\nFractal")
  (princ)
  (setvar "cmdecho" 0)
 ; Загрузка диалога
  (setq Dcl_Id% (load_dialog "fractal.dcl"))
  (new_dialog "Fractal" Dcl_Id%)
  (action_tile
    "accept"
    "(setq r (GET_TILE \"radius\") r1 (GET_TILE \"radius1\") f (GET_TILE \"angle\"))(DONE_DIALOG 142)"
    ) ;_ конец action_tile
  (if (or (zerop (setq i (start_dialog)))
      (zerop (setq r (atof r)))
      (zerop (setq r1 (atof r1)))
      (zerop (setq f (atof f)))
      ) ;_ конец and
    (alert "\nНе верные значения!\n")
    (progn
      (repeat 3
    (setq i    (+ i 10)
          i    (cond
          ((> i 255) 0)
          (t i)
          ) ;_ конец cond
          ) ;_ конец setq
    (command "_.color" i)
    (repeat    20
      (okr f)
      (setq f (+ f (/ pi 10.0)))
      ) ;_ конец repeat
    ) ;_ конец repeat
      ) ;_ конец progn
    ) ;_ конец if
  (unload_dialog Dcl_Id%)
  (setvar "cmdecho" 1)
  (princ)
  ) ;_ конец defun
(defun okr (f / a b x y pc)
  (setq a (cos f))
  (setq b (sin f))
  (setq x (* r a))
  (setq y (* r b))
  (setq pc (list x y))
  (command "_circle" pc r1)
  ) ;_ конец defun

Re: Как связать DCL и LISP?

Большое спасибо немного разобрался.
Убрал

(repeat 3
  (setq i  (+ i 10)
        i  (cond
      ((> i 255) 0)
      (t i)
      ) ;_ конец cond
        ) ;_ конец setq
 ) ;_ конец repeat

По причине ненадобности
Теперь возникла необходимость взять цвет из edit_box - ов
В DCL файл вставил

 :edit_box{label="Цвет"; key="color";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";}

а в LISP как только не пробовал взять значение, но ничего не получается.

Re: Как связать DCL и LISP?

Все описания реакций (action_tile) надо описывать между new_dialog и start_dialog. А простые реакции можно вписать прямо в DCL. Например так:

 :edit_box{label="Цвет"; key="color";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";action = "(setq i $value)";}

Вот сделал такой вариант с кнопкой - удобнее чем edit_box
DCL

Fractal : dialog {label="Введите значения"; children_alignment=centered;
:column {children_alignment=centered;
  :edit_box{label="Угол"; key="angle";width=20;  edit_width=3; edit_limit=3; fixed_width=true; value="";}
  :edit_box{label="Радиус"; key="radius";width=20;  edit_width=3; edit_limit=3; fixed_width=true; value="";}
  :edit_box{label="Радиус"; key="radius1";width=20;  edit_width=3; edit_limit=3; fixed_width=true; value="";}
  :edit_box{label="Цвет"; key="color";width=20; edit_width=3; edit_limit=3; fixed_width=true; value="";action = "(setq color $value)";}
  :image_button {key = "img";width = 6; fixed_width = true;height = 2.0;fixed_height = true;is_enabled = true;}
  :ok_button{label="Построить"; key="accept"; fixed_width=true;}
  }
}

LISP

(defun c:Fractal (/ var old_var new_var Dcl_Id% r r1 f color)
  (princ "\nFractal")
  (setq var     '("cmdecho" "cecolor" "osmode")
        old_var (mapcar 'getvar var)
        new_var '(0 "0" 0)
        ) ;_ end setq
  (mapcar 'setvar var new_var)
  (setq Dcl_Id% (load_dialog "f:\\temp\\fractal.dcl"))
  (new_dialog "Fractal" Dcl_Id%)
  (setq color 0)
  (action_tile "accept" "(action-but)") ;_ конец action_tile
  (action_tile "img" "(action-img)") ;_ конец action_tile
  (START_IMAGE "img")
  (fill_image 0 0 (dimx_tile "img") (dimy_tile "img") Color) ;_ конец fill_image
  (END_IMAGE)
  (start_dialog)
  (if (or (zerop (setq r (atof r)))
          (zerop (setq r1 (atof r1)))
          (zerop (setq f (atof f)))
          ) ;_ конец and
    (alert "\nНе верные значения!\n")
    (progn ;     (repeat 3
      (command "_.color" color)
      (repeat 20 (okr f) (setq f (+ f (/ pi 10.0)))) ;_ конец repeat
      ) ;_ конец progn
    ) ;_ конец if
  (unload_dialog Dcl_Id%)
  (mapcar 'setvar var old_var)
  (princ)
  ) ;_ конец defun
(defun okr (f / a b x y pc)
  (setq a (cos f))
  (setq b (sin f))
  (setq x (* r a))
  (setq y (* r b))
  (setq pc (list x y))
  (command "_circle" pc r1)
  ) ;_ конец defun
(defun action-img (/ msg)
  (if (setq msg (ACAD_COLORDLG color))
    (progn (setq color msg)
           (START_IMAGE "img")
           (fill_image 0 0 (dimx_tile "img") (dimy_tile "img") Color) ;_ конец fill_image
           (END_IMAGE)
           ) ;_ end progn
    ) ;_ end if
  ) ;_ end defun
(defun action-but ()
  (setq r  (GET_TILE "radius")
        r1 (GET_TILE "radius1")
        f  (GET_TILE "angle")
        ) ;_ end setq
  (DONE_DIALOG 1)
  ) ;_ end defun

Re: Как связать DCL и LISP?

Да, кстати возможно  вам надо поправить под себя адрес в строке

(setq Dcl_Id% (load_dialog "f:\\temp\\fractal.dcl"))