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

07/12/2016

Метки начала и конца отмены в лиспе

Почитав про транзакции в .NET, задумался: а если в лиспе сделать вложенные метки начала / конца отмены?

Отлично, попробуем. ACAD2016x64Eng, все обновления. Создаем несложный код:

Код - Auto/Visual LISP: [Выделить]
  1. (vl-load-com)
  2. (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  3.  
  4. (defun t1 ()
  5.   (vla-startundomark adoc)
  6.   (entmakex (list (cons 0 "LINE") (cons 10 '(0. 0. 0.)) (cons 11 '(10. 0. 0.)) (cons 62 1)))
  7.   (t2)
  8.   (entmakex (list (cons 0 "LINE") (cons 10 '(0. 20. 0.)) (cons 11 '(10. 20. 0.)) (cons 62 3)))
  9.   (vla-endundomark adoc)
  10.   (princ)
  11.   ) ;_ end of defun
  12.  
  13. (defun t2 ()
  14.   (vla-startundomark adoc)
  15.   (entmakex (list (cons 0 "LINE") (cons 10 '(0. 10. 0.)) (cons 11 '(10. 10. 0.)) (cons 62 2)))
  16.   (vla-endundomark adoc)
  17.   (princ)
  18.   ) ;_ end of defun

Естественно, вызываем (t1). Естественно, создается три отрезка. А что будет при нажатии Ctrl+Z? Теоретически отмениться должно сразу все: у нас получается одна "внешняя" отмена (сформирована в t1), и одна "внутренняя", или "вложенная" (сделана в t2):

1.Начало t1
2.Начало t2
3.Конец t2
4.Конец t1

При отмене выполненных действий, казалось бы, должна сработать отмена, сделанная только в t1 (все действия, описанные между шагами 1 и 4). Но, к сожалению, это не так: отменяется все, что описано между последними метками начала и конца, т.е. между шагами 2 и 4. При этом метка начала отмены все еще болтается в памяти. А это может привести к ошибке - AutoCAD просто откажется выполнять отмену действий, выводя сообщения вида

Код: [Выделить]
  1. Start of Group encountered.
  2. Must enter UNDO END to go back further.

При этом метод установки метки отмены (командный или vla-) не играет никакой роли, ситуация не меняется.

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

Автор: Алексей Кулик

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 07.12.2016