Тема: функция управления фильтром слоев

Не поможете с кодом функции управления фильтром слоев -

На входе три аргумента
1. имя фильтра  например "xref"
2. тип действия
     "on" -включить
     "off" -выключить
3. значение для "invert filter"
     "on" - инвертирование включить
     "off" - инвертирование выключить


На выходе - произведенное действие в соответствии со значениями аргументов

Re: функция управления фильтром слоев

Может быть эти темы помогут
Отключение слоя или группы слоев (ф-ция layer-filters-status-change)
Программное определение группы слоя

(изменено: Yuriy, 14 сентября 2009г. 00:22:58)

Re: функция управления фильтром слоев

Владимир,    с п а с и б о!

Из того, что успел посмотреть пока наиболее подошли функции от Александра Ривилиса  скачал отсюда
LayerFilter2006.arx - для AutoCAD 2006 (и возможно для 2005)
LayerFilter2007.arx - для AutoCAD 2007 (и возможно для последующих)
Экспортируют в VisualLisp две функции:
   ; Применяет филтр слоев по имени
   (layer_apply_filter_by_name "имя фильтра")
   ; Устанавливает корневой фильтр (т.е. All)
   (layer_apply_filter_all)

Проверил в AA-2009-eng
Но с их помощью похоже нельзя управлять режимом инверсии (((
А мне как раз он очень нужен.
Например для того, чтобы не отображались имена слоев внешних ссылок необходимо установить фильтр "Xref" и включить "invert filter".

Взял на вооружение и понравившуюся мне ф-цию (layer-filters-status-change)

Буду разбираться дальше ...

Re: функция управления фильтром слоев

Да, была такая тема: http://forum.dwg.ru/showthread.php?t=19004

Владимир Азарко, я вынужден признать, что твой код из поста 17 я никак не смог применить для включения какого-либо фильтра слоёв. Т.е. активный фильтр отключается - без проблем, код работает как часы, спасибо.

Но вот если попытаться наоборот активировать какой-нибудь фильтр, используя эту же технологию (т.е. наоборот добавлять пару '(290 . 1)), то ничего не выходит.
Пара добавляется, entmakex возвращает примитив - всё нормально. entmod списка словаря также возвращает не nil, т.е. вроде тоже всё корректно.

Ан нет, на экране всё остаётся по-прежнему. В списке слоёв всё остаётся без изменений. Причём потом проверяю, заново с нуля просматриваю словарь фильтров, так ведь есть-таки  там эта пара '(290 . 1) - фильтр по идее активен! Короче вот так вот.

Я тогда на это забил, не до этого было, сейчас вот вспомнил. Очень хочется довести до конца это дело.

Тогда оформил свои 5 функций:
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 - проверка, есть ли рисунке фильтры слоёв

Но они по сути бесполезны, потому что главное - это как активировать фильтр, из-за этого всё и задумывалось.

PS Хотел приложить файлы с функциями, не нашёл как. Здесь можно как-нибудь файлы прикреплять к сообщениям? Если они кому-нибудь нужны, скажите, я выложу их в той теме на dwg.ru.

(изменено: Yuriy, 14 сентября 2009г. 21:57:05)

Re: функция управления фильтром слоев

Makswell пишет:

Здесь можно как-нибудь файлы прикреплять к сообщениям?

Похоже пока никак :(

Makswell пишет:

Если они кому-нибудь нужны, скажите, я выложу их в той теме на dwg.ru

Конечно выкладывайте обязательно ознакомлюсь.

Makswell пишет:

Да, была такая тема: http://forum.dwg.ru/showthread.php?t=19004

Спасибо пошел смотреть ...

(изменено: Makswell, 15 сентября 2009г. 10:38:15)

Re: функция управления фильтром слоев

Yuriy пишет:

Конечно выкладывайте обязательно ознакомлюсь.

Ну вот, выложил в этом посте.

А вот прямая ссылка на скачивание.

Я там добавил ещё функцию:
m-layer-dict-ACAD_LAYERFILTERS-get-or-greate - получает объект словаря "ACAD_LAYERFILTERS" из корневого словаря слоёв или создает словарь "ACAD_LAYERFILTERS", еcли его там нет

В будущем планируется использовать её для функции программного создания фильтра слоёв.

(изменено: Владимир Азарко, 15 сентября 2009г. 16:47:31)

Re: функция управления фильтром слоев

Yuriy,

Но с их помощью похоже нельзя управлять режимом инверсии (((
А мне как раз он очень нужен. Например для того, чтобы не отображались имена слоев внешних ссылок необходимо установить фильтр "Xref" и включить "invert filter".

Наткнулся на такой вод код. Поступили немного по другому. Создается фильтр, исключающий xref

  (defun c:Foo (/ xdict dict xrecname)

    (setq xdict
           (vlax-vla-object->ename
             (vla-getextensiondictionary
               (vla-get-layers
                 (vla-get-activedocument (vlax-get-acad-object))
               ) ;_ end of vla-get-layers
             ) ;_ end of vla-getextensiondictionary
           ) ;_ end of vlax-vla-object->ename
    ) ;_ end of setq

    (setq dict
           (if (setq dict (dictsearch xdict "ACAD_LAYERFILTERS"))
             (cdr (assoc -1 dict))
             (dictadd xdict
                      "ACAD_LAYERFILTERS"
                      (entmakex
                        '(
                          (0 . "dictionary")
                          (100 . "AcDbDictionary")
                          (280 . 0)
                          (281 . 1)
                         )
                      ) ;_ end of entmakex
             ) ;_ end of dictadd
           ) ;_ end of if
    ) ;_ end of setq

    (princ
      (if (dictsearch dict (setq xrecname "No_Xref_Layers"))
        (strcat
          "Layer filter named <"
          xrecname
          "> already exists."
        ) ;_ end of strcat
        (if
          (dictadd dict
                   xrecname
                   (entmakex
                     (append
                       '(
                         (0 . "xrecord")
                         (100 . "AcDbXrecord")
                         (280 . 1)
                        )
                       (list (cons 1 xrecname))
                       '(
                         (1 . "~*|*")
                         (1 . "*")
                         (1 . "*")
                         (70 . 0)
                         (1 . "*")
                         (1 . "*")
                         (-3
                          ("ACAD"
                           (1000 . "( NAME== \"~*|*\" )")
                          )
                         )
                        )
                     ) ;_ end of append
                   ) ;_ end of entmakex
          ) ;_ end of dictadd
           (strcat
             "Created layer filter named <"
             xrecname
             ">."
           ) ;_ end of strcat
           "Doh! Something horrible happened: Call mommy."
        ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of princ

    (princ)

  ) ;_ end of defun

   

Re: функция управления фильтром слоев

Владимир Азарко пишет:

Создается фильтр, исключающий xref

Очень вам благодарен Владимир  :!: 
- решился мой основной вопрос который я давно не мог решить
- как  програмно отключать отображение имен слоев внешних ссылок в списке панели инструментов.
Из-за которого, собственно и возникла тема.

И удалось обойтись без инверсии

Узнал много о фильтрах...

Спасибо всем!!!

Но тема пока не закрыта  :)

(изменено: Yuriy, 29 сентября 2009г. 21:25:20)

Re: функция управления фильтром слоев

#3 Проверил в AA-2009-eng  Но с их помощью похоже нельзя управлять режимом инверсии (((

Александр добавил в свои функции возможность включать отключать инверсию

ссылка на скачивание

-