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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: 1958 от 13-07-2017, 11:36:02

Название: Отмена действий
Отправлено: 1958 от 13-07-2017, 11:36:02
Искал ответ на вопрос, но не нашёл. Наверно, плохо искал.  :'(
Суть вопроса:
1. делаю выборку по признаку ACAD_PROXY_ENTITY
2. ставлю метку (vla-startundomark adoc)
3. расчленяю набор командой (vl-cmdf "_explode" (ssname ss i))
4. ставлю метку (vla-endundomark adoc)
5. теперь делаю выборку по признаку "CIRCLE" среди расчлененных элементов
6. если окружности в новом наборе имеются, то продолжаю дальнейшие действия.

А если в новом наборе нет окружностей, то как мне отменить действия между метками?
(vl-cmdf "_undo" ... ? )
Что записать в команде? Какие параметры?
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 13-07-2017, 12:07:33
3. расчленяю набор командой (vl-cmdf "_explode" (ssname ss i))
Тут расчленяется не набор, а один выбранный примитив.
6. если окружности в новом наборе имеются, то продолжаю дальнейшие действия.

А если в новом наборе нет окружностей, то как мне отменить действия между метками?
(vl-cmdf "_undo" ... ? )
Что записать в команде? Какие параметры?
Попробуй:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_u")
Название: Re: Отмена действий
Отправлено: 1958 от 13-07-2017, 12:46:09
Тут расчленяется не набор, а один выбранный примитив.
У меня там идет перебор в цикле, не стал расписывать досконально в сообщении.
(vl-cmdf "_u")
Не работает, т.е. прокси-объекты (вернее их остатки) остаются расчлененными.
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 13-07-2017, 14:40:51
Можно еще попробовать
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "1")
Только я вот думаю, что в этом контексте не поможет.
Название: Re: Отмена действий
Отправлено: 1958 от 13-07-2017, 15:28:12
Можно еще попробовать
Код - Auto/Visual Lisp [Выбрать]
(vl-cmdf "_undo" "1")
Только я вот думаю, что в этом контексте не поможет.
Нет, не работает.
Наверно, надо в
1. делаю выборку по признаку ACAD_PROXY_ENTITY
сделать копию выбранного в качестве образца ACAD_PROXY_ENTITY на промежуточный слой, расчленить его, потом анализ на содержание в нем круга и удаление (очистка) промежуточного слоя.
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 13-07-2017, 15:53:48
сделать копию выбранного в качестве образца ACAD_PROXY_ENTITY на промежуточный слой, расчленить его, потом анализ на содержание в нем круга и удаление (очистка) промежуточного слоя.
Это правильно, но не всегда возможно - далеко не все прокси-примитивы можно копировать, а тем более менять им слой.
Название: Re: Отмена действий
Отправлено: 1958 от 13-07-2017, 20:51:06
(vl-cmdf "_undo" "1")
Попробовал такой вариант:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "5")
Вроде работает.
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 13-07-2017, 23:37:45
Попробовал такой вариант:
Код - Auto/Visual Lisp [Выбрать]

    (vl-cmdf "_undo" "5")

Вроде работает.
По меньшей мере странно.
Название: Re: Отмена действий
Отправлено: 1958 от 14-07-2017, 03:12:37
По меньшей мере странно.

1 - авто;
2 - управление;
3 - начало;
4 - конец;
5 - метка;
6 - обратно.

