Обработать отмену вложенной команды Autocad

Автор Тема: Обработать отмену вложенной команды Autocad  (Прочитано 2400 раз)

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

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

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

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

Столкнулся с fatal error при отмене пользователем команды создания полилинии, вложенной в мою команду во время ее исполнения. Как обработать отмену вложенной команды, чтобы не вылететь с fatal error? То есть- моя команда вызывает во время своего выполнения встроенную команду автокада polyline. В этот момент пользователь отменяет polyline и я хватаю ошибку, try catch не помогает.
Проблемный код:
Код - C# [Выбрать]
  1.  try
  2.             {
  3.                 doc.CommandCancelled += Cancelled;
  4.                 await ed.CommandAsync("_.PLINE", Editor.PauseToken);
  5.                 while ( doc.CommandInProgress.ToUpper() == "PLINE" )
  6.                 {
  7.                     await ed.CommandAsync(Editor.PauseToken); // Продолжаем команду
  8.                 }
  9.  
  10.             }
  11.             catch ( System.Exception ex )
  12.             {
  13.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  14.             }

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
ОК, полный код:
Код - C# [Выбрать]
  1.  public class OrdinaryBulkhead
  2.     {
  3.         private ObjectId idPline;
  4.  
  5.         [CommandMethod("0OrdinaryBulkhead")]
  6.         public async void CreateOrdinaryBulkhead()
  7.         {
  8.             Document doc = Application.DocumentManager.MdiActiveDocument;
  9.             if ( doc == null )
  10.             {
  11.                 return;
  12.             }
  13.  
  14.             Editor ed = doc.Editor;
  15.             Database db = doc.Database;
  16.             db.ObjectAppended += Db_ObjectAppended;
  17.             db.ObjectErased += Db_ObjectErased;
  18.             // Запускаем команду
  19.             try
  20.             {
  21.                 doc.CommandCancelled += Cancelled;
  22.                 await ed.CommandAsync("_.PLINE", Editor.PauseToken);
  23.                 while ( doc.CommandInProgress.ToUpper() == "PLINE" )
  24.                 {
  25.                     await ed.CommandAsync(Editor.PauseToken); // Продолжаем команду
  26.                 }
  27.  
  28.             }
  29.             catch ( System.Exception ex )
  30.             {
  31.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  32.             }
  33.            
  34.             // Здесь команда уже завершена
  35.             db.ObjectAppended -= Db_ObjectAppended;
  36.             db.ObjectErased -= Db_ObjectErased;
  37.             doc.CommandCancelled -= Cancelled;
  38.             ed.WriteMessage("\nPline завершилась. ObjectId = {0}", idPline);
  39.             // Здесь уже можно обрабатывать полилинию.
  40.             Transaction tr = doc.TransactionManager.StartTransaction();
  41.             using ( tr )
  42.             {
  43.                 Polyline poly = (Polyline) tr.GetObject(idPline, OpenMode.ForWrite);
  44.                 poly.Layer = "0";
  45.                 poly.LineWeight = LineWeight.ByLayer;
  46.                 poly.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
  47.  
  48.  
  49.                 tr.Commit();
  50.             }
  51.         }
  52.  
  53.         private void Cancelled(object sender, CommandEventArgs e)
  54.         {
  55.             if ( e.GlobalCommandName is "PLINE" )
  56.             {
  57.                 return;
  58.             }
  59.         }
  60.  
  61.         private void Db_ObjectAppended(object sender, ObjectEventArgs e)
  62.         {
  63.             if ( e.DBObject is Polyline )
  64.             {
  65.                 idPline = e.DBObject.ObjectId;
  66.             }
  67.         }
  68.  
  69.         private void Db_ObjectErased(object sender, ObjectErasedEventArgs e)
  70.         {
  71.             if ( e.DBObject.ObjectId == idPline )
  72.             {
  73.                 idPline = ObjectId.Null;
  74.             }
  75.         }
  76.  
  77.     }

Отмечено как Решение Atomohod 28-09-2019, 22:36:25

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так у меня нормально работает:

Код - C# [Выбрать]
  1. // (C) Copyright 2019 by  
  2. //
  3. using System;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.Colors;
  9. using Autodesk.AutoCAD.EditorInput;
  10.  
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(PlineAsync.OrdinaryBulkhead))]
  13.  
  14. namespace PlineAsync
  15. {
  16.  
  17.   public class OrdinaryBulkhead
  18.   {
  19.     private ObjectId idPline;
  20.  
  21.     [CommandMethod("0OrdinaryBulkhead")]
  22.     public async void CreateOrdinaryBulkhead()
  23.     {
  24.       Document doc = Application.DocumentManager.MdiActiveDocument;
  25.       if (doc == null)
  26.       {
  27.         return;
  28.       }
  29.  
  30.       Editor ed = doc.Editor;
  31.       Database db = doc.Database;
  32.       db.ObjectAppended += Db_ObjectAppended;
  33.       db.ObjectErased += Db_ObjectErased;
  34.       // Запускаем команду
  35.       try
  36.       {
  37.         doc.CommandCancelled += Cancelled;
  38.         await ed.CommandAsync("_.PLINE", Editor.PauseToken);
  39.         while (doc.CommandInProgress.ToUpper() == "PLINE")
  40.         {
  41.           await ed.CommandAsync(Editor.PauseToken); // Продолжаем команду
  42.         }
  43.  
  44.       }
  45.       catch (Autodesk.AutoCAD.Runtime.Exception ex)
  46.       {
  47.         if (ex.ErrorStatus == ErrorStatus.UserBreak)
  48.         {
  49.           idPline = ObjectId.Null;
  50.         } else
  51.         {
  52.           Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  53.         }
  54.       }
  55.       catch (System.Exception sex)
  56.       {
  57.         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(sex.ToString());
  58.       }
  59.  
  60.       // Здесь команда уже завершена
  61.       db.ObjectAppended -= Db_ObjectAppended;
  62.       db.ObjectErased -= Db_ObjectErased;
  63.       doc.CommandCancelled -= Cancelled;
  64.       ed.WriteMessage("\nPline завершилась. ObjectId = {0}\n", idPline);
  65.       ed.PostCommandPrompt();
  66.       if (!idPline.IsNull) // <-------
  67.       {
  68.         // Здесь уже можно обрабатывать полилинию.
  69.         Transaction tr = doc.TransactionManager.StartTransaction();
  70.         using (tr)
  71.         {
  72.           Polyline poly = (Polyline)tr.GetObject(idPline, OpenMode.ForWrite);
  73.           poly.Layer = "0";
  74.           poly.LineWeight = LineWeight.ByLayer;
  75.           poly.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
  76.           tr.Commit();
  77.         }
  78.  
  79.       }
  80.     }
  81.  
  82.     private void Cancelled(object sender, CommandEventArgs e)
  83.     {
  84.        idPline = ObjectId.Null; // <-------------
  85.     }
  86.  
  87.     private void Db_ObjectAppended(object sender, ObjectEventArgs e)
  88.     {
  89.       if (e.DBObject is Polyline)
  90.       {
  91.         idPline = e.DBObject.ObjectId;
  92.       }
  93.     }
  94.  
  95.     private void Db_ObjectErased(object sender, ObjectErasedEventArgs e)
  96.     {
  97.       if (e.DBObject.ObjectId == idPline)
  98.       {
  99.         idPline = ObjectId.Null;
  100.       }
  101.     }
  102.  
  103.   }
  104. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
У меня тоже все заработало, спасибо. Поясните, пожалуйста, в чем была причина ошибки.

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

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