Как узнать, что файл после открытия(сохранения) был изменен.

Автор Тема: Как узнать, что файл после открытия(сохранения) был изменен.  (Прочитано 7153 раз)

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

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

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

Отмечено как Решение Привалов Дмитрий 28-12-2019, 12:16:40

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но сходу не нашел свойств или переменных отвечающих за это.
Системная переменная DBMOD: https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2017/RUS/AutoCAD-Core/files/GUID-E255E808-2D48-4BDE-A760-FFEA28E5A86F-htm.html
Она возвращает значение только для активной базы данных.
В ObjectARX есть функция:
Код - C++ [Выбрать]
  1. int __cdecl acdbGetDbmod(class AcDbDatabase *db);
которая позволяет получить DBMOD для любой открытой базы данных.
В принципе её можно вызвать через P/Invoke.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну и еще вариант, когда нужно только узнать есть ли несохранённые изменения - при помощи свойства AcadDocument.Saved:
Код - C# [Выбрать]
  1. public static bool IsSavedDocument(Document document)
  2. {
  3.       return (bool) ((dynamic) document.AcadDocument).Saved;
  4. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
В ObjectARX есть функция:
Код - C++ [Выбрать]

    int __cdecl acdbGetDbmod(class AcDbDatabase *db);

которая позволяет получить DBMOD для любой открытой базы данных.
В принципе её можно вызвать через P/Invoke.

Спасибо! Скорее всего подойдет функция.
Переменная DBMOD не подойдет, т.к. пришлось бы переключать документы.

AcadDocument.Saved также подошел бы, но dynamic появился в .NET 4.0, А мне нужно под .NET 3.5. Если не смогу через рефлексию выловить свойство, то останется только один вариант.

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Ну и еще вариант, когда нужно только узнать есть ли несохранённые изменения - при помощи свойства AcadDocument.Saved:
Код - C# [Выбрать]

    public static bool IsSavedDocument(Document document)
    {
          return (bool) ((dynamic) document.AcadDocument).Saved;
    }


....Для любителей Autocad 2007-2012

Код - C# [Выбрать]
  1. public static bool IsSavedDocument(Document document)
  2. {
  3.         return (bool)document.AcadDocument.GetType().InvokeMember("Saved", BindingFlags.GetProperty, null, document.AcadDocument, null);
  4. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
....Для любителей Autocad 2007-2012
Ну это почти универсальный способ и работать будет до AutoCAD 2020 включительно. Единственный вариант, когда он не будет работать - AcCoreConsole, так как там нет COM/ActiveX
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение