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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно переключить/активировать определённый фильтр слоев?

Как программно переключить/активировать определённый фильтр слоев?

Ответ
Поиск в этой теме
Непрочитано 28.03.2008, 14:09 #1
Как программно переключить/активировать определённый фильтр слоев?
Makswell
 
Инженер-строитель
 
Киров
Регистрация: 15.08.2007
Сообщений: 2,204

В Автокаде 2008 есть пульт управления. На нем имеется "Элемент управления фильтрами слоев".
Вопрос такой. Можно ли каким-нибудь образом этот "Элемент управления фильтрами слоев" присобачить к стандартной панели инструментов?
И ещё вопрос до кучи. Какие ещё в Автокаде имеются средства для управления фильтрами слоев, кроме диспетчера свойств слоев и пульта управления?

Последний раз редактировалось Makswell, 31.03.2008 в 14:46.
Просмотров: 7336
 
Автор темы   Непрочитано 28.03.2008, 14:42
#2
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Я так понял на оба вопроса ответ отрицательный.

Всё же наберусь наглости и ещё спрошу.
Как программно можно переключить/активировать определённый фильтр слоев?

ЗЫ Только тогда наверно надо перенести тему в раздел "программирование"
Makswell вне форума  
 
Непрочитано 28.03.2008, 14:48
#3
Dym


 
Регистрация: 27.09.2005
Двинскъ
Сообщений: 586
Отправить сообщение для Dym с помощью Skype™


_LAYERSTATE ?
Dym вне форума  
 
Непрочитано 29.03.2008, 00:34
#4
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Unknown command "LAYERSTATE". Press F1 for help.
Jerald вне форума  
 
Непрочитано 29.03.2008, 00:53
#5
Dym


 
Регистрация: 27.09.2005
Двинскъ
Сообщений: 586
Отправить сообщение для Dym с помощью Skype™


о ужас, они убили Кенни
Миниатюры
Нажмите на изображение для увеличения
Название: Copy of linda_43.jpg
Просмотров: 285
Размер:	12.2 Кб
ID:	4752  
Dym вне форума  
 
Автор темы   Непрочитано 31.03.2008, 09:03
#6
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Нет, не то, мужики!
Не конфигурация слоев, а фильтр слоев
Makswell вне форума  
 
Непрочитано 31.03.2008, 10:33
#7
Кулик Алексей aka kpblc
Moderator

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


Дык ета... Создал фильтр, вызвал окно слоев, в левой части жмякнул на фильтр, [OK]. Или я чего-то не понял?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2008, 11:02
#8
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Мне не нравится, что надо каждый раз вызывать "Диспетчер свойств слоев" -> выбрать фильтр -> нажать Ок. Много лишних движений.
На пульте управления это все делается с помощью "Элемента управления фильтрами слоев", через выпадающий список.
Это очень удобно. Но монитор у меня не огромен, поэтому пульт управления не висит постоянно на экране, а вызывается мной по мере надобности. Поэтому получается такая же трёхходовка: Вызвать пульт управления -> выбрать фильтр -> закрыть пульт управления.

Смысл сообщений в 1,2 постах сводится именно к этому.

ЗЫ. Я уже кое до чего докопался в лиспе. Чуть позже выложу.
Makswell вне форума  
 
Автор темы   Непрочитано 31.03.2008, 11:05
#9
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Разобрался, как получить список имен фильтров. Вот код для теста:
Код:
[Выделить все]
(defun test (/ dict_ACAD_LAYERFILTERS ListOfNames_LAYERFILTERS n)
  (setq	dict_ACAD_LAYERFILTERS
	 (dictsearch
	   (cdr
	     (assoc
	       360
	       (entget
		 (cdr (assoc
			330
			(entget (tblobjname "LAYER" "0"))
		      )
		 )
	       )
	     )
	   )
	   "ACAD_LAYERFILTERS"
	 )
  )

  (while (assoc 3 dict_ACAD_LAYERFILTERS)
    (setq ListOfNames_LAYERFILTERS
	   (append
	     ListOfNames_LAYERFILTERS
	     (list
	       (cdr (assoc 3 dict_ACAD_LAYERFILTERS)
	       )
	     )
	   )
    )

    (setq dict_ACAD_LAYERFILTERS
	   (cdr
	     (member (assoc 3 dict_ACAD_LAYERFILTERS)
		     dict_ACAD_LAYERFILTERS
	     )
	   )
    )
  )
  (setq n 0)
  (while (< n (length ListOfNames_LAYERFILTERS))
    (princ (nth n ListOfNames_LAYERFILTERS))
    (terpri)
    (setq n (1+ n))
  )
  (princ)
)
У меня, например, получилось:
Цитата:
$ (test)
M-Аннотации
M-Монолит
M-Непечатаемые слои
M-Оборудование двери окна
M-Отверстия
M-Сборный железобетон
M-Сетки Закладные Металлопрокат
M-Стены Перегородки Ограждения
M-Условные обозначения
M-Фасад
_$
Т.е. могу вытащить имя любого фильтра слоев. Как дальше - не знаю...
Makswell вне форума  
 
