Статьи > Тестирование статей

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

(1/2) > >>

Андрей Фазлеев:
Оригинал статьи тут: http://fazleev.blogspot.ru/2015/11/revit-api.html

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


--- Код - C# [Выбрать] ---//Code Region: Inserting a rowpublic void CreateSubtitle(ViewSchedule schedule){    TableData colTableData = schedule.GetTableData();     TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);    tsd.InsertRow(tsd.FirstRowNumber + 1);    tsd.SetCellText(tsd.FirstRowNumber + 1, tsd.FirstColumnNumber, "Schedule of column top and base levels with offsets");}
Получаю объект TableSectionData, далее создаются строчки, столбцы, пишутся/читаются данные из ячеек, задаю форматирование.
Можно сделать таблицу с расширенными возможностями форматирования, записывать туда данные. То что возможности есть - хорошо, при необходимости применю, на некоторое время даже забыл про эту тему.

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

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

Обратите внимание на строчку:

--- Код - C# [Выбрать] ---TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);
Тэкс, Header, Header. Если есть Header, может есть и сама таблица?

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



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

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

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




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



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

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

Пример кода:

   
--- Код - 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);            }            } 
Поля спецификации заполнены:



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

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

Удачи!

Александр Ривилис:
kha
Спасибо за статью! Я поменял ссылки на картинки, так как они были плохо читаемые.

Андрей Фазлеев:
я ещё отредактирую её немного. Методы и свойства цветом выделю, среди текста не читаются

Виктор Чекалин:
Спасибо. Может оказаться полезным.

Однако, нужно быть предельно аккуратным с таким кодом.

--- Цитата: kha от 01-11-2015, 23:27:21 ---Код - 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# [Выбрать] ---if (view.ViewType != ViewType.Schedule)throw new ArgumentException("Вид не является спецификацией")Иначе если по ошибки запустить код на другом виде, все может зависнуть надолго.

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

Андрей Фазлеев:
Сначала сделал код со всеми проверками, но за ними потерялась суть.
Выделил только то что важно для выполнения.
Обычно в справочных материалах такая подача

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

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии