Ошибка печати при экспорте в Pdf

Автор Тема: Ошибка печати при экспорте в Pdf  (Прочитано 45194 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #45 : 22-04-2016, 11:27:08 »
AutoCAD выдает ошибку при проверке параметров печати (строка 1 кода), выдает сообщение "Autodesk.AutoCAD.Runtime.Exception: eWasOpenForWrite    в Autodesk.AutoCAD.PlottingServices.PlotInfoValidator.Validate(PlotInfo info)" .
Посмотри, что у тебя открыто ForWrite и или закрой его или открой ForRead или выполни DowngradeOpen()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн НадеждаАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #46 : 26-04-2016, 12:40:17 »
И снова здравствуйте!  :)
Сегодня так попробовала распечатать мои листы: http://adn-cis.org/forum/index.php?topic=1692.msg6253#msg6253
И опять AutoCAD выдал ошибку:

Autodesk.AutoCAD.Runtime.Exception: eLayoutNotCurrent
   в Autodesk.AutoCAD.PlottingServices.PlotInfoValidator.Validate(PlotInfo info)

Я не знаю, как сделать лист текущим без открытия файла в AutoCAD  ???
Сколько примеров просмотрела здесь, на форуме, и в AutoCAD .NET Developer's Guide - везде используется
 doc = Application.DocumentManager.MdiActiveDocument;
у меня же активный документ - пустой файл, который открылся при запуске AutoCAD, а файлы чертежей у меня читаются и изменяются потоком, без физического их открытия... Получается, мне все-таки нужно их открывать, чтобы активировать нужный лист и распечатать его?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #47 : 26-04-2016, 12:44:42 »
Я не знаю, как сделать лист текущим без открытия файла в AutoCAD 
Никак. Само понятие текущий для листа имеет смысл только в открытом в редакторе файле. Мы может еще пару месяцев ходить вокруг да около. Предлагаю свести задачу к одной из уже решенных. А именно работать с файлами, а не "потоками".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн НадеждаАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #48 : 26-04-2016, 12:50:30 »
Значит, придется их открывать... Но тогда у меня другая проблема появляется: т.к. файлов несколько, я их в цикле открываю-печатаю-закрываю, и они не успевают печататься (пока AutoCAD печатает один, моя программа уже обрабатывает другой). Это можно каким-то образом решить?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #49 : 26-04-2016, 13:00:23 »
1. Так быть не должно если печать идёт не через запущенную через SendCommand команду _PLOT. Следи за состоянием переменной BACKGROUNDPLOT (должно быть 0).
2. Если у тебя есть готовые файлы, то как я уже предлагал сделай так: http://adn-cis.org/forum/index.php?topic=7028.msg19773#msg19773
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн НадеждаАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #50 : 26-04-2016, 14:31:34 »
Наконец-то получилось!!!!  :D
Огромное спасибо, Александр Ривилис и Пашин Евгений, за помощь и поддержку!!!! Столько нового узнала!  :)
Сделала в итоге так: открывала по очереди в цикле dwg-файлы и печатала таким образом: http://adn-cis.org/forum/index.php?topic=1692.msg6253#msg6253, а
не через запущенную через SendCommand команду _PLOT
Еще раз спасибо!!!

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #51 : 26-04-2016, 14:46:26 »
Огромное спасибо, Александр Ривилис и Пашин Евгений, за помощь и поддержку!!!! Столько нового узнала! 

Это больше Александру Наумовичу спасибо :)

Оффлайн НадеждаАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #52 : 26-04-2016, 16:01:47 »
да, безусловно, Александр Наумович мне очень помог, но если б не Ваша поддержка, Евгений, я б давно уже забросила эти pdf  :)
и без канонического имени формата бумаги тоже бы ничего не вышло )))
« Последнее редактирование: 27-04-2016, 06:05:17 от Надежда »

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #53 : 27-04-2016, 06:41:43 »
Надежда, я за Вас очень рад! Вы - молодец.

Оффлайн НадеждаАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #54 : 27-04-2016, 06:42:45 »
спасибо, Евгений!  :)

Оффлайн Bassreflex

  • ADN OPEN
  • Сообщений: 1
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #55 : 24-06-2019, 09:03:56 »
Добрый день!
Я понимаю, что тема старая, ну а вдруг.

Пишу программку для пакетной печати на основе этого:
Можно пойти другими путями без вызова команды _EXPORT:
Вариант 1. https://forums.autodesk.com/t5/net/batching-export-to-pdf-from-acad-problem-c/td-p/3562450

Допилил под свои нужды, проштудировал эту тему и схожие с ней, казалось всё учел, но при определенных условиях программа аварийно завершает работу с ошибкой "eInvalidPlotInfo"
Суть программы в том, что она печатает из пространства модели (или листа) несколько "чертежей" по рамкам основной надписи - "форматкам".
Если все "форматки" одинаковые по размеру и ориентации, то печать проходит без проблем. Однако, если следующая по очереди на печать "форматка" отличается (по размеру и/или ориентации) от первой отправленной в печать, то кирдык-капут через "eInvalidPlotInfo".