Автор темы   Непрочитано 31.03.2008, 14:13
#10
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Кулик Алексей aka kpblc, я тут подумал, может сменить назнание темы на такое: "Как программно переключить/активировать определённый фильтр слоев?".
И перенести этот топик в раздел "Программирование"...
Makswell вне форума  
 
Непрочитано 31.03.2008, 14:21
#11
Кулик Алексей aka kpblc
Moderator

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


Makswell, переименовывай, я перенесу
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2008, 16:45
#12
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Кстати, в процессе поисков наткнулся на недокументированую команду FILTERS (ФИЛЬТРЫ). В хелпе о ней нет никакой информации.

ЗЫ Может кто подскажет, как узнать (в смысле программно), какой фильтр выбран (активен). Хотя бы так.
Makswell вне форума  
 
Автор темы   Непрочитано 01.04.2008, 16:20
#13
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Разобрался как получить имя выбранного/активного фильра слоев.
Это можно сделать примерно так:
Код:
[Выделить все]
(defun test1 (/		       ACLYdict		ACLYdict_ent
	      LayFilters_ents  LayFilter_DXF	Active_LayFilter
	      n
	     )
  (setq	ACLYdict
	 (vla-Item (vla-GetExtensionDictionary
		     (vla-Get-Layers
		       (vla-Get-ActiveDocument (vlax-Get-Acad-Object))
		     )
		   )
		   "ACLYDICTIONARY"
	 )
  )
  (setq ACLYdict_ent (entget (vlax-vla-object->ename ACLYdict)))
  (setq	LayFilters_ents
	 (vl-remove-if
	   'null
	   (mapcar '(lambda (x)
		      (if (= (car x) 350)
			x
		      )
		    )
		   ACLYdict_ent
	   )
	 )
  )
  (setq n 0)
  (while (< n (length LayFilters_ents))
    (setq LayFilter_DXF (entget (cdr (nth n LayFilters_ents))))
    (if	(member (assoc 290 LayFilter_DXF) LayFilter_DXF)
      (setq Active_LayFilter (cdr (assoc 300 LayFilter_DXF)))
    )
    (setq n (1+ n))
  )
  (princ Active_LayFilter)
  (princ)
)
Makswell вне форума  
 
Автор темы   Непрочитано 07.06.2008, 11:11
#14
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Фильтры слоёв представлены объектами типа XRECORD.
Например фильтр слоёв с именем "M-Отверстия", который активен, имеет такоё DXF-представление
Цитата:
((-1 . <Имя объекта: 7ed01470>) (0 . XRECORD) (5 . 1826) (102 . {ACAD_REACTORS) (330 . <Имя объекта: 7ed01450>) (102 . }) (330 . <Имя объекта: 7ed01450>) (100 . AcDbXrecord) (280 . 1) (290 . 1) (1 . AcLyLayerFilter) (90 . 1) (300 . M-Отверстия) (301 . NAME=="M-14*"))
Вопрос:
Как работать с X-записями? Что-то я в этом не очень.
Как, например, удалить из этого списка пару '(290 . 1) так, чтобы в базе рисунка эта X-запись изменилась?
Для графических примитивов использовалась entmod, а здесь как?
Makswell вне форума  
 
