[Revit API] - Запись данных в ключевую спецификацию

Автор Тема: [Revit API] - Запись данных в ключевую спецификацию  (Прочитано 3147 раз)

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

Оффлайн Андрей ФазлеевАвтор темы

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
Оригинал статьи тут: http://fazleev.blogspot.ru/2015/11/revit-api.html

Не так давно я писал о способе создания пользовательской таблицы
Задумался о том, как же теперь наполнить её через API.
Оказалось что здесь всё прозрачно и методы работы описаны в документации:

Код - C# [Выбрать]
  1. //Code Region: Inserting a row
  2. public void CreateSubtitle(ViewSchedule schedule)
  3. {
  4.     TableData colTableData = schedule.GetTableData();
  5.  
  6.     TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);
  7.     tsd.InsertRow(tsd.FirstRowNumber + 1);
  8.     tsd.SetCellText(tsd.FirstRowNumber + 1, tsd.FirstColumnNumber, "Schedule of column top and base levels with offsets");
  9. }

Получаю объект TableSectionData, далее создаются строчки, столбцы, пишутся/читаются данные из ячеек, задаю форматирование.
Можно сделать таблицу с расширенными возможностями форматирования, записывать туда данные. То что возможности есть - хорошо, при необходимости применю, на некоторое время даже забыл про эту тему.

До сегодняшнего дня был ещё один интересный нерешённый вопрос: как заполнять программным способом ключевую спецификацию?
В первый раз он возник месяцев восемь назад, как ни бился над ним - не нашёл подхода.

Видимо эта задачка крутилась в мозгу в фоновом режиме и однажды во время прогулки внезапно пришла мысль, зацепка.

Обратите внимание на строчку:
Код - C# [Выбрать]
  1. TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);

Тэкс, Header, Header. Если есть Header, может есть и сама таблица?

Набираю SectionType и Intellisense предложил первой строчкой интересный вариант:



Пишу код как в справке, заменил Header на Body.
Строки данных добавляются/удаляются методами InsertRow и RemoveRow. Уже хорошо.
А вот с записью данных возникла проблема. На методе  SetCellText возникает ошибка, записать текст не удаётся таким же образом как это делается в заголовке таблицы.

Всё, приехали? Как бы не так!

Выручил Revit Lookup:
выбрал спецификацию, покопался в данных, но не нашёл ничего, что могло бы помочь в записи данных.




Делал несколько подходов, в последний из них забыл выбрать спецификацию в диспетчере проектов и получил совершенно другую картинку:



Что случилось? А случилось вот что: при снятом выделении вида в диспетчере проектов в Revit Lookup попадают все элементы текущего вида.
То есть каждая строчка ключевой спецификации - это объект класса Element. Его нет в модели и у него нет категории.
Зато есть параметры, соответствующие полям спецификации.

Через FilteredElementCollector получаем элементы ключевой спецификации, перебираем их и задаём требуемые значения.

Пример кода:

   
Код - C# [Выбрать]
  1. private void WriteToKeySchedule(View view)
  2.     {
  3.    // Получение элементов вида
  4.    FilteredElementCollector collector = new FilteredElementCollector(view.Document, view.Id);
  5.  
  6.         // Для примера взят параметр "Комментарии", который есть у большинства элементов
  7.         // перед запуском примера добавьте его в ключевую спецификацию
  8.             string s = "test";
  9.             foreach (Element element in collector)
  10.             {
  11.                 element.LookupParameter("Комментарии").Set(s);
  12.             }        
  13.     }
  14.  

Поля спецификации заполнены:



Далее дело техники - прикрутить модуль связи с Excel/CSV/XML... да с чем угодно, всё зависит от конкретных задач, и писать данные в ключевые спецификации

Пример использования см. макросы в прикреплённом файле

Удачи!
« Последнее редактирование: 04-11-2015, 17:03:47 от Андрей Фазлеев »

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 7665
  • Карма: 902
  • Рыцарь ObjectARX
  • Skype: rivilis
kha
Спасибо за статью! Я поменял ссылки на картинки, так как они были плохо читаемые.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей ФазлеевАвтор темы

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
я ещё отредактирую её немного. Методы и свойства цветом выделю, среди текста не читаются

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 687
  • Карма: 99
  • Skype: chekalin-v
Спасибо. Может оказаться полезным.

Однако, нужно быть предельно аккуратным с таким кодом.
Код - C#: [Выделить]
private void WriteToKeySchedule(View view)
    {
   // Получение элементов вида
   FilteredElementCollector collector = new FilteredElementCollector(view.Document, view.Id);
 
        // Для примера взят параметр "Комментарии", который есть у большинства элементов
        // перед запуском примера добавьте его в ключевую спецификацию
            string s = "test";
            foreach (Element element in collector)
            {
                element.LookupParameter("Комментарии").Set(s);
            }        
    }
 

Выбирать элементы без какой-либо фильтрации (за исключением фильтрации по виду) - может оказаться чревато. Особенно с изменением версии Revit нужно тщательно проверять. Нужно хотя бы поставить проверку на то что мы работаем с видом типа Спецификация.
Код - C# [Выбрать]
  1. if (view.ViewType != ViewType.Schedule)
  2. throw new ArgumentException("Вид не является спецификацией")
Иначе если по ошибки запустить код на другом виде, все может зависнуть надолго.

Если не трудно, можете тестовый проект скинуть, где вы это тестировали.

Оффлайн Андрей ФазлеевАвтор темы

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
Сначала сделал код со всеми проверками, но за ними потерялась суть.
Выделил только то что важно для выполнения.
Обычно в справочных материалах такая подача

Тестовый проект выложу чуть позже

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 687
  • Карма: 99
  • Skype: chekalin-v
Выделил только то что важно для выполнения.
Обычно в справочных материалах такая подача

Да, только в таком случае еще прикладывают тогда полные исходники с проектом:)
Думаю, в данном конкретном случае, предупреждение не помешает. Новички могут использовать код как есть, а потом будут долго не понимать, почему все так плохо.

Оффлайн Андрей ФазлеевАвтор темы

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
Заменил тестовый файл.