Программно осуществить перевод выбранной рамки-блока в pdf-файл

Автор Тема: Программно осуществить перевод выбранной рамки-блока в pdf-файл  (Прочитано 24021 раз)

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Off-Topic: показать
спасибо, каждый раз руками правлю форматирование.
Сколько голов, столько умов. Но голов больше

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Здравствуйте, Дамир!

Могу дать Вам рекомендации на базе своего опыта работы:

1. Если Вы пытаетесь пакетно распечатать все рамки из пространства листа, то у Вас нет иного выхода кроме как перенести все Ваши рамки в пространство листа, с помощью команды LAYOUTMERGE.
   1.1. Сразу предупрежу, что в пространстве листа появятся три новых объекта: Видовой экран, Полилиния и Текст. Их нужно будет обнаружить и "убить" с помощью команды VBA Object.Delete()
   1.2. Затем пропарсив все Ваши объекты в пространстве листа Вы сможете определить:
           - габаритные размеры каждой из рамок и сравнить с текущими форматами принтера "DWG To PDF.pc3" (в VBA есть такая команда GetBoundingBox - она возвращает Вам размеры Ваших рамок, вернее координаты начала рамки и ее конца)
           - Заранее предупреждаю, что если в Ваши рамки будут блоками, а внутри блоков будут невидимые объекты, то такой блок несомненно будет иметь размеры с вместе взятыми невидимыми объектами.
           - Таким образом рекомендую создавать новый объект - копию блока, но предварительно взорванного (с помощью команды Object.Explode). Когда Вы его пропарсите - переберете все объекты и узнаете у них размеры (GetBoundingBox вам в помощь), тогда Вы сможете уже менять или создавать новые конфигурации принтера "DWG To PDF.pc3"!
   1.3. Теперь копируйте Ваш лист столько раз, сколько рамок Вы обнаружите внутри листа.
           - В каждом листе настраиваете под каждую рамку настройки принтера.

То есть допустим у Вас чертеж с тремя рамками А2 Горизонтально, А3 Вертикально и А4 Горизонтально в пространстве модели. Переносите объекты в лист. Определяйте рамки. Копируйте два раза лист и для каждого листа настройте принтер: для 1-го листа под А2 Горизонтально, для 2-го листа под А3 Вертикально, для 3-го под А4 Горизонтально. А теперь спокойно пакетно печатайте эти листы.


Рекомендация по настройке принтера:

Код - vb.net [Выбрать]
  1.                            
  2. With acDocComObj.Layouts.Item(i)
  3.                                 .ConfigName = "DWG To PDF.pc3"
  4.                                 .CanonicalMediaName = glCanonicalMediaName ' Имеет вид "UserDefineMetric (Длина х Ширина ММ)"
  5.                                 .PaperUnits = 1 ' Единицы измерения ММ
  6.                                 .PlotHidden = False ' Печать не скрытая
  7.                                 .PlotOrigin = {0, 0} ' Точка начала рамки
  8.                                 .PlotRotation = 0 ' Поворот рамки
  9.                                 LowerLeft = {xMin, yMin} ' Точка начала рамки
  10.                                 UpperRight = {xMax, yMax} ' Точка конца рамки
  11.                                 .SetWindowToPlot(LowerLeft, UpperRight) ' Установить рамку
  12.                                 .UseStandardScale = True ' Масштаб стандартный
  13.                                 .SetCustomScale(1, 1) ' Масштаб 1:1
  14.                                 .PlotType = 4 ' Тип печати РАМКОЙ, параметры которой Вы уже выше описали.
  15.                                 .CenterPlot = True ' Центрировать = ДА!
  16.                                 .PlotViewportBorders = True
  17.                                 .PlotViewportsFirst = True
  18.                                 .PlotWithLineweights = True
  19.                                 .PlotWithPlotStyles = True
  20.                                 .StyleSheet = IIf(glColored = True, "acad.ctb", "monochrome.ctb") ' Цветная или черно-белая печать!
  21. End With

       1.4. Печать с помощью публикации. Команда _-publish. Она потребует некий файл DSD ))) DSD файл - инструкция для пакетной печати! Из чего она состоит можете посмотреть через вкладку ВЫВОД (OUTPUT) -> Пакетная печать (BATCH PLOT ) -> Сохранить DSD файл (Save Sheet List)! Только предварительно сохраните чертеж!

Когда Вы поковыряетесь в DSD файле, Вы сможете его без труда сгенерировать перед самой пакетной печатью. Мало того, что распечатается на УРА! ТАК это еще может получиться в фоновом режиме )))
Мне лично нужно было нужно, чтобы никаких окно не высвечивалось при печати и вообще, чтобы AutoCAD не было видно! У меня получилось.


2. Если рамки оформлены в листах, тогда определяем их размеры (GetBoundingBox) настраиваем печать и снова печатаем с помощью _-PUBLISH, предварительно сгенерировав DSD файл.

Я уже так делал, потому знаю о чем говорю.

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Пашин Евгений, благодарю за столь обстоятельный вариант. Я обязательно протестирую его.
Если Вы пытаетесь пакетно распечатать все рамки из пространства листа
имеете ввиду из пространства модели наверно.

1. Я так понял PUBLISH используется применительно к листам? Поэтому и первым шагом распределяем рамки из модели по листам.

2. Т.е. правильно ли я понял ваш алгоритм: Перетаскиваем из модели наши рамки в листы по правилу - одна рамка в одном листе. Затем осуществляем настройку принтера
Рекомендация по настройке принтера:
. И сам PUBLISH в конце.

На выходе я получу PDF файл по определенному мною пути?
Сколько голов, столько умов. Но голов больше

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Насколько я помню, _.publish способна обрабатывать именованные виды в модели.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
имеете ввиду из пространства модели наверно.

Да, конечно!

Я так понял PUBLISH используется применительно к листам? Поэтому и первым шагом распределяем рамки из модели по листам.

Не только, просто в пространстве модели Вы не сможете программно настроить параметры печати так складно, как в листах. Дело в том, что все новые PlotConfigurations, которые Вы создаете программно отображаются только в листах. Вот где собака порылась.

Т.е. правильно ли я понял ваш алгоритм: Перетаскиваем из модели наши рамки в листы по правилу - одна рамка в одном листе. Затем осуществляем настройку принтера

Почти ))) Дело в том, что по-моему алгоритму вы получите три листа с тремя рамками каждая ))) НО!!! Каждый лист будет настроен на печать только отдельно взятой рамки )))
Да и еще! Путь к PDF файлу Вы сможете задать с помощью DSD файла. Поверьте, это хорошая штука ))) Мало того, PDF будет единым файлом, что тоже не мало важно.


Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Алексей Кулик, я пробовал это сделать программно, но принтер всегда брал только первый настроенный вид, вернее настройки принтера. Может я что-то не так делал?

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Получается в каждом листе по 3 рамки, но в PUBLISH уходит каждый раз нужная рамка.
Вопрос по поводу быстродействия PUBLISH, на сколько я помню при ручном вызове PUBLISH процесс ощутимо "небыстрый", так ли это?
Сколько голов, столько умов. Но голов больше

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Нет! Все довольно быстро формируется. Только не делайте это в режиме PlotHidden=True, а то действительно будет долго.

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Ок, еще раз благодарю за участие. Буду тестировать
Сколько голов, столько умов. Но голов больше

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Пашин Евгений, я бы хотел обсудить детали предложенного Вами решения, если можно?
Сколько голов, столько умов. Но голов больше

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Да, конечно!
Задавайте вопросы, можно даже по электронной почте или личное сообщение.

Хочу уточнить на каком этапе Вы сейчас находитесь, чтобы определиться: какой информацией Вас снабдить?!

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Евгений, благодарю за скорый ответ. Ответил Вам в личном сообщении. Результаты опубликуем впоследствии в общем чате
Сколько голов, столько умов. Но голов больше

Оффлайн wavaw

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Эту проблему решил так: есть имя которое мы задаем руками "myname", есть системное автоприсваиваемое имя "UserDefineMetric", "UserDefineMetric_1" и т.д. Чтобы получить имя в виде "myname", нужно использовать метод
Код - Visual Basic [Выбрать]
Plotlayout.GetLocaleMediaName(Х)
, где Х - это перебор всех существующих у Layout имен форматов, т.е.
Код - Visual Basic [Выбрать]
Plotlayout.GetCanonicalMediaNames()


Чтобы указать нужный формат просто перебором сверяем искомое имя.
здравствуйте. а можно чуть подробней?
пишем код:
Код - Visual Basic [Выбрать]
  1. Dim plotName As Variant
  2.     plotName = Layout.GetCanonicalMediaNames()
  3.     For i = LBound(plotName) To UBound(plotName)
  4.        Layout.GetLocaleMediaName (plotName(i))
а дальше что перебираем/сравнимаем if-ом, чтобы получить имя формата вида "А2х3"?

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Независимо от того , какое имя Вы присвоили пользовательской форматке, Автокад присвоит свое (понятное ему) в виде UserDefinedMetric + ширина  + высота. Т.к. уникальных ПО РАЗМЕРУ форматок может быть только одна, обращайтесь к фоматке по принципу понятному Автокаду. Я делаю это так:

Код - Visual Basic [Выбрать]
  1. r = "UserDefinedMetric (" + CStr(dl/fRamka.XScaleFactor) + ".00 x " + CStr(sh/fRamka.YScaleFactor) + ".00мм)"

Я считываю размеры и дополняю ими название форматки. Успехов
Сколько голов, столько умов. Но голов больше