Оригинал статьи тут:
http://fazleev.blogspot.ru/2015/11/revit-api.htmlНе так давно я писал о способе создания
пользовательской таблицы Задумался о том, как же теперь наполнить её через API.
Оказалось что здесь всё прозрачно и методы работы описаны в
документации:
//Code Region: Inserting a row
public 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, далее создаются строчки, столбцы, пишутся/читаются данные из ячеек, задаю форматирование.
Можно сделать таблицу с расширенными возможностями форматирования, записывать туда данные. То что возможности есть - хорошо, при необходимости применю, на некоторое время даже забыл про эту тему.
До сегодняшнего дня был ещё один интересный нерешённый вопрос: как заполнять программным способом ключевую спецификацию?
В первый раз он возник месяцев восемь назад, как ни бился над ним - не нашёл подхода.
Видимо эта задачка крутилась в мозгу в фоновом режиме и однажды во время прогулки внезапно пришла мысль, зацепка.
Обратите внимание на строчку:
TableSectionData tsd = colTableData.GetSectionData(SectionType.Header);
Тэкс,
Header,
Header. Если есть Header, может есть и сама таблица?
Набираю
SectionType и Intellisense предложил первой строчкой интересный вариант:
Пишу код как в справке, заменил
Header на
Body.
Строки данных добавляются/удаляются методами
InsertRow и
RemoveRow. Уже хорошо.
А вот с записью данных возникла проблема. На методе
SetCellText возникает ошибка, записать текст не удаётся таким же образом как это делается в заголовке таблицы.
Всё, приехали? Как бы не так!
Выручил Revit Lookup:
выбрал спецификацию, покопался в данных, но не нашёл ничего, что могло бы помочь в записи данных.
Делал несколько подходов, в последний из них забыл выбрать спецификацию в диспетчере проектов и получил совершенно другую картинку:
Что случилось? А случилось вот что: при снятом выделении вида в диспетчере проектов в Revit Lookup попадают все элементы текущего вида.
То есть каждая строчка ключевой спецификации - это объект класса
Element. Его нет в модели и у него нет категории.
Зато есть параметры, соответствующие полям спецификации.
Через
FilteredElementCollector получаем элементы ключевой спецификации, перебираем их и задаём требуемые значения.
Пример кода:
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... да с чем угодно, всё зависит от конкретных задач, и писать данные в ключевые спецификации
Пример использования см. макросы в прикреплённом файле
Удачи!