Вы предложили <1>, не сработало. А вот <5> (возврат к метке) - работает. Вроде логично. Погоняю еще немного на работе с разными файлами.
Название: Re: Отмена действий
Отправлено: Алексей Кулик от 14-07-2017, 07:55:19
Мне кажется, что 5 в данном случае будет пониматься не как "Метка", а как количество отменяемых шагов.
Название: Re: Отмена действий
Отправлено: 1958 от 14-07-2017, 08:13:13
Мне кажется, что 5 в данном случае будет пониматься не как "Метка", а как количество отменяемых шагов.
Возможно. Но, Вы посмотрите рисунок запроса действий на команду undo.
Название: Re: Отмена действий
Отправлено: Алексей Кулик от 14-07-2017, 11:48:28
Смотрел. Много раз смотрел :)
Делать видео лениво, поэтому сделаем небольшой код:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun tt (/ adoc x s)
  4.   (setq x    0.
  5.         s    50.
  6.         adoc (vla-get-activedocument (vlax-get-acad-object))
  7.         ) ;_ end of setq
  8.   (repeat 15
  9.     (vla-startundomark adoc)
  10.     (entmakex (list '(0 . "circle") (cons 10 (list x 0. 0.)) (cons 40 (* s 0.4))))
  11.     (setq x (+ x s))
  12.     (vla-endundomark adoc)
  13.     ) ;_ end of repeat
  14.   (princ)
  15.   ) ;_ end of defun
После выполнения делаем _.undo и нажимаем, к примеру, 8. Смотрим на результат :)
Название: Re: Отмена действий
Отправлено: German от 14-07-2017, 14:05:48
А параметр "Mark" не работает? Я имею ввиду, что-то вроде:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "M")
Название: Re: Отмена действий
Отправлено: Алексей Кулик от 14-07-2017, 14:09:15
Конечно работает! 1958, как мне кажется, просто перепутал количество отменяемых действий и порядковый номер опции :)
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 14-07-2017, 14:11:31
А параметр "Mark" не работает? Я имею ввиду, что-то вроде:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "M")
Тогда уж так. Отмечаем точку, до которой нужно откатиться:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "_mark")
Если нужно откатиться, то вызываем:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-cmdf "_undo" "_back")
Название: Re: Отмена действий
Отправлено: German от 14-07-2017, 14:17:26
Если нужно откатиться, то вызываем:

Я это и имел ввиду, просто не использовал никогда. Похоже, если такие метки проставлены в цикле, то каждый "_back" будет возвращать к предыдущей метке.
Мне кажется, об этом 1958, и спрашивал изначально.
Название: Re: Отмена действий
Отправлено: 1958 от 14-07-2017, 14:49:37
Конечно работает! 1958, как мне кажется, просто перепутал количество отменяемых действий и порядковый номер опции
Погоняв Ваш код, признаю свою ошибку.
Тогда уж так. Отмечаем точку, до которой нужно откатиться:
Где и как в коде Алексея отметить точку отката? Прошу прощения за наивный вопрос.
Всё! Разобрался.
Спасибо всем.
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 14-07-2017, 17:51:50
Всё! Разобрался.
Спасибо всем.
Ну так поделись своим решением. У нас так принято...
Название: Re: Отмена действий
Отправлено: 1958 от 14-07-2017, 17:57:30
Ну так поделись своим решением. У нас так принято...
Да какое там решение!

Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (defun c:tt (/ adoc x s)
  3.   (setq x    0.
  4.         s    50.
  5.         adoc (vla-get-activedocument (vlax-get-acad-object))
  6.         ) ;_ end of setq
  7.  (vl-cmdf "_undo" "_mark")
  8.   (repeat 15
  9.     (vla-startundomark adoc)
  10.     (entmakex (list '(0 . "circle") (cons 10 (list x 0. 0.)) (cons 40 (* s 0.4))))
  11.     (setq x (+ x s))
  12.     (vla-endundomark adoc)
  13.     ) ;_ end of repeat
  14.   (princ)
  15.  (alert "выполнено")
  16.  (vl-cmdf "_undo" "_back")
  17.   ) ;_ end of defun
Название: Re: Отмена действий
Отправлено: Александр Ривилис от 14-07-2017, 18:04:17
Да какое там решение!
Вот уж точно! :) Тебе в этом цикле совсем не нужны вызовы (vla-startundomark adoc) и (vla-endundomark adoc) - они лишние.
Название: Re: Отмена действий
Отправлено: 1958 от 14-07-2017, 20:30:43
Вот уж точно!  Тебе в этом цикле совсем не нужны вызовы (vla-startundomark adoc) и (vla-endundomark adoc) - они лишние.
Я просто в код Алексея добавил три строки, чтобы посмотреть что будет. А в своем основном лиспе (из-за которого весь сыр-бор) функции (vla-startundomark adoc) и (vla-endundomark adoc) я убрал. Еще раз спасибо!