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

ADN Club => AutoCAD .NET API => Тема начата: Кирилл Захаров от 21-03-2017, 17:42:52

Название: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Кирилл Захаров от 21-03-2017, 17:42:52
Здравствуйте!
Подскажите, пожалуйста, как можно проверить что внешняя ссылка требует повторной загрузки в .NET? То есть, когда кто-то обновляет файл, на который ссылается открытый чертеж, появляется уведомление внизу экрана и предлагается заново загрузить внешнюю ссылку. Такие внешние ссылки помечаются в диспетчере внешних ссылок в графе Status восклицательным знаком.

(https://s30.postimg.org/xanhtd731/Needs_reloading.png) (https://postimg.org/image/xanhtd731/)

У объектов XrefGraphNode и BlockTableRecord есть свойство XrefStatus, но в перечислении XrefStatus нет варианта "NeedsReloading" или чего-то в этом роде. Внешние ссылки, которые требуют перезагрузки, имеют XrefStatus равным Resolved.
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Александр Ривилис от 21-03-2017, 18:05:42
Попробуй такой код:
Код - 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.
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Александр Ривилис от 21-03-2017, 22:54:13
Я попробовал этот код. Он не совсем то, о чем ты спрашивал, но позволяет определить не было ли изменения внешней ссылки.
Выглядит это так:



В коде строка:
Код - C# [Выбрать]
  1. fdm.UpdateEntry(index);
сбрасывает признак того, что внешняя ссылка была модифицирована.
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Кирилл Захаров от 21-03-2017, 23:00:28
Большое спасибо!
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Кирилл Захаров от 22-03-2017, 10:54:52
Сейчас проверил, это не то, что мне нужно.
Как я понял, с помощью этой команды FDM можно получить данные обо всех измененных чертежах внешних ссылок, но нельзя определить были ли они перезагружены или еще нет.
Например, если изменить чертеж внешней ссылки, перезагрузить эту внешнюю ссылку в своем чертеже, то команда FDM все равно выдает те же данные, как если бы внешняя ссылка не была перезагружена.
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Александр Ривилис от 22-03-2017, 13:28:23
Надеюсь это подойдёт больше:

Код - 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.
Название: Re: Как проверить, что внешняя ссылка требует перезагрузки?
Отправлено: Кирилл Захаров от 22-03-2017, 15:21:04
Да, это и есть ответ на мой вопрос - XrefNotificationStatus. Огромное спасибо!