PrintSetup InSession

Автор Тема: PrintSetup InSession  (Прочитано 15188 раз)

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

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

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

  • ADN Club
  • Сообщений: 4
  • Карма: 0
PrintSetup InSession
« : 07-11-2018, 19:12:23 »
Коллеги, всем привет! Кто-нибудь пробовал печатать с использованием PrintSetup.InSession? Не получается применить PrintParameters. Как я понял из этой темы, была проблема в старых версиях API, но в 2017-то всё должно быть нормально.
Что-то на том форуме никто не откликается, может, здесь кто поможет :)
Печатать нужно именно без открытия транзакции, поэтому PrintSetting.Save не подойдет.
Заранее спасибо всем, кто откликнется.
Код:
Код - C# [Выбрать]
  1. public void StartPrint()
  2. {
  3.         Document doc = this.ActiveUIDocument.Document;
  4.         List<ViewSheet> sheets = new FilteredElementCollector(doc)
  5.                 .OfClass(typeof(ViewSheet))
  6.                 .Cast<ViewSheet>()
  7.                 .ToList();
  8.  
  9.         foreach (ViewSheet sheet in sheets)
  10.         {
  11.                 PrintManager pManager = doc.PrintManager;
  12.                 pManager.SelectNewPrintDriver("PDFCreator");
  13.                 pManager.PrintRange = PrintRange.Current;
  14.                 pManager.Apply();
  15.  
  16.                 pManager.PrintSetup.CurrentPrintSetting = pManager.PrintSetup.InSession;
  17.                 PrintParameters pps = pManager.PrintSetup.CurrentPrintSetting.PrintParameters;
  18.                 pps.PaperPlacement = PaperPlacementType.Center;
  19.                 pps.ZoomType = ZoomType.FitToPage;
  20.                 pps.ColorDepth = ColorDepthType.GrayScale;
  21.                 pManager.Apply();
  22.  
  23.                 pManager.SubmitPrint(sheet); //print in colors, no grayscales
  24.         }
  25. }
« Последнее редактирование: 07-11-2018, 19:56:29 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #1 : 07-11-2018, 19:58:30 »
extraneous
Приветствую на форуме! Обрати внимание, что я исправил все ссылки, так как они содержали двойные кавычки и поэтому вели "в никуда".
По теме вопроса у меня нет ответа, и если в ближайшее время никто не ответит, то отправлю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #2 : 07-11-2018, 20:33:53 »
Печатать нужно именно без открытия транзакции, поэтому PrintSetting.Save не подойдет.
Хотел бы предварительно уточнить почему не подходит транзакция? Она не может выполнятся в этом контексте или ты не хочешь чтобы производилась модификация файла?
Во втором случае можно попытаться реализовать так (с откатом транзакции):
Код - C# [Выбрать]
  1. using (Transaction t = new Transaction(doc, "InSessionPrint"))
  2. {
  3.   t.Start();
  4.   StartPrint(); // Тут настройка и печать
  5.   t.RollBack();
  6. }
  7.  
И еще один вариант (без транзакции):
Код - C# [Выбрать]
  1. try
  2. {
  3.   pManager.PrintSetup.Save();
  4. }
  5. catch{}
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 4
  • Карма: 0
Re: PrintSetup InSession
« Ответ #3 : 07-11-2018, 22:41:12 »
Александр, привет! Спасибо за корректирование ссылок.

Транзакция не подходит потому, что лист печатается из файла, подгруженного ссылкой (не спрашивайте. как мы дошли до жизни такой). Но, как ни странно, листы так можно печатать! Вопрос только в настройке параметров печати. И дело даже не в Rollback: исключение вываливается в тот же момент, когда вызывается Save.

Да и вообще, учитывая то, что параметры настраиваются заново для каждого листа, использование параметров печати "В сеансе" выглядит более чистым решением. Такое ощущение, что я просто что-то упускаю.
С другой стороны, в SDK в примере ViewPrinter та же фигня: если выбрать набор параметров печати "В сеансе" и, например, печать в черных линиях, то лист всё равно напечатается цветной...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #4 : 07-11-2018, 22:44:03 »
И дело даже не в Rollback: исключение вываливается в тот же момент, когда вызывается Save.
Одной из рекомендаций было заключить его (т.е. Save) в try/catch - рекомендация не моя - нашел её в контексте именно этой задачи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #5 : 07-11-2018, 22:46:15 »
Транзакция не подходит потому, что лист печатается из файла, подгруженного ссылкой
И? Я очень далёк от Revit и его API, но не понимаю, почему не должна работать транзакция.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 08-11-2018, 09:54:46

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: PrintSetup InSession
« Ответ #6 : 08-11-2018, 01:44:34 »
Неа, с in-session оно и в 2019 до сих пор не работает.

И? Я очень далёк от Revit и его API, но не понимаю, почему не должна работать транзакция.

Потому что топикстартер, вероятно вынуждено(?), занимается какими-то особо изысканными извращениями с печатью листов из связанного файла. Revit не даст внести изменения в связанный файл (запустить транзакцию), это можно сделать, если только сначала выгрузить связь, открыть связанный документ, сделать что-то полезное, закрыть и загрузить связь обратно. Печатаемый вид и PrintSettings также должны быть физически в одном файле, т.е. не получится сохранить настройки печати в основной файл, а потом запустить печать с этими настройками вида из другого файла.

Решить можно отказом от извращений по методу со связанными файлами, приведенному по ссылке, либо, выгрузкой/загрузкой связанных файлов, либо предварительной настройкой в связанных файлах профилей печати

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #7 : 08-11-2018, 01:48:08 »
Александр Игнатович,
Спасибо за "ликбез"!  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 4
  • Карма: 0
Re: PrintSetup InSession
« Ответ #8 : 08-11-2018, 09:52:37 »
с in-session оно и в 2019 до сих пор не работает
Ну, собственно, всё, что нам нужно знать про Автодеск. Спасибо за ответ.
А еще надеюсь, что в будущем вы воздержитесь от того, чтобы называть извращением работу других людей.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #9 : 08-11-2018, 09:57:37 »
А еще надеюсь, что в будущем вы воздержитесь от того, чтобы называть извращением работу других людей.
Вы видимо не так поняли Александра. У него ключевым словом является "вынужденно", а не "извращение", т.е. "извращение" есть лишь следствие "вынужденности". Так что ничего обидного в его словах я не вижу.
Off-Topic: показать
P.S.: В теме собрались одни Александры.  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: PrintSetup InSession
« Ответ #10 : 08-11-2018, 11:31:20 »
Да, никого обидеть я не хотел, извините, если что.

А политика Autodesk, в принципе, понятна, есть огромный объем кода, есть, наверное, не меньший перечень задач. Проблема существует - ну да, workaround есть? Опять же да, в приведенной выше ссылке. Даже в Вашем случае задача может быть выполнена, причем несколькими способами. Выгрузкой/загрузкой связанных документов или, например, если проект не открыт - получением через TransmissionData путей ко всем связанным документам и уже, при необходимости, открытием нужных, печати/закрытием обратно

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

  • ADN Club
  • Сообщений: 4
  • Карма: 0
Re: PrintSetup InSession
« Ответ #11 : 08-11-2018, 12:25:32 »
Александр Игнатович, да, конечно, будем выкручиваться. Просто как я понял из той темы, эта ошибка была в 2015 и исправлена в 2016 R2. Но, видимо, что-то не так понял.
Печатать из связанного файла приходится потому, что у нас типовые повторяющиеся конструкции сразу с оформленными листами делаются в отдельных файлах.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #12 : 08-11-2018, 12:35:49 »
Просто как я понял из той темы, эта ошибка была в 2015 и исправлена в 2016 R2. Но, видимо, что-то не так понял.
Так как тема начата в 2012 году, то проблема как минимум с версии 2013 (где-то я нашел, что значительно раньше). И тогда же информация была передана Revit Dev Team. Но видимо она оказалась недостаточно приоритетной. И я не увидел в той ссылке информации об исправлении в Revit 2016 R2. Там вообще нет информации об исправлении, а тем более в конкретной версии. Только вариант workaround.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: PrintSetup InSession
« Ответ #13 : 18-11-2019, 13:02:56 »
Продолжим тему? :)

В приведенном Александром Ривилисом выше коде, PrintManager.PrintSetup.Save() взят в try...catch и явно не просто так. В моем случае, в Revit 2020 именно в этом месте код рушится с сообщением "Save of the print setup was unsuccessful." При этом в 2018-ой версии все работало отлично.
Есть идеи, что может влиять на отказ в сохранении?

