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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 18-04-2016, 16:16:00

Название: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 16:16:00
Требуется отследить событие попытки открытия чертежа, сохранённого в формате более новом чем тот, который может быть открыт настоящим приложением. Т.е. например, отследит попытку открытия в AutoCAD 2009 чертежей формата DWG2013.

В документации искал по разделам DocumentCollection Events и Database Events, но не нашёл ничего похожего на то, что мне нужно. Как отследить интересующее меня событие?
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Пекшев aka Modis от 18-04-2016, 16:24:15
Варианты:
1. "Следить" за самим открытием. Когда пользователь открывает чертеж можно ведь "отловить" этот файл, до того как он начнет открываться? А из файла можно извлечь нужную информацию и проверить
2. Это событие - это-же Exception вроде...

Это мои предположения для размышления. Может натолкнут на идею) Лично я не в курсе
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 18-04-2016, 17:11:53
Как отследить интересующее меня событие?
Думаю, что напрямую средствами AutoCAD API - никак.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Дмитрий Загорулькин от 18-04-2016, 20:54:03
Отследить попытку открытия чертежа можно - для этого есть события Application.DocumentMeneger.
Если попытка открытия файла неудачна, читаем первые 6 байт файла и по ним определяем версию чертежа.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 21:51:03
Отследить попытку открытия чертежа можно - для этого есть события Application.DocumentMeneger.
Как я уже писал выше - среди событий DocumentCollection я не нашёл того, о чём спрашивал. У тебя есть какой-то конкретный вариант?

