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

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

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги.

Есть такая задача - получить размеры всех форматов во всех принтерах текущего чертежа.

Подскажите как это можно сделать?

Пока определяю лишь принтеры и их форматы:
Код - vb.net [Выбрать]
  1.     Public Sub Get_All_Formats_Of_All_Printers()
  2.         ' Подключаемся к приложению
  3.         Dim AcApp As Autodesk.AutoCAD.ApplicationServices.DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager
  4.         ' Подключаемся к активному документу
  5.         Dim AcDoc As Autodesk.AutoCAD.ApplicationServices.Document = AcApp.MdiActiveDocument
  6.         ' Подключаемся к базе данных чертежа
  7.         Dim AcDB As Database = AcDoc.Database
  8.         ' Получаем из устройств службы печати список настроек печати
  9.         Dim Devices As Autodesk.AutoCAD.PlottingServices.PlotConfigInfoCollection = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.Devices
  10.         ' Перебираем каждый элемент списка настроек печати
  11.         For Each PlotterInfo As PlotConfigInfo In Devices
  12.             Dim NewPrinter As New PashinEugene.galPrinter
  13.             With NewPrinter
  14.                 .PrinterName = PlotterInfo.DeviceName
  15.                 .PrinterType = PlotterInfo.DeviceType.ToString
  16.             End With
  17.             ' Записываю в базу данных текущий принтер
  18.             GDB.Printers.Add(NewPrinter)
  19.             ' Новый PlotSettings
  20.             Using plSet As PlotSettings = New PlotSettings(True)
  21.                 Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current
  22.                 ' Устанавливаем плоттер и формат, НО я решил попробовать ничего в формат не добавлять!!! Только имя принтера!!!
  23.                 acPlSetVdr.SetPlotConfigurationName(plSet, PlotterInfo.DeviceName, Nothing)
  24.                 Dim cnt As Integer = 0
  25.                 For Each mediaName As String In acPlSetVdr.GetCanonicalMediaNameList(plSet)
  26.                     ' Вывод имён по каноническому имени mediaName
  27.                     Dim NewPrinterFormat As New PashinEugene.galPrinterFormat
  28.                     With NewPrinterFormat
  29.                         .PrinterID = NewPrinter.PrinterID
  30.                         .PrinterFormatCanonicalName = mediaName
  31.                         .PrinterFormatLocaleName = acPlSetVdr.GetLocaleMediaName(plSet, cnt)
  32.                     End With
  33.                     cnt = cnt + 1
  34.                     ' Записываю в базу данных формат текущего принтера
  35.                     GDB.PrinterFormats.Add(NewPrinterFormat)
  36.                 Next
  37.             End Using
  38.         Next
  39.     End Sub

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
всех принтерах текущего чертежа.
Что такое все принтеры текущего чертежа?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Что такое все принтеры текущего чертежа?


Надеюсь про все форматы принтеров нет нужды картинку высылать :)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
получить размеры всех форматов во всех принтерах текущего чертежа
Нет такого понятия как "принтер текущего чертежа" =)) Есть конфигурации плоттеров, которые относятся не к чертежу, а к автокаду в целом.
Вот посмотрите ссылку для начала

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Пашин Евгений,
Александр правильно сказал по поводу того, что нет плоттеров чертежа. Собствено говоря у тебя в коде это и есть список плоттеров, которые AutoCAD может использовать: Autodesk.AutoCAD.PlottingServices.PlotConfigManager.Devices
Ну а тебе нужно будет еще проверить:
PlotSettings.PlotPaperSize
PlotSettings.PlotPaperMargins
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Полностью согласен с этим. Название темы взял незамысловатое, простое, но если считаете, что его стоит поменять, то я не против.

Собствено говоря у тебя в коде это и есть список плоттеров, которые AutoCAD может использовать: Autodesk.AutoCAD.PlottingServices.PlotConfigManager.Devices
Ну а тебе нужно будет еще проверить:
PlotSettings.PlotPaperSize
PlotSettings.PlotPaperMargins

Я, как всегда, искал где угодно, но только не здесь :)

