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

ADN Club => AutoCAD .NET API => Тема начата: Klo от 14-03-2022, 10:50:12

Название: Событие EndOpen приложения на C#
Отправлено: Klo от 14-03-2022, 10:50:12
Здравствуйте!
Хочу написать программку для конвертирования файлов из 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. }
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 14-03-2022, 12:42:54
Klo,
Приветствую на форуме! У меня в подписи инструкция по форматированию кода на нашем форуме. Просьба соблюдать это правило.
Вообще-то открытие файла должно происходить синхронно, так что потребности в этом событии нет. И думаю что в случае Application.Documents.Open это событие просто не возникает.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 14-03-2022, 13:00:09
Александр Ривилис,
То, что событие не возникает, заметил. Но не понял, почему оно не возникает :)
Интерес к этому событию возник после получения сообщения об ошибке при попытке получить имя открытого файла
Код - C# [Выбрать]
  1. string name = doc.Name;
получаю ошибку после открытия файла в AutoCAD:
Цитировать
System.Runtime.InteropServices.COMException: 'Фильтр сообщений выдал диагностику о занятости приложения. (Исключение из HRESULT: 0x8001010A
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 14-03-2022, 13:04:11
получаю ошибку после открытия файла в AutoCAD:
Цитировать

    System.Runtime.InteropServices.COMException: 'Фильтр сообщений выдал диагностику о занятости приложения. (Исключение из HRESULT: 0x8001010A
Этот вопрос неоднократно на форуме обсуждался. Это не связано конкретно с получением имени файла. И вообще крайне не рекомендую работать с AutoCAD через COM/ActiveX.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 14-03-2022, 13:10:10
Мне кажется, что самый лучший способ для твоей задачи - использовать AcCoreConsole. Во-первых, это будет быстрее. Во-вторых, если требуется только конвертировать dxf в dwg, то можно обойтись вообще без программирования, а только средствами *.scr-файлов.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Дмитрий Загорулькин от 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
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 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, найти сейчас проблематично :)
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 14-03-2022, 17:52:27
AcCoreConsole - буду разбираться, первый раз слышу о таком.
Поиск в интернете. Поиск на нашем сайте и форуме.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 15-03-2022, 11:36:39
Этот вопрос неоднократно на форуме обсуждался. Это не связано конкретно с получением имени файла. И вообще крайне не рекомендую работать с AutoCAD через COM/ActiveX.
Александр, спасибо за подсказки, но не смог найти обсуждение подобной ошибки. Не могли бы направить меня в нужную сторону, как сформулировать поисковый запрос, чтобы обойти эту ошибку?
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 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
Настоятельно рекомендую отказаться от этой идеи, чтобы не было мучительно больно за зря потраченное время.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 15-03-2022, 13:36:12
Александр Ривилис, спасибо огромное, могли бы сразу сказать, что достаточно небольшую задержку поставить, чтобы акад очухаться успел :)
ну или сделать все те, проверки, которые описаны в https://adn-cis.org/forum/index.php?topic=7364 (https://adn-cis.org/forum/index.php?topic=7364)
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 15-03-2022, 13:55:11
Klo,
Это первый этап. Будут и другие.
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 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. }
Название: Re: Событие EndOpen приложения на C#
Отправлено: Александр Ривилис от 17-03-2022, 13:01:52
Klo,
Твой код для каждого из чертежей запускает новый AutoCAD. Подозреваю, что большая часть времени тратится именно на это.
И вот это совершенно лишнее:
Код - C# [Выбрать]
  1. app.Visible = true;
Название: Re: Событие EndOpen приложения на C#
Отправлено: Klo от 17-03-2022, 13:24:52
Твой код для каждого из чертежей запускает новый AutoCAD. Подозреваю, что большая часть времени тратится именно на это.
Спасибо, за комментарий - действительно, если не закрывать Application, то время конвертации тех же файлов сокращается до 7-ми минут :)
Извините, вам запрещён просмотр содержимого спойлеров.