Мой код:
Код - C# [Выбрать]
  1.                     printManager.PrintRange = PrintRange.Select;
  2.                     printManager.Apply();
  3.  
  4.                     printManager.SelectNewPrintDriver(ExternalApplication.options.PrinterName);
  5.                     printManager.Apply();
  6.  
  7.                     if (printManager.IsVirtual == VirtualPrinterType.AdobePDF)
  8.                     {
  9.                         printManager.CombinedFile = true;
  10.                         printManager.Apply();
  11.                     }
  12.  
  13.                     string viewSheetSettingName = string.Format("ViewSheet {0}", nowTime/*viewSheet.SheetNumber*/);
  14.                     ViewSheetSetting viewSheetSetting = printManager.ViewSheetSetting;
  15.  
  16.                     ViewSet viewSet = new ViewSet();
  17.                     viewSet.Insert(viewSheet);
  18.  
  19.                     viewSheetSetting.CurrentViewSheetSet.Views = viewSet;
  20.  
  21.                     viewSheetSetting.SaveAs(viewSheetSettingName);
  22.                     printManager.Apply();
  23.  
  24.                     XYZ margins = new XYZ(6, 4, 0);
  25.                     margins = Utils.ConvertMillimetresToInches(margins);
  26.  
  27.                     PrintSetup printSetup = printManager.PrintSetup;
  28.                     IPrintSetting printSetting = printSetup.CurrentPrintSetting;
  29.                     printSetting.PrintParameters.ColorDepth = ColorDepthType.BlackLine;//добавить список или переключатель для выбора ColorDepthType;
  30.                     printSetting.PrintParameters.HiddenLineViews = HiddenLineViewsType.RasterProcessing;// = HiddenLineViewsType.VectorProcessing;
  31.                     printSetting.PrintParameters.HideCropBoundaries = true;
  32.                     printSetting.PrintParameters.HideReforWorkPlanes = true;
  33.                     printSetting.PrintParameters.HideScopeBoxes = true;
  34.                     printSetting.PrintParameters.HideUnreferencedViewTags = false;
  35.                     printSetting.PrintParameters.PaperPlacement = PaperPlacementType.Margins;
  36.                     printSetting.PrintParameters.MarginType = MarginType.UserDefined;
  37.                     printSetting.PrintParameters.UserDefinedMarginX = margins.X;
  38.                     printSetting.PrintParameters.UserDefinedMarginY = margins.Y;
  39.                     printSetting.PrintParameters.RasterQuality = RasterQualityType.High;
  40.                     printSetting.PrintParameters.ZoomType = ZoomType.Zoom;
  41.                     printSetting.PrintParameters.Zoom = 100;
  42.                     printSetting.PrintParameters.PageOrientation = formatName.IndexOf("h", StringComparison.OrdinalIgnoreCase) >= 0 ? PageOrientationType.Landscape : PageOrientationType.Portrait;
  43.  
  44.                     if (ExternalApplication.options.InversePageOrientation)
  45.                         printSetting.PrintParameters.PageOrientation = printSetting.PrintParameters.PageOrientation == PageOrientationType.Landscape ? PageOrientationType.Portrait : PageOrientationType.Landscape;
  46.  
  47.                     bool paperSizeFound = false;
  48.                     string paperSizeName = "";
  49.                     foreach (PaperSize paperSize in printManager.PaperSizes)
  50.                     {
  51.                         paperSizeName = paperSize.Name;
  52.                         if (ExternalApplication.options.InversePageFormat)
  53.                             paperSizeName = ReplaceFormatChar(paperSizeName);
  54.                         else if (ExternalApplication.options.InversePageFormatOnLandscape && printSetting.PrintParameters.PageOrientation == PageOrientationType.Landscape)
  55.                             paperSizeName = ReplaceFormatChar(paperSizeName);
  56.  
  57.                         if (string.Equals(paperSizeName, formatName, StringComparison.OrdinalIgnoreCase))
  58.                         {
  59.                             printSetting.PrintParameters.PaperSize = paperSize;
  60.                             paperSizeFound = true;
  61.                             break;
  62.                         }
  63.                     }
  64.  
  65.                     if (!paperSizeFound)
  66.                     {
  67.                         TaskDialog.Show("Revit", string.Format("Не найден формат {0} для принтера {1} на листе {2}!", formatName, ExternalApplication.options.PrinterName, viewSheet.SheetNumber), TaskDialogCommonButtons.Close);
  68.                         return result;
  69.                     }
  70.  
  71.  
  72.                     string setupName = string.Format("Setting {0}", nowTime);
  73.                     printSetup.SaveAs(setupName);
  74.                     printManager.Apply();
  75.  
  76.                     FilteredElementCollector printSettings = new FilteredElementCollector(doc).OfClass(typeof(PrintSetting));
  77.                     foreach (PrintSetting ps in printSettings)
  78.                     {
  79.                         if (ps.Name == setupName)
  80.                         {
  81.                             doc.PrintManager.PrintSetup.CurrentPrintSetting = ps;
  82.                             doc.PrintManager.PrintSetup.Save();
  83.                             break;
  84.                         }
  85.                     }
  86.  
  87.                     printManager.SubmitPrint();
  88.                     //printManager.SubmitPrint(viewSheet);
  89.                     //printManager.Apply();
  90.  
  91.                     viewSheetSetting.Delete();
  92.  

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: PrintSetup InSession
« Ответ #14 : 18-11-2019, 13:18:28 »
Как бы сложно сказать. В каком месте на этом полотне возникает ошибка?

Не здесь ли?
Код - C# [Выбрать]
  1. doc.PrintManager.PrintSetup.CurrentPrintSetting = ps;
  2. doc.PrintManager.PrintSetup.Save();

Могу предположить, что по причине:
Цитировать
Thrown when the current print setting is In-Session or the current print setting has not changed.

из документации PrintSetup.Save