ADN Open CIS
Сообщество программистов Autodesk в СНГ

31/05/2017

Как получить каноническое имя формата листа для локального имени формата?

Вопрос: Пользователь в команде ПЕЧАТЬ (_PLOT) выбирает формат листа по его локальному имени, а в программе для печати следует задавать каноническое имя формата. Как можно получить соответствие между локальным и каноническим именами формата?

Ответ: Ниже приведен код на VBA, реализующий преобразование локального имени в каноническое. Основное преобразование происходит в функции GetCanonicalFromLocalName.

Код - VBA: [Выделить]
  1. '1. Печать в PDF при помощи выбора нижней левой и верхней правой точек
  2. Sub PlotByPoints()
  3.     Dim Layout As AcadLayout
  4.     Dim pt1 As Variant, pt2 As Variant
  5.    
  6.     Set Layout = ThisDrawing.ActiveLayout
  7.    
  8.     ' Получаем первую точку рамки
  9.     pt1 = ThisDrawing.Utility.GetPoint(, "Выберите нижний левый угол")
  10.     ' Переводим координаты из WCS в DCS
  11.     pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  12.     ReDim Preserve pt1(0 To 1)   ' Приводим массив к 2д виду, удаляем z координату
  13.    
  14.     ' Получаем вторую точку
  15.     pt2 = ThisDrawing.Utility.GetPoint(, "Выберите правый верхний угол")
  16.     ' Переводим координаты из WCS в DCS
  17.     pt2 = ThisDrawing.Utility.TranslateCoordinates(pt2, acWorld, acDisplayDCS, False)
  18.     ReDim Preserve pt2(0 To 1)   ' Приводим массив к 2д виду, удаляем z координату
  19.         
  20.     ' Настройка печати
  21.     Layout.ConfigName = "PDFCreator"
  22.    
  23.     ' Обновим текущую плот-информацию
  24.     Layout.RefreshPlotDeviceInfo
  25.    
  26.     ' Печатаем на формат A0
  27.     Layout.CanonicalMediaName = GetCanonicalFromLocalName(Layout, "A0")
  28.    
  29.     Layout.CenterPlot = True
  30.     Layout.PlotRotation = ac90degrees
  31.     Layout.StandardScale = acScaleToFit
  32.     Layout.StyleSheet = "acad.ctb"
  33.    
  34.     ' Устанавливаем рамки окошка
  35.     Layout.SetWindowToPlot pt1, pt2
  36.     Layout.PlotType = acWindow
  37.    
  38.     ' Отправляем на печать
  39.     ThisDrawing.Regen acAllViewports
  40.     ThisDrawing.Plot.PlotToDevice
  41.    
  42. End Sub
  43. '----------------------------------------------------------
  44. ' Функция преобразует из локального имени формата листа
  45. '                      в каноническое
  46. '----------------------------------------------------------
  47. Function GetCanonicalFromLocalName(Layout As AcadLayout, lName As String) As String
  48.     Dim cNames As Variant
  49.     cNames = Layout.GetCanonicalMediaNames()
  50.     Dim cName As String
  51.     cName = Layout.CanonicalMediaName
  52.     For i = LBound(cNames) To UBound(cNames)
  53.       sName = Layout.GetLocaleMediaName(cNames(i))
  54.       If lName = sName Then
  55.         cName = cNames(i)
  56.         Exit For
  57.       End If
  58.     Next
  59.     GetCanonicalFromLocalName = cName
  60. End Function

Автор: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7824

Опубликовано 31.05.2017
Отредактировано 31.05.2017 в 14:58:18