Подскажите, куда копать?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #56 : 24-06-2019, 11:10:24 »
Подскажите, куда копать?
Приветствую на форуме!
Ну как минимум нужен пример кода и тестовый чертеж.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexandr1993

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #57 : 22-11-2024, 12:12:03 »
Добрый день! Полностью подтверждаю описанную выше проблему. Программа исправно отрабатывает при нескольких вариантах:
1. Все листы имеют одинаковый формат (CanonicalMediaName) и ориентацию (PlotRotation)
2. Всем листам (независимо от их фактических параметров, указанных выше) назначать эти параметры одинаковыми.


Код программы:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.PlottingServices;
  5. using Autodesk.AutoCAD.Publishing;
  6. using Autodesk.AutoCAD.Runtime;
  7.  
  8.  
  9. [CommandMethod("mplot")]
  10.         static public void MultiSheetPlot()
  11.         {
  12.             Document doc = Application.DocumentManager.MdiActiveDocument;
  13.             using (doc.LockDocument())
  14.             {
  15.                 Editor ed = doc.Editor;
  16.                 Database db = doc.Database;
  17.  
  18.  
  19.                 Transaction trans = db.TransactionManager.StartTransaction();
  20.  
  21.                 using (trans)
  22.                 {
  23.                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  24.                  
  25.                     // A PlotEngine does the actual plotting
  26.                     // (can also create one for Preview)
  27.  
  28.                     if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  29.                     {
  30.                         PlotEngine plotengine = PlotFactory.CreatePublishEngine();
  31.                         using (plotengine)
  32.                         {
  33.                             ObjectIdCollection layoutsToPlot = new ObjectIdCollection();
  34.                             List<Layout> listlayout = new List<Layout>();
  35.                             DBDictionary layoutdic= (DBDictionary)db.LayoutDictionaryId.GetObject(OpenMode.ForRead);
  36.  
  37.                             // Create a Progress Dialog to provide info
  38.                             // and allow thej user to cancel
  39.  
  40.                             foreach (DBDictionaryEntry entry in layoutdic)
  41.                             {
  42.                                 if (entry.Key != "Model")
  43.                                     listlayout.Add((Layout)trans.GetObject(entry.Value, OpenMode.ForRead));
  44.                             }
  45.                             listlayout.Sort((l1, l2) => l1.TabOrder.CompareTo(l2.TabOrder));
  46.                             layoutsToPlot = new ObjectIdCollection(listlayout.Select(l => l.BlockTableRecordId).ToArray());
  47.  
  48.                             PlotProgressDialog plotprogressdialog = new PlotProgressDialog(false, layoutsToPlot.Count, true);
  49.  
  50.                             using (plotprogressdialog)
  51.                             {
  52.                                 //ObjectIdCollection layoutsToPlot = new ObjectIdCollection();
  53.  
  54.                                 int numSheet = 1;
  55.  
  56.                                 foreach (ObjectId btrId in layoutsToPlot)
  57.                                 {
  58.                                     PlotInfo plotinfo = new PlotInfo();
  59.                                     PlotInfoValidator piv = new PlotInfoValidator();
  60.  
  61.                                     piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabledCustom;
  62.                                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
  63.  
  64.                                     Layout lo = (Layout)trans.GetObject(btr.LayoutId, OpenMode.ForRead);
  65.  
  66.                                     // We need a PlotSettings object
  67.                                     // based on the layout settings
  68.                                     // which we then customize
  69.  
  70.  
  71.                                     PlotSettings plotset = new PlotSettings(lo.ModelType);
  72.  
  73.                                     plotset.CopyFrom(lo);
  74.                                    
  75.                                     // The PlotSettingsValidator helps
  76.                                     // create a valid PlotSettings object
  77.  
  78.  
  79.                                     PlotSettingsValidator plotsetvalid = PlotSettingsValidator.Current;
  80.  
  81.  
  82.                                     // We'll plot the extents, centered and
  83.                                     // scaled to fit
  84.  
  85.  
  86.                                     plotsetvalid.SetPlotType(plotset, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout);
  87.                                     plotsetvalid.SetUseStandardScale(plotset, true);                                  
  88.                                     plotsetvalid.SetStdScaleType(plotset, StdScaleType.StdScale1To1);
  89.                                                                        
  90.                                     // We'll use the standard DWFx PC3, as
  91.                                     // this supports multiple sheets
  92.  
  93.                                     try
  94.                                     {
  95.                                         plotsetvalid.SetPlotConfigurationName(plotset, "DWG To PDF.pc3", lo.CanonicalMediaName);
  96.                                     }
  97.                                     catch (System.Exception)
  98.                                     {
  99.  
  100.                                         System.Windows.MessageBox.Show("Для листа " + lo.LayoutName.ToUpper() + " не удалось определить формат листа и назначить ему настройки печати." +
  101.                                             "\n Принтер должен быть DWG to PDF.pc3" +
  102.                                            "\n " + lo.CanonicalMediaName +
  103.                                             "\n Обратитесь в поддержку.", "ERROR", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
  104.                                         return;
  105.                                     }
  106.  
  107.                                     // We need a PlotInfo object
  108.                                     // linked to the layout
  109.  
  110.                                     // Make the layout we're plotting current
  111.                                     LayoutManager.Current.CurrentLayout = lo.LayoutName;
  112.                                    
  113.                                     // We need to link the PlotInfo to the
  114.                                     // PlotSettings and then validate it
  115.                                     plotinfo.OverrideSettings = plotset;
  116.                                     plotinfo.Layout = btr.LayoutId;
  117.                                     piv.Validate(plotinfo);
  118.                                    
  119.  
  120.                                     if (numSheet == 1)
  121.                                     {
  122.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress");
  123.  
  124.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
  125.  
  126.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
  127.  
  128.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
  129.  
  130.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");
  131.  
  132.                                         plotprogressdialog.LowerPlotProgressRange = 0;
  133.  
  134.                                         plotprogressdialog.UpperPlotProgressRange = 100;
  135.  
  136.                                         plotprogressdialog.PlotProgressPos = 0;
  137.  
  138.  
  139.                                         // Let's start the plot, at last
  140.  
  141.  
  142.                                         plotprogressdialog.OnBeginPlot();
  143.  
  144.                                         plotprogressdialog.IsVisible = true;
  145.  
  146.                                         plotengine.BeginPlot(plotprogressdialog, null);
  147.  
  148.  
  149.                                         // We'll be plotting a single document
  150.  
  151.                                         plotengine.BeginDocument(plotinfo, doc.Name, null, 1, true, doc.Name.Replace("dwg", "PDF"));
  152.                                     }
  153.  
  154.  
  155.                                     // Which may contain multiple sheets
  156.  
  157.  
  158.                                     plotprogressdialog.StatusMsgString = "Plotting " + doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1) + " - sheet " + numSheet.ToString() +
  159.  
  160.                                       " of " + layoutsToPlot.Count.ToString();
  161.  
  162.  
  163.                                     plotprogressdialog.OnBeginSheet();
  164.  
  165.  
  166.                                     plotprogressdialog.LowerSheetProgressRange = 0;
  167.  
  168.                                     plotprogressdialog.UpperSheetProgressRange = 100;
  169.  
  170.                                     plotprogressdialog.SheetProgressPos = 0;
  171.  
  172.  
  173.                                     PlotPageInfo plotpageinfo = new PlotPageInfo();
  174.                                     try
  175.                                     {
  176.                                         plotengine.BeginPage(plotpageinfo, plotinfo, numSheet == layoutsToPlot.Count, null);
  177.                                     }
  178.                                     catch (System.Exception)
  179.                                     {
  180.                                         System.Windows.MessageBox.Show("Ошибки с настройкой листа " + lo.LayoutName.ToUpper() + " при печати. Обратитесь в поддержку.", "ERROR",
  181.                                             System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
  182.                                         return;
  183.                                     }
  184.  
  185.  
  186.                                     plotengine.BeginGenerateGraphics(null);
  187.  
  188.                                     plotprogressdialog.SheetProgressPos = 50;
  189.  
  190.                                     plotengine.EndGenerateGraphics(null);
  191.  
  192.  
  193.                                     // Finish the sheet
  194.  
  195.                                     plotengine.EndPage(null);
  196.  
  197.                                     plotprogressdialog.SheetProgressPos = 100;
  198.  
  199.                                     plotprogressdialog.OnEndSheet();
  200.  
  201.                                     numSheet++;
  202.                                 }
  203.  
  204.                                 // Finish the document
  205.  
  206.                                 plotengine.EndDocument(null);
  207.  
  208.                                 // And finish the plot
  209.  
  210.                                 plotprogressdialog.PlotProgressPos = 100;
  211.  
  212.                                 plotprogressdialog.OnEndPlot();
  213.  
  214.                                 plotengine.EndPlot(null);
  215.                             }
  216.                         }
  217.                     }
  218.                     else
  219.                     {
  220.                         ed.WriteMessage("\nAnother plot is in progress.");
  221.                     }
  222.                     trans.Commit();
  223.                 }
  224.  
  225.             }
  226.         }

Чертёж для теста и настроенные файлы PC3 и PMP прилагаю.
Мои попытки пробить эту стену в течение 2-х дней ни к чему не привели.
« Последнее редактирование: 23-11-2024, 23:19:41 от Alexandr1993 »