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

15/08/2014

Обновление файлов семейств без отображения диалога. Часть 2

Ранее я уже предлагал советы по обновлению файлов семейств без отображения диалога, появляющегося каждый раз при загрузке семейства в проект.

Предложения были такими:

Разработчик, которого интересовал этот вопрос, попытался использовать эти способы. Я хотел бы обсудить что в итоге вышло.

1.       Revit File Updater

Я попытался найти эту надстройку на сайте Autodesk Lab, но страница с этой надстройкой уже недоступна. Немного поискав, я увидел, что Revit File Updater был перенесен на сайт Autodesk Exchange. Но я так и не смог его найти. Так что было бы не плохо, если бы вы смогли дать все же эту надстройку и показать как мы можем обновить файлы.

2.       Обработка события отображения диалогов

Вот диалог, который я пытаюсь спрятать:

 

Диалог появляется каждый раз при вызове метода Document.LocadSymbol, если семейство было создано в предыдущей версии Revit. Диалог автоматически исчезает, но он появляется снова и снова при каждом открытии файла.

Я попытался с помощью обработки события DialogBoxShowing спрятать это окно, но похоже, что это событие не вызывается при отображении диалога с предупреждением об обновлении.

Затем я попробовал использовать Failure API и создал свой класс, реализующий интерфейс IFailuresPreprocesser. Для использования я вызывал метод

Код - C#: [Выделить]
  1.   transaction.SetFailureHandlingOptions( options );

К сожалению, это работает на совсем так как хотелось. Вызов метода IFailuresPreprocessor.PreprocessFailures происходит, но только в момент подтверждения транзакции:

Код - C#: [Выделить]
  1.   // Диалог появляется в этот момент:
  2.  
  3.   doc.LoadFamilySymbol( familyfilePath,
  4.     typeName, out symbol );
  5.  
  6.   // А метод обработки ошибок только здесь:
  7.   transaction.commit();

Я не пробовал использовать методы Windows API, но что-то мне подсказывает, что это единственный способ спрятать наконец это окно.

3.       Определение версии Revit, в которой файл был сохранен

Класс BasicFileInfo работает замечательно. Я смог получить версию Revit, в которой файл семейства был сохранен.

Вообще я бы хотел видеть перегруженный метод LoadFamilySymbol, который бы позволял не отображать диалог об обновлении. Например, такой:

Код - C#: [Выделить]
  1.   doc.LoadFamilySymbol( familyFilePath,
  2.     typeName, ignorePrompts, out symbol );

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

Ответ: Скачать исходный код Revit File Updater можно по ссылке.

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

Я, наверное, соглашусь, что использование Windows API, в данном случае, это единственных выход.

Вы не хотите поделиться примером кода по использованию BasicFileInfo? Мне кажется еще не было примеров по его использованию.

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

Может быть стоит с помощью BasicFileInfo определить список файлов, которые требуют обновления, отобразить этот список пользователю и спросить у него подтверждения, стоит ли обновлять файлы или нет. Затем запустить утилиту обновления файла до загрузки его в проект.

Ответ: Я использовал BasicFileInfo в таком виде:

Код - C#: [Выделить]
  1.   var familyFilePath = "FamilyFile.rfa";
  2.   var fileInfo = BasicFileInfo.Extract(
  3.     familyFilePath );

FileInfo содержит два свойства, которые нам интересны:

  • fileInfo.IsSavedInCurrentVersion. Возвращает true, если файл был сохранен в той же самой версии, что и текущая версия Revit
  • fileInfo.SavedInVersion. Возвращает строку с полным наименованием версии Revit, например, «Autodesk Revit Architecture 2015»

Спасибо за ссылку на код Revit File Updater. Глядя на код, я вижу, что каждое семейство открывается и сохраняется в текущей версии Revit. Я попытаюсь у себя реализовать тот же самый подход.

Большое спасибо за советы.

Источник: http://thebuildingcoder.typepad.com/blog/2014/07/upgrading-family-files-silently-part-2.html

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

Опубликовано 15.08.2014
Отредактировано 16.08.2014 в 11:37:01