ADN Club > Revit API
Фильтр по материалам
Alexander:
Добрый день!
В проекте есть несколько перекрытий(полы), которые состоят из нескольких материалов(например бетон, плитка и т.д.). Мне нужно отфильтровать эти материалы, чтобы получить их описание и записать в общий параметр, который является параметром перекрытие.
Поскольку в проекте несколько уровней, фильтр должен быть ещё и по уровням. То есть сначала фильтр по уровням, потом по перекрытиям и по материалам.
Создать фильтр для материалов по уровням или для перекрытий по уровням у меня получилось, но всё вместе пока не получается.
Возможен ли такой фильтр?
Виктор Чекалин:
Добрый день.
Речь идет о создании фильтра в спецификации?
Alexander:
Нет
Виктор Чекалин:
А о каком? FilteredElementCollector?
Так как вы написали, что у вас получилось сделать фильтр по отдельности, а вместе - нет, то неплохо было бы привести пример кода, дабы посмотреть что там не верно.
Alexander:
--- Код - C# [Выбрать] --- public static ElementId FindLevelId(Document doc, string name) { FilteredElementCollector collectorLevels = new FilteredElementCollector(doc); collectorLevels.OfClass(typeof(Level)); // Now use LINQ to see if one exists with provided name. ElementId idLevel = ElementId.InvalidElementId; try { Element levelMatched = collectorLevels.First(level => level.Name.Equals(name)); if (levelMatched != null) idLevel = levelMatched.Id; } catch (System.InvalidOperationException) { } catch (System.ArgumentNullException) { } return idLevel; } 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) { 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(" слово "); }
В таком случае он не найдёт parameterMatName , но в общий параметр Описание1 можно записать символы.
Вопрос в том, как создать фильтр, чтобы ещё и parameterMatName был виден.
Фильтр для материалов:
--- Код - C# [Выбрать] --- ElementId levelFirstId = FindLevelId(activeDoc, _level_first); FilteredElementCollector collector1 = new FilteredElementCollector(activeDoc); BuiltInParameter bip = BuiltInParameter.FAMILY_LEVEL_PARAM; ParameterValueProvider provider = new ParameterValueProvider(new ElementId(bip)); FilterNumericRuleEvaluator evaluator = new FilterNumericEquals(); FilterRule ruleOne = new FilterElementIdRule(provider, evaluator, levelFirstId); ElementParameterFilter filterOne = new ElementParameterFilter(ruleOne); collector1.OfClass(typeof(Material)).OfType<Material>(); //collector1.OfCategory(BuiltInCategory.OST_Materials); //collector1.WherePasses(filterOne); ICollection<Element> LevelOneParam = collector1.ToElements(); foreach (Materials materials in LevelOneParam) { Parameter parameterDescription = materials.get_Parameter("Описание1"); Parameter parameterMatName = materials.get_Parameter(BuiltInParameter.MATERIAL_NAME); var text = parameterMatName.AsString(); var res = materials.get_Parameter("Описание1").Set(" слово "); }
Навигация
Перейти к полной версии