ADN Open CIS
Сообщество программистов Autodesk в СНГ

23/01/2015

Как получить все доступные параметры экземпляра для категории

Получить все параметры заданной категории можно двумя способами.

Первый заключается в том, что нужно получить объект в модели заданной категории и взять его коллекцию параметров. Например, вот так:

Код - C#: [Выделить]
  1. var collector = new FilteredElementCollector(doc);
  2. var wall = collector.OfCategory(BuiltInCategory.OST_Walls)
  3.        .WhereElementIsNotElementType()
  4.        .FirstElement();
  5.                                                
  6. if (wall!=null)
  7. {
  8.      var parameters =
  9.             wall.Parameters;
  10.      foreach (Parameter p in parameters)
  11.      {
  12.            Debug.Print("{0} - {1}", p.Definition.Name, p.Id);
  13.      }
  14. }

В результате будет выведено следующее в окно Output:

Код - XML: [Выделить]
  1.  
  2. ADN-CIS - 571696
  3. Area - -1012805
  4. Base Constraint - -1001107
  5. Base Extension Distance - -1012829
  6. Base is Attached - -1001118
  7. Base Offset - -1001108
  8. Comments - -1010106
  9. Enable Analytical Model - -1001552
  10. Length - -1004005
  11. Location Line - -1001122
  12. Mark - -1001203
  13. Phase Created - -1012100
  14. Phase Demolished - -1012101
  15. Related to Mass - -1001713
  16. Room Bounding - -1001007
  17. Structural - -1001596
  18. Structural Usage - -1001119
  19. Test 1 - 571694
  20. Top Constraint - -1001103
  21. Top Extension Distance - -1012828
  22. Top is Attached - -1001117
  23. Top Offset - -1001109
  24. Unconnected Height - -1001105
  25. Volume - -1012806
  26.  

Преимущества данного подхода:

  • Отображаются только те свойства, которые видны пользователю, в окне свойств объекта
  • Можно получить группу параметра

Недостатки:

  • Объект данной категории обязательно должен присутсвовать в модели.

Еще один способ – использование метода ParameterFilterUtilities.GetFilterableParametersInCommon(Document doc, ICollection<ElementId> categories). Метод возвращает идентификаторы параметров, доступных для фильтрации элементов по выбранным категориям. В интерфейсе пользователя, это можно увидеть, например при создании фильтра видимости элементов:

 

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

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

Для встроенного параметра, нужно воспользоваться методом LabelUtils.GetLabelFor(BuiltInParameter):

Код - C#: [Выделить]
  1. var parameterName = LabelUtils.GetLabelFor((BuiltInParameter) parameterId.IntegerValue);

В случае же общего параметра, или параметра проекта, нужно сначала получить элемент, по этому идентификатору, а затем получить его название:

Код - C#: [Выделить]
  1. var parameterName = doc.GetElement(parameterId).Name;[[&/code]]
  2. Пример кода:
  3.  
  4. Код - C#: [Выделить]
  5. var bic = BuiltInCategory.OST_Walls;                                               
  6. var categoryId = new ElementId(bic);
  7.                                                
  8. var doc = ActiveUIDocument.Document;
  9. var parametetIds =
  10.     ParameterFilterUtilities.GetFilterableParametersInCommon(doc, new [] {categoryId});
  11.                                                
  12. foreach (ElementId parameterId in parametetIds)
  13. {
  14.     if (BuiltInParameter.IsDefined(typeof(BuiltInParameter), parameterId.IntegerValue))
  15.     {
  16.           var s = LabelUtils.GetLabelFor((BuiltInParameter) parameterId.IntegerValue);
  17.           Debug.Print("{0} - {1}", s, parameterId);
  18.     }
  19.     else
  20.     {
  21.           var p = doc.GetElement(parameterId); 
  22.           Debug.Print("{0} - {1}", p.Name, parameterId);
  23.     }                                                                                                                                                                               
  24. }

Результат:

Код - XML: [Выделить]
  1.  
  2. Absorptance - -1005435
  3. ADN-CIS - 571696
  4. Area - -1012805
  5. Assembly Code - -1002500
  6. Assembly Description - -1002501
  7. Assembly Name - -1150420
  8. Comments - -1010106
  9. Cost - -1001205
  10. Description - -1010103
  11. Estimated Reinforcement Volume - -1018502
  12. Family Name - -1002002
  13. Fire Rating - -1001206
  14. Function - -1001006
  15. Heat Transfer Coefficient (U) - -1005430
  16. Keynote - -1140422
  17. Length - -1004005
  18. Manufacturer - -1010108
  19. Mark - -1001203
  20. Model - -1010109
  21. Roughness - -1005436
  22. Structural Material - -1005500
  23. Structural Usage - -1001119
  24. Test 1 - 571694
  25. Thermal mass - -1005434
  26. Thermal Resistance (R) - -1005431
  27. Type Comments - -1010105
  28. Type Mark - -1001405
  29. Type Name - -1002001
  30. URL - -1010104
  31. Volume - -1012806
  32. Width - -1001000
  33.  

Не трудно заметить, что параметров в этом списке немного больше. Часть параметров являются параметрами типа, так как в фильтрации возможно использовать и их.

Преимущества способа:

  • Вомзожно получить параметры катеогрии объекта, даже если самого объекта в модели нет.

Недостатки:

  • Возвращаются «лишние» параметры. Нет разграничения на параметры типа и экземпляра
  • Нельзя получить группу

Оба способа имеют свои преимущества и недостатки. Недостатки одного, компенсируются преимуществами другого. Какой способ использовать – зависит от ситуации и задачи. Возможно оптимальным будет использование обоих способов одновременно.

Автор: Виктор Чекалин
Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=1796

Опубликовано 23.01.2015
Отредактировано 21.02.2015 в 18:26:02