Как получить все доступные параметры экземпляра для категории
Получить все параметры заданной категории можно двумя способами.
Первый заключается в том, что нужно получить объект в модели заданной категории и взять его коллекцию параметров. Например, вот так:
- var collector = new FilteredElementCollector(doc);
- var wall = collector.OfCategory(BuiltInCategory.OST_Walls)
- .WhereElementIsNotElementType()
- .FirstElement();
- if (wall!=null)
- {
- var parameters =
- wall.Parameters;
- foreach (Parameter p in parameters)
- {
- Debug.Print("{0} - {1}", p.Definition.Name, p.Id);
- }
- }
В результате будет выведено следующее в окно Output:
- ADN-CIS - 571696
- Area - -1012805
- Base Constraint - -1001107
- Base Extension Distance - -1012829
- Base is Attached - -1001118
- Base Offset - -1001108
- Comments - -1010106
- Enable Analytical Model - -1001552
- Length - -1004005
- Location Line - -1001122
- Mark - -1001203
- Phase Created - -1012100
- Phase Demolished - -1012101
- Related to Mass - -1001713
- Room Bounding - -1001007
- Structural - -1001596
- Structural Usage - -1001119
- Test 1 - 571694
- Top Constraint - -1001103
- Top Extension Distance - -1012828
- Top is Attached - -1001117
- Top Offset - -1001109
- Unconnected Height - -1001105
- Volume - -1012806
Преимущества данного подхода:
- Отображаются только те свойства, которые видны пользователю, в окне свойств объекта
- Можно получить группу параметра
Недостатки:
- Объект данной категории обязательно должен присутсвовать в модели.
Еще один способ – использование метода ParameterFilterUtilities.GetFilterableParametersInCommon(Document doc, ICollection<ElementId> categories). Метод возвращает идентификаторы параметров, доступных для фильтрации элементов по выбранным категориям. В интерфейсе пользователя, это можно увидеть, например при создании фильтра видимости элементов:
Т.е. чтобы получить список параметров, доступных одной категории, то нужно вторым параметром передать коллекцию, состоящую из одной, тербуемой категории.
Так как результат возвращается в виде идентификатора, то чтобы получить название параметра, нужно допольнительное преобразование.
Для встроенного параметра, нужно воспользоваться методом LabelUtils.GetLabelFor(BuiltInParameter):
- var parameterName = LabelUtils.GetLabelFor((BuiltInParameter) parameterId.IntegerValue);
В случае же общего параметра, или параметра проекта, нужно сначала получить элемент, по этому идентификатору, а затем получить его название:
- var parameterName = doc.GetElement(parameterId).Name;[[&/code]]
- Пример кода:
- Код - C#: [Выделить]
- var bic = BuiltInCategory.OST_Walls;
- var categoryId = new ElementId(bic);
- var doc = ActiveUIDocument.Document;
- var parametetIds =
- ParameterFilterUtilities.GetFilterableParametersInCommon(doc, new [] {categoryId});
- foreach (ElementId parameterId in parametetIds)
- {
- if (BuiltInParameter.IsDefined(typeof(BuiltInParameter), parameterId.IntegerValue))
- {
- var s = LabelUtils.GetLabelFor((BuiltInParameter) parameterId.IntegerValue);
- Debug.Print("{0} - {1}", s, parameterId);
- }
- else
- {
- var p = doc.GetElement(parameterId);
- Debug.Print("{0} - {1}", p.Name, parameterId);
- }
- }
Результат:
- Absorptance - -1005435
- ADN-CIS - 571696
- Area - -1012805
- Assembly Code - -1002500
- Assembly Description - -1002501
- Assembly Name - -1150420
- Comments - -1010106
- Cost - -1001205
- Description - -1010103
- Estimated Reinforcement Volume - -1018502
- Family Name - -1002002
- Fire Rating - -1001206
- Function - -1001006
- Heat Transfer Coefficient (U) - -1005430
- Keynote - -1140422
- Length - -1004005
- Manufacturer - -1010108
- Mark - -1001203
- Model - -1010109
- Roughness - -1005436
- Structural Material - -1005500
- Structural Usage - -1001119
- Test 1 - 571694
- Thermal mass - -1005434
- Thermal Resistance (R) - -1005431
- Type Comments - -1010105
- Type Mark - -1001405
- Type Name - -1002001
- URL - -1010104
- Volume - -1012806
- Width - -1001000
Не трудно заметить, что параметров в этом списке немного больше. Часть параметров являются параметрами типа, так как в фильтрации возможно использовать и их.
Преимущества способа:
- Вомзожно получить параметры катеогрии объекта, даже если самого объекта в модели нет.
Недостатки:
- Возвращаются «лишние» параметры. Нет разграничения на параметры типа и экземпляра
- Нельзя получить группу
Оба способа имеют свои преимущества и недостатки. Недостатки одного, компенсируются преимуществами другого. Какой способ использовать – зависит от ситуации и задачи. Возможно оптимальным будет использование обоих способов одновременно.
Автор перевода: Виктор Чекалин
Обсуждение: http://adn-cis.org/forum/index.php?topic=1796
Опубликовано 23.01.2015Отредактировано 21.02.2015 в 18:26:02