Событие EndOpen приложения на C#

Автор Тема: Событие EndOpen приложения на C#  (Прочитано 12635 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Здравствуйте!
Хочу написать программку для конвертирования файлов из dxf в dwg. Пробую открыть файл в AutoCad'е через Autodesk.AutoCAD.Interop и отследить событие EndOpen, чтобы начать сохранение. Но не могу понять почему не срабатывает обработчик события?
Код - C# [Выбрать]
  1. using System;
  2. using System.Diagnostics;
  3. using Autodesk.AutoCAD.Interop;
  4.  
  5. namespace DxfToDwg
  6. {
  7.     class Program
  8.     {
  9.         static public AcadApplication app;
  10.         static AcadDocument doc;
  11.         static string file = @"d:\Drawing1.dxf";
  12.         static void Main(string[] args)
  13.         {
  14.             OpenAndSave();
  15.         }
  16.         public static void OpenAndSave()
  17.         {
  18.             app = new AcadApplication();            
  19.             app.Visible = true;
  20.             app.EndOpen += new _DAcadApplicationEvents_EndOpenEventHandler(app_EndOpen); //прикрепляем обработчик события endOpen            
  21.             doc = app.Documents.Open(file, false); //открываем документ
  22.         }
  23.         private static void app_EndOpen(string target)
  24.         {            
  25.             Console.WriteLine("End!" + target);
  26.             Console.ReadKey();
  27.         }
  28.     }
  29. }
« Последнее редактирование: 14-03-2022, 11:47:25 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #1 : 14-03-2022, 12:42:54 »
Klo,
Приветствую на форуме! У меня в подписи инструкция по форматированию кода на нашем форуме. Просьба соблюдать это правило.
Вообще-то открытие файла должно происходить синхронно, так что потребности в этом событии нет. И думаю что в случае Application.Documents.Open это событие просто не возникает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #2 : 14-03-2022, 13:00:09 »
Александр Ривилис,
То, что событие не возникает, заметил. Но не понял, почему оно не возникает :)
Интерес к этому событию возник после получения сообщения об ошибке при попытке получить имя открытого файла
Код - C# [Выбрать]
  1. string name = doc.Name;
получаю ошибку после открытия файла в AutoCAD:
Цитировать
System.Runtime.InteropServices.COMException: 'Фильтр сообщений выдал диагностику о занятости приложения. (Исключение из HRESULT: 0x8001010A

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #3 : 14-03-2022, 13:04:11 »
получаю ошибку после открытия файла в AutoCAD:
Цитировать

    System.Runtime.InteropServices.COMException: 'Фильтр сообщений выдал диагностику о занятости приложения. (Исключение из HRESULT: 0x8001010A
Этот вопрос неоднократно на форуме обсуждался. Это не связано конкретно с получением имени файла. И вообще крайне не рекомендую работать с AutoCAD через COM/ActiveX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #4 : 14-03-2022, 13:10:10 »
Мне кажется, что самый лучший способ для твоей задачи - использовать AcCoreConsole. Во-первых, это будет быстрее. Во-вторых, если требуется только конвертировать dxf в dwg, то можно обойтись вообще без программирования, а только средствами *.scr-файлов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Событие EndOpen приложения на C#
« Ответ #5 : 14-03-2022, 13:22:36 »
Во-вторых, если требуется только конвертировать dxf в dwg, то можно обойтись вообще без программирования
https://knowledge.autodesk.com/support/autocad/downloads/caas/downloads/content/autodesk-customization-conversion-tools.html
Если хочется свой такой же велосипед, то можно поизучать исходники: https://github.com/ADN-DevTech/ScriptPro

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #6 : 14-03-2022, 17:30:41 »
Мне кажется, что самый лучший способ для твоей задачи - использовать AcCoreConsole. Во-первых, это будет быстрее. Во-вторых, если требуется только конвертировать dxf в dwg, то можно обойтись вообще без программирования, а только средствами *.scr-файлов.
AcCoreConsole - буду разбираться, первый раз слышу о таком.
Насчёт скрипт-файлов - это первое, что пришло мне в голову, но при открытии dxf-файла я получаю запрос autocad на открытие его же в режим для чтения. На форуме autodesk описывается эта проблема, но решения мне не помогли...
https://knowledge.autodesk.com/support/autocad/downloads/caas/downloads/content/autodesk-customization-conversion-tools.html
Если хочется свой такой же велосипед, то можно поизучать исходники: https://github.com/ADN-DevTech/ScriptPro
с этой программой тоже всё непросто, установить - не получилось (ошибка this operation system is not supported by ScriptPro), у меня Windows10 x64. Чтобы начать разбираться в исходниках, нужна библиотека Microsoft Ribbon for WPF October 2010 под framework 3.5, найти сейчас проблематично :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #7 : 14-03-2022, 17:52:27 »
AcCoreConsole - буду разбираться, первый раз слышу о таком.
Поиск в интернете. Поиск на нашем сайте и форуме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #8 : 15-03-2022, 11:36:39 »
Этот вопрос неоднократно на форуме обсуждался. Это не связано конкретно с получением имени файла. И вообще крайне не рекомендую работать с AutoCAD через COM/ActiveX.
Александр, спасибо за подсказки, но не смог найти обсуждение подобной ошибки. Не могли бы направить меня в нужную сторону, как сформулировать поисковый запрос, чтобы обойти эту ошибку?

