Аудит средствами .NET API

Автор Тема: Аудит средствами .NET API  (Прочитано 21577 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Аудит средствами .NET API
« : 29-01-2014, 13:46:48 »
AutoCAD 2009 SP3 Enu
AutoCAD 2014 SP1 Enu

Класс AuditInfo унаследован от DisposableWrapper в котором, в свою очередь присутствует метод со следующей сигнатурой:

Код - C# [Выбрать]
  1. public static DisposableWrapper Create(Type type, IntPtr unmanagedPointer, bool autoDelete);

В документации ObjectARX SDK (2009 и 2014) по данному методу (да и не только по нему, а почти по всем методам) класс DisposableWrapper не содержит никакой информации. Сооветственно приходится гадать о том, что за параметры следует ему передавать.

Код - C# [Выбрать]
  1. // db - экземпляр Database
  2. // Выполняю аудит базы данных чертежа
  3. Rtm.DisposableWrapper wrap = Db.AuditInfo.Create(typeof(Db.AuditInfo), db.GetRXClass().UnmanagedObject, true);
  4. Db.AuditInfo info = wrap as Db.AuditInfo;                      
  5. db.Audit(info); // Здесь получаю ошибку, завершающую работу AutoCAD.

Хотелось бы пояснений по данному методу - верно ли я его пытаюсь использовать?

В последней строке кода получаю ошибку, одну и ту же что в AutoCAD 2009, что в AutoCAD 2014 (см. скрины) с последующим немедленным умиранием AutoCAD.

Когда наконец-то наступит ImplementedAlready?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #1 : 29-01-2014, 18:30:48 »
Когда наконец-то наступит ImplementedAlready?
Вот уж не знаю. В чистом ObjectARX тоже это метод не реализован. Я не проверял, но метод DBObject.Audit вроде бы реализован, т.е. можно попробовать последовательно вызвать его для каждого объекта/примитива. Ну и альтернативный способ - вызов ActiveX/COM метода AcadDocument.AuditInfo.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Аудит средствами .NET API
« Ответ #2 : 26-02-2015, 11:28:14 »
А как пользоваться DBObject.Audit? Какие ограничения? У меня любой из приведённых ниже методов падает с System.AccessViolationException при запуске в шаблоне из вложения к сообщению (и на любом файле, сделанном на основе данного шаблона). При этом команда audit не выдаёт никаких ошибок в файлах.
При этом, на стандартном акадовском шаблоне отрабатывает спокойно.
Autocad 2014x64
Код - C# [Выбрать]
  1. [CommandMethod("testaudit")]
  2. public void TestAudit()
  3. {
  4.     Database db = HostApplicationServices.WorkingDatabase;
  5.     DisposableWrapper wrap = AuditInfo.Create(typeof(AuditInfo), db.GetRXClass().UnmanagedObject, true);
  6.     AuditInfo ai = wrap as AuditInfo;
  7.     using (Transaction tr = db.TransactionManager.StartTransaction())
  8.     {
  9.         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  10.         foreach (var id in bt.Cast<ObjectId>())
  11.         {
  12.             DBObject dbo = tr.GetObject(id, OpenMode.ForWrite);
  13.             dbo.Audit(ai);
  14.         }
  15.         tr.Commit();
  16.     }
  17. }
  18.  
  19. [CommandMethod("testaudit2")]
  20. public void TestAudit2()
  21. {
  22.     Database db = HostApplicationServices.WorkingDatabase;
  23.     using (Transaction tr = db.TransactionManager.StartTransaction())
  24.     {
  25.         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  26.         foreach (var id in bt.Cast<ObjectId>())
  27.         {
  28.             DBObject dbo = tr.GetObject(id, OpenMode.ForWrite);
  29.             DisposableWrapper wrap = AuditInfo.Create(typeof(AuditInfo), dbo.GetRXClass().UnmanagedObject, true);
  30.             AuditInfo ai = wrap as AuditInfo;
  31.             dbo.Audit(ai);
  32.         }
  33.     }
  34. }
Алексей

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Аудит средствами .NET API
« Ответ #3 : 26-02-2015, 11:37:48 »
А как пользоваться DBObject.Audit?
Аудит можно глянуть тут (правда это для 2015-го). Правда по ссылке используется Database.Audit. Попробуй в своём коде выполнить блокировку документа, прежде чем выполнять аудит (я не утверждаю, что это поможет, просто это первое, что приходит на ум по теме). Однако я  не исключаю, что для версий более ранних, чем 2015, функционал аудита мог быть ещё не реализован, как я уже указывал в первом сообщении темы касательно Database.Audit.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #4 : 26-02-2015, 12:19:58 »
У меня любой из приведённых ниже методов падает с System.AccessViolationException при запуске в шаблоне из вложения к сообщению (и на любом файле, сделанном на основе данного шаблона).
На других не падает? Проанализируй на чем именно падает. Как я понял ты проверяешь только BlockTableRecord'ы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Аудит средствами .NET API
« Ответ #5 : 26-02-2015, 12:23:40 »
Андрей Бушман, нужен 2014..
Александр Ривилис, у меня тут все файлы сделаны на основе этого шаблона, так что на других реальных файлах не проверял. Проверял на стандартном acadiso.dwt, там не падает.
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #6 : 26-02-2015, 12:30:50 »
Вообще говоря использование этого метода нигде не описано. Зато в COM/ActiveX есть метод AcadDocument.AuditInfo
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #7 : 26-02-2015, 14:28:52 »
P.S.: Кстати в коде написана полная ерунда. Я когда-то не заметил эту ерунду у Андрея и она расползлась. ;)
Метод:
Код - C# [Выбрать]
  1.  public static DisposableWrapper Create(Type type, IntPtr unmanagedPointer, bool autoDelete);
