Реактор на удаление объекта - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реактор на удаление объекта

Реактор на удаление объекта

Ответ
Поиск в этой теме
Непрочитано 07.10.2010, 15:09
Реактор на удаление объекта
Игорь Костюкович
 
Минск
Регистрация: 31.07.2009
Сообщений: 40

100 лет не писал на лиспе...
Задача стоит так: при удалении примитива, нужно сохранить некоторую информацию о нём, например имя слоя, с которого он был удалён. Пробую решение "в лоб": создаю реактор на событие "удаление объекта". Реактор отрабатывает нормально, но по указателю примитива, который возвращается в функцию отклика, уже ничего получить невозможно - это и понятно, примитив-то уже удалён.
Вопрос: какими обходными путями воспользоваться? Как получить информацию о примитиве до его удаления из базы рисунка?
И ещё в перспективе маячит задача с использованием реакторов: запретить сохранение рисунка под определённым (текущим) именем...
Заранее спасибо за помощь.
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 12:28. Причина: Удалил теги оформления текста
Просмотров: 6123
 
Автор темы   Непрочитано 11.10.2010, 13:56
#21
Игорь Костюкович


 
Регистрация: 31.07.2009
Минск
Сообщений: 40


TararykovDG, нашлась проблемка при предложенном Вами подходе. Тестировал на достаточно загруженном чертеже (порядка 80 тыс. примитивов). Терпения хватило на 10 минут ожидания, затем сбросил процесс. Вывод: пересчитывать всю базу примитивов не есть правильно. Всё-таки нужно найти какой-то способ вытянуть данные удаляемого примитива в промежутке между его выбором для удаления и реальным его удалением...
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!
Игорь Костюкович вне форума  
 
Непрочитано 12.10.2010, 16:45
#22
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Игорь Костюкович Посмотреть сообщение
Тестировал на достаточно загруженном чертеже (порядка 80 тыс. примитивов). Терпения хватило на 10 минут ожидания, затем сбросил процесс. Вывод: пересчитывать всю базу примитивов не есть правильно. Всё-таки нужно найти какой-то способ вытянуть данные удаляемого примитива в промежутке между его выбором для удаления и реальным его удалением...


Игорь Костюкович, ну при таком количестве объектов - это было очивидно. Но мы не сдадимся, попробуй так
Код:
[Выделить все]
(defun Erased(reac data / ) ; удаляется какой-то объект
  (if (not flag_first_del) ; если удаляем первый раз
    (setq lst_del_obj (cons (last data) lst_del_obj)) ; заносим удаляемый объект в список
    )
)

(defun WillStart(reac data / ) ; старт какой-то команды ACad
  (if (member (car data) (list "ERASE" "_ERASE")) ; если это команда удаления
    (setq lst_del_obj nil
	  lst_info_del_obj nil
	  flag_first_del nil
	  )
    )
)

(defun Ended(reac data / ) ; конец какой-то команды ACad
  (if (member (car data) (list "ERASE" "_ERASE")) ; если это команда удаления
    (if lst_del_obj ; если список (сформированный в Erased) не пустой
      (progn
	(setq flag_first_del T) ; запоминаем что объекты уже удалены
        (setq lst_info_del_obj (mapcar '(lambda (del_obj) (entget (entdel del_obj))) lst_del_obj)) ; восстанавливаем удаленные объекты и формируем список с инфой по ним
	(mapcar 'entdel lst_del_obj) ; снова удаляем восстановленные объекты
	)
      )
    )
)

(setq dbr (vlr-acdb-reactor "Реактор базы чертежа: "
	      (list '(:vlr-objectErased . Erased)
		    )
	      )
	)

(setq cmdr (vlr-command-reactor "Реактор команд: "
	     (list '(:vlr-commandWillStart . WillStart)
		   '(:vlr-commandEnded . Ended)
		   )
	     )
      )
После выполнения в списке lst_info_del_obj должна быть вся инфа по удаленным объектам. Скорость выполнения никак не должна зависеть от общего числа объектов на чертеже, а вот от числа удаляемых объектов зависеть будет, так что если будешь удалять (80 тыс. примитивов), то ...
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 12.10.2010, 17:09
#23
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
вот от числа удаляемых объектов зависеть будет, так что если будешь удалять (80 тыс. примитивов), то ...
то просто будет последовательность _ERASE _OOPS _ERASE.
TararykovDG, - маладца. Думаю что это приемлемый вариант для Игоря.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.10.2010, 19:06
#24
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от VVA Посмотреть сообщение
TararykovDG, - маладца. Думаю что это приемлемый вариант для Игоря.


VVA, приятно получит такую оценку от Вас, если конечно это не ирония. Судя по тому, что Вы и Игорь из одного города можно предположить, что Вы знакомы. Однако посмотрим, что скажет сам Игорь по поводу предложенного варианта .
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 13.10.2010, 15:20
#25
Игорь Костюкович


 
Регистрация: 31.07.2009
Минск
Сообщений: 40


TararykovDG, огромное СПАСИБО! Действительно, работает так, как нужно. В том же чертеже (80 тыс. примитивов) удалил одной командой _erase (исключительно в целях эксперимента ) 11825 примитивов. Результат получил через 4.22 с.
Тестировать более подробно пока нет времени, но уже понятно, что результат достигнут. Ещё раз - спасибо...
Offtop: С VVA, мы действительно знакомы, хотя работаем в разных организациях и над разными проблемами...
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!
Игорь Костюкович вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реактор на удаление объекта



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
результат работ команд purge и audit lex0101 Программирование 23 13.02.2012 08:34
AutoCAD 2011 при копировании не вставляет в другой чертеж Maxxwell AutoCAD 7 07.05.2010 14:44
Удаление объекта при удалении штриховки и фиксация палитр кнопок hwd AutoCAD 2 11.02.2010 13:03
Удаление объекта СПДС валит Acad! Protreck AutoCAD 8 09.11.2008 23:25