Как проверить, что внешняя ссылка требует перезагрузки?

Автор Тема: Как проверить, что внешняя ссылка требует перезагрузки?  (Прочитано 3815 раз)

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

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

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Здравствуйте!
Подскажите, пожалуйста, как можно проверить что внешняя ссылка требует повторной загрузки в .NET? То есть, когда кто-то обновляет файл, на который ссылается открытый чертеж, появляется уведомление внизу экрана и предлагается заново загрузить внешнюю ссылку. Такие внешние ссылки помечаются в диспетчере внешних ссылок в графе Status восклицательным знаком.



У объектов XrefGraphNode и BlockTableRecord есть свойство XrefStatus, но в перечислении XrefStatus нет варианта "NeedsReloading" или чего-то в этом роде. Внешние ссылки, которые требуют перезагрузки, имеют XrefStatus равным Resolved.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такой код:
Код - C# [Выбрать]
  1. [CommandMethod("FDM")]
  2. public void FDM()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Editor ed = doc.Editor;
  7.   Database db = doc.Database;
  8.  
  9.   using (FileDependencyManager fdm = db.FileDependencyManager)
  10.   {
  11.     fdm.IteratorInitialize(null, true, false, true);
  12.     int index = fdm.IteratorNext;
  13.     if (index == 0)
  14.       ed.WriteMessage("\nНет обновлений!");
  15.     else
  16.       ed.WriteMessage("\nОбновлений: {0}", index);
  17.     while (index > 0)
  18.     {
  19.       FileDependencyInfo fdi = fdm.GetEntry(index, true);
  20.       ed.WriteMessage("\n");
  21.       ed.WriteMessage("\n{0}", fdi.FileName);
  22.       ed.WriteMessage("\n{0} {1}: {2}", "----", "Feature", fdi.Feature);
  23.       ed.WriteMessage("\n{0} {1}: {2}", "----", "FileSize", fdi.FileSize);
  24.       ed.WriteMessage("\n{0} {1}: {2}", "----", "FingerprintGuid", fdi.FingerprintGuid);
  25.       ed.WriteMessage("\n{0} {1}: {2}", "----", "FoundPath", fdi.FoundPath);
  26.       ed.WriteMessage("\n{0} {1}: {2}", "----", "FullFileName", fdi.FullFileName);
  27.       ed.WriteMessage("\n{0} {1}: {2}", "----", "Index", fdi.Index);
  28.       ed.WriteMessage("\n{0} {1}: {2}", "----", "IsAffectsGraphics", fdi.IsAffectsGraphics);
  29.       ed.WriteMessage("\n{0} {1}: {2}", "----", "IsModified", fdi.IsModified); // <- Модифицирован или нет?
  30.       ed.WriteMessage("\n{0} {1}: {2}", "----", "ReferenceCount", fdi.ReferenceCount);
  31.       ed.WriteMessage("\n{0} {1}: {2}", "----", "TimeStamp", fdi.TimeStamp);
  32.       ed.WriteMessage("\n{0} {1}: {2}", "----", "VersionGuid", fdi.VersionGuid);
  33.       ed.WriteMessage("\n");
  34.       fdm.UpdateEntry(index);
  35.       index = fdm.IteratorNext;
  36.       ed.WriteMessage("\n{0}", index);
  37.     }
  38.   }
  39. }

Я не пробовал, но по логике для требующих перезагрузки ссылок fdi.IsModified должно быть true.
« Последнее редактирование: 21-03-2017, 22:51:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я попробовал этот код. Он не совсем то, о чем ты спрашивал, но позволяет определить не было ли изменения внешней ссылки.
Выглядит это так:



В коде строка:
Код - C# [Выбрать]
  1. fdm.UpdateEntry(index);
сбрасывает признак того, что внешняя ссылка была модифицирована.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Большое спасибо!

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Сейчас проверил, это не то, что мне нужно.
Как я понял, с помощью этой команды FDM можно получить данные обо всех измененных чертежах внешних ссылок, но нельзя определить были ли они перезагружены или еще нет.
Например, если изменить чертеж внешней ссылки, перезагрузить эту внешнюю ссылку в своем чертеже, то команда FDM все равно выдает те же данные, как если бы внешняя ссылка не была перезагружена.

Отмечено как Решение Кирилл Захаров 22-03-2017, 15:19:07

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Надеюсь это подойдёт больше:

Код - C# [Выбрать]
  1. public Editor ed;
  2. [CommandMethod("CheckNeedReload")]
  3. public void CheckNeedReload()
  4. {
  5.   Document doc = Application.DocumentManager.MdiActiveDocument;
  6.   if (doc == null) return;
  7.   ed = doc.Editor;
  8.   Database db = doc.Database;
  9.   XrefGraph xg = db.GetHostDwgXrefGraph(true);
  10.   CheckNeedReloadNode(xg.RootNode);
  11. }
  12. public void CheckNeedReloadNode(GraphNode root)
  13. {
  14.   for (int o = 0; o < root.NumOut; o++)
  15.   {
  16.     XrefGraphNode child = root.Out(o) as XrefGraphNode;
  17.     if (child != null)
  18.     {
  19.       ed.WriteMessage("\n{0} -- {1}", child.Database.Filename, child.XrefNotificationStatus);
  20.       CheckNeedReloadNode(child);
  21.     }
  22.   }
  23. }

Если внешняя ссылка требует обновления, то её XrefNotificationStatus == ResolvedUpdateAvailable



P.S.: Код будет работать только если системная переменная XREFNOTIFY отлична от 0.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Да, это и есть ответ на мой вопрос - XrefNotificationStatus. Огромное спасибо!