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

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

Показать в диспетчере слоев слой выбранного объекта

Ответ
Поиск в этой теме
Непрочитано 21.11.2017, 12:31 #1
Показать в диспетчере слоев слой выбранного объекта
olga87
 
Регистрация: 28.05.2007
Сообщений: 207

Здравствуйте Уважаемые программисты!
Подскажите пожалуйста как изменить код ниже (lisp cad 2007), чтобы после выбора объекта на чертеже открывалось окно "Диспетчер свойств слоев", в котором была бы выделена строка со слоем на котором расположен выделенный объект, при этом чтобы слой выделенного объекта не становился текущим.
Спасибо!
Код:
[Выделить все]
(defun c:chlayer ()
(setq entlist (entget (car (entsel "\nВыберите объект: "))))
(setvar "clayer" (cdr (assoc 8 entlist)))
)
Просмотров: 2093
 
Непрочитано 21.11.2017, 12:45
#2
Кулик Алексей aka kpblc
Moderator

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


Первое - (command-s "_.layer")
А по второму, но-моему, никак. Слой выбранного объекта и так показывается в выпадающем списке и в панели свойств.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.11.2017, 12:50
#3
olga87


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


Иногда нужно быстро зайти в Диспетчер слоев и изменить свойства слоя (цвет, тип линии, вес и др.) выделенного объекта.
olga87 вне форума  
 
Непрочитано 21.11.2017, 13:00
#4
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от olga87 Посмотреть сообщение
Иногда нужно быстро зайти в Диспетчер слоев и изменить свойства слоя (цвет, тип линии, вес и др.) выделенного объекта.
А ты понимаешь, что тем самым изменишь свойства ВСЕХ (а не только выбранного) объектов, "находящихся" на этом слое? Может, лучше изменить локальные свойства локального (выбранного) объекта?
Setvar вне форума  
 
Автор темы   Непрочитано 21.11.2017, 14:10
#5
olga87


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


Бывает просто надо быстро посмотреть все состояния слоя объекта, если есть проблемы с печатью и др. Может быть переименовать слой.
olga87 вне форума  
 
Непрочитано 23.11.2017, 16:46
#6
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


olga87, идея оказалась для меня понятна и близка. Действительно, часто хочешь переименовать слой какого-то объекта на чертеже или изменить цвет слоя, а найти его в диспетчере среди сотен других, в т.ч. принадлежащих внешним ссылкам, проблематично. Знаю, можно в окне поиска диспетчера слоев набрать имя нужного слоя, используя "*", но все же я решил написать под это дело реактор, а точнее, подправить тот, что у меня уже был.

Итак, надо обеспечить автозагрузку приведенного ниже кода. Он отслеживает событие изменения набора объектов, как то: выбор первого объекта, выбор каждого последующего, сброс выбора - в общем, любые изменения количества выделенных примитивов, подсвеченных ручками. Если выбран один объект, то его слой станет активным. Если в это время активен диспетчер слоев, то в нем соответствующий слой подсветится галочкой. Если в чертеже слоев много и их список не умещается в экране, то можно отсортировать слои по статусу, нажав на заголовок столбца "Статус", тогда активный слой всегда будет сверху. Если выбран второй объект или выбор сброшен (количество подсвеченных объектов не равно 1), то активируется слой, который был активным до этого.
Код:
[Выделить все]
 (vl-load-com)

