Остановка печати при нажатии кнопок отмены в диалоге PlotProgressDialog

Автор Тема: Остановка печати при нажатии кнопок отмены в диалоге PlotProgressDialog  (Прочитано 3991 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Всем доброго дня

Как обработать отмену печати по нажатию на кнопку отмены в диалоге прогресса печати?

Есть такой метод печати всех листов в текущем чертеже.
Код - C# [Выбрать]
  1.       // Печать всех листов в текущем документе
  2.       private void MultiSheetPlot()
  3.       {
  4.          Document doc = Application.DocumentManager.MdiActiveDocument;        
  5.          Database db = doc.Database;
  6.          using (var t = db.TransactionManager.StartTransaction())
  7.          {
  8.             var bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);
  9.             var pi = new PlotInfo();            
  10.             var piv = new PlotInfoValidator();            
  11.             piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
  12.            
  13.             if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  14.             {              
  15.                using (var pe = PlotFactory.CreatePublishEngine())
  16.                {                  
  17.                   var layouts = new List<Layout>();
  18.                   DBDictionary layoutDict = (DBDictionary)db.LayoutDictionaryId.GetObject(OpenMode.ForRead);
  19.                   foreach (DBDictionaryEntry entry in layoutDict)
  20.                   {
  21.                      if (entry.Key != "Model")                    
  22.                         layouts.Add((Layout)t.GetObject(entry.Value, OpenMode.ForRead));                    
  23.                   }
  24.                   layouts.Sort((l1, l2) => l1.LayoutName.CompareTo(l2.LayoutName));
  25.                   var layoutsToPlot = new ObjectIdCollection(layouts.Select(l => l.BlockTableRecordId).ToArray());
  26.  
  27.                   using (var ppd = new PlotProgressDialog(false, layoutsToPlot.Count, false))
  28.                   {                    
  29.                      int numSheet = 1;
  30.                      foreach (ObjectId btrId in layoutsToPlot)
  31.                      {
  32.                         var btr = (BlockTableRecord)t.GetObject(btrId, OpenMode.ForRead);
  33.                         var lo = (Layout)t.GetObject(btr.LayoutId, OpenMode.ForRead);                        
  34.                        
  35.                         var psv = PlotSettingsValidator.Current;                                                
  36.                         pi.Layout = btr.LayoutId;                        
  37.                         LayoutManager.Current.CurrentLayout = lo.LayoutName;                        
  38.                         piv.Validate(pi);
  39.  
  40.                         if (numSheet == 1)
  41.                         {
  42.                            ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Печать");
  43.                            ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Отмена");                                                      
  44.                            ppd.set_PlotMsgString(PlotMessageIndex.MessageCanceling, "Отмена печати");
  45.                            ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Печать листов");
  46.                            ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Печать листа");
  47.                            ppd.LowerPlotProgressRange = 0;
  48.                            ppd.UpperPlotProgressRange = 100;
  49.                            ppd.PlotProgressPos = 0;
  50.  
  51.                            ppd.OnBeginPlot();
  52.                            ppd.IsVisible = true;
  53.                            pe.BeginPlot(ppd, null);                          
  54.  
  55.                            string fileName = Path.Combine(Path.GetDirectoryName(doc.Name), Path.GetFileNameWithoutExtension(doc.Name) + ".pdf");
  56.                            pe.BeginDocument(pi, doc.Name, null, 1, true, fileName);
  57.                         }
  58.                         ppd.OnBeginSheet();
  59.                         ppd.SheetProgressPos = 0;
  60.  
  61.                         var ppi = new PlotPageInfo();                                                                        
  62.                         pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null);
  63.                         pe.BeginGenerateGraphics(null);
  64.                         ppd.SheetProgressPos = 50;
  65.                         pe.EndGenerateGraphics(null);
  66.                        
  67.                         pe.EndPage(null);
  68.                         ppd.SheetProgressPos = 100;
  69.                         ppd.OnEndSheet();                        
  70.                         numSheet++;
  71.                         ppd.PlotProgressPos += 100 / layoutsToPlot.Count;                        
  72.                      }                    
  73.                      pe.EndDocument(null);                    
  74.                      ppd.PlotProgressPos = 100;
  75.                      ppd.OnEndPlot();
  76.                      pe.EndPlot(null);    
  77.                   }
  78.                }
  79.             }
  80.             else
  81.             {
  82.                throw new System.Exception("Другое задание на печать уже выполняется.");              
  83.             }
  84.             t.Commit();
  85.          }
  86.       }
Предполагается, что листы настроены на pdf принтер. Лучше бы печатать на штатный принтер "DWG to PDF", независимо от настроек листов. Но, пока так.

Есть класс реактора для печати:
Код - C# [Выбрать]
  1. PlotReactorManager plotReactor = new PlotReactorManager();
  2. plotReactor.PlotCancelled += PlotReactor_PlotCancelled;
Как его обработать, чтобы отменить печать?
Код - C# [Выбрать]
  1. private void PlotReactor_PlotCancelled(object sender, System.EventArgs e)
  2. {            
  3. }

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
При нажатии на кнопку отмены, получаю такое исключение - eNotApplicable.

Вот так вызываю печать:
Код - C# [Выбрать]
  1. [CommandMethod("TestPlot")]      
  2. public static void TestPlot()
  3. {
  4.     PlotMultiPDF plotMultiPdf = new PlotMultiPDF();
  5.     plotMultiPdf.PlotCur();
  6. }
Метод PlotCur в PlotMultiPDF
Код - C# [Выбрать]
  1. public void PlotCur()
  2. {
  3.     Document doc = Application.DocumentManager.MdiActiveDocument;
  4.     if (!File.Exists(doc.Name))
  5.     {
  6.         throw new System.Exception("Нужно сохранить текущий чертеж.");
  7.     }
  8.     HostApplicationServices.WorkingDatabase = doc.Database;
  9.     MultiSheetPlot();
  10. }

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Ошибка возникает на строке:
Код - C# [Выбрать]
  1. pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null);

Если "продолжить" после исключения, то печать прерывается, команда завершается.


Изменил вызов метода печати всех листов в текущем документе. Добавил блокировку документа.
Код - C# [Выбрать]
  1. [CommandMethod("TestPlot")]      
  2. public static void TestPlot()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     using (doc.LockDocument())
  6.     {
  7.        HostApplicationServices.WorkingDatabase = doc.Database;
  8.        PlotMultiPDF plotMultiPdf = new PlotMultiPDF();
  9.        plotMultiPdf.MultiSheetPlot();
  10.     }        
  11. }
Тогда ловлю исключение ePlotCancelled, при нажатии на кнопку отмены печати в диалоге процесса печати.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Ок, спасибо. Это похоже нормальное поведение. Нужно ловить это исключение.

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

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