Александр, добрый день.
Скажу честно, что можно сказать я совсем не понял что вы хотите сделать и что делает код, так как он в большей части бессмысленный.
Для начала я попробую перефразировать вашу задачу своими словами, чтобы убедиться правильно ли я понял вашу мысль или нет.
Да, и параметр "Описание1" - это общий параметр для
Материала или для
Перекрытия?
Задача как ее понял я.
У меня два варианта:
1) Нужно выбрать все перекрытия на определенном уровне, затем получить список материалов, из которых сделаны эти перекрытия и записать список всех материалов в общий параметр перекрытия (не ясно только для чего).
2) Для каждого перекрытия находящегося на определенном уровне нужно записать в общий параметр описание материала из которого сделано это перекрытие (более вероятный сценарий)
Тем не менее есть много замечаний к коду, да и вообще к логике работы.
В начале темы вы пишите:
Создать фильтр для материалов по уровням <...> у меня получилось, но всё вместе пока не получается.
Затем приводите код:
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, во-вторых, логически такой подход не верен.
Материал - это некоторая сущность, которая характеризует свойство элемента. Таким образом, в принципе нельзя получить свойство, находящееся на таком то уровне. На уровне элементы находятся.
Затем, что в первом куске кода, что во-втором, идет несвязанный друг с другом код:
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 строчки не несут совсем никакой нагрузки.
В таком случае он не найдёт parameterMatName , но в общий параметр Описание1 можно записать символы.
Вопрос в том, как создать фильтр, чтобы ещё и parameterMatName был виден.
\
Как я уже сказал, естественно в общий параметр Описание1 можно записать символы, так как дополнительной проверки у вас нет.
parameterMatName не будет не виден никогда. У перекрытия нет и не было такого параметра. Это параметр Материала.
В то же время, перекрытие может состоять из нескольких материалов. Но структурный материал у перекрытия всегда один. Его можно получить с помощью встроенного параметра STRUCTURAL_MATERIAL_PARAM. Правда он тоже может быть равен ElementId.InvalidElementId если материал задан по категории. В этому случае нужно получить материал из категории.
Александр, в общем постарайтесь сформулировать вашу задачу с описанием того, какой должен быть итог, либо подтвердите мои предположения. Изначально вопрос про фильтр стоит неверно, так как судя по всему, тут не в фильтре дело совсем.