; Функция действия на событие описанное в реакторе
(defun pickfirstModified (reac data / oldSHORTCUTMENU ss i en_i len en)
	(if (and (setq ss (cadr (ssgetfirst))) (= (sslength ss) 1))
		(progn
			(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
				  en_obj  (ssname ss 0)
				  vla_obj (vlax-ename->vla-object en_obj)
				  *CURRENT_LAYER* (vla-get-ActiveLayer adoc)
			)
			(vla-put-ActiveLayer adoc (vla-Item (vla-get-Layers adoc) (vla-get-Layer vla_obj)))
			(if (= (cdr (assoc 0 (entget en_obj))) "INSERT")
				(princ (strcat "\nИмя блока: \"" (vlax-get-property vla_obj 'EffectiveName) "\""))			
			)
		)
		(if *CURRENT_LAYER*
			(progn 
				(vla-put-ActiveLayer adoc *CURRENT_LAYER*)
				(setq *CURRENT_LAYER* nil)
			)
		)
	)
)

;------------------------------------------------------------
; Реактор
	(if (null *MISC_REACTOR*) 
		(setq *MISC_REACTOR* (vlr-miscellaneous-reactor nil
							(list
								'(:VLR-pickfirstModified . pickfirstModified)
							)
						)
		)
	)
;------------------------------------------------------------

P.S.: olga87, в код добавлен небольшой сюрприз. Подсказка: нужно попробовать выбрать блок

Последний раз редактировалось skkkk, 23.11.2017 в 18:05.
skkkk вне форума  
 
Непрочитано 23.11.2017, 17:24
1 | 1 #7
Кулик Алексей aka kpblc
Moderator

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


Прикольное решение Из-за своей паранойи не связывался с подобными реакторами, но решение очень интересное
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.11.2017, 09:11
#8
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Супер. Особенно мне понравился вывод имени блока, хотя в статусную строку было бы веселее)
koMon вне форума  
 
Непрочитано 24.11.2017, 12:51
#9
VVA

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


Цитата:
Сообщение от koMon Посмотреть сообщение
хотя в статусную строку было бы веселее
Веселись
Код:
[Выделить все]
 
 (vl-load-com)

; Функция действия на событие описанное в реакторе
(defun pickfirstModified (reac data / oldSHORTCUTMENU ss i en_i len en)
	(if (and (setq ss (cadr (ssgetfirst))) (= (sslength ss) 1))
		(progn
			(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
				  en_obj  (ssname ss 0)
				  vla_obj (vlax-ename->vla-object en_obj)
				  *CURRENT_LAYER* (vla-get-ActiveLayer adoc)
                                  *MODEMACRO* (getvar "MODEMACRO")
			)
			(vla-put-ActiveLayer adoc (vla-Item (vla-get-Layers adoc) (vla-get-Layer vla_obj)))
			(if (= (cdr (assoc 0 (entget en_obj))) "INSERT")
				(princ (strcat "\n" (setvar "MODEMACRO" (strcat "Имя блока: \"" (vlax-get-property vla_obj 'EffectiveName) "\""))))			
			)
		)
		(if *CURRENT_LAYER*
			(progn 
				(vla-put-ActiveLayer adoc *CURRENT_LAYER*)
                                (setvar "MODEMACRO" *MODEMACRO*)
				(setq *CURRENT_LAYER* nil *MODEMACRO* nil)
                                 
			)
		)
	)
)

;------------------------------------------------------------
; Реактор
	(if (null *MISC_REACTOR*) 
		(setq *MISC_REACTOR* (vlr-miscellaneous-reactor nil
							(list
								'(:VLR-pickfirstModified . pickfirstModified)
							)
						)
		)
	)
;------------------------------------------------------------
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.11.2017, 13:45
#10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от VVA Посмотреть сообщение
Веселись
Спасибо конечно!-) но уже как сделал так.
Код:
[Выделить все]
 
(defun pickfirstModified (reac data / oldSHORTCUTMENU ss i en_i len en)
	(if (and (setq ss (cadr (ssgetfirst))) (= (sslength ss) 1))
		(progn
			(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
				  en_obj  (ssname ss 0)
				  vla_obj (vlax-ename->vla-object en_obj)
				  *CURRENT_LAYER* (vla-get-ActiveLayer adoc)
			)
			(vla-put-ActiveLayer adoc (vla-Item (vla-get-Layers adoc) (vla-get-Layer vla_obj)))
			(if (= (cdr (assoc 0 (entget en_obj))) "INSERT")
				(grtext -1 (strcat "\nBlock \"" (vlax-get-property vla_obj 'EffectiveName) "\""))
			)
		)
		(if *CURRENT_LAYER*
			(progn 
				(vla-put-ActiveLayer adoc *CURRENT_LAYER*)
				(setq *CURRENT_LAYER* nil)
			  	(grtext -1 "")
			)
		)
	)
)

;------------------------------------------------------------
; Ðåàêòîð
	(if (null *MISC_REACTOR*) 
		(setq *MISC_REACTOR* (vlr-miscellaneous-reactor nil
							(list
								'(:VLR-pickfirstModified . pickfirstModified)
							)
						)
		)
	)
;------------------------------------------------------------

koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Показать в диспетчере слоев слой выбранного объекта

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматизировать переименование слоев d.mOnII LISP 9 17.11.2017 15:42
Autocad2014 Как в диспетчере слоев отфильтровать слои внешних ссылок ? kurstep AutoCAD 4 28.09.2017 10:29
Ищу 3д модель (приложение к паспорту антитеррористической защищенности объекта) Lirikk Поиск литературы, чертежей, моделей и прочих материалов 2 20.09.2012 21:53
Получение разрешения на строительство объекта капитального строительства maxummm Прочее. Архитектура и строительство 18 25.08.2010 20:31
VBA. Размораживание слоя, построение объекта в нем, замораживание слоя = ошибка Alexey_02 Программирование 3 06.03.2009 22:33