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

ADN Club => Revit API => Тема начата: Alexander от 10-02-2014, 09:30:48

Название: Table Section Data
Отправлено: Alexander от 10-02-2014, 09:30:48
Добрый день!

В своей спецификации я использовал:
TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);
для изменения свойств заголовка в спецификации.
Но если я меняю SectionType.Body то ревит выдаёт ошибку. В api help пишут, что можно менять только заголовок.(http://help.autodesk.com/view/RVT/2014/ENU/?guid=GUID-76A3927E-6DA6-495F-A89C-00F760E3702C (http://help.autodesk.com/view/RVT/2014/ENU/?guid=GUID-76A3927E-6DA6-495F-A89C-00F760E3702C))

Это действительно так или я где-то ошибаюсь?

Спасибо.
Название: Re: Table Section Data
Отправлено: Виктор Чекалин от 10-02-2014, 10:02:46
Александр, здравствуйте.

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

Вы не написали что вы конкретно хотели изменить, но могу дать стандартный совет - попробуйте сделать то, что вы хотите сделать программно, вручную в интерфейсе. Если это невозможно сделать в интерфейсе, то в 99% случаев это нельзя сделать и с помощью API.
Название: Re: Table Section Data
Отправлено: shss от 23-01-2017, 15:20:59
Виктор, здравствуйте!
Столкнулся с такой же делеммой, как обновить данные в секции Body.
Наткнулся на такой пример:
=1m53s
Плагин, насколько я понял может выгружать данные в Excel, изменять их там, и загружать обратно. Но в документации написано: Also, for ViewSchedules, while the header section has read/write permissions, the body section is read-only.
Название: Re: Table Section Data
Отправлено: Виктор Чекалин от 24-01-2017, 07:39:44
shss, Сергей, все верно, тело спецификации менять нельзя.
Но работоспособность плагина легко объяснить. Тело спецификации состоит из списка объектов, а столбцы - свойства этих объектов. Соответственно, чтобы изменить значение в ячейки спецификации, нужно изменить значение свойства объекта.
Плагин не добавляет новых строк, а только лишь изменяет существующие.
Думаю алгоритм работы при импорте примерно такой:

Я не проверял, но уверен, что плагин не сработает или споткнется на следующих случаях, сделанных в экселе:
Название: Re: Table Section Data
Отправлено: shss от 24-01-2017, 10:43:09
Виктор, а как же быть с полями которые для ручного заполнения, например у меня есть поле порядкового номера, которое можно поменять вручную, причем любым значением помимо цифр, их получается нельзя поменять, с помощью API?
Название: Re: Table Section Data
Отправлено: Виктор Чекалин от 24-01-2017, 16:58:49
Сергей, я честно говоря не знал о том, что можно в спецификацию добавить поля для ручного заполнения. В интерфейсе тоже не нашел такого. Можешь привести пример, лучше даже файл с тестовой спецификацией. Покопаюсь на предмет редактирования.
Название: Re: Table Section Data
Отправлено: Виктор Чекалин от 24-01-2017, 17:02:48
Сергей, видимо ты вот это (http://adn-cis.org/forum/index.php?topic=3171.0) имел ввиду. Такая ячейка - это отдельный ревитовский элемент. Найдя ее, можно записать в нее значения.
Название: Re: Table Section Data
Отправлено: shss от 26-01-2017, 20:19:28
Виктор, да, примерно, то что надо.
Но у меня возникает сразу же вопрос по этой строчке:
Код - C# [Выбрать]
  1.  foreach (Element element in collector)
  2.             {
  3.                 element.LookupParameter("Комментарии").Set(s);
  4.             }
А если Revit на английском или другом языке. Скорее всего нужно брать внутреннее имя параметра.
Но как получить все внутренние имена полей спецификации?
Название: Re: Table Section Data
Отправлено: shss от 26-01-2017, 20:26:17
Кажется нашел, можно получить список добавленных в спецификацию полей через GetSchedulableField().
Название: Re: Table Section Data
Отправлено: shss от 27-01-2017, 11:44:54
Виктор, спасибо за ссылку. Сделал все что хотел:
Код - C# [Выбрать]
  1. using (Transaction tr = new Transaction(doc, "WriteToSchedule")) {
  2.         tr.Start();
  3.         foreach (Element element in collector) {
  4.         count++;
  5.         for (int i = table.Columns.Count - 1; i >= 0; i--) {
  6.                    try {
  7.                           Parameter parameter = element.LookupParameter(table.Columns[i].ColumnName);
  8.                           if ((!parameter.IsReadOnly) & (null != parameter))
  9.                                   parameter.Set(table.Rows[count][table.Columns[i].ColumnName].ToString());
  10.                           }
  11.                           catch (Exception ex) { Debug.Print("{0}: {1}", ex.Source, ex.Message); }
  12.                      }
  13.           }
  14.           tr.Commit();
  15. }
  16.  

Получилось заполнение полей спецификации (которые не "read-only") из datatable.
Название: Re: Table Section Data
Отправлено: Александр Пекшев aka Modis от 22-12-2018, 18:25:18
А что будет, если установлена IsItemized = False? Т.е. не стоит галочка "Для каждого экземпляра"