ADN Club > Revit API

Фильтр по материалам

<< < (2/2)

Виктор Чекалин:
Александр, добрый день.

Скажу честно, что можно сказать я совсем не понял что вы хотите сделать и что делает код, так как он в большей части бессмысленный.

Для начала я попробую перефразировать вашу задачу своими словами, чтобы убедиться правильно ли я понял вашу мысль или нет.

Да, и параметр "Описание1" - это общий параметр для Материала или для Перекрытия?

Задача как ее понял я.
У меня два варианта:
1) Нужно выбрать все перекрытия на определенном уровне, затем получить список материалов, из которых сделаны эти перекрытия и записать список всех материалов в общий параметр перекрытия (не ясно только для чего).
2) Для каждого перекрытия находящегося на определенном уровне нужно записать в общий параметр описание материала из которого сделано это перекрытие (более вероятный сценарий)

Тем не менее есть много замечаний к коду, да и вообще к логике работы.

В начале темы вы пишите:

--- Цитата: Alexander от 13-02-2014, 15:33:04 ---Создать фильтр для материалов по уровням <...> у меня получилось, но всё вместе пока не получается.

--- Конец цитаты ---

Затем приводите код:

--- Код - C# [Выбрать] ---FilteredElementCollector collector1 = new FilteredElementCollector(activeDoc);ElementParameterFilter filterOne = new ElementParameterFilter(ruleOne);collector1.OfClass(typeof(Material)).OfType<Material>();//collector1.OfCategory(BuiltInCategory.OST_Materials);//collector1.WherePasses(filterOne);ICollection<Element> LevelOneParam = collector1.ToElements(); 
Однако этот фильтр выберет просто все материалы в проекте. То что у вас закомментировано, где вы видимо хотели отфильтровать материалы, находящиеся на определенном уровне, естественно работать не будет. Во-первых, у материала нет параметра FAMILY_LEVEL_PARAM, во-вторых, логически такой подход не верен.
Материал - это некоторая сущность, которая характеризует свойство элемента. Таким образом, в принципе нельзя получить свойство, находящееся на таком то уровне. На уровне элементы находятся.

Затем, что в первом куске кода, что во-втором, идет несвязанный друг с другом код:

--- Код - C# [Выбрать] ---                Parameter parameterDescription = floor.get_Parameter("Описание1");                Parameter parameterMatName = floor.get_Parameter(BuiltInParameter.MATERIAL_NAME);                             var text = parameterMatName.AsString();                var res = floor.get_Parameter("Описание1").Set(" слово ");
Вы записываете в параметр "Описание1" некое значение, которое никак не зависит от трех предыдущих строчек. Причем те 3 строчки не несут совсем никакой нагрузки.


--- Цитата: Alexander от 13-02-2014, 15:33:04 ---В таком случае он не найдёт parameterMatName , но в общий параметр Описание1 можно записать символы.
Вопрос в том, как создать фильтр, чтобы ещё и parameterMatName был виден.

--- Конец цитаты ---
\

Как я уже сказал, естественно в общий параметр Описание1 можно записать символы, так как дополнительной проверки у вас нет.
parameterMatName не будет не виден никогда. У перекрытия нет и не было такого параметра. Это параметр Материала.

В то же время, перекрытие может состоять из нескольких материалов. Но структурный материал у перекрытия всегда один. Его можно получить с помощью встроенного параметра STRUCTURAL_MATERIAL_PARAM. Правда он тоже может быть равен ElementId.InvalidElementId если материал задан по категории. В этому случае нужно получить материал из категории.

Александр, в общем постарайтесь сформулировать вашу задачу с описанием того, какой должен быть итог, либо подтвердите мои предположения. Изначально вопрос про фильтр стоит неверно, так как судя по всему, тут не в фильтре дело совсем.

Alexander:
Виктор, спасибо за ответ.
Я хочу создать объединённую таблицу(на фото). Таблица состоит из спецификации перекрытий и ведомости материалов для перекрытий(в таблице это Данные элементов пола).
Тип этой таблицы так же спецификация.
Данные элементов пола - это поле Материал: Описание из ведомости материалов.

Поэтому я хочу создать текстовый общий параметр Описание1(для каждого перекрытия) и записать в него описание материала. В дальнейшем вставить его в спецификацию.


Виктор Чекалин:
Добрый день.

В таком случае вам надо выбрать все перекрытия на определенном уровне (вы это уже сделали).
Затем, перебирая в цикле все перекрытия, для каждого перекрытия определяете материал. Получаете описание материала и записываете значение в параметр перекрытия.

Код будет примерно такой:


--- Код - C# [Выбрать] ---            ElementId levelFirstId = FindLevelId(activeDoc, level_first);            ElementLevelFilter filterElementsOnLevelOne = new ElementLevelFilter(levelFirstId);            FilteredElementCollector filteredElementCollectorWallOne = new FilteredElementCollector(activeDoc);            var LevelOneParam = filteredElementCollectorWallOne.OfClass(typeof(Floor));            LevelOneParam.OfCategory(BuiltInCategory.OST_Floors);            LevelOneParam.WherePasses(filterElementsOnLevelOne);             foreach (Floor floor in LevelOneParam)            {                //Находим материал                var floorType = doc.GetElement(floor.GetTypeId()) as FloorType;                 // Получаем структурный материал                 var materialId = floorType.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM);                         //Если материал определен по категории, то определяем его                if (materialId == ElementId.InvalidElementId)                {                      materialId = floorType.Category.Material.Id;                 }                 Material material = doc.GetElement(materialId) as Material;                 //описание материала                var materialDescription = material.get_Parameter("Описание1").AsString();                            var res = floor.get_Parameter("Описание1").Set(materialDescription );            }
Код я не проверял, но думаю смысл понятен.

Еще логичнее было бы записывать описание материала не в параметр конкретного перекрытия, а в параметр типа перекрытия, так как материал задается именно для типа.

Alexander:
Спасибо.
Ещё один вопрос:
Через API у нас есть доступ к общим параметрам созданным пользователем в ревите. Возможно ли программно работать с параметрами проекта, которые создал пользователь?

Виктор Чекалин:
Доступ к параметрам проекта (не общим) через API ограничен. Можно получить список всех параметров (общих и не общих) и получить доступ к привязанным категориям. Но понять какой параметр общий, а какой нет - нельзя.
Фактически получается единственное, что можно сделать через API - поменять привязку параметра к категории, зная его наименование. Возможно еще удалить параметр. А вот добавить новый - не выйдет.

Подробней про доступ к параметрам я писал в статье: http://adn-cis.org/dostup-k-opredeleniyam-obshhix-parametrov-proekta.html

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии