PrintSetup InSession

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

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

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: PrintSetup InSession
« Ответ #30 : 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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #31 : 20-11-2019, 12:32:42 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: PrintSetup InSession
« Ответ #32 : 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-файлу. Остальной код вы уже видели ранее. Ничего хитрого.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: PrintSetup InSession
« Ответ #33 : 20-11-2019, 12:58:53 »
Окей, тогда вопрос, судя по всему, код выше вызывается для каждого вида, который собираетесь печатать.

Попробуйте в ViewSet добавить все виды. В логах вышеозначенная ошибка повторяется много раз. По ссылке от Александра, если 0x50 означает ERROR_FILE_EXISTS.

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: PrintSetup InSession
« Ответ #34 : 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. Спасибо Александрам за посильную помощь :)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #35 : 20-11-2019, 13:14:34 »
По ссылке от Александра, если 0x50 означает ERROR_FILE_EXISTS.
Почему ты решил, что это шестнадцатеричное 50? Обычно GetLastError() показывают десятичным и соответственно ошибка ERROR_NOT_SUPPORTED
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: PrintSetup InSession
« Ответ #36 : 20-11-2019, 13:17:36 »
Alxd,
Еще одна мысль - убрать строку viewSheetSetting.Delete();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: PrintSetup InSession
« Ответ #37 : 20-11-2019, 14:03:56 »
Саша, они тогда множиться будут, как кролики, на каждую отправку на печать. Поэтому Delete нужен.