Если попытка открытия файла неудачна, читаем первые 6 байт файла и по ним определяем версию чертежа.
Я в курсе того, как определять версию формата. Мой вопрос был не об этом.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Дмитрий Загорулькин от 18-04-2016, 21:56:49
Application.DocumentManager.DocumentCreateStarted
Application.DocumentManager.DocumentCreated
Application.DocumentManager.DocumentCreationCanceled
По идее - как раз то, что нужно. Но нужно экспериментировать.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 21:59:39
Application.DocumentManager.DocumentCreateStarted
Application.DocumentManager.DocumentCreated
Application.DocumentManager.DocumentCreationCanceled
По идее - как раз то, что нужно. Но нужно экспериментировать.
По идее - это не то, т.к. прежде чем создавать Document на основе Database, этот самый Database нужно заполнить контентом. Т.е. недостаёт события, сообщающего об [не]успешной операции предварительного чтения содержимого DWG-файла или о попытке начала чтения этого DWG. Документ может открываться и кликом мышки по файлу в проводнике Windows.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Пекшев aka Modis от 18-04-2016, 22:08:05
кхммм...
2. Это событие - это-же Exception вроде...
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Дмитрий Загорулькин от 18-04-2016, 22:16:35
По идее - это не то, т.к. прежде чем создавать Document на основе Database, этот самый Database нужно заполнить контентом.
Судя по тому, как работают эти события, то происходит примерно так:
Команда открытия документа -> событие DocumentCreateStarted -> чтение файла и наполнение Database -> событие DocumentCreated.
Если файл неподходящей версии, то будет, наверное, так (проверить просто-напросто не на чем):
Команда открытия документа -> событие DocumentCreateStarted -> чтение файла, неподходящая версия -> событие DocumentCreationCanceled.
Документ может открываться и кликом мышки по файлу в проводнике Windows.
И эти события срабатывают и в этом случае, по крайней мере в версиях 2014-2016.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 22:18:33
Проверить смогу только завтра.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 18-04-2016, 22:41:40
Проверить смогу только завтра.
Можешь не проверять. Это не работает.
Я так понимаю, что это можно словить только на уровне Win32 Hook. Никакое из API в AutoCAD не поможет. Конечно если речь идёт о том, что пользователь открывает файл, а не ты сам это делаешь программно.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 22:45:37
Конечно если речь идёт о том, что пользователь открывает файл, а не ты сам это делаешь программно.
О том.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 18-04-2016, 22:48:47
Конечно если речь идёт о том, что пользователь открывает файл, а не ты сам это делаешь программно.
О том.
Ну и сразу напрашивается следующий вопрос. Ты обнаружил, что файл создан в более новой версии. Что ты будешь делать?
Можно поставить хук на окно, которое выводит сообщение о том, что файл создан не в той версии. Но что делать дальше, если AutoCAD в любом случае просит открыть файл?
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 22:52:30
Ну и сразу напрашивается следующий вопрос. Ты обнаружил, что файл создан в более новой версии. Что ты будешь делать?
Программно пересохраню файл, понизив версию DWG до нужной и продолжу открытие документа.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 18-04-2016, 23:22:23
Программно пересохраню файл, понизив версию DWG до нужной и продолжу открытие документа.
Я не буду тебя спрашивать какими средствами ты собираешься это сделать, так как это будет наверняка оффтопом на этом форуме.
Можно закрыть при помощи Hook окно:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F53078%2F7842324.6%2F0_121a73_20259f45_orig.png&hash=9b862f50e6635c86629e3f95cab8cabd)
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F54905%2F7842324.6%2F0_121a74_ec2155f7_orig.png&hash=1fa2dcf1f02026395a6992219cd4adf7)
Это не слишком сложно. Но я вижу дальше два подводных камня:
1) не известно имя файла - как его узнать?
2) даже если имя файла стало известно, то его придётся всунуть в следующее диалоговое окно и нажать в нём кнопку Open (Открыть). Это теоретически возможно - понадобится еще один хук.



 
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 18-04-2016, 23:27:33
Если запрашиваемого мною события нет, то я оставлю текущее решение как есть - отдельной командой, понижающей версию DWG с последующим открытием файла (если открытие было запрошено). Хотелось сделать это максимально прозрачно для пользователя, без создания отдельной команды под это дело. В принципе, можно оставить и так, раз в AutoCAD .NET API подходящих событий нет.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 18-04-2016, 23:58:13
Хотелось сделать это максимально прозрачно для пользователя, без создания отдельной команды под это дело.
А я бы так делать принципиально не стал:
1) Чертеж становится не 100%-совместимым с AutoCAD.
2) Если в чертеже есть объекты/примитивы вертикального приложения, то совсем будет беда.
Поэтому, без предупреждения и пользователя и согласия его на эту операцию я бы не стал понижать версию. IMHO.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Андрей Бушман от 19-04-2016, 00:20:45
1) Чертеж становится не 100%-совместимым с AutoCAD.
2) Если в чертеже есть объекты/примитивы вертикального приложения, то совсем будет беда.
Несколько лет активной практики проблем не выявили.
Название: Re: Как отследить попытку открытия чертежа недоступного формата?
Отправлено: Александр Ривилис от 19-04-2016, 00:52:11
На всякий случай по поводу последовательности событий:


Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. [assembly: CommandClass(typeof(DwgBeginOpen.MyCommands))]
  9. [assembly: ExtensionApplication(typeof(DwgBeginOpen.MyCommands))]
  10.  
  11. namespace DwgBeginOpen
  12. {
  13.   public class MyCommands: IExtensionApplication
  14.   {
  15.     void IExtensionApplication.Initialize()
  16.     {
  17.       Application.DocumentManager.DocumentCreateStarted
  18.         += DocumentManager_DocumentCreateStarted;
  19.       Application.DocumentManager.DocumentCreated
  20.         += DocumentManager_DocumentCreated;
  21.     }
  22.  
  23.     void DocumentManager_DocumentCreateStarted(object sender, DocumentCollectionEventArgs e)
  24.     {
  25.       Application.ShowAlertDialog("DocumentCreateStarted");
  26.       e.Document.BeginDwgOpen += Document_BeginDwgOpen;
  27.       e.Document.EndDwgOpen += Document_EndDwgOpen;
  28.     }
  29.  
  30.     void DocumentManager_DocumentCreated(object sender, DocumentCollectionEventArgs e)
  31.     {
  32.       Application.ShowAlertDialog("DocumentCreated");
  33.     }
  34.  
  35.     void Document_EndDwgOpen(object sender, DrawingOpenEventArgs e)
  36.     {
  37.       Application.ShowAlertDialog("End Open " + e.FileName);
  38.     }
  39.  
  40.     void Document_BeginDwgOpen(object sender, DrawingOpenEventArgs e)
  41.     {
  42.       Application.ShowAlertDialog("Begin Open " + e.FileName);
  43.     }
  44.  
  45.     void IExtensionApplication.Terminate()
  46.     {
  47.     }
  48.   }
  49. }
  50.