Поиск спецификаций на листе
Guy Robinson недавно рассказал нам о легком способе как получить доступ ко всем элементам спецификации.
Виктор Чекалин немного расширил возможности данного метода.
Ниже представлено его решение как получить все спецификации на листе и все элементы в спецификации.
В один прекрасный день мне понадобилось получить все Спецификации представленные на Листе.
Первым делом я посмотрел в документацию по Revit API, но к большому сожалению не обнаружил там метода типа GetSchedulesOnView в классе ViewSheet. Таким образом, не существует явного способа получить требуемые данные. После пары часов попыток достичь того что мне нужно, я наткнулся на решение Гая (Guy Robinson) как получить доступ ко всем элементам в спецификации. Решение было следующим: использовать FilteredElementCollector и в конструкторе передать идентификатор вида, на котором я хочу искать элементы, т.е. идентификатор вида Спецификации.
Я создал простое решение в виде метода-расширения, который возвращает список всех спецификаций, находящихся на листе.
- public static class ViewSheetExtensions
- {
- public static IEnumerable<ViewSchedule>
- GetSchedules(this ViewSheet viewSheet)
- {
- var doc = viewSheet.Document;
- FilteredElementCollector collector =
- new FilteredElementCollector(doc, viewSheet.Id);
- var scheduleSheetInstances =
- collector
- .OfClass(typeof(ScheduleSheetInstance))
- .ToElements()
- .OfType<ScheduleSheetInstance>();
- foreach (var scheduleSheetInstance in
- scheduleSheetInstances)
- {
- var scheduleId =
- scheduleSheetInstance
- .ScheduleId;
- if (scheduleId == ElementId.InvalidElementId)
- continue;
- var viewSchedule =
- doc.GetElement(scheduleId)
- as ViewSchedule;
- if (viewSchedule != null)
- yield return viewSchedule;
- }
- }
- }
- var schedules =
- viewSheet
- .GetSchedules()
- .ToList();
- foreach (var viewSchedule in schedules)
- {
- // Какие-либо действия со спецификациями
- }
Результат выполнения демонстрационной команды можно увидеть на скриншоте.
Но я решил не останавливаться на достигнутом и идти дальше. Следующим шагом будет являться метод, который позволит получить все элементы, так или иначе связанные со спецификацией. Используется тот же самый подход что и со спецификациями на листе. Используя FilteredElementCollector, только вместо идентификатора Листа, в качестве параметра я буду передавать идентификатор спецификации.
Метод-расширения похож на предыдущий:
- public static class ViewScheduleExtensions
- {
- public static IEnumerable<ElementId>
- GetElementIdsInSchedule(this ViewSchedule viewSchedule)
- {
- var doc = viewSchedule.Document;
- FilteredElementCollector collector =
- new FilteredElementCollector(doc, viewSchedule.Id);
- var elementIds =
- collector
- .WhereElementIsNotElementType()
- .ToElementIds();
- return elementIds;
- }
- }
Но в случае с элементами на спецификации есть небольшой нюанс. Если я буду извлекать элементы со спецификации вида Расход материала, то в результате я получу также и список всех материалов проекта вместе с элементами, находящимися в спецификации. Решение этой проблемы простое – просто пропускать элементы с типом Material при итерации элементов:
- foreach (var elementId in elementIds)
- {
- var element =
- doc.GetElement(elementId);
- if (element is Material)
- continue;
- // Какие-либо действия с элементами спецификации.
- }
На скриншоте представлен результат выполнения тестовой команды.
Скачать архив проекта можно по ссылке или на GitHub.
Источник: http://thebuildingcoder.typepad.com/blog/2013/02/retrieving-schedules-on-a-sheet.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=117.0
Отредактировано 19.07.2013 в 13:55:35