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

ADN Club => Revit API => Тема начата: shss от 30-01-2017, 17:34:01

Название: Получение данных спецификации
Отправлено: shss от 30-01-2017, 17:34:01
Добрый день!
Хочу получить данные спецификации в виде DataTable с внутренним названием заголовков, Джереми предлагает способ через экспорт спецификации: http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html (http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html). Но данный способ перестает работать когда в спецификации появляются колонки с одинаковым названием.
Пробовал через GetCellText, но также не берется внутреннее имя поля.
Получил список внутренних имен колонок через GetSchedulableFields(), но как их связать с данными спецификации?
Есть каке-нибудь варианты?
Название: Re: Получение данных спецификации
Отправлено: shss от 30-01-2017, 22:01:16
Вообщем решил пойти по другому пути.
Получать даные не из спецификации, а напрямую из объектов.
Получил, выбранные, пользователем колонки:
Код - C# [Выбрать]
  1. IList<SchedulableField> schedulableFields = selectedSchedule.Definition.GetSchedulableFields();
  2.             foreach (SchedulableField sf in schedulableFields) {
  3.                 if (sf.ParameterId.IntegerValue < 0) {
  4.                     IList<ScheduleFieldId> ids = selectedSchedule.Definition.GetFieldOrder();
  5.                     foreach (ScheduleFieldId id in ids) {
  6.                         ScheduleField field = selectedSchedule.Definition.GetField(id);
  7.                         try {
  8.                             if (field.GetSchedulableField() == sf) {
  9.                                 c_lbScheduleHeaders.Items.Add(field.GetName() + "[" + field.ColumnHeading + "]");
  10.                                 break;
  11.                             }
  12.                         }
  13.                         catch { }
  14.                     }
  15.                 }
  16.             }
  17.  

А далее просто перебрал объекты, которые находятся в спецификации и получил активные свойства:

Код - C# [Выбрать]
  1. DataTable dt = new DataTable();
  2. foreach (string col in listItems)
  3.     dt.Columns.Add(col, typeof(string));
  4.  
  5. FilteredElementCollector ids = new FilteredElementCollector(selectedSchedule.Document, selectedSchedule.Id);
  6. var elementIds = ids.WhereElementIsNotElementType().ToElementIds();
  7. List<string> data = new List<string>();
  8. foreach (ElementId elementId in elementIds) {
  9.     Element element = doc.GetElement(elementId);
  10.     foreach (string stringParameter in parameters) {
  11.         Parameter parameter = element.LookupParameter(stringParameter);
  12.         if (null != parameter)
  13.                 data.Add(element.LookupParameter(stringParameter).AsValueString());
  14.         }
  15.         dt.Rows.Add(data.ToArray());
  16.         data.Clear();
  17. }
  18.  

Некрасиво, но работает намного быстрее, нежели через GetSchedulableFields()
Название: Re: Получение данных спецификации
Отправлено: shss от 31-01-2017, 09:43:28
Возникла проблема с обращением к полю типа Count и Instance.
Можно ли получить эти данные?
Название: Re: Получение данных спецификации
Отправлено: shss от 05-02-2017, 16:16:08
В итоге имеем, что Count это просто сортировка объектов, и не явлется параметром объекта, его я скипнул выставив свойство
Код - C# [Выбрать]
  1. selectedSchedule.Definition.IsItemized = true;
в этом случае все элементы будут по одной позиции.