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

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Эксперты, доброго дня!
Win 8 x64, AutoCAD 2015, VBA Enabler
Мая задача: в пространстве модели есть несколько рамок в виде блоков. Необходимо выгружать, печатать, экспортировать выбранную рамку в pdf-файл. Пока речь идет об одной рамке. Команда должна выполняться по кнопке из пользовательской панели .mnu - это уже готово.
Знаю о возможности экспорта в pdf или печати с помощью DWG to PDF.pc3. Главным является публикация именно рамки с учетом ее размеров.

Прошу подсказать как лучше реализовать данную задачу? К примеру достаточно ли будет вызова команды:
Достаточно ли будет передать в командную строку команду типа

Код - Visual Basic [Выбрать]
  1. str_cmd = "(command ""_plot"" ""Y"" ""Model"" """ & pname & """ """ & FA & """ ""M"" """ & AorK & """ " _
  2.                 & " ""N"" ""Р""  """ & strPt1 & """ """ & strPt2 & """ " _
  3.                 & " ""В"" ""Ц"" ""Д"" """ & CTB & """ ""Д"" ""О"" ""Н"")" & " "
У меня на руках чужой dvb проект, в котором реализована выгрузка рамки в pdf и использованием PDFCreator. Но пока столкнулся с проблемой передачи команды печати в командную строку. Подобная проблема обсуждалась здесь. Своей наверно посвящу отдельную тему, если не решу.


Заранее премного благодарен
« Последнее редактирование: 16-05-2015, 18:37:48 от Александр Ривилис »
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 8395
  • Карма: 1012
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Печать осуществляется из VBA внутри AutoCAD или из внешнего приложения, которое использует ActiveX/COM модель AutoCAD?
2) Рамка в модели или в листе?
3) Почему не попытаться обойтись без команд? Есть же в объектной модели возможность прямой печати в файл.
Например: http://www.cadtutor.net/forum/showthread.php?54518-Using-VBA-to-export-a-Pdf-File-from-AutoCAD
Только нужно указать что печатать рамку и задать углы рамки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Александр, благодарю за скорый ответ.

1. Предполагаю, что в последствии буду обращаться к COM-объекту AutoCAD из внешнего приложения. Пока текущую задачу хочу реализовать внутри AutoCAD'a в DVB приложении;
2. Рамка в модели;
3. Благодарю за идею по сути это мне и было нужно. Буду экспериментировать. Прошу подсказать ссылку на материал или пункт в API, где подробно описаны необходимые методы, начиная с "ThisDrawing.PlotConfigurations", по сути конфигурацию процесса прямой печати в файл?

Еще раз благодарю за скорые и точные ответы
« Последнее редактирование: 17-05-2015, 20:00:44 от Дамир »
Сколько голов, столько умов. Но голов больше

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

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

Отмечено как Решение Дамир 17-05-2015, 19:58:32

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

  • Administrator
  • *****
  • Сообщений: 8395
  • Карма: 1012
  • Рыцарь ObjectARX
  • Skype: rivilis
Забыл уточнить. Координаты рамки следует преобразовать из МСК (WCS) в ДСК (DCS):
Код - Visual Basic [Выбрать]
  1. ' Преобразование угловых точек окна из WCS в DCS:
  2. p1 = ThisDrawing.Utility.TranslateCoordinates(p1, acWorld, acDisplayDCS, False)
  3. p2 = ThisDrawing.Utility.TranslateCoordinates(p2, acWorld, acDisplayDCS, False)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Вернулся к данной теме. Сейчас получилось кодом вывести одну pdf соответствующую одной выбранной рамке в модели. Новый вопрос: а как сформировать собранный pdf-файл из нескольких рамок модели? К примеру выделены несколько рамок. Заранее премного благодарен!

Код - 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.     Set PtObj = ThisDrawing.Plot
  16.    
  17.     Set Plotlayout = ThisDrawing.ModelSpace.Layout
  18.     With Plotlayout
  19.         .ConfigName = "DWG To PDF.pc3"
  20.         .SetCustomScale 1, 1
  21.         ThisDrawing.Regen acActiveViewport
  22.         .CanonicalMediaName = "ISO_A0_(841.00_x_1189.00_MM)"
  23.         .CenterPlot = True
  24.         .StyleSheet = "Acad.ctb"
  25.         .SetWindowToPlot point1, point2
  26.         .PlotType = acWindow
  27.         .PlotRotation = ac0degrees
  28.     End With
  29.     PtObj.PlotToFile Replace(ThisDrawing.FullName, "dwg", "pdf")
  30. End Sub
Сколько голов, столько умов. Но голов больше

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

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

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
в модели 3 рамки, в итоге получаем один файл pdf состоящий из 3-ех страниц, соответствующих рамкам модели (1 страница = первая рамка, 2 страница - вторая рамка и т.д.)
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 8395
  • Карма: 1012
  • Рыцарь ObjectARX
  • Skype: rivilis
Я могу ошибаться, но мне кажется так сделать средствами AutoCAD API нельзя. Я бы посоветовал бы какую-нибудь стороннюю программу, которая бы объединяла бы кучу pdf-файлов в один. Насколько я знаю есть такие бесплатные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 8395
  • Карма: 1012
  • Рыцарь ObjectARX
  • Skype: rivilis
Поищу бесплатные программы с API
Вроде PDFCreator это делает:
Цитировать
PDFCreator comes with a COM interface that allows you to control it from your application or script. You can wait for a print job, define where it will be saved, merge it with other print jobs and much more. As far as we know, we are the only PDF converter freeware that allows you to go this far.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Да, с него и начал. Пока не наше нужного метода (задал вопрос на форуме), но еще поищу.
Сколько голов, столько умов. Но голов больше

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

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Хочу уточнить: знаю, что вручную AutoCAD позволяет собирать единую pdf из листов. Что, если рамки находятся в листах. Получится ли программно вывести единую pdf. Возможно вызовом команды в командной строке или еще как-то?
« Последнее редактирование: 18-06-2015, 09:39:33 от Александр Ривилис »
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 764
  • Карма: 120
Все, что сказано - личное мнение.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 8395
  • Карма: 1012
  • Рыцарь 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 от Алексей Кулик »
Сколько голов, столько умов. Но голов больше

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

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

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • 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
  • *****
  • Сообщений: 764
  • Карма: 120
Насколько я помню, _.publish способна обрабатывать именованные виды в модели.
Все, что сказано - личное мнение.

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

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

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

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

Да, конечно!

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • 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мм)"

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

Оффлайн wavaw

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
благодарю, Дамир!
все получилось.
Код - Visual Basic [Выбрать]
  1. Layout.CanonicalMediaName = "UserDefinedMetric (" + CStr(594) + ".00 x " + CStr(1261) + ".00мм)"