Однако меня смущает одна деталь:
Код - vb.net [Выбрать]
  1.     Public Sub Get_All_Formats_Of_All_Printers()
  2.         ' Подключаемся к приложению
  3.         Dim AcApp As Autodesk.AutoCAD.ApplicationServices.DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager
  4.         ' Подключаемся к активному документу
  5.         Dim AcDoc As Autodesk.AutoCAD.ApplicationServices.Document = AcApp.MdiActiveDocument
  6.         ' Подключаемся к базе данных чертежа
  7.         Dim AcDB As Database = AcDoc.Database
  8.         ' Получаем из устройств службы печати список настроек печати
  9.         Dim Devices As Autodesk.AutoCAD.PlottingServices.PlotConfigInfoCollection = Autodesk.AutoCAD.PlottingServices.PlotConfigManager.Devices
  10.         ' Перебираем каждый элемент списка настроек печати
  11.         For Each PlotterInfo As PlotConfigInfo In Devices
  12.             Dim NewPrinter As New PashinEugene.galPrinter
  13.             With NewPrinter
  14.                 .PrinterName = PlotterInfo.DeviceName
  15.                 .PrinterType = PlotterInfo.DeviceType.ToString
  16.             End With
  17.             ' Записываю в базу данных текущий принтер
  18.             GDB.Printers.Add(NewPrinter)
  19.             ' Новый PlotSettings
  20.             Using plSet As PlotSettings = New PlotSettings(True)
  21.                 Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current
  22.  
  23.                 ' Устанавливаем плоттер и формат, НО я решил попробовать ничего в формат не добавлять!!! Только имя принтера!!!
  24.                 acPlSetVdr.SetPlotConfigurationName(plSet, PlotterInfo.DeviceName, Nothing)
  25.                 Dim cnt As Integer = 0
  26.                 For Each mediaName As String In acPlSetVdr.GetCanonicalMediaNameList(plSet)
  27.                     ' Вывод имён по каноническому имени mediaName
  28.                     Dim NewPrinterFormat As New PashinEugene.galPrinterFormat
  29.                     With NewPrinterFormat
  30.                         .PrinterID = NewPrinter.PrinterID
  31.                         .PrinterFormatCanonicalName = mediaName
  32.                         .PrinterFormatLocaleName = acPlSetVdr.GetLocaleMediaName(plSet, cnt)
  33.                         .PaperSizeWidht = plSet.PlotPaperSize.X
  34.                         .PaperSizeHeight = plSet.PlotPaperSize.Y
  35.                         .MarginLeft = plSet.PlotPaperMargins.MinPoint.X
  36.                         .MarginRight = plSet.PlotPaperMargins.MaxPoint.X
  37.                         .MarginTop = plSet.PlotPaperMargins.MaxPoint.Y
  38.                         .MarginBottom = plSet.PlotPaperMargins.MinPoint.Y
  39.                     End With
  40.                     cnt = cnt + 1
  41.                     ' Записываю в базу данных формат текущего принтера
  42.                     GDB.PrinterFormats.Add(NewPrinterFormat)
  43.                 Next
  44.             End Using
  45.         Next
  46.     End Sub

Получаю следующую картину:
Код - XML [Выбрать]
  1. ...
  2.     <galPrinterFormat>
  3.       <PrinterID>99e38cac-a1c3-4262-9d81-c7b097fe790b</PrinterID>
  4.       <PrinterFormatID>d3837fe1-74d7-406c-bd00-d1a992bade6b</PrinterFormatID>
  5.       <PrinterFormatCanonicalName>UserDefinedMetric (420.00 x 1189.00мм)</PrinterFormatCanonicalName>
  6.       <PrinterFormatLocaleName>A3x4_ver (420 x 1189 mm)</PrinterFormatLocaleName>
  7.       <PaperSizeWidht>210</PaperSizeWidht> ?????
  8.       <PaperSizeHeight>297</PaperSizeHeight> ?????
  9.       <MarginLeft>0.793749988079071</MarginLeft> ?????
  10.       <MarginRight>0.7937469482421875</MarginRight> ?????
  11.       <MarginTop>0.79376220703125</MarginTop> ?????
  12.       <MarginBottom>0.793749988079071</MarginBottom> ?????
  13.     </galPrinterFormat>
  14. ...

Откуда появились поля, если у меня они равны 0? И размеры не те! Вот блин, а я то уже порадовался. Везде один и тот же размер указан 210х297 мм.



Я явно что-то не то определяю!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты не вызвал PlotSettingsValidator.SetCanonicalMediaName для plSet. Поэтому ты получаешь значения по-умолчанию для листа и полей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ты не вызвал PlotSettingsValidator.SetCanonicalMediaName для plSet. Поэтому ты получаешь значения по-умолчанию для листа и полей.

Ужас...

Код - vb.net [Выбрать]
  1.                 For Each mediaName As String In acPlSetVdr.GetCanonicalMediaNameList(plSet)
  2.  
  3.                     ' Устанавливаем плоттер и формат (AutoCAD ушёл в спячку и оооооочень долго из неё не возвращался!!!!!!!!!!!!!!!!!!!)
  4.                     acPlSetVdr.SetPlotConfigurationName(plSet, PlotterInfo.DeviceName, mediaName)
  5.  
  6.                     ' Вывод имён по каноническому имени mediaName
  7.                     Dim NewPrinterFormat As New PashinEugene.galPrinterFormat
  8.                     With NewPrinterFormat
  9.                         .PrinterID = NewPrinter.PrinterID
  10.                         .PrinterFormatCanonicalName = mediaName
  11.                         .PrinterFormatLocaleName = acPlSetVdr.GetLocaleMediaName(plSet, cnt)
  12.                         .PaperSizeWidht = plSet.PlotPaperSize.X
  13.                         .PaperSizeHeight = plSet.PlotPaperSize.Y
  14.                         .MarginLeft = plSet.PlotPaperMargins.MinPoint.X
  15.                         .MarginRight = plSet.PlotPaperMargins.MaxPoint.X
  16.                         .MarginTop = plSet.PlotPaperMargins.MaxPoint.Y
  17.                         .MarginBottom = plSet.PlotPaperMargins.MinPoint.Y
  18.                     End With
  19.                     cnt = cnt + 1
  20.                     ' Записываю в базу данных формат текущего принтера
  21.                     GDB.PrinterFormats.Add(NewPrinterFormat)
  22.                 Next

А более быстрого варианта нет? Это ужасно долгая процедура, причем на мощном компьютере.

Код - XML [Выбрать]
  1.     <galPrinterFormat>
  2.       <PrinterID>e3734e97-2d58-4196-9901-99c8652686a7</PrinterID>
  3.       <PrinterFormatID>06de77c4-0e12-418b-8029-0e9c79e6b2dd</PrinterFormatID>
  4.       <PrinterFormatCanonicalName>UserDefinedMetric (420.00 x 891.00мм)</PrinterFormatCanonicalName>
  5.       <PrinterFormatLocaleName>A3x3_ver (420 x 891 mm)</PrinterFormatLocaleName>
  6.       <PaperSizeWidht>420</PaperSizeWidht>
  7.       <PaperSizeHeight>891</PaperSizeHeight>
  8.       <MarginLeft>0</MarginLeft>
  9.       <MarginRight>0</MarginRight>
  10.       <MarginTop>0</MarginTop>
  11.       <MarginBottom>0</MarginBottom>
  12.     </galPrinterFormat>

Результат хороший, но за время ожидания меня пользователи побьют!

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Проверил два варианта:
Код - vb.net [Выбрать]
  1.                     acPlSetVdr.SetPlotConfigurationName(plSet, PlotterInfo.DeviceName, mediaName) ' 1 вариант - работает медленно
  2.                     acPlSetVdr.SetCanonicalMediaName(plSet, mediaName) ' 2 вариант - работает медленно

Работает ужасно медленно, попытался выполнить этот модуль с помощью AcCoreConsole.exe - работает также медленно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не думаю, что этот процесс можно ускорить. Это связано с опросом драйверов плоттеров, которые должны вернуть все их характеристики.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Не думаю, что этот процесс можно ускорить.

Жаль.


Я пока ещё поищу решения.

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

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

Когда я делаю это вручную, AutoCAD же не чудит по 5-10 минут. Поскольку за то время, которое занимает выполнение модуля, я смогу пробежаться вручную по всем принтерам и всех их форматам.



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты это делаешь для одного плоттера.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ты это делаешь для одного плоттера.

Ну, Александр Наумович, Вы же понимаете, что нет. Для всех принтеров. Но при выборе каждого из них, нет длительной задержки подключения. Меня это и настораживает, а выполнение модуля (для 25 принтеров) занимает от 6 до 9 минут (всегда по-разному). Причем, если пройтись по каждому вручную, то для некоторых принтеров подключение срабатывает мгновенно, а нескольких других до 5 секунд (максимум). В остальных случаях по 1 секунде. Это вручную.


Я бы ещё понял, если бы это было 1-2 минуты, но 6-9 минут - это уже ни в какие ворота: не уровень автоматизации.