Автор темы   Непрочитано 07.06.2008, 13:18
#15
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Может не совсем понятно?
Эти Х-записи являются объектами словаря "ACLYDICTIONARY" (словарь фильтров слоёв по свойствам), который можно получить так:
Код:
[Выделить все]
(entget
  (vlax-vla-object->ename
    (vla-Item (vla-GetExtensionDictionary
		(vla-Get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
	      )
	      "ACLYDICTIONARY"
    )
  )
)
У меня, например, получилось такое
Цитата:
(
(-1 . <Имя объекта: 7efd7450>)
(0 . "DICTIONARY")
(5 . "1822")
(102 . "{ACAD_REACTORS") (330 . <Имя объекта: 7efd4ed0>) (102 . "}")
(330 . <Имя объекта: 7efd4ed0>)
(100 . "AcDbDictionary")
(280 . 0)
(281 . 1)
(3 . "*A1") (350 . <Имя объекта: 7efd7460>)
(3 . "*A10") (350 . <Имя объекта: 7efd74f0>)
(3 . "*A11") (350 . <Имя объекта: 7efd7500>)
(3 . "*A2") (350 . <Имя объекта: 7efd7470>)
(3 . "*A3") (350 . <Имя объекта: 7efd7480>)
(3 . "*A4") (350 . <Имя объекта: 7efd7490>)
(3 . "*A5") (350 . <Имя объекта: 7efd74a0>)
(3 . "*A6") (350 . <Имя объекта: 7efd74b0>)
(3 . "*A7") (350 . <Имя объекта: 7efd74c0>)
(3 . "*A8") (350 . <Имя объекта: 7efd74d0>)
(3 . "*A9") (350 . <Имя объекта: 7efd74e0>)
)
Здесь точечные пары с кодом 350 и есть DXF-представления фильтров слоев (Х-записи).
Признаком того, что фильтр выбран (активен) является наличие в его DXF-представлении списка '(290 . 1)
Соответственно моя цель из нужной Х-записи удалить этот список, а другую нужную добавить.

Вот, вроде понятно написал.
Makswell вне форума  
 
Непрочитано 07.06.2008, 23:36
#16
Кулик Алексей aka kpblc
Moderator

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


В DwgRuLispLib смотрел?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.06.2008, 12:00
#17
VVA

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


Makswell, Снабдил коментариями. Должен разобраться. Данный пример отключает текущий фильтр слоев
Код:
[Выделить все]
(vl-load-com)
(setq dict               ;_ename словарей фильтров
  (vlax-vla-object->ename
    (vla-Item (vla-GetExtensionDictionary
		(vla-Get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
	      )
	      "ACLYDICTIONARY"
    )
  )
)
(setq dict_list (entget dict)) ;_список словаря
(setq	LayFilters_ents_list   ;_ ename фильтров слоев
	 (mapcar 'cdr
	 (vl-remove-if
	   'null
	   (mapcar '(lambda (x)
		      (if (= (car x) 350)
			x
		      )
		    )
		   dict_list
	   )
	 )
  )
	)
(foreach item LayFilters_ents_list ;_item - имя примитива конкретного словаря
  (setq item_list (entget item))   ;_ entget конкретного словаря
  (if (= (cdr(assoc 290 item_list)) 1) ;_Словарь активен (поле 290=1)
    (progn
      (setq new-item                   ;_Делаем новый XRECORD с полем 290=0
	     (entmakex (subst (cons 290 0)(assoc 290 item_list) item_list))
	    )
      (setq new_dist_list (subst (cons 350 new-item)(cons 350 item) dict_list)) ;_Заменяем в списке словаря фильтров слдоев
      (entmod new_dist_list)            ;_Модифицируем
      
      )
    )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.09.2009, 10:43
#18
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


В приложенном файле находятся функции для работы с фильтрами слоёв.
  • m-layer-dict-ACAD_LAYERFILTERS-get-or-greate - получает объект словаря "ACAD_LAYERFILTERS" из корневого словаря слоёв или создает словарь "ACAD_LAYERFILTERS", еcли его там нет
  • m-layfilter-activefilter-off - отключение активного фильтра слоёв
  • m-layfilter-get-enames-to-lst - получает список из примитивов (ename) фильтров слоёв
  • m-layfilter-get-name-activefilter - получает имя активного фильтра
  • m-layfilter-get-names-to-lst - получает список из имён фильтров слоёв
  • m-layfilter-hasfilter - проверка, есть ли рисунке фильтры слоёв

В общем-то ничего нового, всё так или иначе обсуждалось здесь. Просто тема получила продолжение здесь: http://www.caduser.ru/forum/index.ph...D=23&TID=46998

Поэтому долго ничего объяснять не буду, если интересно, почитайте.

P.S. Все с нетепением ждут VVA )))
Вложения
Тип файла: zip layfilter-func.ZIP (2.9 Кб, 250 просмотров)
Makswell вне форума  
 
Непрочитано 15.09.2009, 15:26
#19
VVA

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


Makswell, А чего меня ждать? У меня результат такой же
Цитата:
Но вот если попытаться наоборот активировать какой-нибудь фильтр, используя эту же технологию (т.е. наоборот добавлять пару '(290 . 1)), то ничего не выходит.
Пара добавляется, entmakex возвращает примитив - всё нормально. entmod списка словаря также возвращает не nil, т.е. вроде тоже всё корректно
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.09.2009, 15:55
#20
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Жаль конечно.

Спасибо, что ответил, а то я думал, может я что не правильно делаю.
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно переключить/активировать определённый фильтр слоев?

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

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