Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: extraneous от 07-11-2018, 19:12:23

Название: PrintSetup InSession
Отправлено: extraneous от 07-11-2018, 19:12:23
Коллеги, всем привет! Кто-нибудь пробовал печатать с использованием PrintSetup.InSession (http://www.revitapidocs.com/2017/8fa68bd4-9e97-f772-629b-25ef129939e3.htm)? Не получается применить PrintParameters. Как я понял из этой темы (https://forums.autodesk.com/t5/revit-api-forum/printermanager-printsetup-do-not-apply-settings/m-p/8385475), была проблема в старых версиях 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. }
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 07-11-2018, 19:58:30
extraneous
Приветствую на форуме! Обрати внимание, что я исправил все ссылки, так как они содержали двойные кавычки и поэтому вели "в никуда".
По теме вопроса у меня нет ответа, и если в ближайшее время никто не ответит, то отправлю в ADN DevHelp.
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 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{}
Название: Re: PrintSetup InSession
Отправлено: extraneous от 07-11-2018, 22:41:12
Александр, привет! Спасибо за корректирование ссылок.

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

Да и вообще, учитывая то, что параметры настраиваются заново для каждого листа, использование параметров печати "В сеансе" выглядит более чистым решением. Такое ощущение, что я просто что-то упускаю.
С другой стороны, в SDK в примере ViewPrinter та же фигня: если выбрать набор параметров печати "В сеансе" и, например, печать в черных линиях, то лист всё равно напечатается цветной...
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 07-11-2018, 22:44:03
И дело даже не в Rollback: исключение вываливается в тот же момент, когда вызывается Save.
Одной из рекомендаций было заключить его (т.е. Save) в try/catch - рекомендация не моя - нашел её в контексте именно этой задачи.
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 07-11-2018, 22:46:15
Транзакция не подходит потому, что лист печатается из файла, подгруженного ссылкой
И? Я очень далёк от Revit и его API, но не понимаю, почему не должна работать транзакция.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 08-11-2018, 01:44:34
Неа, с in-session оно и в 2019 до сих пор не работает.

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

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

Решить можно отказом от извращений по методу со связанными файлами, приведенному по ссылке, либо, выгрузкой/загрузкой связанных файлов, либо предварительной настройкой в связанных файлах профилей печати
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 08-11-2018, 01:48:08
Александр Игнатович,
Спасибо за "ликбез"!  :)
Название: Re: PrintSetup InSession
Отправлено: extraneous от 08-11-2018, 09:52:37
с in-session оно и в 2019 до сих пор не работает
Ну, собственно, всё, что нам нужно знать про Автодеск. Спасибо за ответ.
А еще надеюсь, что в будущем вы воздержитесь от того, чтобы называть извращением работу других людей.
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 08-11-2018, 09:57:37
А еще надеюсь, что в будущем вы воздержитесь от того, чтобы называть извращением работу других людей.
Вы видимо не так поняли Александра. У него ключевым словом является "вынужденно", а не "извращение", т.е. "извращение" есть лишь следствие "вынужденности". Так что ничего обидного в его словах я не вижу.
Off-Topic: показать
P.S.: В теме собрались одни Александры.  :)
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 08-11-2018, 11:31:20
Да, никого обидеть я не хотел, извините, если что.

А политика Autodesk, в принципе, понятна, есть огромный объем кода, есть, наверное, не меньший перечень задач. Проблема существует - ну да, workaround есть? Опять же да, в приведенной выше ссылке. Даже в Вашем случае задача может быть выполнена, причем несколькими способами. Выгрузкой/загрузкой связанных документов или, например, если проект не открыт - получением через TransmissionData путей ко всем связанным документам и уже, при необходимости, открытием нужных, печати/закрытием обратно
Название: Re: PrintSetup InSession
Отправлено: extraneous от 08-11-2018, 12:25:32
Александр Игнатович, да, конечно, будем выкручиваться. Просто как я понял из той темы, эта ошибка была в 2015 и исправлена в 2016 R2. Но, видимо, что-то не так понял.
Печатать из связанного файла приходится потому, что у нас типовые повторяющиеся конструкции сразу с оформленными листами делаются в отдельных файлах.
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 08-11-2018, 12:35:49
Просто как я понял из той темы, эта ошибка была в 2015 и исправлена в 2016 R2. Но, видимо, что-то не так понял.
Так как тема начата в 2012 году, то проблема как минимум с версии 2013 (где-то я нашел, что значительно раньше). И тогда же информация была передана Revit Dev Team. Но видимо она оказалась недостаточно приоритетной. И я не увидел в той ссылке информации об исправлении в Revit 2016 R2. Там вообще нет информации об исправлении, а тем более в конкретной версии. Только вариант workaround.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 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.  
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 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
Название: Re: PrintSetup InSession
Отправлено: Alxd от 18-11-2019, 14:04:27
Да, конечно в этом месте.
Только у меня, похоже не In-Session, а обычный вызов обернутый в транзакцию (в коде не указал, извиняюсь).

Судя по приведенному комментарию из документации, получается, сообщение об ошибке может возникать, если параметры не изменились, а их пытаются сохранить. Бред конечно, но допустим.  За-трай-кэтчил.

Обновил до Revit 2020.1, пытаюсь вызвать SubmitPrint и Revit просто падает с сообщением "An unrecoverable error has occurred.  The program will now be terminated.  All of your data has been recently saved, so there is no need to create recovery files." :( Опять же, в 2018-ом такого не было. 2020-ый падает стабильно.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 18-11-2019, 14:09:03
Попробуйте открыть группу транзакций, в ней транзакцию сохранения настроек печати, её коммитим, дальше печатаем, в завершение, откатываем группу транзакций
Название: Re: PrintSetup InSession
Отправлено: Alxd от 18-11-2019, 15:06:04
С группой транзакций не понял, но идея разделить на транзакции зацепила.
Разбил процесс печати на 3 транзакции, но результат тот же самый. Не понимаю, чего ему не хватает. Причем, что интересно, Revit создает .ps файл в результате вызова SubmitPrint, а потом вываливает сообщение о неустранимой ошибке. И ошибка не трай-кэтчится, что обидно. В итоге и .ps файл имеется, и сделать ничего не можешь.

Попробовал вызвать те же самые действия с правами админа, результат тот же самый. Не слабый такой облом получился при переходе на новую версию. Теперь ума не приложу, как печатать большой объем документации?! :(

Off-Topic: показать
P.S. Revit - пример крайне непродуманного и сырого продукта. В сравнении с AutoCAD - небо и земля.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 18-11-2019, 15:11:04
Off-Topic: показать
P.S. Revit - пример крайне непродуманного и сырого продукта. В сравнении с AutoCAD - небо и земля.


о_0, 0_о, 0_0

Да ну ладно, Revit - конфетка, ну, может быть кроме API, связанного с печатью :). Где-то в другом, возможно проблема. У нас есть пакетная печать, в 2020 работает без проблем
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 18-11-2019, 15:22:48
Причем, что интересно, Revit создает .ps файл в результате вызова SubmitPrint, а потом вываливает сообщение о неустранимой ошибке.
А это не проблема драйвера?
Название: Re: PrintSetup InSession
Отправлено: Alxd от 18-11-2019, 15:28:28
о_О, о_О, о_О
Это, конечно, уже не в тему, но попробуйте программно повернуть, скажем, тройник на 15 градусов вокруг длиной оси. Еще можете попробовать поменять систему у трубопровода с одной на другую. Ну или сформировать спецификацию металла с "двухэтажным" обозначение материала, а потом еще и сводную ведомость материалов. И все эти детские проблемы в 2020 версии, а не в первой!

Александр Ривилис, вполне возможно, что так. Я уже два разных проверил. Но в обоих случаях ошибка. И ведь вручную он с их помощью печатает, а программно - нет! Настройки идентичные при печати!

Сейчас попробую с помощью SendKey дожать это засранца.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 19-11-2019, 14:51:09
В общем, пока нашел только вызов диалогового окна "Print":

Код - C# [Выбрать]
  1. RevitCommandId printCommandId = RevitCommandId.LookupPostableCommandId(PostableCommand.Print);
  2. application.PostCommand(printCommandId);
  3.  

и событие на выполнение печати, т.е., в моем случае, создание .ps-файла:

Код - C# [Выбрать]
  1. private static void Doc_ViewPrinted(object sender, Autodesk.Revit.DB.Events.ViewPrintedEventArgs e)
  2. {
  3.     // здесь можно пост обработку добавить
  4. }
  5.  

Проблема в том, что не могу нажать на "ОК" программно в окне "Print" (Печать). Никто не решал такой задачки?

P.S. Забавно то, что окно "Print" при поиске его с помощью функций Win32 не находится ни среди MainWindow, ни среди Children'ов. Но Spy++ его находит и показывает на Desktop'е.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 19-11-2019, 14:54:48
Проблема где-то, по-видимому, за пределами показанного Вами кода. В журналах Revit-а не пробовали смотреть? Повторюсь ещё раз, у нас есть вполне рабочая версия пакетной печати в 2020
Название: Re: PrintSetup InSession
Отправлено: Alxd от 19-11-2019, 15:14:36
Какой принтер вы используете для формирования PS или PDF? Мы - PDF Creator (он же GhostScript).

P.S. И еще раз повторюсь, в 2018 все работало, а в 2020 перестало.
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 19-11-2019, 15:33:27
Проблема в том, что не могу нажать на "ОК" программно в окне "Print" (Печать). Никто не решал такой задачки?
Говорят, что обработка события DialogBoxShowing должна помочь.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 19-11-2019, 15:34:25
Какой принтер вы используете для формирования PS или PDF?

PDF Writer - bioPDF.

Т.е. в 2020 работает с физическим принтером или другим виртуальным, но падает с GhostScript?

P.S.
P.S. И еще раз повторюсь, в 2018 все работало, а в 2020 перестало.

Такое бывает, добро пожаловать в мир разработки ПО :)
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 06:08:25
Цитировать
Говорят, что обработка события DialogBoxShowing должна помочь.
Саша, они нагло врут! Не отлавливает этот event событие открытия диалога "Print". Если же тебе разработчики подсказали, то значит в этом направлении у них еще один баг. Хотя, еще один из тыщи их мало заботит.
Этот event отлавливает появление TaskDialog. К "Print" не относится. Проверил. :(

Цитировать
PDF Writer - bioPDF.

Т.е. в 2020 работает с физическим принтером или другим виртуальным, но падает с GhostScript?
Попробую PDF Writer, сообщу.
Я не могу проверить программную печать на всех видах принтеров, на это нет времени. Тем более, что через интерфейс все работает.

Off-Topic: показать
Цитировать
Такое бывает, добро пожаловать в мир разработки ПО
Если б Revit 2020 был второй версией продукта, т.е. первая вышла, скажем, в 2018-ом с номером 2019 (идиотская нумерация), то подобные баги были бы простительны. Вторая версия продукта. Сырой еще. Не все алгоритмы устоялись и протестированы. Ничего страшного - наладят.
Но продукту уже 19 лет! Он выпускается с 2000 года (под шильдиком Autodesk)! И за 19 лет в таком огромном коммерческом продукте, продаваемом миллионами копий не устоялись алгоритмы печати?! Да вы, ять, издеваетесь?! (это обращение к разработчикам)
Это указывает на то, что качество кода в продукте - отстой, идеологически - не продуман, тесты написаны далеко не все, архитектор продукта не знает, что продукт делает, а в команде разработчиков нет обмена информацией. Autodesk за последние лет 10-15 из поставщика качественной CAD системы (я про AutoCAD), превратился в безответственного продавана. Это я вам как бывший поклонник всех продуктов Autodesk говорю.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 08:27:31
PDF Writer и bioPDF денег стоят. :(
Попробовал еще Microsoft Print to PDF - пару раз печатает с помощью SubmitPrint, а потом точно также роняет весь Revit.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 20-11-2019, 10:33:50
Что в журналах Revit-а? Пробовали отладчик студии аттачить к процессу?

P.S.
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 12:09:59
Вы натолкнули меня на мысль, изолировать аддон от других аддонов. Исключил загрузку всех аддонов, оставил только разрабатываемый. Все равно падает.
Зачем аттачить отладчик? Я запускаю Revit прямо из под VS 2019 и отлаживаю приложение в таком режиме.
Лог приложил.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 20-11-2019, 12:31:14
Ну там, как минимум, весьма занятные строки есть:

Цитировать
' 1:< 0 <-pushSettingsIntoDriver
' 1:< resolveSettingsCompatibility
' 1:< ->pushSettingsIntoDriver "RevitPrinter" "C:\Temp\1.ps"
' 1:< DeviceCapabilities: GetLastError() = 50
' 1:< Compatibility = 7
' 1:< Simple index = 0x0083
' 1:< 0 <-pushSettingsIntoDriver
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 20-11-2019, 12:32:42
' 1:< DeviceCapabilities: GetLastError() = 50
https://docs.microsoft.com/ru-ru/windows/win32/debug/system-error-codes--0-499- тут про ошибку 50.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 12:39:11
Вы не поверите, но ничего такого код не делает :)

Идёт обращение к принтеру по имени с целью получить путь, указанный в его порту
Код - C# [Выбрать]
  1.         if (!ValidatePrinter(ExternalApplication.options.PrinterName, ref PostScriptFileName))
  2.             return Result.Failed;
  3.  
  4.         public static bool ValidatePrinter(string printerName, ref string psFileName)
  5.         {
  6.             string printerPortName = GetPrinterPortDestination(ExternalApplication.options.PrinterName);
  7.             try
  8.             {
  9.                 psFileName = Path.GetFullPath(printerPortName);
  10.             }
  11.             catch (Exception ex)
  12.             {
  13.                 TaskDialog.Show("Revit", string.Format("Invalid file name in port of printer {0}!", printerName));
  14.                 return false;
  15.             }
  16.             return true;
  17.         }
  18.  
  19.         public static string GetPrinterPortDestination(string printerName)
  20.         {
  21.             var oManagementScope = new ManagementScope(ManagementPath.DefaultPath);
  22.             oManagementScope.Connect();
  23.  
  24.             SelectQuery oSelectQuery = new SelectQuery();
  25.             oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer WHERE Name = '" + printerName.Replace("\\", "\\\\") + "'";
  26.  
  27.             ManagementObjectSearcher oObjectSearcher = new ManagementObjectSearcher(oManagementScope, @oSelectQuery);
  28.             ManagementObjectCollection oObjectCollection = oObjectSearcher.Get();
  29.  
  30.             foreach (ManagementObject oItem in oObjectCollection)
  31.             {
  32.                 return oItem.Properties["PortName"].Value.ToString();
  33.             }
  34.  
  35.             return null;
  36.         }
  37.  

И всё! Далее вся работа ведётся с переменной PostScriptFileName, которая содержит путь к .ps-файлу. Остальной код вы уже видели ранее. Ничего хитрого.
Название: Re: PrintSetup InSession
Отправлено: Александр Игнатович от 20-11-2019, 12:58:53
Окей, тогда вопрос, судя по всему, код выше вызывается для каждого вида, который собираетесь печатать.

Попробуйте в ViewSet добавить все виды. В логах вышеозначенная ошибка повторяется много раз. По ссылке от Александра, если 0x50 означает ERROR_FILE_EXISTS.
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 13:11:04
Я нашел в каком месте проблема.
Начал исключать фрагменты кода по частям. Старый метод. Применяю в крайнем случае.

В общем, если исключить вот этот код:
Код - C# [Выбрать]
  1.                     if (printManager.IsVirtual == VirtualPrinterType.AdobePDF)
  2.                     {
  3.                         printManager.CombinedFile = true;
  4.                         printManager.Apply();
  5.                     }
  6.  

То все работает. Сейчас скомипилирую в Release и отдам пользователям. Они в рабочей среде его помучают.
P.S. Спасибо Александрам за посильную помощь :)
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 20-11-2019, 13:14:34
По ссылке от Александра, если 0x50 означает ERROR_FILE_EXISTS.
Почему ты решил, что это шестнадцатеричное 50? Обычно GetLastError() показывают десятичным и соответственно ошибка ERROR_NOT_SUPPORTED
Название: Re: PrintSetup InSession
Отправлено: Александр Ривилис от 20-11-2019, 13:17:36
Alxd,
Еще одна мысль - убрать строку viewSheetSetting.Delete();
Название: Re: PrintSetup InSession
Отправлено: Alxd от 20-11-2019, 14:03:56
Саша, они тогда множиться будут, как кролики, на каждую отправку на печать. Поэтому Delete нужен.