Ошибка отмены в AutoCAD
Никогда не сталкивались с ситуацией, когда запускается какой-то лисп несколько раз (ну или выполняется отладка), и потом при попытке отмены действий AutoCAD выдает
Start of Group encountered.
Must enter UNDO END to go back further.
Вопросы стандартные: "кто виноват" и "что делать".
Кто виноват? Автор лиспа.
Что делать? Редактировать лисп. Рассмотрим пример "плохого" кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 | (vl-load-com) (defun c:cmd (/ *error* adoc) (defun *error* (msg) (vla-endundomark adoc) (princ msg) (princ) ) ;_ end of defun (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) ;; <...> Что-то делаем (princ) ) ;_ end of defun |
Обратите внимание: в случае нормального завершения работы ставится метка начала отмены, но не ставится метка конца отмены!. Но при этом метка конца отмены стоит в функции обработки ошибки (*error*). Для того, чтобы избежать появления ситуации с невозможностью корректно отменить какие-либо действия, достаточно внутрь кода перед последней
1 | (princ) |
ввести
1 | (vla-endundomark adoc) |
Если вдруг такая ситуация приключилась, работать надо продолжать, то самое простое - это дать команду
1 2 3 | Command: _UNDO Current settings: Auto = On, Control = All, Combine = Yes, Layer = Yes Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back] <1>: _end |
По крайней мере разово ситуация будет решена. Но в дальнейшем надо будет править исходный код.
По моему опыту могу сказать следующее: при разработке лучше всего избегать вложенных конструкций начала-конца отмены:
1 2 3 4 5 6 7 | (vla-startundomark adoc) ; start1 ;; <...> (vla-startundomark adoc) ; start2 ;; <...> (vla-endundomark adoc) ; end2 ;; <...> (vla-endundomark adoc) ; end1 |
Намного лучше будет использовать все же одну пару начала-конца отмены. По какому правилу будут выполняться отмены - то ли пара start1-end1, то ли start2-end1, то ли еще как - предсказать лично мне тяжеловато. Правило вложенных транзакций, которым так легко можно пользоваться при разработке на .NET, здесь может давать сбои.