Получение данных спецификации

Автор Тема: Получение данных спецификации  (Прочитано 2858 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!
Хочу получить данные спецификации в виде DataTable с внутренним названием заголовков, Джереми предлагает способ через экспорт спецификации: http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html. Но данный способ перестает работать когда в спецификации появляются колонки с одинаковым названием.
Пробовал через GetCellText, но также не берется внутреннее имя поля.
Получил список внутренних имен колонок через GetSchedulableFields(), но как их связать с данными спецификации?
Есть каке-нибудь варианты?

Отмечено как Решение shss 05-02-2017, 16:16:27

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение данных спецификации
« Ответ #1 : 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()

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение данных спецификации
« Ответ #2 : 31-01-2017, 09:43:28 »
Возникла проблема с обращением к полю типа Count и Instance.
Можно ли получить эти данные?

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение данных спецификации
« Ответ #3 : 05-02-2017, 16:16:08 »
В итоге имеем, что Count это просто сортировка объектов, и не явлется параметром объекта, его я скипнул выставив свойство
Код - C# [Выбрать]
  1. selectedSchedule.Definition.IsItemized = true;
в этом случае все элементы будут по одной позиции.