Обновление файлов семейств без отображения диалога. Часть 2
Ранее я уже предлагал советы по обновлению файлов семейств без отображения диалога, появляющегося каждый раз при загрузке семейства в проект.
Предложения были такими:
- Использовать Revit file updater, разработанный командой ADN
- Обработать событие отображения сообщений с помощью различных технологий
- Определить версию Revit, в который был сохранен файл, до начала загрузки.
Разработчик, которого интересовал этот вопрос, попытался использовать эти способы. Я хотел бы обсудить что в итоге вышло.
1. Revit File Updater
Я попытался найти эту надстройку на сайте Autodesk Lab, но страница с этой надстройкой уже недоступна. Немного поискав, я увидел, что Revit File Updater был перенесен на сайт Autodesk Exchange. Но я так и не смог его найти. Так что было бы не плохо, если бы вы смогли дать все же эту надстройку и показать как мы можем обновить файлы.
2. Обработка события отображения диалогов
Вот диалог, который я пытаюсь спрятать:
Диалог появляется каждый раз при вызове метода Document.LocadSymbol, если семейство было создано в предыдущей версии Revit. Диалог автоматически исчезает, но он появляется снова и снова при каждом открытии файла.
Я попытался с помощью обработки события DialogBoxShowing спрятать это окно, но похоже, что это событие не вызывается при отображении диалога с предупреждением об обновлении.
Затем я попробовал использовать Failure API и создал свой класс, реализующий интерфейс IFailuresPreprocesser. Для использования я вызывал метод
- transaction.SetFailureHandlingOptions( options );
К сожалению, это работает на совсем так как хотелось. Вызов метода IFailuresPreprocessor.PreprocessFailures происходит, но только в момент подтверждения транзакции:
- // Диалог появляется в этот момент:
- doc.LoadFamilySymbol( familyfilePath,
- typeName, out symbol );
- // А метод обработки ошибок только здесь:
- transaction.commit();
Я не пробовал использовать методы Windows API, но что-то мне подсказывает, что это единственный способ спрятать наконец это окно.
3. Определение версии Revit, в которой файл был сохранен
Класс BasicFileInfo работает замечательно. Я смог получить версию Revit, в которой файл семейства был сохранен.
Вообще я бы хотел видеть перегруженный метод LoadFamilySymbol, который бы позволял не отображать диалог об обновлении. Например, такой:
- doc.LoadFamilySymbol( familyFilePath,
- typeName, ignorePrompts, out symbol );
Пока я использую класс BasicFileInfo для сбора информации о версиях, в которых были сохранены все мои файлы семейств. Перед загрузкой семейств в проект, если есть необходимость обновлять файлы, то я предупреждаю пользователя, что во время загрузки будет показано информационное сообщение о необходимости обновления файла.
Ответ: Скачать исходный код Revit File Updater можно по ссылке.
Мне правда жаль, что другие методы, которые я вам предложил, не помогли в решении задачи. Спасибо что вы попробовали каждый из них и подробно описали проблемы.
Я, наверное, соглашусь, что использование Windows API, в данном случае, это единственных выход.
Вы не хотите поделиться примером кода по использованию BasicFileInfo? Мне кажется еще не было примеров по его использованию.
Возможно, при использовании метода обновления файла совместно с методом, который применили вы, полностью решит проблему автоматического обновления файлов.
Может быть стоит с помощью BasicFileInfo определить список файлов, которые требуют обновления, отобразить этот список пользователю и спросить у него подтверждения, стоит ли обновлять файлы или нет. Затем запустить утилиту обновления файла до загрузки его в проект.
Ответ: Я использовал BasicFileInfo в таком виде:
- var familyFilePath = "FamilyFile.rfa";
- var fileInfo = BasicFileInfo.Extract(
- 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