Всем привет! Сегодня разберём две связанные темы, для которых я напишу демонстрационное приложение. Само приложение, наверное, не будет иметь особого практического смысла, а вот его части вы сможете использовать для других задач.
Задача
Для выбранного пользователем элемента получить его изображение на 3D-виде в визуальном стиле "Реалистичный". Вывести изображение, Id и имя элемента в окно. При нажатии кнопки "Добавить элемент" добавлять в окно следующий элемент (собрать таблицу из выбранных изображений элементов и их данных).
Решение
Часть 1. Создание вида и экспорт изображения
Экспорт изображения — довольно простая операция. Давайте сразу посмотрим код, как я создаю вид, и экспортирую его:
Какие тут нюансы:
- Я создаю новый 3D-вид, поэтому мне нужно выбрать тип 3D-вида (строка 12).
- Я решил, что элемент будет изолирован, для чего я применяю временное изолирование (строка 17) и превращение временного вида в постоянный (18)
- На строке 20 я создаю путь к файлу во временной папке.
- Учтите, что свойство ShadowViewsFileType применяется к видам с тенями (это реалистичный в том числе), а HLRandWFViewsFileType — для каркаса. Я не учёл это, и реалистичный вид у меня выгрузился в JPEG.
- На строке 32 я отменяю транзакцию, и у меня ещё и новосозданный вид удаляется после экспорта (почему бы и нет).
Через отладчик я захожу в путь к файлу и могу посмотреть, куда выгрузился файл. Я нарисовал такие стенки:
И получил такое изображение одной из них:
Отлично, это изображение мы можем использовать для нашего окна с картинками.
Часть 2. Создание WPF-окна с картинками
Тут я воспользуюсь тем, о чём уже писал — создам ListView с ItemTemplate, а также напишу конвертёр для изображений.
Окно будет выглядеть так:
Для того, чтобы оно нормально работало, я создал свойство, в котором будет хранится список изображений, и команду для добавления изображений во ViewModel:
В ListView я сделал привязку ItemSource к списку дескрипторов, поэтому внутри шаблона элемента я спокойно обращаюсь к его свойствам. Id и Name становятся текстом, а Bitmap я превращаю в изображение, кешируя его в памяти, с помощью конвертёра:
Если что-то не получится, то конвертёр просто не будет создавать изображение с помощью Binding.DoNothing.
В общем-то, и всё, запускаем приложение и смотрим результат:
Заключение
Теперь, используя мой код, вы знаете, как экспортировать изображение, и как использовать его в окне WPF. Способ экспорта из Revit по сути, единственный, а вот готовое изображение вы можете использовать и другими способами, это — один из многих.
Итоговый код в моём репозитории на GitHub
И не забывайте подписываться на мой телеграм-канал о Revit API. До новых встреч!