Как определить корректное завершение штатной команды?

Автор Тема: Как определить корректное завершение штатной команды?  (Прочитано 8107 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Раньше все было просто: 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'ом, другие варианты решения не покатят :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Ага, я видел. В том-то и проблема: если в ACAD2013 запустить код, то при нажатии Esc - что на первый pause, что на второй - вернется nil. В 2016 такой номер уже не срабатывает :(
А определить, нажал пользователь Esc или нет - сильно хочется.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн frostmourn

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Какая причина не запрашивать заранее параметры и потом передавать в команду? Нужна интерактивность во время её выполнения?
И, кстати, что конкретно за команда?

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Например, _.-insert (динамическая вставка блока, блок "болтается" на курсоре). Или _.change (аналогичные условия).
Если для _.-insert в принципе можно получить последний примитив, после выполнения посмотреть, что изменилось - в общем, выкрутиться, то для _.change начинается уже значительно более мозголомная логика. Похоже, придется переписывать часть библиотечных функций :(
Печально...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн frostmourn

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Для _.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)
Это если в общих чертах. Похоже, не во всех случаях будет применимо.

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Вот-вот, под каждый чих придется делать свое решение. Печально :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!