Запуск асинхронного метода с кнопки

Автор Тема: Запуск асинхронного метода с кнопки  (Прочитано 2988 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!

Нужно запустить метод на исполнение через кнопку на самописной панели инструментов.
Метод:
Код - C# [Выбрать]
  1.  public async void CreateTankCrosshair()
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             if (doc == null)
  5.             {
  6.                 return;
  7.             }
  8.  
  9.             Editor ed = doc.Editor;
  10.             Database db = doc.Database;
  11.             db.ObjectAppended += Db_ObjectAppended;
  12.             db.ObjectErased += Db_ObjectErased;
  13.             // Запускаем команду
  14.             try
  15.             {
  16.                 doc.CommandCancelled += Cancelled;
  17.                 await ed.CommandAsync("_.PLINE", Editor.PauseToken);
  18.                 while (doc.CommandInProgress.ToUpper() == "PLINE")
  19.                 {
  20.                     await ed.CommandAsync(Editor.PauseToken); // Продолжаем команду
  21.                 }
  22.  
  23.             }
  24.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  25.             {
  26.                 if (ex.ErrorStatus == ErrorStatus.UserBreak)
  27.                 {
  28.                     idPline = ObjectId.Null;
  29.                 }
  30.                 else
  31.                 {
  32.                     Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  33.                 }
  34.             }
  35.             catch (System.Exception sex)
  36.             {
  37.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(sex.ToString());
  38.             }
  39.  
  40.             // Здесь команда уже завершена
  41.             db.ObjectAppended -= Db_ObjectAppended;
  42.             db.ObjectErased -= Db_ObjectErased;
  43.             doc.CommandCancelled -= Cancelled;
  44.             ed.WriteMessage("\nPline завершилась. ObjectId = {0}\n", idPline);
  45.             ed.PostCommandPrompt();
  46.             if (!idPline.IsNull) // <-------
  47.             {
  48.                 // Здесь уже можно обрабатывать полилинию.
  49.                 Transaction tr = doc.TransactionManager.StartTransaction();
  50.                 using (tr)
  51.                 {
  52.                     Polyline poly = (Polyline)tr.GetObject(idPline, OpenMode.ForWrite);
  53.                     poly.Layer = BasicLayers.BulkheadsAndDecksThin;
  54.                     poly.Linetype = ESKDValues.DashDotLine;
  55.                     poly.LineWeight = LineWeight.ByLayer;
  56.                     poly.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
  57.                     tr.Commit();
  58.                 }
  59.  
  60.             }
  61.         }
  62.         private void Db_ObjectAppended(object sender, ObjectEventArgs e)
  63.         {
  64.             if ( e.DBObject is Polyline )
  65.             {
  66.                 idPline = e.DBObject.ObjectId;
  67.             }
  68.         }
  69.  
  70.         private void Db_ObjectErased(object sender, ObjectErasedEventArgs e)
  71.         {
  72.             if ( e.DBObject.ObjectId == idPline )
  73.             {
  74.                 idPline = ObjectId.Null;
  75.             }
  76.         }
  77.  
  78.         private void Cancelled(object sender, CommandEventArgs e)
  79.         {
  80.             idPline = ObjectId.Null; // <-------------
  81.         }
Кнопка:
Код - C# [Выбрать]
  1.  private void OrdinaryBulkhead_Click(object sender, EventArgs e)
  2.         {
  3.             Document doc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
  4.  
  5.             using ( doc.LockDocument() )
  6.             {
  7.                 ShipElements.HullElements.OrdinaryBulkhead bhd = new OrdinaryBulkhead();
  8.                 bhd.CreateTankCrosshair();
  9.             }
  10.         }
Метод не срабатывает, рисование полилинии не начинается, сразу выскакивает в командную строку с сообщением что id полилинии нет.
Подозреваю, что дело в асинхронности, но без нее не добраться до родной команды рисования полилинии. Как мне сделать возможным запуск этого метода с кнопки?
PS Метод нормально работает при вызове его командой через командную строку.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как мне сделать возможным запуск этого метода с кнопки?
1. Код поместить в отдельную команду
2. С кнопки запускать команду: Document.SendStringToExecute
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Переписал кнопку
Код - C# [Выбрать]
  1.  private void OrdinaryBulkhead_Click(object sender, EventArgs e)
  2.         {
  3.             Document doc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
  4.  
  5.             using ( doc.LockDocument() )
  6.             {
  7.                 ShipElements.HullElements.OrdinaryBulkhead bhd = new OrdinaryBulkhead();
  8.                 doc.SendStringToExecute("0OrdinaryBulkhead",true,true,true);
  9.                
  10.             }
  11.         }
Словил ошибку. команда по-прежнему не стартует.


Отмечено как Решение Atomohod 15-12-2019, 19:57:16

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй так:
Код - C# [Выбрать]
  1. doc.SendStringToExecute("0OrdinaryBulkhead ",false, false, true);
В этом случае документ можно не блокировать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Код - C# [Выбрать]
  1. private void OrdinaryBulkhead_Click(object sender, EventArgs e)
  2.         {
  3.             Document doc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
  4.  
  5.          
  6.                 ShipElements.HullElements.OrdinaryBulkhead bhd = new OrdinaryBulkhead();
  7.                 doc.SendStringToExecute("0OrdinaryBulkhead",false,false,true);
  8.                
  9.            
  10.         }
Все также-нажал кнопку, команда не стартовала, интерфейс не заблокирован - могу нажать на любую др кнопку, они стартуют.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не "0OrdinaryBulkhead", а "0OrdinaryBulkhead "
Пробел в конце строки необходим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Пробел в конце строки необходим.
Это сработало. Можете объяснить какую роль выполняет пробел? Вроде бы пробелы всегда это зло, а тут наоборот. И почему не надо блокировку дока, тоже хочу разобраться.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можете объяснить какую роль выполняет пробел?
Пробел или ввод (ENTER) завершают команду. Вся строка при вызове метода SendStringToExecute передаётся AutoCAD как будто ты вводишь ей в командной строке.
И почему не надо блокировку дока, тоже хочу разобраться.
При запуске команды блокировать документ необязательно (хотя и можно), так как AutoCAD при запуске  команды сам заблокирует документ (если команда не имеет флага SESSION)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Спасибо!