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

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

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

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

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

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 12:28. Причина: Удалил теги оформления текста
Просмотров: 5889
 
Непрочитано 07.10.2010, 15:13
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


А каким образом примитив удаляется?
Do$ вне форума  
 
Автор темы   Непрочитано 07.10.2010, 18:16
#3
Игорь Костюкович


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


Да любым. Разве это имеет значение? Командой _.erase, например...
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 12:30. Причина: Удалил теги оформления текста
Игорь Костюкович вне форума  
 
Непрочитано 08.10.2010, 00:51
1 | #4
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Попробуй добавить объектный реактор :vlr-openedForModify, на нём бери инфу с объекта, а потом, если сработает :vlr-erased, то просто используй считанную информацию.
Евгений А. вне форума  
 
Автор темы   Непрочитано 08.10.2010, 09:02
#5
Игорь Костюкович


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


Евгений, это, конечно, вариант, но...
Проблема в том, что объетный реактор должен "знать" те объекты, за которые он отвечает. Я же не знаю, какой из объектов пользователь вздумает удалить. Т.е. мне нужно контролировать ВСЮ базу примитивов, добавлять в список вновь созданные и т.д....
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 12:29. Причина: Удалил теги оформления текста
Игорь Костюкович вне форума  
 
Непрочитано 08.10.2010, 10:09
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Может быть функцией entdel восстанавливать примитив, брать с него данные и снова удалять?
Do$ вне форума  
 
Непрочитано 08.10.2010, 10:10
#7
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Хорошо, есть ешё :vlr-objectOpenedForModify (для vlr-acdb-reactor), там реастор на весь файл, а не на объект.
Евгений А. вне форума  
 
Непрочитано 08.10.2010, 10:18
1 | #8
TararykovDG

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


Игорь Костюкович, а если ипользовать командный реактор на событие "Вызвана команда системы AutoCAD". Например, при удалении объекта так
Код:
[Выделить все]
(vlr-command-reactor "Реактор команд: "
	      (list '(:vlr-commandWillStart . MyFun)
		    )
	      ) 

(defun MyFun(reac data / nbr)
  (if (= (car data) "ERASE")
    (if (setq nbr (cadr (ssgetfirst)))
      (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr)))) ; - список dxf кодов удаляемых объектов
      )
    )
)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 08.10.2010, 11:00
#9
Игорь Костюкович


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


Евгений, а ведь и вправду... Что-то у меня этот реактор выпал из поля зрения... Будем пробовать...
TararykovDG, интересное решение, но функция (ssgetfirst) в данном случае возвращает список (nil nil)... :-(
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 12:30. Причина: Удалил теги оформления текста
Игорь Костюкович вне форума  
 
Непрочитано 08.10.2010, 11:15
#10
TararykovDG

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


Цитата:
Сообщение от Игорь Костюкович Посмотреть сообщение
но функция (ssgetfirst) в данном случае возвращает список (nil nil)
Игорь Костюкович, а ты это проверил или только предполагаешь? Лично у меня если я выбрал и удаляю какой-то объект или набор выделенные объектов, то (ssgetfirst) возвращает что-то типа (nil <Selection set: 1e>) с набором объектов выбранных для удаления. Обрати внимание, что используется событие :vlr-commandWillStart, т. е. команда ACad'а только вызвана и еще не отработала и все объекты еще на местах и существуют, а значит и (ssgetfirst) должен их вернуть
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 08.10.2010, 11:40
#11
Игорь Костюкович


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


TararykovDG, проверил, естественно. AutoCAD 2008.Сейчас попробую на других версиях, но, полагаю, результат будет тот же...

В дополнение. Ваша схема работает. если сначала были выбраны объекты, а затем дана команда _erase. Если же сначала задана команда, а затем производится выбор объктов для удаления, то - увы - (nil nil)...
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!

Последний раз редактировалось Игорь Костюкович, 08.10.2010 в 11:56.
Игорь Костюкович вне форума  
 
Непрочитано 08.10.2010, 15:39
1 | #12
TararykovDG

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


Игорь Костюкович, да ты прав, если сначала задана команда, а затем производится выбор объктов для удаления, то - увы - (nil nil)... Есть такое предложение
Код:
[Выделить все]
(defun MyFun_3(reac data / ) ; действие при старте команды
  (if (member (car data) (list "ERASE" "_ERASE"))
    (if (setq nbr (cadr (ssgetfirst))) ; если удаляемые объекты были выбраны, то запоминаем их в глобальном наборе nbr
      (setq flag_sel T) ; замопинаем, что удаляемые объекты были выбраны
      (setq nbr (ssget "_X")
	    flag_sel nil
	    ) ; если же объекты не были выбраны, то запоминаем все объекты чертежа
      )
    )
  (if nbr
    (setq lst_obj_info (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr))))) ; запоминаем всю инфу о всех объектах, если оно вообще есть на чертеже
    )
)

(defun MyFun_4(reac data / item ed) ; действие после завершения команды
  (if (member (car data) (list "ERASE" "_ERASE"))
    (if (not flag_sel) ; если flag_sel = T, то у нас уже есть все удаляемые объекты
      (progn
	(foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr))) ; перебираем все объекты из набора
	  (if (setq ed (entget item)) ; если ed не равен nil, значит объект осталься на чертеже, если ed = T, значит объект был удален
	    (setq lst_obj_info (vl-remove ed lst_obj_info)) ; удаляем из списка не удаленные объекты
	    )
	  )
	)
      )
    )
  lst_obj_info
)

(setq dbr (vlr-command-reactor "Реактор команд: "
	      (list '(:vlr-commandWillStart . MyFun_3)
		    '(:vlr-commandEnded . MyFun_4)
		    )
	      )
	)
(vlr-pers dbr)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 08.10.2010, 16:21
#13
Игорь Костюкович


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


TararykovDG, огромное спасибо! На первый взгляд - то, что нужно. Протестирую подробнее, посмотрю, поверчу, о результатах доложу...
Ещё раз - спасибо.
__________________
Там всё есть для счастья, меня там только нет,
Так это значит, что я там - буду!
Игорь Костюкович вне форума  
 
Непрочитано 08.10.2010, 16:41
#14
TararykovDG

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


Игорь Костюкович, тестируй. Думаю, если что и не так, то можно будет дожать
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 10.10.2010, 21:07
#15
puma


 
Регистрация: 20.02.2009
Сообщений: 260


Не подскажите по похожей задачки: как запретить взрывание ("explode") определенных блоков (имеют определенное имя)? Заранее спасибо.
puma вне форума  
 
Непрочитано 10.10.2010, 21:37
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Установи для них в свойствах (если, конечно, AutoCAD не ниже 2008) explodeable -> нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2010, 22:01
#17
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


В 2006 версии тоже можно, ниже - не знаю.
Евгений А. вне форума  
 
Непрочитано 10.10.2010, 22:01
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Offtop: У меня дома установлен только 2011, так что насчет ранних версий - "тут помню, тут не помню"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2010, 22:36
#19
puma


 
Регистрация: 20.02.2009
Сообщений: 260


Спасибо огромное, помогло. А можно понаглеть: нет чего-нибудь подобного для штриховок и размеров? а то соседи часто случайно разбивают их.
puma вне форума  
 
Непрочитано 11.10.2010, 11:19
#20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от puma Посмотреть сообщение
нет чего-нибудь подобного для штриховок и размеров?
Заблокировать слои со штриховками и размерами. Чтобы чертить правильно можно применить это (как вариант): Автоматический перенос размеров на слой размеры. Break макро
__________________
Как использовать код на Лиспе читаем здесь
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