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

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Алексей, благодарю. Протестирую этот метод. Суть идеи  стоит в том, чтобы все рамки из модели разместить по листам, а уже потом сформировать единый pdf. Хотя метод действительно сложен.
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Хочу уточнить: знаю, что вручную AutoCAD позволяет собирать единую pdf из листов. Что, если рамки находятся в листах. Получится ли программно вывести единую pdf. Возможно вызовом команды в командной строке или еще как-то?
Теоретически (если рамки в листах) это возможно. Для этой цели необходимо вызвать метод Plot.SetLayoutsToPlot и передать массив всех листов. Ну и листы должны быть настроены для печати. Но это врядли то, что ты пытаешься реализовать.
В AutoCAD .NET API есть больше возможностей для этого. Пример: http://www.acadnetwork.com/index.php?topic=315.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Александр, благодарю за пример. Будут ли мне в VBA (VBS) доступны методы используемые из .NET API?
Да, предполагается, что рамки в листах. А уже потом публикация листов в pdf. Буду экспериментировать дальше. Спасибо
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Будут ли мне в VBA (VBS) доступны методы используемые из .NET API?
Нет. Эти методы доступны только из .NET dll-файла, загруженного внутрь AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Снова вернулся к теме.


На данный момент никак не могу разобраться со способом уточнения границ печати и выбором нужного конфигуратора печати (PlotConfig).
Итак, первый вариант кода работает без конфигуратора, при этом я использую обращение к Layout пространства модели (работаем в ней):


Код - Visual Basic [Выбрать]
  1. Sub Fer()
  2.     Dim block As AcadBlockReference
  3.     Dim pt As Variant
  4.     Dim PlotConfig As AcadPlotConfiguration
  5.     Dim PtObj As AcadPlot
  6.     Dim BackPlot As Variant
  7.     Dim point1 As Variant, point2 As Variant
  8.     Dim config As AcadPlotConfiguration
  9.    
  10.     point1 = ThisDrawing.Utility.GetPoint(, "Л-Н")
  11.     ReDim Preserve point1(0 To 1)
  12.     point2 = ThisDrawing.Utility.GetPoint(, "П-В")
  13.     ReDim Preserve point2(0 To 1)
  14.      
  15.     'BackPlot = ThisDrawing.GetVariable("BACKGROUNDPLOT")
  16.    'ThisDrawing.SetVariable "BACKGROUNDPLOT", 0
  17.    
  18.     Set PtObj = ThisDrawing.Plot
  19.     Set Plotlayout = ThisDrawing.ModelSpace.Layout
  20.     With Plotlayout
  21.         .ConfigName = "DWG To PDF.pc3"
  22.         .SetCustomScale 1, 1
  23.         ThisDrawing.Regen acActiveViewport
  24.         '.CanonicalMediaName = "ISO_A0_(841.00_x_1189.00_mm)"
  25.        .CenterPlot = True
  26.         .StyleSheet = "Acad.ctb"
  27.         .SetWindowToPlot point1, point2
  28.         .PlotType = acWindow
  29.         .PlotRotation = ac0degrees
  30.     End With
  31.        
  32.     PtObj.PlotToFile Replace(ThisDrawing.FullName, "dwg", "pdf")
  33.    
  34.     'PtConfigs.Item("PDF").Delete
  35.    'Set PlotConfig = Nothing
  36.    
  37. End Sub
На выходе получаю рамку в pdf как и хотел, но если в настройках pc3 поменяю (везде ставлю 0) область печати у формата, то получаю чистый лист в pdf - это ПРОБЛЕМА#1


ПРОБЛЕМА#2
Пытался создать собственный формат с именем "myname", однако по такому имени указать формат не получается
Код - Visual Basic [Выбрать]
  1.  .CanonicalMediaName = "myname"
, попытался выявить как это имя воспринимается AutoCAD'ом. Для этого воспользовался методом:
Код - Visual Basic [Выбрать]
  1. .GetCanonicalMediaNames()
В итоге созданный мною формат "myname" читается как UserDefineMetric_A0_(841.00_x_1189.00_mm).

Как задать "особое" имя формата, т.е. такое, которое можно задать кодом?

Теперь покажу вариант с использованием PlotConfig

Код - Visual Basic [Выбрать]
  1.  
  2. Sub Fer7()
  3.     Dim PtConfigs As AcadPlotConfigurations
  4.     Dim PlotConfig As AcadPlotConfiguration
  5.     Dim PtObj As AcadPlot
  6.     Dim BackPlot As Variant
  7.     Dim point1 As Variant, point2 As Variant
  8.    
  9.     ' Get first point in window
  10.    point1 = ThisDrawing.Utility.GetPoint(, "Click the lower-left of the window to plot.")
  11.     ReDim Preserve point1(0 To 1)   ' Change this to a 2D array by removing the Z position
  12.    
  13.     ' Get second point in window
  14.    point2 = ThisDrawing.Utility.GetPoint(, "Click the upper-right of the window to plot.")
  15.     ReDim Preserve point2(0 To 1)   ' Change this to a 2D array by removing the Z position
  16.    
  17.     Set PtObj = ThisDrawing.Plot
  18.     Set PtConfigs = ThisDrawing.PlotConfigurations
  19.  
  20.     PtConfigs.Add "PDF", False
  21.  
  22.  
  23.     Set PlotConfig = PtConfigs.Item("PDF")
  24.  
  25.     PlotConfig.StandardScale = acScaleToFit
  26.    
  27.     PlotConfig.RefreshPlotDeviceInfo
  28.    
  29.     PlotConfig.ConfigName = "DWG To PDF.pc3"
  30.    
  31.     PlotConfig.StyleSheet = "Acad.ctb"
  32.  
  33.     PlotConfig.PlotWithPlotStyles = True
  34.     PlotConfig.SetWindowToPlot point1, point2
  35.    
  36.     BackPlot = ThisDrawing.GetVariable("BACKGROUNDPLOT")
  37.     ThisDrawing.SetVariable "BACKGROUNDPLOT", 0
  38.  
  39.  
  40.     PlotConfig.RefreshPlotDeviceInfo
  41.  
  42.     PtObj.PlotToFile Replace(ThisDrawing.FullName, "dwg", "pdf"), PlotConfig.ConfigName
  43.    
  44.  
  45.     PtConfigs.Item("PDF").Delete
  46.     Set PlotConfig = Nothing
  47.     ThisDrawing.SetVariable "BACKGROUNDPLOT", BackPlot
  48.  
  49.  
  50. End Sub
  51.  
Здесь я пытался сделать все классически, но на выходе чистый pdf указанного формата.

Прошу помощи по следующим вопросам:


Как создавать свои форматы так, чтобы их можно было указывать при печати программно?
Код - Visual Basic [Выбрать]
  1.  .CanonicalMediaName = "myname"

Каким способом осуществлять печать программно? Как задавать границы печати так чтобы они попадали в размеры рамки формата?
Проще говоря какие методы Plotconfig или Layot задавать?

Интернет весь облазил и протестировал большинство примеров, где печатают всю видимую область. Буду признателен любым советам.

P.s. все рамки-блоки - правильного размера, AutocAD 2015 64, VBA enabler, руки вроде не кривые
Сколько голов, столько умов. Но голов больше

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Добавил код:
Код - Visual Basic [Выбрать]
  1. Dim point1 As Variant, point2 As Variant
  2.     Dim config As AcadPlotConfiguration
  3.    
  4.     point1 = ThisDrawing.Utility.GetPoint(, "Ë-Í")
  5.     ReDim Preserve point1(0 To 1)
  6.     point2 = ThisDrawing.Utility.GetPoint(, "Ï-Â")
  7.     ReDim Preserve point2(0 To 1)
  8.     point1 = ThisDrawing.Utility.TranslateCoordinates(point1, acWorld, acDisplayDCS, False)
  9.     point2 = ThisDrawing.Utility.TranslateCoordinates(point2, acWorld, acDisplayDCS, False)


Получаю ошибку:
"Ошибка преобразования точки из SafeArray в точку двойного массива"

Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Определи point1 и point2 как:
Код - Visual Basic [Выбрать]
  1. Dim point1(0 To 2) As Double
  2. Dim point2(0 To 2) As Double
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Чертовщина началась...
Код - Visual Basic [Выбрать]
  1. Dim point1(0 To 2) As Double
  2.     Dim point2(0 To 2) As Double
  3.    
  4.     point1 = ThisDrawing.Utility.GetPoint(, "Ë-Í")
  5.     ReDim Preserve point1(0 To 1)
  6.     point2 = ThisDrawing.Utility.GetPoint(, "Ï-Â")
  7.     ReDim Preserve point2(0 To 1)
  8.     point1 = ThisDrawing.Utility.TranslateCoordinates(point1, acWorld, acDisplayDCS, False)
  9.     point2 = ThisDrawing.Utility.TranslateCoordinates(point2, acWorld, acDisplayDCS, False)


Error: "Can't assign to array", указывая на point1
Сколько голов, столько умов. Но голов больше

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Прошу прощения, что именно смотреть?
Я не уверен что дело в преобразовании точек. Хотя не исключаю этого. Просто при использовании стандартных форматов все работает, не работает лишь при изменении стандартных или использовании собственных (нестандартных) форматов.
Сколько голов, столько умов. Но голов больше

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

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

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

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

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

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

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

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


Чтобы указать нужный формат просто перебором сверяем искомое имя.
« Последнее редактирование: 14-08-2015, 08:47:15 от Алексей Кулик »
Сколько голов, столько умов. Но голов больше