Отмечено как Решение Klo 15-03-2022, 13:32:59

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #9 : 15-03-2022, 12:59:29 »
Klo,
Ошибку скорее всего не обойдешь.
Темы вот:
https://adn-cis.org/forum/index.php?topic=10529
https://adn-cis.org/forum/index.php?topic=7364
Настоятельно рекомендую отказаться от этой идеи, чтобы не было мучительно больно за зря потраченное время.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #10 : 15-03-2022, 13:36:12 »
Александр Ривилис, спасибо огромное, могли бы сразу сказать, что достаточно небольшую задержку поставить, чтобы акад очухаться успел :)
ну или сделать все те, проверки, которые описаны в https://adn-cis.org/forum/index.php?topic=7364

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #11 : 15-03-2022, 13:55:11 »
Klo,
Это первый этап. Будут и другие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #12 : 17-03-2022, 12:55:30 »
Выкладываю код получившейся программы на случай, если кому-то понадобится под собственные нужды.
Обработка 135 файлов заняла 27 минут. То есть примерно 12 сек на файл.
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Interop;
  3. using System.Threading;
  4. using System.IO;
  5.  
  6. namespace DxfToDwg
  7. {
  8.     class Program
  9.     {
  10.         static public AcadApplication app;
  11.         static AcadDocument doc;
  12.         static bool isReady;
  13.         static string path = "";
  14.         const int sleep_time = 500;
  15.  
  16.         static void Main(string[] args)
  17.         {
  18.             if (args.Length > 0)
  19.             {
  20.                 path = args[0];
  21.             }
  22.             else
  23.             {
  24.                 path = Environment.CurrentDirectory;
  25.             }
  26.             string[] files=  Directory.GetFiles(path, "*.dxf");
  27.             Console.WriteLine("Начинается обработка файлов в папке: " + path);
  28.             foreach (string f in files)
  29.             {
  30.                 OpenAndSave(f);
  31.             }
  32.             Console.WriteLine("Обработка завершена. Нажмите любую клавишу...");
  33.             Console.ReadKey();
  34.         }
  35.         private static void OpenAndSave(string fileName)
  36.         {
  37.             isReady = false;
  38.             app = new AcadApplication();
  39.             app.Visible = true;
  40.             Console.WriteLine("Открытие файла: " + fileName);
  41.             doc = app.Documents.Open(fileName, false); //открываем документ
  42.  
  43.             while (!isReady) //ожидаем, пока приложение будет не занято
  44.             {
  45.                 try
  46.                 {
  47.                     AcadState state = app.GetAcadState();
  48.                     isReady = state.IsQuiescent;
  49.                 }
  50.                 catch (Exception ex) { Console.WriteLine(ex); }
  51.                 Thread.Sleep(sleep_time);
  52.             }
  53.             string oldName = doc.Name;
  54.             string newName = oldName.Substring(0, oldName.LastIndexOf('.')) + @".dwg";
  55.             string pa = doc.Path + @"\";
  56.             doc.SaveAs(pa + newName);
  57.             Console.WriteLine("Сохранено: " + pa + newName);
  58.             doc.Close();
  59.             app.Quit();
  60.         }
  61.     }
  62. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие EndOpen приложения на C#
« Ответ #13 : 17-03-2022, 13:01:52 »
Klo,
Твой код для каждого из чертежей запускает новый AutoCAD. Подозреваю, что большая часть времени тратится именно на это.
И вот это совершенно лишнее:
Код - C# [Выбрать]
  1. app.Visible = true;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн KloАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Событие EndOpen приложения на C#
« Ответ #14 : 17-03-2022, 13:24:52 »
Твой код для каждого из чертежей запускает новый AutoCAD. Подозреваю, что большая часть времени тратится именно на это.
Спасибо, за комментарий - действительно, если не закрывать Application, то время конвертации тех же файлов сокращается до 7-ми минут :)
Извините, вам запрещён просмотр содержимого спойлеров.