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

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

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

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #15 : 19-04-2016, 11:15:51 »
...Если честно, я плохо себе представляю, как работает программа. Это не мой код, он мне достался "по наследству". Как я понимаю, файлы на самом деле не открываются физически, программа получает к ним доступ через какой-то поток, добирается до базы чертежа и вносит в нее нужные изменения.
 Я не знала, как таким же способом, не открывая файл, получить из него pdf, вот и стала их открывать, делать активным нужный мне лист и экспортировать либо публиковать...
Получается, я просто могу сформировать DSD-файл с именами листов и файлов и выполнить публикацию? Но предварительно нужно настроить каждый лист на принтер «DWG_To_PDF.pc3», забив в него нужные мне форматы?

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #16 : 19-04-2016, 12:56:07 »
Получается, я просто могу сформировать DSD-файл с именами листов и файлов и выполнить публикацию?

Да!

Но предварительно нужно настроить каждый лист на принтер «DWG_To_PDF.pc3», забив в него нужные мне форматы?

Да!


Только уточните,  а точно ли в каждом чертеже лист называется одинаково? :)
Иначе чертёж всё-таки придётся открывать, НО, правда лишь для того, чтобы получить список листов :), ну или для проверки того, какой принтер у листов настроен :)

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #17 : 19-04-2016, 13:07:31 »
Спасибо!!! попробую... осталось только научиться настраивать параметры печати )))
Цитировать
Только уточните,  а точно ли в каждом чертеже лист называется одинаково?
- я сама даю имена листам, так что могу это имя передать в качестве переменной )))

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #18 : 19-04-2016, 15:33:23 »
осталось только научиться настраивать параметры печати

Вам как требуется настраивать параметры печати: через интерфейс или программно? Могу легкий каст записать, если потребуется :)

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #19 : 20-04-2016, 05:19:43 »
мне бы программно, я вот так пробовала вчера, но AutoCad выдал ошибку:

Код - C# [Выбрать]
  1. //Этот код был в программе:                        
  2. using (Transaction trn = db.TransactionManager.StartTransaction())
  3. {
  4.      layoutName = sheetName;
  5.      foreach (char c in "<>/;\\:\"?*|`=,")
  6.      layoutName = layoutName.Replace(c, '_');
  7.    
  8.     BlockTable bt = (BlockTable)trn.GetObject(db.BlockTableId, OpenMode.ForWrite);
  9.  
  10.     DBDictionary layoutDict = (DBDictionary)trn.GetObject(db.LayoutDictionaryId, OpenMode.ForWrite);
  11.  
  12.     //Создать новый лист
  13.     Layout newLayout = new Layout();
  14.     BlockTableRecord newBTR = new BlockTableRecord();
  15.     newBTR.Name = BlockTableRecord.PaperSpace;
  16.     idBTRPaper = bt.Add(newBTR);
  17.     trn.AddNewlyCreatedDBObject(newBTR, true);
  18.     newLayout.LayoutName = layoutName;
  19.     newLayout.AddToLayoutDictionary(db, idBTRPaper);
  20.  
  21.    //Удалить остальные листы
  22.    ObjectIdCollection layoutColl = new ObjectIdCollection();
  23.    foreach (DBDictionaryEntry entry in layoutDict)
  24.    if (entry.Value != bt[BlockTableRecord.ModelSpace] && entry.Value != newLayout.ObjectId)
  25.       layoutColl.Add(entry.Value);
  26.       foreach (ObjectId id in layoutColl)
  27.       layoutDict.Remove(id);
  28.  
  29.     //Скопировать из шаблона
  30.         using (Database dbTmpt = new Database(false, true))
  31.         {
  32.            dbTmpt.ReadDwgFile(FILE_TMPT_SHEET, System.IO.FileShare.Read, false, String.Empty);
  33.                  using (Transaction trnTmpt = dbTmpt.TransactionManager.StartTransaction())
  34.                 {
  35.                           DBDictionary layoutDictTmpt = (DBDictionary)trnTmpt.GetObject(dbTmpt.LayoutDictionaryId, OpenMode.ForRead);
  36.                    ObjectId idLayoutSrc = ObjectId.Null;
  37.                    foreach (DBDictionaryEntry entry in layoutDictTmpt)
  38.                    if (entry.Key == tmptFormatName)
  39.                        idLayoutSrc = entry.Value;
  40.  
  41.                    if (idLayoutSrc != ObjectId.Null)
  42.                       {
  43.                         Layout layoutSrc = (Layout)trnTmpt.GetObject(idLayoutSrc, OpenMode.ForRead);
  44.                         BlockTableRecord btrSrc = (BlockTableRecord)trnTmpt.GetObject(layoutSrc.BlockTableRecordId, OpenMode.ForRead);
  45.                         ObjectIdCollection idsToClone = new ObjectIdCollection();
  46.                         foreach (ObjectId id in btrSrc)
  47.                         idsToClone.Add(id);
  48.                         IdMapping mapping = new IdMapping();
  49.                         db.WblockCloneObjects(idsToClone, idBTRPaper, mapping, DuplicateRecordCloning.Replace, false);
  50.  
  51.                         layoutSrc.Dispose();
  52.                         btrSrc.Dispose();
  53.                         idsToClone.Dispose();
  54.                         mapping.Dispose();
  55.                      }
  56.                   layoutDictTmpt.Dispose();
  57.                   trnTmpt.Commit();
  58.                 }
  59.            }
  60. //Этот я добавила:                    
  61.                   // Get a copy of the PlotSettings from the layout
  62.                     PlotSettings acPlSet = new PlotSettings(newLayout.ModelType);
  63.                     acPlSet.CopyFrom(newLayout);
  64.  
  65.                     // Update the PlotConfigurationName property of the PlotSettings object
  66.                     PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  67.                     acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout);
  68.                     acPlSetVdr.SetUseStandardScale(acPlSet, true);
  69.                     acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.StdScale1To1);
  70.                     acPlSetVdr.SetPlotCentered(acPlSet, true);
  71.  (1)               acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWG To PDF.pc3",
  72.                                                         "A1");
  73.  
  74.                     // Update the layout
  75.                     newLayout.UpgradeOpen();
  76.                     newLayout.CopyFrom(acPlSet);
  77.  
  78.             layoutDict.Dispose();
  79.             layoutColl.Dispose();
  80.             newLayout.Dispose();
  81.             newBTR.Dispose();
  82.             bt.Dispose();
  83.             trn.Commit();
  84.         }

На строке (1) AutoCAD выдает ошибку:

Autodesk.AutoCAD.Runtime.Exception: eInvalidInput
   в Autodesk.AutoCAD.DatabaseServices.PlotSettingsValidator.SetPlotConfigurationName(PlotSettings plotSet, String plotDeviceName, String mediaName)

и аварийно завершает работу...
« Последнее редактирование: 20-04-2016, 07:14:06 от Надежда »

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #20 : 20-04-2016, 10:20:54 »
На строке (1) AutoCAD выдает ошибку:

Autodesk.AutoCAD.Runtime.Exception: eInvalidInput
   в Autodesk.AutoCAD.DatabaseServices.PlotSettingsValidator.SetPlotConfigurationName(PlotSettings plotSet, String plotDeviceName, String mediaName)

и аварийно завершает работу...

Да уж, для меня такая конструкция вложенных транзакций сложновата :)
НО, может всё-таки создание «Настройки печати» произвести в новой транзакции, а то старая trnTmpt.Commit(); была закрыта уже :)

