Jump to content

Бесконечный цикл undo в Lisp


Recommended Posts

Вопрос перемещён из темы http://forum.nanocad...indpost&p=25654

 

Запускаю простейший лисп:

(defun c:test ( / )
(command "_.undo" "_be")
(command "_.line" "0.0,0.0" "10,10" "")
(command "_.line" "0,0" "0,10" "")
(command "_.line" "10,10" "0,10" "")
(command "_.undo" "_e")
)

Получаю бесконечный цикл undo...

Видимо опции undo еще не реализованы, хотя по идее программа должна выдавать ошибку и завершаться...

Link to comment
Share on other sites

Действительно, вызов команды UNDO из Lisp приводит к закцикливанию. Из цикла удаётся выйти по Esc.

 

Записал дефект #154 в Клуб разработчиков.

 

В настоящее время опции Begin и End не реализованы, поэтому вызовы undo имеет смысл закомментировать.

Link to comment
Share on other sites

В настоящее время опции Begin и End не реализованы, поэтому вызовы undo имеет смысл закомментировать.

Без undo можно конечно, но пользователю будет тяжко. Собственно все мои программы используют управление маркерами отмены. А этот дефект был замечен после того, как был замечен баг с vla-StartUndoMark и vla-EndUndoMark. В программе они не приводили к ошибке, но после выполнения программы отмена уже не работала...

Link to comment
Share on other sites

Методы StartUndoMark и EndUndoMark не реализованы. Записал в багтрекер Клуба разработчиков пожелание #155.

 

Не можем понять, как эти вызовы влияют на функционирование отмены. Замена (command "_.undo" "_be") на (vla-StartUndoMark) к описанному эффекту не привела.

 

(defun c:test ( / )
 (vl-load-com)
 (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object)))
 (vla-StartUndoMark thisdrawing)
 (command "_.line" "0.0,0.0" "10,10" "")
 (command "_.line" "0,0" "0,10" "")
 (command "_.line" "10,10" "0,10" "")
 (vla-EndUndoMark thisdrawing)
)

 

Можно пример?

Link to comment
Share on other sites

Можно пример?

Кажется разобрался.

Первое не так: undo удаляет все, что нарисовано лиспом с помощью command одним махом, вместо того, чтоб удалять по одной линии или по одной команде.

Второе не так: undo игнорирует нарисованное с помощью entmake, vla- не пробовал...

Усложним задачу чуть-чуть:

(defun c:test ( /  mkpline)

 (defun mkpline (flag lyr lst)
   (entmake
     (append
       (list
        '(0 . "LWPOLYLINE")
        '(100 . "AcDbEntity")
        '(100 . "AcDbPolyline")
         (cons 8 lyr)
         (cons 90 (length lst))
         (cons 70 flag)
        '(210 0.0 0.0 1.0)
       )
       (mapcar '(lambda (x) (cons 10 x)) lst)
     )
   )
 )

 (vl-load-com)

 (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object)))

 (vla-StartUndoMark thisdrawing)

 (command "_.line" "0.0,0.0" "10,10" "")
 (command "_.line" "0,0" "0,10" "")
 (command "_.line" "10,10" "0,10" "")

 (mkpline  1 "0" '((0 0) (100 50)(10 50)))

 (vla-EndUndoMark thisdrawing)
)

Если выполнить этот код, будут нарисованы два прямоугольника, один с помощью command, другой с помощью entmake. Если теперь нажать отмену, то удалится только первый, причем второй будет существовать, пока не выполнить регенерацию. Как я понимаю vla-StartUndoMark и vla-EndUndoMark добавлены только для совместимости, а по сути пустышки...

Edited by gomer
Link to comment
Share on other sites

Эффекты 1 и 2 нам известны.

 

По первому (entmake) записал в багтрекер Клуба разработчиков дефект #156.

 

Чем второй эффект (удаление всех отрезков зараз) плох? Есть ситуации, когда это действительно мешает работать, а не просто непривычно?

Link to comment
Share on other sites

Просто есть приемы, используемые программистами, в котором задействованы маркеры отмены, не раз замечал во многих старых лиспах. Делается это для отрисовки предварительной картинки с возможностью отмены одной, нескольких или всех операций. Думаю при адаптации таких лиспов возникнут проблемы.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...