Метки начала и конца отмены в лиспе
Почитав про транзакции в .NET, задумался: а если в лиспе сделать вложенные метки начала / конца отмены?
Отлично, попробуем. ACAD2016x64Eng, все обновления. Создаем несложный код:
- (vl-load-com)
- (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
- (defun t1 ()
- (vla-startundomark adoc)
- (entmakex (list (cons 0 "LINE") (cons 10 '(0. 0. 0.)) (cons 11 '(10. 0. 0.)) (cons 62 1)))
- (t2)
- (entmakex (list (cons 0 "LINE") (cons 10 '(0. 20. 0.)) (cons 11 '(10. 20. 0.)) (cons 62 3)))
- (vla-endundomark adoc)
- (princ)
- ) ;_ end of defun
- (defun t2 ()
- (vla-startundomark adoc)
- (entmakex (list (cons 0 "LINE") (cons 10 '(0. 10. 0.)) (cons 11 '(10. 10. 0.)) (cons 62 2)))
- (vla-endundomark adoc)
- (princ)
- ) ;_ end of defun
Естественно, вызываем (t1). Естественно, создается три отрезка. А что будет при нажатии Ctrl+Z? Теоретически отмениться должно сразу все: у нас получается одна "внешняя" отмена (сформирована в t1), и одна "внутренняя", или "вложенная" (сделана в t2):
1. | Начало t1 | |
2. | Начало t2 | |
3. | Конец t2 | |
4. | Конец t1 |
При отмене выполненных действий, казалось бы, должна сработать отмена, сделанная только в t1 (все действия, описанные между шагами 1 и 4). Но, к сожалению, это не так: отменяется все, что описано между последними метками начала и конца, т.е. между шагами 2 и 4. При этом метка начала отмены все еще болтается в памяти. А это может привести к ошибке - AutoCAD просто откажется выполнять отмену действий, выводя сообщения вида
- Start of Group encountered.
- Must enter UNDO END to go back further.
При этом метод установки метки отмены (командный или vla-) не играет никакой роли, ситуация не меняется.
Поэтому при написании кодов не стоит злоупотреблять метками отмены, проставляемыми бессистемно.
Автор: Алексей Кулик
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 07.12.2016