используется для создания управляемого объекта из неуправляемого. Т.е. в качестве unmanagedPointer необходимо передать указатель на объект неуправляемого класса AcDbAuditInfo. Но у нас такого объекта нет. А передавать указатель на Database или на DbObject - это совершенно бессмысленно и точно может привести к Fatal Error.
Можно конечно попытаться через P/Invoke вызвать конструктор AcDbAuditInfo, но насколько мне известно это сделать невозможно: http://stackoverflow.com/questions/2354152/p-invoke-a-purely-c-library
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Аудит средствами .NET API
« Ответ #8 : 26-02-2015, 14:35:40 »
Кстати в коде написана полная ерунда. Я когда-то не заметил эту ерунду у Андрея и она расползлась.
Заметили и до сих пор молчали? Минус один вам в карму за такое! :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #9 : 26-02-2015, 14:37:29 »
Заметили и до сих пор молчали?
Только что заметил, а не тогда, когда ты написал этот код и создал эту тему на форуме. Читай внимательно моё сообщение. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Аудит средствами .NET API
« Ответ #10 : 26-02-2015, 16:49:21 »
Вообще, именно такую конструкцию я видел в сообщении от 2010 года
http://forums.autodesk.com/t5/net/help-with-auditinfo-constructor/m-p/2744515#M20323
Жалко, caddzone.com ушел в небытие, туда Тони дал ссылку на своё решение..
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #11 : 26-02-2015, 16:58:03 »
Вообще, именно такую конструкцию я видел в сообщении от 2010 года
http://forums.autodesk.com/t5/net/help-with-auditinfo-constructor/m-p/2744515#M20323
Просто ему никто не сказал, что там написана ерунда.
Жалко, caddzone.com ушел в небытие, туда Тони дал ссылку на своё решение..
Решение заключалось в синхронном выполнении команд для файлов. Насколько я помню там был код через ActiveX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Аудит средствами .NET API
« Ответ #12 : 02-03-2015, 13:58:07 »
Крыша едет неспеша..
Можно ли получить AcadDocument из Database, если она открыта через ReadDwgFile?
В том смысле, что бы использовать AcadDocument.AuditInfo
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #13 : 03-03-2015, 01:48:58 »
Можно ли получить AcadDocument из Database, если она открыта через ReadDwgFile?
Увы. Я потестировал и пришел к неутешительному результату, что это сделать нельзя:
Код - C# [Выбрать]
  1.     [CommandMethod("Test")]
  2.     public void Test()
  3.     {
  4.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.       Database dbOld = HostApplicationServices.WorkingDatabase;
  6.       // Обрати внимание на второй false !!!
  7.       using (Database db = new Database(false, false))
  8.       {
  9.         db.ReadDwgFile(@"C:\testfile.dwg", FileShare.ReadWrite, false, "");
  10.         Document doc = Application.DocumentManager.GetDocument(db);
  11.         if (doc != null)
  12.         {
  13.           object aDoc = doc.GetAcadDocument();
  14.           if (aDoc != null)
  15.           {
  16.             aDoc.GetType().InvokeMember("AuditInfo",
  17.               BindingFlags.InvokeMethod, null,
  18.               aDoc, new object[] {true});
  19.           }
  20.         }
  21.       }
  22.     }
  23.  

doc у меня возвращает текущий чертеж и соотвественно Audit выполняется для него.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аудит средствами .NET API
« Ответ #14 : 03-03-2015, 02:30:23 »
На всякий случай отправил запрос в ADN DevHelp. Мне кажется странным, что есть опция для создания Database с попутным созданием документа и при этом документ найти нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение