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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Алексей Кулик от 25-04-2017, 20:52:33

Название: Как определить корректное завершение штатной команды?
Отправлено: Алексей Кулик от 25-04-2017, 20:52:33
Раньше все было просто: command (равно как command-s) всегда возвращали nil - что в случае успешного завершения команды, что в случае ее отмены. vl-cmdf в этом отношении была более адекватна: если команда была завершена корректно, возвращался t, если отменена - nil. В AutoCAD2016x64 (установлены все обновления) Eng и Rus элементарный код не работает так, как нужно:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun test ()
  2.   (alert (if (vl-cmdf "_.circle" pause pause)
  3.            "ok"
  4.            "cancel"
  5.          ) ;_ end of if
  6.   ) ;_ end of alert
  7. ) ;_ end of defun
Когда бы я ни нажимал на Esc, все равно выводится "ok".
Начиная с какой версии так подсуропили (то ли 2014, то ли 2015) - не столь суть важно. Важно то, что каким образом теперь определить, выполнил команду пользователь или отменил ее? Неужели придется извращаться по полной программе?
P.S. К сожалению, приходится пока обходиться только lisp'ом, другие варианты решения не покатят :(
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: Александр Ривилис от 26-04-2017, 09:19:50
Документация говорит, что (vl-cmdf) всегда возвращает T: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-AutoLISP/files/GUID-6F1AAB6B-D5B1-426A-A463-0CBE93E4D956-htm.html
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: Алексей Кулик от 26-04-2017, 09:22:11
Ага, я видел. В том-то и проблема: если в ACAD2013 запустить код, то при нажатии Esc - что на первый pause, что на второй - вернется nil. В 2016 такой номер уже не срабатывает :(
А определить, нажал пользователь Esc или нет - сильно хочется.
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: frostmourn от 28-04-2017, 17:09:09
Какая причина не запрашивать заранее параметры и потом передавать в команду? Нужна интерактивность во время её выполнения?
И, кстати, что конкретно за команда?
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: Алексей Кулик от 28-04-2017, 19:14:10
Например, _.-insert (динамическая вставка блока, блок "болтается" на курсоре). Или _.change (аналогичные условия).
Если для _.-insert в принципе можно получить последний примитив, после выполнения посмотреть, что изменилось - в общем, выкрутиться, то для _.change начинается уже значительно более мозголомная логика. Похоже, придется переписывать часть библиотечных функций :(
Печально...
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: frostmourn от 02-05-2017, 16:21:40
Для _.change можно попробовать запоминать состояние примитива, что-то типа такого:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_.change" (setq x (car(entsel)) y (entget x) x x) "" )
И после завершения команды сравнивать с текущим
Код - Auto/Visual Lisp [Выбрать]
  1. (setq x (entget x))
  2. (equal x y)
Это если в общих чертах. Похоже, не во всех случаях будет применимо.
Название: Re: Как определить корректное завершение штатной команды?
Отправлено: Алексей Кулик от 02-05-2017, 20:32:57
Вот-вот, под каждый чих придется делать свое решение. Печально :(