Ошибка отмены в 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, здесь может давать сбои.



Поделитесь своим мнением


Я не робот.