Я себе это действие как-то так представлял:


Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.PlottingServices;
  5.  
  6. [CommandMethod("CreateOrEditPageSetup")]
  7. public static void CreateOrEditPageSetup()
  8. {
  9.  
  10.     Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11.     Database acCurDb = acDoc.Database;
  12.  
  13.     using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  14.     {
  15.  
  16.         DBDictionary plSets = acTrans.GetObject(acCurDb.PlotSettingsDictionaryId,
  17.                                                 OpenMode.ForRead) as DBDictionary;
  18.         DBDictionary vStyles = acTrans.GetObject(acCurDb.VisualStyleDictionaryId,
  19.                                                  OpenMode.ForRead) as DBDictionary;
  20.  
  21.         PlotSettings acPlSet = default(PlotSettings);
  22.         bool createNew = false;
  23.  
  24.         LayoutManager acLayoutMgr = LayoutManager.Current;
  25.  
  26.         Layout acLayout = acTrans.GetObject(acLayoutMgr.GetLayoutId(acLayoutMgr.CurrentLayout),
  27.                                             OpenMode.ForRead) as Layout;
  28.  
  29.         if (plSets.Contains("MyPageSetup") == false)
  30.         {
  31.             createNew = true;
  32.  
  33.             acPlSet = new PlotSettings(acLayout.ModelType);
  34.             acPlSet.CopyFrom(acLayout);
  35.  
  36.             acPlSet.PlotSettingsName = "MyPageSetup";
  37.             acPlSet.AddToPlotSettingsDictionary(acCurDb);
  38.             acTrans.AddNewlyCreatedDBObject(acPlSet, true);
  39.         }
  40.         else
  41.         {
  42.             acPlSet = plSets.GetAt("MyPageSetup").GetObject(OpenMode.ForWrite) as PlotSettings;
  43.         }
  44.  
  45.         try
  46.         {
  47.             PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  48.  
  49.             acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWG To PDF.pc3", "A1");
  50.  
  51.             if (acLayout.ModelType == false)
  52.             {
  53.                 acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout);
  54.             }
  55.             else
  56.             {
  57.                 acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
  58.  
  59.                 acPlSetVdr.SetPlotCentered(acPlSet, true);
  60.             }
  61.  
  62.  
  63.             acPlSetVdr.SetPlotOrigin(acPlSet, new Point2d(0, 0));
  64.  
  65.             acPlSetVdr.SetUseStandardScale(acPlSet, true);
  66.             acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);
  67.             acPlSetVdr.SetPlotPaperUnits(acPlSet, PlotPaperUnit.Inches);
  68.             acPlSet.ScaleLineweights = true;
  69.  
  70.             acPlSet.ShowPlotStyles = true;
  71.  
  72.             acPlSetVdr.RefreshLists(acPlSet);
  73.  
  74.             acPlSet.ShadePlot = PlotSettingsShadePlotType.AsDisplayed;
  75.  
  76.             acPlSet.ShadePlotResLevel = ShadePlotResLevel.Normal;
  77.  
  78.             acPlSet.PrintLineweights = true;
  79.             acPlSet.PlotTransparency = false;
  80.             acPlSet.PlotPlotStyles = true;
  81.             acPlSet.DrawViewportsFirst = true;
  82.             acPlSet.CurrentStyleSheet
  83.  
  84.  
  85.             acPlSetVdr.SetPlotRotation(acPlSet, PlotRotation.Degrees000);
  86.  
  87.             if (acCurDb.PlotStyleMode == true)
  88.             {
  89.                 acPlSetVdr.SetCurrentStyleSheet(acPlSet, "acad.ctb");
  90.             }
  91.             else
  92.             {
  93.                 acPlSetVdr.SetCurrentStyleSheet(acPlSet, "acad.stb");
  94.             }
  95.  
  96.             acPlSetVdr.SetZoomToPaperOnUpdate(acPlSet, true);
  97.         }
  98.         catch (Autodesk.AutoCAD.Runtime.Exception es)
  99.         {
  100.             System.Windows.Forms.MessageBox.Show(es.Message);
  101.         }
  102.  
  103.         acTrans.Commit();
  104.  
  105.         if (createNew == true)
  106.         {
  107.             acPlSet.Dispose();
  108.         }
  109.     }
  110. }

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #21 : 20-04-2016, 10:32:32 »
Цитировать
старая trnTmpt.Commit();
- это транзакция для файла шаблона (с ее помощью из файла шаблона был взят нужный шаблон листа, и больше она не нужна, потому и закрыта).. а мой новый лист newLayout был создан в другой транзакции, trn, и она еще не закрыта...

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #22 : 20-04-2016, 10:38:57 »
- это транзакция для файла шаблона (с ее помощью из файла шаблона был взят нужный шаблон листа, и больше она не нужна, потому и закрыта).. а мой новый лист newLayout был создан в другой транзакции, trn, и она еще не закрыта...

Тогда проверьте правильно ли Вы назвали формат A1 (буква английская) или А1 (буква русская)!!! Это тоже может стать помехой. Они должны быть такими же как и в формате принтера :)

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #23 : 20-04-2016, 11:04:39 »
Букву поменяла, не помогло, вот какую ошибку выдает AutoCAD перед аварийным завершением:

************** Текст исключения **************
System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в Autodesk.AutoCAD.DatabaseServices.DBObject.DeleteUnmanagedObject()
   в Autodesk.AutoCAD.Runtime.DisposableWrapper.!DisposableWrapper()
   в Autodesk.AutoCAD.Runtime.DisposableWrapper.Dispose(Boolean )
   в Autodesk.AutoCAD.DatabaseServices.DBObject.Dispose(Boolean )

...в общем, надо сначала изучить C#, чтобы понимать все эти потоки... пойду учиться ))

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #24 : 20-04-2016, 11:56:19 »
Надежда
Если используешь транзакцию,  то ни в коем случае не используй метод Dispose для объектов, вовлеченных в эту транзакцию. Последняя ошибка явно связана с вызовом Dispose.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка печати при экспорте в Pdf
« Ответ #25 : 20-04-2016, 12:48:09 »
спасибо, Александр! переместила свой код до команды Dispose() - фатальная ошибка исчезла, но AutoCAD по-прежнему ругается на строку:

Autodesk.AutoCAD.Runtime.Exception: eInvalidInput
   в Autodesk.AutoCAD.DatabaseServices.PlotSettingsValidator.SetPlotConfigurationName(PlotSettings plotSet, String plotDeviceName, String mediaName)
 
я уже и в DWG To PDF.pc3 создала свой формат листа (чтобы точно не было ошибки в имени) - все равно не помогает ((

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Ошибка печати при экспорте в Pdf
« Ответ #26 : 20-04-2016, 13:57:14 »
Что-то мне помнится что eInvalidInput при печати означает что не верно задан формат бумаги, т.е. именно такого нет в списке pmp файла именно того плоттера на который производится печать.

http://forums.autodesk.com/t5/net/einvalidinput-setplotconfigurationname/td-p/4577989

http://through-the-interface.typepad.com/through_the_interface/2007/10/allowing-select.html

т.е. должно быть написано, например, ISO_A1_(841.00_x_594.00_MM)

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #27 : 20-04-2016, 14:24:54 »
Да, мне тоже помнится, что передаваться должно каноническое имя формата принтера!!!

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Ошибка печати при экспорте в Pdf
« Ответ #28 : 20-04-2016, 14:29:47 »
Надежда, есть вероятность, что Ваша проблема связана с тем, что Вы пытаетесь передать в настройку принтера LocaleMediaName, а, возможно, Вам требуется передавать её CanonicalMediaName.

Кстати, вот что я нашел в справке:

Код - C# [Выбрать]
  1. // Set the Plotter and page size
  2.             acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWF6 ePlot.pc3", "ANSI_B_(17.00_x_11.00_Inches)");

Это означает, что у Вас формат имеет, например, значение «А3 (297х420 мм)», а его каноническое имя будет иметь вид «A3_(297.00_x_420.00_mm)»!!! Вы, конечно, не видите это в диалоговом окне печати, но программно можете вытащить это.

Код - C# [Выбрать]
  1.         Document acDoc = Application.DocumentManager.MdiActiveDocument;
  2.         PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;
  3.  
  4.         int cnt = 0;
  5.  
  6.         foreach (string mediaName in acPlSetVdr.GetCanonicalMediaNameList(plSet))
  7.         {
  8.             // Выводим имена форматов (Locale и Canonical) принтера текущей настройки принтера
  9.             acDoc.Editor.WriteMessage("\n  " + mediaName + " | " +
  10.                                       acPlSetVdr.GetLocaleMediaName(plSet, cnt));
  11.  
  12.             cnt = cnt + 1;
  13.         }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка печати при экспорте в Pdf
« Ответ #29 : 20-04-2016, 15:48:42 »
Самое смешное, что при печати при помощи DSD в PDF/DWF(DWFx) не нужно вообще указывать устройство вывода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение