Импорт изображения в проект.

Автор Тема: Импорт изображения в проект.  (Прочитано 11680 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги.

Есть задачка, мне пока она не по зубам. Необходимо вставить изображение в проект, используя метод Document.Import.

Данный метод имеет 4 входных параметра:

1) file As String - с этим параметром всё ясно: путь к файлу изображения (Полный путь к файлу для импорта. Файл должен существовать).

2) options As Autodesk.Revit.DB.ImageImportOptions - вот тут уже загвоздка: как создать данный объект мне понятно:

Код - vb.net [Выбрать]
  1. Dim options As New Autodesk.Revit.DB.ImageImportOptions

Вот только что в него нужно вписывать - не понятно. Справочная литература об этом не шибко откровенничает (Возможны различные варианты, применимые к изображению. Если null - пустая ссылка (Nothing в Visual Basic), все параметры будут установлены в их соответствующие значения по умолчанию). Таким образом в этот параметр, чтобы не мудрить, посылаем null / Nothing !!! Было бы хорошо разобраться с настройками, на будущее.

3) view As Autodesk.Revit.DB.View - (Вид, в который изображение будет импортировано). Если принять тот факт, что видом может быть и объект ViewSchedule, то сюда понятно что нужно вставить.

4) ByRef element As Autodesk.Revit.DB.Element - (Импортированный экземпляр после успешного импорта. Может быть использован для дальнейшей обработки этого экземпляра). И вот тут я встал. Что за элемент здесь должен быть? Разве он не должен его создавать самостоятельно? Без этого элемента не выходит «каменный цветок».

Может кто-нибудь знает, что здесь нужно вставить?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #1 : 28-09-2016, 11:51:19 »
Евгений, начнем по порядку.
1. Путь к файлу, ничего особенного
2. В объекте класса ImageImportOptions задаются параметры вставки изображения. Вообще данных подход довольно стандартный для программирования, когда в качестве параметров метода передается некий объект, содержащий в себе какие либо параметры. Это делается по большей части для облегчения чтения кода. В принципе можно было бы создать метод Import и передавать в него 28 параметров (цифра 28 взята для примера и не отражает реальное количество параметров в данном случае). Очевидно, что метод с 28 параметрами не очень удобен для чтения и использования. Вместо этого, передается класс, поля которого используются в дальнейшем в методе.
В данном случае, класс ImageImportOptions содержит следующие поля:
RefPoint - точка, куда вставлять изображение
Placemnet - соответствие точки RefPoint с изображением. Например, точка, которую мы указали, должна соответствовать центру изображения. Или правому верхнему углу и т.п.
Resolution - с каким разрешением импортировать файл.

Собственно чтобы задать эти настройки при импорте изображения, нужно создать объект класса ImageImportOptions, заполнить соответствующие поля и передать этот объект в метод Import
Если не задавать, то будет импортировано с некими настройками по умолчанию. Какими конкретно - нужно экспериментировать.

3. Ага. вид куда импортируем изображение.

4. Объект, который будет создан после импортирования. Этот объект будет инициализирован ПОСЛЕ выполнения метода. Т.е. до выполнения метода  нужно просто объявить переменную типа Element без инициализации, передать эту переменную в качестве параметра. после выполнения метода, переменная будет инициализирована.
Данный подход называется https://msdn.microsoft.com/ru-ru/library/ddck1z30.aspx
На C# код будет выглядеть примерно так:
Код - C# [Выбрать]
  1. Element importedImage;
  2. doc.Import("file", new ImageImportOptions(), view, out importedElement);
  3. //если импорт удался и объект есть
  4. if (importedElement!=null)
  5.  var id = importedElement.Id;
  6.  

На VB.NET наверное так:
Код - vb.net [Выбрать]
  1. Dim importedElement as Element
  2. doc.Import('file', null, viewSchedule, importedElement)[/vbnet]
  3.  

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #2 : 28-09-2016, 12:01:41 »
Спасибо, Виктор.

Код - vb.net [Выбрать]
  1. Dim importedElement as Element
  2. doc.Import('file', null, viewSchedule, importedElement)

Я так и сделал, но увы, это не сработало. Потому и создал новую тему.

Код - vb.net [Выбрать]
  1.             Dim NewElementId As Element
  2.             Doc.Import("000.png", Nothing, rvtViewSchedule, NewElementId)


Я сейчас делаю как раз отладку с этим кодом. Это таааак доооолго всё происходит!!! Кстати, может кто подскажет почему с запуском Revit-а во время отладки всё происходит неимоверно долго?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #3 : 28-09-2016, 12:14:16 »
Я так и сделал, но увы, это не сработало
Так а что именно то не сработало? Выскакивает ошибка при вызове метода? Код не компилируется? Метод выполняется не изображение не вставляется? Все вставляется только не так как хотелось бы?

Я сейчас делаю как раз отладку с этим кодом. Это таааак доооолго всё происходит!!! Кстати, может кто подскажет почему с запуском Revit-а во время отладки всё происходит неимоверно долго?
Если вкратце, то взаимодействие приложения с отладчиком - ресурсоемкая операция.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #4 : 28-09-2016, 12:29:47 »
Так а что именно то не сработало? Выскакивает ошибка при вызове метода? Код не компилируется? Метод выполняется не изображение не вставляется? Все вставляется только не так как хотелось бы?

Ничего не произошло. Будто при нажатии кнопки ничего не должно происходить. Хотя на самом деле после вставки изображения в проект у меня ещё должно было произойти построение табличных данных. Никаких ошибок, только «Молчание ягнят»



Вот первое что я увидел


Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #5 : 28-09-2016, 12:35:41 »
Никаких ошибок, только «Молчание ягнят»
Так есть вероятность, что все отработало как положено. Если в отладке все получается очень долго, то после вставки изображения выведи диалогом идентификатор вставленного элемента. Тем самым будет понятно, вставлено изображение или нет. потом из интерфейса Revit - поиск объекта по его идентификатору.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #6 : 28-09-2016, 12:45:29 »
Без добавления изображения в проект всё выглядит так



Так есть вероятность, что все отработало как положено.

К сожалению вряд ли, поскольку сразу после добавления изображения идёт обработка и вывод данных в таблицу. А этого не произошло. Да и к тому же новых ElementType я не обнаружил.
« Последнее редактирование: 28-09-2016, 13:19:46 от Пашин Евгений »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #7 : 28-09-2016, 13:21:18 »
Судя по ошибке - нельзя импортировать изображения на вид Спецификация. Экспериментирую дальше.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #8 : 28-09-2016, 13:25:28 »
Экспериментирую дальше.

Так и я тоже самое делаю :)



Плюс ко всему добавлю (по старой теме про вставку изображения в ячейку): вручную добавил изображение в ячейку спецификации №1, затем определил его ElementType.Id и попробовал использовать только сам Id (сам номер) и блин изображение что-то не хочет в остальные спецификации вставляться :) Вот это я удачно тему поднял :)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #9 : 28-09-2016, 13:29:07 »
Кажется разобрался.

В общем метод импорта изображения возможен только в конкретный вид и то, только в вид, который можно вывести на печать. Спецификация таким видом не является.
В то же самое время, в интерфейсе можно импортировать изображение, не вставляя его ни в какой вид.

Так как у тебя конечная цель - вставить изображение в спецификацию, а для этого нужно знать Id изображения, то метод Document.Import не подходит.

Нашелся другой метод - ImageType.Create:
Код - C# [Выбрать]
  1. public static ImageType Create(
  2.         Document document,
  3.         string imagePath
  4. )
  5.  

Просто импортирует изображение в проект. Возвращает объект типа ImageType. Для вставки в спецификацию нужно использовать Id этого объекта[/code]

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #10 : 28-09-2016, 13:34:15 »
Виктор, ты наверное уже понимаешь, что нужно будет потом на эту тему статью навоять :)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #11 : 28-09-2016, 13:53:29 »
Так как у тебя конечная цель - вставить изображение в спецификацию, а для этого нужно знать Id изображения, то метод Document.Import не подходит.

Жаль :) Много времени потратил на этот метод :)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Импорт изображения в проект.
« Ответ #12 : 28-09-2016, 14:25:57 »
Много времени потратил на этот метод
Зато приобрел опыт использования этого метода :)
С другим методом то получилось?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #13 : 28-09-2016, 14:41:33 »
С другим методом то получилось?

Нет ещё, я буду пробовать завтра. Но я обязательно отпишусь по этому вопросу.

Отмечено как Решение Пашин Евгений 03-10-2016, 10:26:16

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Импорт изображения в проект.
« Ответ #14 : 03-10-2016, 10:25:45 »
Виктор, всё получилось:

Код - vb.net [Выбрать]
  1.         Dim uiDoc As UIDocument = commandData.Application.ActiveUIDocument
  2.         Dim Doc As Document = uiDoc.Document
  3.  
  4.         Dim ImageID As ElementId = ElementId.InvalidElementId
  5.  
  6.         Using transaction As New Transaction(Doc, "Image type")
  7.             transaction.Start()
  8.             Dim imaget As ImageType = ImageType.Create(Doc, "D:\Пашин\Revit_Ribbon_Menu\Images\00011.png")
  9.             ImageID = imaget.Id
  10.             transaction.Commit()
  11.         End Using

Это была промежуточная тема, необходимая для определения решения в теме:
Вставка изображения в ячейку спецификации: http://adn-cis.org/forum/index.php?topic=7353.0