API для работы с фильтрами переопределения видимости/графики
Возможность иметь программный доступ к управлению фильтрами переопределения видимости/графики было одним из самых долгожданных пожеланий многих разработчиков. И эта возможность полностью реализована в Revit API 2014.
Для управления фильтрами в API появились следующие методы:
- View.AddFilter()
- View.SetFilterVisibility()
- View.SetFilterOverrides()
Ниже мы рассмотрим несколько вопросов от разработчиков, для решения которых необходимо использовать новые функций.
Вопрос 1: Мы хотим программно делать то, что мы можем на вкладке Фильтры в диалоге Переопределения видимости/графики.
С помощью фильтров можно, например, установить синий цвет для всех элементов, у которых значение определенного общего параметра находится в заданном диапазоне. Другие элементы можно отобразить красным. Все фильтры, включая цвет и штриховку поверхностей уже есть в API.
Мы также хотим скрыть определенный элемент на виде. Это можно сделать с помощью фильтра переопределения видимости/графики. Сейчас мы используем свойства View.ProjColorOverrideByElement и View.ProjLineWeightOverrideByElement для изменения цвета элементов, но скрыть элементы мы не можем.
В примере из SDK описывается, как достичь того, чего мы хотим, за исключением последнего шага – как применить созданный фильтр к виду. В Revit 2013 и более ранних версиях единственным способом применить созданный фильтр вручную в диалоге Переопределения видимости/графики на вкладке фильтры.
Вопрос 2: Benson оставил следующий комментарий к моей статье Видимость элементов, где он спрашивает:
Я могу выбрать элемент и в контекстном меню по правой кнопке мыши выбрать Скрыть на виде -> По фильтру… и добавить фильтр для скрытия выбранного элемента. Метод IsHiddenElementOrCategory все равно вернет True для этого элемента. Т.е. фильтр для скрытия элемента игнорируется.
Я хочу получить все элементы, которые скрыты по условиям фильтра. На первый взгляд классы ParameterFilterElement и FilterRule должны быть полезны в этом случае. Метод FilterRule.ElementPasses можно использовать для определения попадает ли элемент в фильтр, но нельзя определить применен ли этот фильтр к конкретному виду или нет.
Так можно ли определить установлена ли видимость фильтра для конкретного вида?
Я нашел как перечислить все фильтры, но все еще не могу понять, как определить установлена ли галочка Видимость для фильтра или нет.
Вопрос 3: Я бы хотел экспортировать только видимые объекты. Метод Element.IsHidden возвращает верное значение, только если элемент был скрыт с помощью меню Скрыть на виде -> Элемент (Категорию), но игнорирует скрытие элемента с помощью фильтра.
Как можно точно определить, что пользователь действительно видит на виде? Наши клиенты очень ждут такую возможность для экспорта.
Вопрос 4: Мне нужно программно определить цвет и тип линий. В интерфейсе Revit это можно увидеть в диалоге Переопределения видимости/графики на вкладке Фильтры.
Вопрос 5: Мне нужно программно получить список фильтров в диалоге Переопределения видимости/графики.
Ответ: Класс ParameterFilterElement и связанные с ним классы были обновлены и теперь похожи на классы ElementFilter, которые используются для поиска элементов я для DMU.
Первоначально не было прямого способа как привязать фильтр к виду. Параметры SCHEDULE_FILTER_PARAM и VIS_GRAPHICS_FILTERS возможно используются для этих целей, но нельзя было изменить или прочитать значение этих параметров.
Этот недостаток был устранен в Revit API 2014 и в документации это выделено в разделе Что нового:
Фильтры Переопределения видимости/графики
Новые методы класса View позволяют получить, добавить, применить и удалить фильтры. Фильтры могут быть созданы с помощью метода Create класса ParameterFilterElement, который был и предыдущих версиях API.
Как я уже говорил, новые методы, которые предоставляют доступ к новым функциям это:
- View.AddFilter()
- View.SetFilterVisibility()
- View.SetFilterOverrides()
Источник: http://thebuildingcoder.typepad.com/blog/2013/08/view-filter-api.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=185
Опубликовано 22.08.2013Отредактировано 22.08.2013 в 11:30:34