Тема: Найти ошибку в маленьком куске кода

Не могу найти ошибку в коде на autolisp

(defun ddd()
   (setq dcl_id (load_dialog "C:/dia.dcl"))
   (new_dialog "dd_edit" dcl_id)
   (action_tile "accept" "(done_dialog)(rem_Data)")
   (start_dialog)
  )
(defun rem_Data()
   (command "_box" (list 10 10 10) (list 50 50 50))   
)


Прога открывает диалоговое окно и вешает событие на кнопку ОК:

  (action_tile "accept" "(done_dialog)(rem_Data)")


Т.е. при нажатии на ОК окно закрывается и выполняется функция rem_Data, в которой выполняется стандартная команда autocad
НО! Почему-то в обработчике rem_Data выполняется всё, кроме команд автокада, как в примере:

(command "_box" (list 10 10 10) (list 50 50 50))   

На этом месте всё виснет:(( Хотя любые другие операторы, вычисления и прочее выполняется.

(изменено: Александр Пекшев aka Modis, 22 ноября 2011г. 20:37:06)

Re: Найти ошибку в маленьком куске кода

А может все-же так:

(command "_box" "10,10,10" "50,50,50")

Re: Найти ошибку в маленьком куске кода

Не суть важно. Смысл в том, что вообще, если это команда, т.е. (command "..."), то всё виснет. Хотя попробовал по-твоему, но проблема всё равно не исчезла.

Re: Найти ошибку в маленьком куске кода

Ах, не правильно понял вопрос :)
Если честно, то лисп я уже забыл... но я вот например не вижу у тебя (unload_dialog)
Вообще типа того должно быть (без проверки):

(defun ddd() 
(setq dcl_id (load_dialog "C:/dia.dcl")) 
(new_dialog "dd_edit" dcl_id) 
(action_tile "accept" "(done_dialog 1)") 
(setq step (start_dialog))
    (cond
  ((= step 1)
       (rem_Data)
       )
); cond
  ); while step
  (unload_dialog dcl_id)
  (princ)
)
(defun rem_Data() 
(command "_box" (list 10 10 10) (list 50 50 50)) 
) 

Re: Найти ошибку в маленьком куске кода

Вроде бы что-то пропущено

 ); while step 

Не могу найти открывающую скобку. И автокад на неё ругается:(

Re: Найти ошибку в маленьком куске кода

Сижу и думаю - что меня тут смущает. На лиспе кодил давноооо, но чую что что-то не так... И вспомнил наконец! - Нельзя использовать command при открытых диалоговых окнах!

Re: Найти ошибку в маленьком куске кода

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

Re: Найти ошибку в маленьком куске кода

Ну как минимум три варианта:
1. Создать куб, используя entmake
2. Создать куб, используя ActiveX
3. Использовать command после закрытия диалога

С примером я пасс - не помню ничего из лиспа :)

Re: Найти ошибку в маленьком куске кода

Третий вариант более очевидный. Я так понимаю, нужно принудительно закрыть окно. Это не помнишь как делается?

Re: Найти ошибку в маленьком куске кода

(unload_dialog) выгружает вроде
Вообще - полазий по форуму - есть куча примеров

Re: Найти ошибку в маленьком куске кода

Андрей Андрей пишет:

На этом месте всё виснет( Хотя любые другие операторы, вычисления и прочее выполняется.

Я обычно делаю так для простоты
отслеживаю значение в done_dialog
смотри для accept и cancel , переменные по возможности или ситуации
держи в локальных (за косой чертой)

(defun rem_Data() 
(command "_box" "_non" (list 10 10 10) "_non" (list 50 50 50)) 
)


(defun c:demo(/ dcl_id pick)
(setq dcl_id (load_dialog "C:\dia.dcl")) 
(new_dialog "dd_edit" dcl_id) 
(action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
(setq pick (start_dialog) )
  (unload_dialog dcl_id)
(if (= 1 pick)
 ( rem_Data)
  )
(princ)
)

Re: Найти ошибку в маленьком куске кода

Я немножко не понял, до меня туго доходит, что такое done_dialog 1 и done_dialog 2. Ну а здравый смысл мне подсказывает, что

(setq pick (start_dialog) ) 
  (unload_dialog dcl_id) 

Окно открывается и тут же закрывается

Re: Найти ошибку в маленьком куске кода

Загрузи код и запусти команду DEMO

(изменено: Андрей Андрей, 23 ноября 2011г. 18:57:51)

Re: Найти ошибку в маленьком куске кода

Всё работает, спасибо!

Re: Найти ошибку в маленьком куске кода

Не за что
:)