Найти в Дзене

Добавление изображения в WPF-окно. Экспорт изображений из Revit

Оглавление

Всем привет! Сегодня разберём две связанные темы, для которых я напишу демонстрационное приложение. Само приложение, наверное, не будет иметь особого практического смысла, а вот его части вы сможете использовать для других задач.

Задача

Для выбранного пользователем элемента получить его изображение на 3D-виде в визуальном стиле "Реалистичный". Вывести изображение, Id и имя элемента в окно. При нажатии кнопки "Добавить элемент" добавлять в окно следующий элемент (собрать таблицу из выбранных изображений элементов и их данных).

Решение

Часть 1. Создание вида и экспорт изображения

Экспорт изображения — довольно простая операция. Давайте сразу посмотрим код, как я создаю вид, и экспортирую его:

Какие тут нюансы:

  • Я создаю новый 3D-вид, поэтому мне нужно выбрать тип 3D-вида (строка 12).
  • Я решил, что элемент будет изолирован, для чего я применяю временное изолирование (строка 17) и превращение временного вида в постоянный (18)
  • На строке 20 я создаю путь к файлу во временной папке.
  • А затем создаю ImageExportOptions, задавая им размер, путь к файлу и тип файла.
  • Учтите, что свойство ShadowViewsFileType применяется к видам с тенями (это реалистичный в том числе), а HLRandWFViewsFileType — для каркаса. Я не учёл это, и реалистичный вид у меня выгрузился в JPEG.
  • На строке 32 я отменяю транзакцию, и у меня ещё и новосозданный вид удаляется после экспорта (почему бы и нет).

Через отладчик я захожу в путь к файлу и могу посмотреть, куда выгрузился файл. Я нарисовал такие стенки:

-2

И получил такое изображение одной из них:

Отверстие в стене, потому что геометрию вырезала другая стена
Отверстие в стене, потому что геометрию вырезала другая стена

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

Часть 2. Создание WPF-окна с картинками

Тут я воспользуюсь тем, о чём уже писал — создам ListView с ItemTemplate, а также напишу конвертёр для изображений.

Окно будет выглядеть так:

-4

Для того, чтобы оно нормально работало, я создал свойство, в котором будет хранится список изображений, и команду для добавления изображений во ViewModel:

Так выглядит ViewModel
Так выглядит ViewModel
А так — дескриптор элемента
А так — дескриптор элемента

В ListView я сделал привязку ItemSource к списку дескрипторов, поэтому внутри шаблона элемента я спокойно обращаюсь к его свойствам. Id и Name становятся текстом, а Bitmap я превращаю в изображение, кешируя его в памяти, с помощью конвертёра:

-7

Если что-то не получится, то конвертёр просто не будет создавать изображение с помощью Binding.DoNothing.

В общем-то, и всё, запускаем приложение и смотрим результат:

-8

Заключение

Теперь, используя мой код, вы знаете, как экспортировать изображение, и как использовать его в окне WPF. Способ экспорта из Revit по сути, единственный, а вот готовое изображение вы можете использовать и другими способами, это — один из многих.

Итоговый код в моём репозитории на GitHub

И не забывайте подписываться на мой телеграм-канал о Revit API. До новых встреч!

-9