ADN Open CIS
Сообщество программистов Autodesk в СНГ

19/11/2014

Получить ImageType импортированного изображения

Вопрос: Возможно ли получить объект ImageType из изображения, которое было вставлено в Revit с помощью метода Document.Import?

Ответ: Да, только не совсем явным способом.

Метод для импорта изображения выглядит так:

Код - C#: [Выделить]
  1.   bool Import(
  2.     string file,
  3.     ImageImportOptions options,
  4.     View view,
  5.     out Element element);

С помощью этого метода мы можем только получить объект типа Element, который не содержит каких-либо параметров. Я просмотрел этот объект с помощью утилиты RevitLookup и не нашел там ничего полезного, в том числе и ImageType.

Тем не менее, мы можем получить из Revit все объекты типа ImageType, тем самым мы можем найти тот ImageType того изображения, которое было импортировано.

Но как же связать тот элемент, который мы получили при импортировании с соответствующим ImageType?

Element хранит в себе месторасположение изображения, в то время как в объекте ImageType хранится само изображение. Нам понадобится и то и другое.

К счастью, оба объекта имеют одинаковое наименование Element.Name – имя файла изображения.

Я реализовал небольшое решение, как связать Element и ImageType:

1. Создадим группу транзакций TransactionGroup.
2. Создадим новую транзакцию.
3. Импортируем изображение с уникальным именем файла:
Код - C#: [Выделить]
  1. String tmpFilename = System.IO.Path.GetTempPath()
  2.   + "kubit_" + Guid.NewGuid().ToString() + ".png";
  3. mDoc.Import( tmpFilename, options, newView,
  4.   out element );

4. Присоединим сущность расширяемой области хранения к элементу, полученному при иморте:

Код - C#: [Выделить]
  1. Entity additionalData = newEntity(
  2.   MyImageSchema.GetSchema() );
  3. element.SetEntity( additionalData );

5. Зафиксируем транзакцию
6. Найдем все объекты типа ImageType в базе данных Revit.
7. Заполним словарь, где ключом будет значение свойства Name, а значением – объект ImageTypeDictionary<string, ImageType>
8. С помощью фильтра ExtensibleStorageFilter вернем все объекты, которые мы получили на третьем шаге.
9. Создадим еще одну транзакцию.
10. В цикле пройдемся по всем элементам и к ним ImageType с помощью созданного словаря.

Код - C#: [Выделить]
  1. Entity additionalData = elem.GetEntity(
  2.   MyImageSchema.GetSchema() );
  3.  
  4. if( additionalData.IsValid() )
  5. {
  6.   // Найдем соответствие между ImageType и Element
  7.  
  8.   if( !nameImageTypeMap.ContainsKey( elem.Name ) )
  9.     continue;
  10.  
  11.   ImageType image = nameImageTypeMap[elem.Name];
  12.   additionalData.Set<ElementId>( "ImageTypeId", image.Id );
  13.   elem.SetEntity( additionalData );
  14. }

11. Зафиксируем транзакцию.
12. Зафиксируем группу транзакций.

После этого, вы можете легко извлечь все элементы с изображениями, используя ExtensibleStorageFilter, а также определить ImageType используя идентификатор, хранящийся в расширяемой области хранений.

Надеюсь в следующих версиях Revit API появятся некоторые улучшения в этом плане.

 

Источник: http://thebuildingcoder.typepad.com/blog/2014/09/debugging-and-maintaining-the-image-relationship.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1090

Опубликовано 19.11.2014