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

Статьи => Опубликованные статьи => Тема начата: ADSK от 28-10-2015, 00:00:53

Название: Установка и очистка признака модификации документа в .NET
Отправлено: ADSK от 28-10-2015, 00:00:53
Установка и очистка признака модификации документа в .NET (http://adn-cis.org/ustanovka-i-ochistka-priznaka-modifikaczii-dokumenta-v-.net.html)
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Андрей Бушман от 28-10-2015, 11:15:48
У всех 32-битных версий значение параметра EntryPoint одно и то же. Аналогично и для 64-битных. Т.о. для большей наглядности и удобства имеет смысл вынести значения в статические константные переменные.
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 28-10-2015, 13:27:01
Т.о. для большей наглядности и удобства имеет смысл вынести значения в статические константные переменные.
Сложно поспорить. :)
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 23-06-2017, 01:02:39
А есть ли функция для получения текущего значения DbMod, т.е. для программного определения изменялся ли чертеж?
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 23-06-2017, 01:05:47
А есть ли функция для получения текущего значения DbMod, т.е. для программного определения изменялся ли чертеж?
Для активного чертежа можно просто проверить значение системной переменной DBMOD.
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 23-06-2017, 01:14:05
А вообще в ObjectARX есть недокументированная функция:
Код - C++ [Выбрать]
  1. int __cdecl acdbGetDbmod(class AcDbDatabase *);
которая возвращает значение DBMOD для переданной базы. Это если необходимо работать не только с активной базой.
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 23-06-2017, 01:33:00
Точно!  :)
Спасибо!
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 24-06-2017, 20:43:42
Не работает в 2018 версии (((

"Не удается найти точку входа \"?acdbSetDbmod@@YAJPEAVAcDbDatabase@@J@Z\" в DLL \"acdb22.dll\"."

Где вообще можно посмотреть структуру файла acdb22.dll - какие функции и точки входа?
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 24-06-2017, 23:43:00
Не работает в 2018 версии (((

"Не удается найти точку входа \"?acdbSetDbmod@@YAJPEAVAcDbDatabase@@J@Z\" в DLL \"acdb22.dll\"."
Для 2018 x64: "?acdbSetDbmod@@YAHPEAVAcDbDatabase@@H@Z"
Для 2018 x86: "?acdbSetDbmod@@YAHPAVAcDbDatabase@@H@Z"

Где вообще можно посмотреть структуру файла acdb22.dll - какие функции и точки входа?
Проще всего при помощи утилиты dumpbin.exe из Visual Studio. Причем напускать её лучше на acdb22.lib из ObjectARX SDK, а не на acdb22.dll из AutoCAD, так как в этом случае тебе придётся иметь обе разрядности AutoCAD, а в ObjectARX SDK они уже есть обе:
Код - INI [Выбрать]
  1. dumpbin /exports acdb22.lib >acdb22.txt
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 25-06-2017, 01:22:37
Не работает. Код отрабатывает без ошибок, но значение DBMOD не меняет.

Код - C# [Выбрать]
  1. namespace dbmod
  2. {
  3.     public class Class1
  4.     {
  5.         [CommandMethod("test_dbmod_set0")]
  6.         public static void test_dbmod_set0()
  7.         {
  8.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  9.             DbModClass.acdbSetDbmod(ref db, 0);
  10.         }
  11.  
  12.         [CommandMethod("test_dbmod_set1")]
  13.         public static void test_dbmod_set1()
  14.         {
  15.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  16.             DbModClass.acdbSetDbmod(ref db, 1);
  17.         }
  18.     }
  19.  
  20.     public class DbModClass
  21.     {
  22.         [DllImport("acdb22.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acdbGetDbmod@@YAHPEAVAcDbDatabase@@@Z")]
  23.         private static extern Int32 acdbSetDbmod22x64(IntPtr db, Int32 newDbMod);
  24.  
  25.         public static Int32 acdbSetDbmod(ref Database db, Int32 newDbMod)
  26.         {
  27.             if (IntPtr.Size == 4)
  28.                 return acdbSetDbmod22x86(db.UnmanagedObject, newDbMod);
  29.             else
  30.                 return acdbSetDbmod22x64(db.UnmanagedObject, newDbMod);
  31.         }
  32.     }
  33. }

Похоже это или баг или закрыли возможность менять этот параметр.
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 25-06-2017, 09:04:32
Я исправлял вчера строки. Перепроверь.
Вместо "?acdbGetDbmod@@YAHPEAVAcDbDatabase@@@Z" должно быть
"?acdbSetDbmod@@YAHPEAVAcDbDatabase@@H@Z"
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 25-06-2017, 21:25:38
Да!
Спасибо!
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Александр Ривилис от 25-06-2017, 23:13:11
Да!
Спасибо!
Теперь я так понимаю всё работает нормально?
Название: Re: Установка и очистка признака модификации документа в .NET
Отправлено: Алексей Терно от 25-06-2017, 23:14:40
Теперь я так понимаю всё работает нормально?
Работает отлично! ))