Как узнать размеры всех форматов во всех принтерах?

Автор Тема: Как узнать размеры всех форматов во всех принтерах?  (Прочитано 13508 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как вариант - чтение и анализ PC3/PCP-файлов. Где-то у нас на форуме был для этого алгоритм.
На скорость влияет тот факт, что мы присваиваем новые установки PlotSetting и AutoCAD должен проанализировать допустимость такой операции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
На скорость влияет тот факт, что мы присваиваем новые установки PlotSetting и AutoCAD должен проанализировать допустимость такой операции.

Это понятно.

Как вариант - чтение и анализ PC3/PCP-файлов. Где-то у нас на форуме был для этого алгоритм.

Бегло пробежал по поиску, может опять не так ищу :)



Попробовал по одному принтеру - работает довольно шустро, но правда для типов принтеров PC3File (и то не все). Некоторые принтеры типа SystemPrinter работают медленно. Особенно сетевые.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можешь попробовать на скорость такой способ:
1. Сохраняешь текущий PlotConfig
Код - C# [Выбрать]
  1. PlotConfig pCfg = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.CurrentConfig;
2. Устанавливаешь для PlotConfig новый принтер:
Код - C# [Выбрать]
  1. pCfg = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.SetCurrentConfig("имя устройства плотера или pc3-файл");
3. Пробуешь pCfg.GetMediaBounds() для каждой из canonicalMediaName
Может быть это будет работать (не проверял) и будет работать быстрее, чем тот способ, о котором шла речь выше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Попробую обязательно, только уже завтра.

Но от себя добавлю, что подключение к сетевому принтеру и получение размеров его форматов через AcCoreConsole.exe прошло быстрее (не так сильно конечно). Буду тестировать дальше, если что ещё и этот вариант буду рассматривать. В общем протестирую.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Цитата: Александр Ривилис от 18-05-2017, 14:15:28
Как вариант - чтение и анализ PC3/PCP-файлов. Где-то у нас на форуме был для этого алгоритм.

Бегло пробежал по поиску, может опять не так ищу
http://adn-cis.org/forum/index.php?topic=3248.0
PiaNO

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Можешь попробовать на скорость такой способ:
1. Сохраняешь текущий PlotConfig
Код - C# [Выбрать]
PlotConfig pCfg = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.CurrentConfig;
2. Устанавливаешь для PlotConfig новый принтер:
Код - C# [Выбрать]
pCfg = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.SetCurrentConfig("имя устройства плоттера или pc3-файл");
3. Пробуешь pCfg.GetMediaBounds() для каждой из canonicalMediaName
Может быть это будет работать (не проверял) и будет работать быстрее, чем тот способ, о котором шла речь выше.

Проверил. Работает в 33 раза быстрее. Вместо 366 секунд всего 11 секунд. Это уже ход конём. Однако для некоторых физических принтеров значения размеров определяет некорректно (надо уточнить у пользователей, нужны ли им всякие факсы и т.п. шелуха). Заодно ещё потестирую. Вдруг что-то упустил.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
http://adn-cis.org/forum/index.php?topic=3248.0
PiaNO

Дмитрий, спасибо, уже скачал, но посмотрю уже только на следующей неделе.

Отмечено как Решение Пашин Евгений 31-05-2017, 12:23:00

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Решение оставил в таком виде:
Код - vb.net [Выбрать]
  1.     Public Shared Sub Get_List_Of_Device_And_Media()
  2.         ' Для проверки общего времени выполнения создаём параметр времени начала выполнения
  3.         Dim t1 As DateTime = Now()
  4.         ' Сюда буду писать все сообщения
  5.         Dim Text As New List(Of String)
  6.         ' Текущий документ
  7.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  8.         ' Параметры для вывода сообщений: имя устройства, формат
  9.         Dim devname As String = "", medname As String = ""
  10.         ' Параметр проверки настройки печати
  11.         Dim psv As PlotSettingsValidator = PlotSettingsValidator.Current
  12.         ' Получаем список устройств печати
  13.         Dim devlist As Specialized.StringCollection = psv.GetPlotDeviceList()
  14.         ' Сначала выведем весь список принтеров
  15.         For i As Integer = 0 To devlist.Count - 1
  16.             Text.Add(i + 1 & " " & devlist(i))
  17.         Next
  18.         ' Создаём настройки печати
  19.         Using ps As New PlotSettings(True)
  20.             ' Перебираем все принтеры
  21.             For i As Integer = 0 To devlist.Count - 1
  22.                 ' Имя текущего принтера
  23.                 devname = devlist(i)
  24.                 ' Выводим имя текущего принтера в сообщение
  25.                 Text.Add("Текущий/Selected: " & devname)
  26.                 ' Настройка печати для текущего принтера
  27.                 Dim plotConfig As PlotConfig = PlotConfigManager.SetCurrentConfig(devname)
  28.                 ' Устанавливаем текущий принтер
  29.                 psv.SetPlotConfigurationName(ps, devname, Nothing)
  30.                 ' Обновление параметров настройки печати
  31.                 psv.RefreshLists(ps)
  32.                 ' Получаем все форматы принтера в каноническом виде
  33.                 Dim medlist As Specialized.StringCollection = psv.GetCanonicalMediaNameList(ps)
  34.                 ' Перебираем их
  35.                 For j As Integer = 0 To medlist.Count - 1
  36.                     ' Выводим имя текущего формата принтера в сообщение
  37.                     Text.Add("Формат/Media name " & j + 1 & " " & medlist(j))
  38.                     ' Получаем границы формата
  39.                     Dim mb As MediaBounds = plotConfig.GetMediaBounds(medlist(j))
  40.                     ' Выводим размеры и поля формата в сообщение
  41.                     Text.Add(Math.Round(mb.PageSize.X).ToString())
  42.                     Text.Add(Math.Round(mb.PageSize.Y).ToString())
  43.                     Text.Add(Math.Round(mb.LowerLeftPrintableArea.X).ToString())
  44.                     Text.Add(Math.Round(mb.UpperRightPrintableArea.Y).ToString())
  45.                     Text.Add(Math.Round(mb.UpperRightPrintableArea.X).ToString())
  46.                     Text.Add(Math.Round(mb.LowerLeftPrintableArea.Y).ToString())
  47.                 Next
  48.             Next
  49.         End Using
  50.         ' Для проверки общего времени выполнения создаём параметр времени завершения выполнения
  51.         Dim t2 As DateTime = Now()
  52.         ' Показываем время выполнения в секундах
  53.         MsgBox("Check delay: " & DateDiff(DateInterval.Second, t1, t2).ToString)
  54.         ' Сохраняем сообщение в файл и открываем его
  55.         IO.File.WriteAllLines("D:\info.txt", Text)
  56.         Process.Start("D:\info.txt")
  57.     End Sub

Время обработки 9-14 секунд.