Тема: LISP+DCL=зависание автокада. Помогите пожалуйста найти ошибки.

Написал небольшую программу, но она зависает при нажатии на кнопку "расчитать".
Самое интересно что если изменить запись

(action_tile "accept" "(statika)"  )

вместо слова статика ввести другое например statik, то окно закрывается.
После этого ввожу в ком. строку (statika) и все нормально расчитывается.
ниже приведен код окна и лисп программы, может быть кто-то найдет ошибку.
и еще в этом же окне не могу нормально считать данные из эдит_бокс.
если начальное значение стереть и ввести заново, то считываются, а если просто нажать на кнопку расчитать не трогая поля эдит_бокс, то значения из них не считываются.
нашел пока один выход: нужно по всем ячейкам пройтись щелкая по клавише ТАВ

;: программа для статического расчета        ::
;: плужных каналокапателей МК-19 МК-23 МД-12 ::
;: для запуска программы в командной строке  ::
;: наберите STAT    (creat in AutoCad 2008)  ::
;::::::::::::::::::::::::::::::::::::::::::::::

(defun stat ( / dcl_id )
  (if (< (setq dcl_id (load_dialog "d:\\stat\\dialog.dcl")) 0)(exit))
  (if (not (new_dialog "stat" dcl_id)) (exit))

(action_tile "b11" "(set_tile \"hk\" \"0\")
             (set_tile \"bk\" \"0\")
            (set_tile \"m\" \"0\")
            (set_tile \"FL\" \"0\")
            (set_tile \"AL\" \"0\")
            (set_tile \"aotv\" \"0\")
            (set_tile \"ar\" \"0\")
            (set_tile \"fm1\" \"0\")
            (set_tile \"ky\" \"0\")
            (set_tile \"kr\" \"0\")
            (set_tile \"gb\" \"0\")
            (set_tile \"gm\" \"0\")
            (set_tile \"xr\" \"0\")
            (set_tile \"x1\" \"0\")
            (set_tile \"xm\" \"0\")
            (set_tile \"XL\" \"0\")
            (set_tile \"zc\" \"0\")
            (set_tile \"lb\" \"0\")
            (set_tile \"bg\" \"0\")
           ") ; конец action_tile "b11"
  (action_tile "b12" "(set_tile \"hk\" \"0.4\")
             (set_tile \"bk\" \"0.4\")
            (set_tile \"m\" \"1.25\")
            (set_tile \"FL\" \"40\")
            (set_tile \"AL\" \"40\")
            (set_tile \"aotv\" \"40\")
            (set_tile \"ar\" \"40\")
            (set_tile \"fm1\" \"1.25\")
            (set_tile \"ky\" \"100\")
            (set_tile \"kr\" \"0.8\")
            (set_tile \"gb\" \"130\")
            (set_tile \"gm\" \"11\")
            (set_tile \"xr\" \"4.7\")
            (set_tile \"x1\" \"0.3\")
            (set_tile \"xm\" \"5\")
            (set_tile \"XL\" \"5.6\")
            (set_tile \"zc\" \"0.3\")
            (set_tile \"lb\" \"3\")
            (set_tile \"bg\" \"0.3\")
           ") ; конец action_tile "b11"
  (action_tile "b13" "(set_tile \"hk\" \"0.45\")
             (set_tile \"bk\" \"0.45\")
            (set_tile \"m\" \"1.25\")
            (set_tile \"FL\" \"45\")
            (set_tile \"AL\" \"45\")
            (set_tile \"aotv\" \"45\")
            (set_tile \"ar\" \"45\")
            (set_tile \"fm1\" \"1.25\")
            (set_tile \"ky\" \"115\")
            (set_tile \"kr\" \"0.8\")
            (set_tile \"gb\" \"140\")
            (set_tile \"gm\" \"12\")
            (set_tile \"xr\" \"4.8\")
            (set_tile \"x1\" \"0.3\")
            (set_tile \"xm\" \"5.1\")
            (set_tile \"XL\" \"5.7\")
            (set_tile \"zc\" \"0.25\")
            (set_tile \"lb\" \"3.2\")
            (set_tile \"bg\" \"0.3\")
           ") ; конец action_tile "b12"
  (action_tile "b14" "(set_tile \"hk\" \"0.5\")
             (set_tile \"bk\" \"0.6\")
            (set_tile \"m\" \"1.25\")
            (set_tile \"FL\" \"35\")
            (set_tile \"AL\" \"40\")
            (set_tile \"aotv\" \"45\")
            (set_tile \"ar\" \"40\")
            (set_tile \"fm1\" \"1.25\")
            (set_tile \"ky\" \"105\")
            (set_tile \"kr\" \"0.8\")
            (set_tile \"gb\" \"130\")
            (set_tile \"gm\" \"11\")
            (set_tile \"xr\" \"4.9\")
            (set_tile \"x1\" \"0.3\")
            (set_tile \"xm\" \"5.2\")
            (set_tile \"XL\" \"5.8\")
            (set_tile \"zc\" \"0.3\")
            (set_tile \"lb\" \"3.45\")
            (set_tile \"bg\" \"0.3\")
           ") ; конец action_tile "b13"


(action_tile "accept" "(statika)"  ) ;конец action_tile
 

 (start_dialog)


(unload_dialog dcl_id)
  (princ)
);конец defun 
  


;----------------------- Function's ---------------------------------
(defun Stepen (a b)
  (exp (* b (log a)))
)
(defun Tan (v)
  (/ (sin v) (cos v))
)
(defun KoordNew() 
  (cdr (assoc 10 (entget (entlast))))
)
(defun KoordEnd()
  (cdr (assoc 11 (entget (entlast))))
)
;-----------------д-жЁп Setting--------------------------------------
(defun Sett()
(setq cmde (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq blmd (getvar "BLIPMODE"))
(setvar "BLIPMODE" 0)
(setq lun (getvar "LUNITS"))
(setvar "LUNITS" 2)
(setq lup (getvar "LUPREC"))
(setvar "LUPREC" 3)
)
;-----------------д-жЁп Input_Fun------------------------------------
;
;------------------------д-жЁп SetLayer------------------------------

;(defun SetLayer(name)
;(command "layer" name "")
;)
;------------------------ д-жЁп Abcd ---------------------------------
(defun Abcd()
(setq fotv 90)
(setq hp (* hk 2))
(setq zk (* 0.25 hk))
(setq ctgfl (/ 1 (* (/ (sin FL) (cos FL)) (sin AL)))
)
(setq xk (* zk ctgFL))
(setq l (* 0.75 hp))
(setq hp2 (Stepen hp 2))
(setq hp3 (Stepen hp 3))
(setq zk2 (Stepen zk 2))
(setq zk3 (Stepen zk 3))

(setq a (- (/  ctgfl (Stepen (* -1 (- zk hp)) 2)) 
           (/ (* 2 (- xk l)) (* -1 (Stepen (* -1 (- zk hp)) 3)))) )
(setq b (/ (- (/ ctgfl (- zk hp)) (* 3 a (+ zk hp))) 2) )
(setq c (- ctgfl (* 3 a zk2) (* 2 b zk) ))
(setq d (- xk (* a zk3) (* b zk2) (* c zk) ))
(setq a2 (/ (- AL aotv) (- (+ (* fotv fotv) (* FL FL) ) (* 2 FL fotv)))
)
(setq a1 (- (* 2 a2 fotv) ))
(setq a0 (+ aotv (* a2 fotv fotv) ))

)
;-----------------------  Raschet -------------------------------
(defun Raschet()
(setq pii (/ 180 pi))

(setq s (* hk (+ (* hk m) bk)))
(setq r (* ky s))
(setq er (- 90 (+ ar (* (atan fm1) pii))))
(setq rv (* r (sin er)))
(setq rg (* r (cos er)))
(setq xc (* 0.25 lb) hz (* kr hk))

(setq r2 (/ (+ (* rv xr) (* gm xm) (- (* rg (+ hk zc (- hz))))) 
            (+ xl (* fm1 (+ hk zc))) 
         ) 
) ;---R2
(setq r1 (- (+ gb gm rv) r2))
(setq aaa (+ (* rv (- xr xc)) (* gm (- xm xc)) (* gb X1) ))
(setq bbb (+ (* rg (- hk hz)) (* r2 (- XL xc)) (* fm1 r2 hk) ))
(setq xd (/ (- aaa bbb) r1)) 
(setq pmax (/ (* r1 (+ 1 (/ (* 6 xd) lb))) (* bg lb 2 1000)))
(setq pmin (/ (* r1 (- 1 (/ (* 6 xd) lb))) (* bg lb 2 1000)))
)

;----------------------- Statika--------------------------------------
(defun Statika()



(setq x 0.0 dx 0.0 dy 0.0 )

(Sett)
(Abcd)
(Raschet) 

;(SetLayer "TEXT")
(command "_.text" (list 533 353) 8 0 (rtos rv) )
(command "_.text" (list 480 267) 8 0 (rtos rg) )
(command "_.text" (list 443 335) 8 0 (rtos r) )
(command "_.text" (list 252 243) 8 0 (rtos r1) )
(command "_.text" (list 703 160) 8 0 (rtos r2) )
(command "_.text" (list 255 283) 8 0 (rtos xd) )
(command "_.text" (list 284 35) 8 0 (rtos pmax) )
(command "_.text" (list 275 20) 8 0 (rtos pmin) )
(command "_.pline" (list 112 315) (list 112 235) 
                 (list 341 274) (list 341 315) "")
(command "_.text" (list 80 235) 8 0 pmax)
(command "_.text" (list 345 225) 8 0 pmin)
  
  (setvar "CMDECHO" cmde)
  (setvar "BLIPMODE" blmd)
  (setvar "LUNITS" lun)
  (setvar "LUPREC" lup)
(princ "OK")
(princ)
)
  
stat: dialog{label="Расчет плужного каналокапателя";is_bold="true";fixed_width = true;

:text{label = " Выбирете данные для расчета ";fixed_width_font=true;alignment=centered;}
:radio_row{key="b1";
  :radio_button{label="Сброс"; key="b11";value="1";}
  :radio_button{label="МК-19"; key="b12";}
  :radio_button{label="МК-23"; key="b13";}
  :radio_button{label="МД-12"; key="b14";}
   } //конец радио кнопки

:text{label = " Параметры канала ";fixed_width_font=true;alignment=centered;}
:column{children_alignment=centered;
fixed_width_font = true;
  :edit_box{label="Глубина канала (Нк), м";key="hk";value="";edit_width=10;action = "(setq hk (atof $value))";}
  :edit_box{label="Ширина канала по дну (В), м";key="bk";value="";edit_width=10;action = "(setq bk (atof $value))";}
  :edit_box{label="Коэф заложения откосов (m) ";key="m";value="";edit_width=10;action = "(setq m (atof $value))";}
  :edit_box{label="угол F1 в градусах";key="FL";value="";edit_width=10;action = "(setq FL (angtof $value 0))";}
  :edit_box{label="угол AL в градусах";key="AL";value="";edit_width=10;action = "(setq AL (angtof $value 0))";}
 } //column Параметры канала
 
:text{label = " Параметры рабочего органа и грунта ";fixed_width_font=true;alignment=centered;}
 :column{children_alignment=centered;
  :edit_box{label="Угол захвата верхних отвалов (Аотв), в град";key="aotv";value="";edit_width=10;action = "(setq aotv (angtof $value 0))";}
  :edit_box{label="Угол между силой R и горизонтом, в град";key="ar";value="";edit_width=10;action = "(setq ar (angtof $value 0))";}
  :edit_box{label="Коэф трения грунта о металл (fm1) ";key="fm1";value="";edit_width=10;action = "(setq fm1 (atof $value))";}
  :edit_box{label="Удельное сопротивение грунта копанию (ky), кН";key="ky";value="";edit_width=10;action = "(setq ky (atof $value))";}
  :edit_box{label="Коэф влияния св-в грунта на положение т.действия силы R (kr) ";key="kr";value="";edit_width=10;action = "(setq kr (atof $value))";}
 } //column Параметры рабочего органа
 
:text{label = " Параметры машины ";fixed_width_font=true;alignment=centered;}
 :column{children_alignment=centered;  
  :edit_box{label="Вес трактора в кН, (G)";key="gb";value="";edit_width=10;action = "(setq gb (atof $value))";}
  :edit_box{label="Вес рабочего органа в кН, (Gm)";key="gm";value="";edit_width=10;action = "(setq gm (atof $value))";}
  :edit_box{label="Расстояние от т. действия силы R до т. С (Xr), м";key="xr";value="";edit_width=10;action = "(setq xr (atof $value))";}
  :edit_box{label="Расстояние от оси Z до центра силы тяжести трактора (X1), м";key="x1";value="";edit_width=10;action = "(setq x1 (atof $value))";}
  :edit_box{label="Расстояние от т.С до центра силы тяжести раб.ограна (Xm), м";key="xm";value="";edit_width=10;action = "(setq xm (atof $value))";}
  :edit_box{label="Расстояние от т.С до точки приложения силы R2 (XL), м";key="XL";value="";edit_width=10;action = "(setq XL (atof $value))";}
  :edit_box{label="Расстояние от т.С до поверхности грунта (Zc), м";key="zc";value="";edit_width=10;action = "(setq zc (atof $value))";}
  :edit_box{label="База трактора (Lb), м";key="lb";value="";edit_width=10;action = "(setq lb (atof $value))";}
  :edit_box{label="Ширина гусеницы трактора (Bg), м";key="bg";value="";edit_width=10;action = "(setq bg (atof $value))";}

} //column параметры машины

  :row{//label="Готово_Отмена";
     fixed_width=true; //Минимальная ширина по объектам внутри
     alignment = centered;//Выровнян centered
:ok_button{label="Расчитать"; key="accept";
       is_default=true;   //Срабатывает, если нажат Enter
       is_cancel =false;  //Срабатывает, если нажат Х в правом верхнем углу
       is_tab_stop = true;//Фокус переключается между кнопками клавишей Tab
       fixed_width = true;//Ширина кнопки - по ширине надписи
      }//конец кнопки bt_Accept
     :button{    //кнопка
     key="bt_cancel";
     label="Отмена";
     is_default=false;
     is_cancel=true;
     is_tab_stop = true;
     fixed_width = true;
    }//конец кнопки bt_Cancel
     :button{    //Правая кнопка
     key="bt_help";
     label="Помощь";
     is_default=false;
     is_cancel=true;
     is_tab_stop = true;
     fixed_width = true;
    }//конец кнопки bt_Cancel
   }//конец Row
  
}// конец stat

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

(SetLayer "TEXT")
(defun SetLayer(name)
(command "layer" name "")
)

но оно работает не так как нужно, просто выскавает окно с выбором слоев и нужно нажимать ок на нужном слое, а хотелось бы это автоматизировать.

Re: LISP+DCL=зависание автокада. Помогите пожалуйста найти ошибки.

вместо слова статика ввести другое например statik, то окно закрывается.

Оно всегда закрывается. потому что Ok_button, а вот

(action_tile "accept" ... ) 

Почему-то никогда не обрабатывается, что-то ты в диалоге с кнопками перемутил.

не могу нормально считать данные из эдит_бокс.
если начальное значение стереть и ввести заново, то считываются, а если просто нажать на кнопку расчитать не трогая поля эдит_бокс, то значения из них не считываются.
нашел пока один выход: нужно по всем ячейкам пройтись щелкая по клавише ТАВ

Правильно, у тебя данные считываются в диалоге по action (действие над)  эдит_бокс, Tab-ом, как раз ты их и задействываешь.
А надо не в диалоге, а в Lisp-е, считать все значения

(action_tile 
"accept"
"(setq hk (atof (get_tile \"hk\"))
       ...
       lb (atof (get_tile \"lb\"))
 )"
) 

,а он у тебя что-то не работает  :(

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

У всех(ну или почти у всех) диалоговых команд, есть "дублёры" без диалога, вызываются они также, только с префиксом "-", в твоём случае "-layer"