Получить ImageType импортированного изображения
Вопрос: Возможно ли получить объект ImageType из изображения, которое было вставлено в Revit с помощью метода Document.Import?
Ответ: Да, только не совсем явным способом.
Метод для импорта изображения выглядит так:
- bool Import(
- string file,
- ImageImportOptions options,
- View view,
- out Element element);
С помощью этого метода мы можем только получить объект типа Element, который не содержит каких-либо параметров. Я просмотрел этот объект с помощью утилиты RevitLookup и не нашел там ничего полезного, в том числе и ImageType.
Тем не менее, мы можем получить из Revit все объекты типа ImageType, тем самым мы можем найти тот ImageType того изображения, которое было импортировано.
Но как же связать тот элемент, который мы получили при импортировании с соответствующим ImageType?
Element хранит в себе месторасположение изображения, в то время как в объекте ImageType хранится само изображение. Нам понадобится и то и другое.
К счастью, оба объекта имеют одинаковое наименование Element.Name – имя файла изображения.
Я реализовал небольшое решение, как связать Element и ImageType:
1. Создадим группу транзакций TransactionGroup.2. Создадим новую транзакцию.
3. Импортируем изображение с уникальным именем файла:
- String tmpFilename = System.IO.Path.GetTempPath()
- + "kubit_" + Guid.NewGuid().ToString() + ".png";
- mDoc.Import( tmpFilename, options, newView,
- out element );
- Entity additionalData = newEntity(
- MyImageSchema.GetSchema() );
- element.SetEntity( additionalData );
6. Найдем все объекты типа ImageType в базе данных Revit.
7. Заполним словарь, где ключом будет значение свойства Name, а значением – объект ImageType – Dictionary<string, ImageType>
8. С помощью фильтра ExtensibleStorageFilter вернем все объекты, которые мы получили на третьем шаге.
9. Создадим еще одну транзакцию.
10. В цикле пройдемся по всем элементам и к ним ImageType с помощью созданного словаря.
- Entity additionalData = elem.GetEntity(
- MyImageSchema.GetSchema() );
- if( additionalData.IsValid() )
- {
- // Найдем соответствие между ImageType и Element
- if( !nameImageTypeMap.ContainsKey( elem.Name ) )
- continue;
- ImageType image = nameImageTypeMap[elem.Name];
- additionalData.Set<ElementId>( "ImageTypeId", image.Id );
- elem.SetEntity( additionalData );
- }
12. Зафиксируем группу транзакций.
После этого, вы можете легко извлечь все элементы с изображениями, используя ExtensibleStorageFilter, а также определить ImageType используя идентификатор, хранящийся в расширяемой области хранений.
Надеюсь в следующих версиях Revit API появятся некоторые улучшения в этом плане.
Обсуждение: http://adn-cis.org/forum/index.php?topic=1090
Опубликовано 19.11.2014