Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Балиев от 17-05-2017, 14:59:52

Название: Не перехватывается сообщение об ошибке.
Отправлено: Балиев от 17-05-2017, 14:59:52
День добрый!

Хочу перехватить сообщение об ошибке при выполнении команды следующим образом:
Код - Auto/Visual Lisp [Выбрать]
  1.                 (setq oldError *error*)
  2.                 (defun *error* ()
  3.                         (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  4.                         (exit)
  5.                 )
  6.                 (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  7.                 (setq *error* oldError)
  8.  

Проблема в том, что когда команда sweep не выполняется, то в текстовом экране появляется сообщение:
"Ошибка операции моделирования:
     Выполнение сдвига привело к созданию недопустимой поверхности.

Сдвиг 1 выбранных объектов невозможен."

Но при этом сообщение через функцию *error* не перехватывается и приложение работу не останавливает. В чем причина?

Заранее благодарен.
Леонид
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Дмитрий Загорулькин от 17-05-2017, 19:15:39
Возможно, причина в том, что это ошибка другого контекста, с которым не работает *error*.
Попробуйте еще заменить vl-cmdf на command (или command-s). Если не поможет - тогда увы.
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Александр Ривилис от 17-05-2017, 20:42:19
Проблема в том, что когда команда sweep не выполняется, то в текстовом экране появляется сообщение:
"Ошибка операции моделирования:
     Выполнение сдвига привело к созданию недопустимой поверхности.

Сдвиг 1 выбранных объектов невозможен."

Но при этом сообщение через функцию *error* не перехватывается и приложение работу не останавливает. В чем причина?
Такого рода ошибки не отлавливаются ни в одной функции обработки ошибок, но ты можешь сравнить значение (entlast) до выполнения команды и после неё.
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Балиев от 18-05-2017, 14:37:03
Цитировать
Такого рода ошибки не отлавливаются ни в одной функции обработки ошибок, но ты можешь сравнить значение (entlast) до выполнения команды и после неё.
Да, это работает. Примерно так, если кому интересно:

Код - Auto/Visual Lisp [Выбрать]
  1.                 (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  2.                 (if (/= (cdr (assoc 0 (entget (entlast)))) "3DSOLID")
  3.                         (progn
  4.                                 (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  5.                                 (exit)
  6.                         ) ; end progn          
  7.                 ) ; end if
  8.  
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Александр Ривилис от 18-05-2017, 14:42:05
Да, это работает. Примерно так, если кому интересно:
Это если последний примитив перед запуском команды _.SWEEP был не 3DSOLID. Если логика программы такова, то всё нормально.
Но правильнее (универсальнее) так:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq enlast (entlast))
  2. (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  3. (if (eq enlast (entlast))  ;; Исправил по замечанию Балиева
  4.   (progn
  5.       (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  6.       (exit)
  7.   ) ; end progn          
  8. ) ; end if
И это подходит для любой команды, которая создаёт примитивы.
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Балиев от 18-05-2017, 14:49:18
И это подходит для любой команды, которая создаёт примитивы.
Согласен. Но только вместо (if (/= enlast (entlast)) нужно (if (eq enlast (entlast)).
Название: Re: Не перехватывается сообщение об ошибке.
Отправлено: Александр Ривилис от 18-05-2017, 15:10:15
Согласен. Но только вместо (if (/= enlast (entlast)) нужно (if (eq enlast (entlast)).
Согласен. Исправил код чтобы не вводить никого в заблуждение.