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

ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 28-12-2019, 10:13:05

Название: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Привалов Дмитрий от 28-12-2019, 10:13:05
Хотел пройти по коллекции документов и узнать, какие чертежи были изменены с момента последнего открытия или сохранения.
Но сходу не нашел свойств или переменных отвечающих за это.
Может что подскажете?
Название: Re: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Александр Ривилис от 28-12-2019, 10:41:31
Но сходу не нашел свойств или переменных отвечающих за это.
Системная переменная 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.
Название: Re: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Александр Ривилис от 28-12-2019, 10:55:32
Ну и еще вариант, когда нужно только узнать есть ли несохранённые изменения - при помощи свойства AcadDocument.Saved:
Код - C# [Выбрать]
  1. public static bool IsSavedDocument(Document document)
  2. {
  3.       return (bool) ((dynamic) document.AcadDocument).Saved;
  4. }
Название: Re: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Привалов Дмитрий от 28-12-2019, 12:16:30
В ObjectARX есть функция:
Код - C++ [Выбрать]

    int __cdecl acdbGetDbmod(class AcDbDatabase *db);

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

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

AcadDocument.Saved также подошел бы, но dynamic появился в .NET 4.0, А мне нужно под .NET 3.5. Если не смогу через рефлексию выловить свойство, то останется только один вариант.
Название: Re: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Привалов Дмитрий от 28-12-2019, 13:14:38
Ну и еще вариант, когда нужно только узнать есть ли несохранённые изменения - при помощи свойства 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. }
Название: Re: Как узнать, что файл после открытия(сохранения) был изменен.
Отправлено: Александр Ривилис от 28-12-2019, 17:11:24
....Для любителей Autocad 2007-2012
Ну это почти универсальный способ и работать будет до AutoCAD 2020 включительно. Единственный вариант, когда он не будет работать - AcCoreConsole, так как там нет COM/ActiveX