Опубликован: 21.02.2012 | Уровень: специалист | Доступ: свободно
Лекция 8:

Программирование на VBA

Вычерчивание и настройка разметки (layouts)

Понятие пространства модели и пространства листа: в пространстве модели обычно вычерчивают в реальных мировых единицах. Пространство листа представляет модель в том виде в котором она выходит на печать. В пространстве листа можно настраивать различные видовые экраны и показывать модель или ее детали в произволном масштабе. Для одного чертежа может существовать много пространств листов.

Вся геометрия рисунка содержится в макетах. Геометрия пространства модели содержится на одном макете называемом Model. Его нельзя переименовать, но можно создать еще один. В одном рисунке может быть только одно пространство модели.Геометрия пространства листа также содержится на макетах. Может быть много различных макетов пространства листа, каждый из которых представляет свою конфигурацию для печати. В ActiveX-автоматизации объект ModelSpace содержит всю геометрию макета пространства модели. А т.к. пространств листов много, то объект PaperSpace указывает на последний активный.

Содержимое любого макета распределено между двумя различными объектами ActiveX Layout и Block. Объект Layout содержит настройки печати и визуальные свойства появляющиеся в интерфейсе пользователя. Объект Block содержит геометрию макета. Каждый объект Layout ассоциируется только с одним объектом Block. Для доступа к объекту используется свойство Block, а для доступа из блока к Layout используется соответствующее свойство блока. Объект PlotConfiguration подобен объекту Layout отличаясь тем, что не имеет связи с конкретным объектом Block, а является именованной коллекцией настроек плоттера.

Настройки макета управляют окончательной печатью. Они затрагивают - размер бумаги, масштаб вычерчивания, область вычерчивания, начало координат вычерчивания и устройство печати. Все настройки Layout доступны через его свойства и методы.

Для выбора размера бумаги и единиц следует обращаться к каноническому имени принтера, можно также указать единицы используя свойство PaperUnits, которое принимает одно из трех значений: acInches, acMillimeters, acPixels. Для установки начала координат плоттера есть свойство CenterPlot, (по умолчанию оно равно FALSE)

Чтобы задать область вычерчивания есть свойство PlotType, которое может принимать одно из следующих значений: acDisplay - печатать все содержимое пространства модели (недоступно при печати из пространства листа), acExtents - печатать все что находится внутри границ, acLimits - печатать все внутри пределов, acView - печатать видовой экран заданный ViewToPlot, acWindow - печатать содержимое выбранного методом SetWindowToPlot окна, acLayout - печатать содержимое в границах пространства листа (недоступно при печати из пространства модели).

Чтобы задать масштаб вычерчивания есть два метода - стандартный масштаб установив свойство UseStandardScale в значение TRUE, после чего задать значение свойства StandardScale. Более гибкий метод - ввод пользовательского масштаба через UseStandardScale = FALSE и далее методом SetCustomScale указываем нужный масштаб. Можно также использовать значение acScaleToFit свойства StandardScale для подгонки изображения под размер листа. Для управления масштабированием веса линий свойство ScaleLineweights следует установить = TRUE.

Имя устройства печати задается свойством ConfigName, если его не трогать то печать будет идти на устройство по-умолчанию.

Видовые экраны

Для одновременного отображения нескольких частей рисунка, в т.ч. в разных масштабах существуют видовые экраны (ViewPorts). Они могут быть как "впритык" друг к другу, так и плавающими. Рисовать примечания можно непосредственно в пространстве листа не затрагивая пространства модели. Нельзя редактировать модель из пространства листа. Для доступа к модели в объекте PViewport следует переключиться из пространства листа в пространство модели через свойство ActiveSpace. При работе в PViewport объекте возможности редактирования почти такие же как и в Viewport, однако, в первом случае более удобна работа с отдельными видами. К примеру, можно заморозить или отключить слои на некоторых видовых экранах, не затрагивая остальные. Можно включить и выключить весь видовой экран. Можно так же выравнивать виды по видовым экранам. При работе с объектом ViewPort свойство ActiveSpace должно быть установлено в acModelSpace. При работе с объектом PViewport свойство ActiveSpace можно установить как в значение acModelSpace так и в acPaperSpace, то есть переключаться по мере необходимости.

Тип видового экрана Состояние Применение
PViewport ActiveSpace = acPaperspace Упорядочивание лэйаутов созданием плавающих видовых экранов, редактирование не затрагивает модель
PViewport ActiveSpace = acModelspace Работа с плавающими видовыми экранами для редактирования модели
Viewport ActiveSpace = acModelspace Разбивка экрана на пристыкованные блоки и редактирование модели

Свойство ActiveSpace меняет значение системной переменной TILEMODE. Установка ThisDrawing.ActiveSpace = acModelSpace эквивалентна TILEMODE = on, и установка ThisDrawing.ActiveSpace = acPaperSpace эквивалентна TILEMODE = off. Так же свойство MSpace является эквивалентом команд MSpace и PSpace. Установка ThisDrawing.MSpace = TRUE - то же самое, что использование команды MSPACE, а установка ThisDrawing.MSpace = FALSE эквивалентна команде PSPACE то есть переключает в пространство листа. В дополнение к сказанному требуется использование метода Display перед установкой свойства MSpace = TRUE, т.к. он инициализирует определенные графические установки, которые должны быть установлены перед переключением в пространство модели. Однако в ActiveX автоматизации установку этих настроек возлагают на программиста. Запомните: следует включить display методом Display по крайней мере для одного объекта PViewport перед тем как устанавливать свойств MSpace = TRUE

Переключение в лэйауты пространства листа

Переключиться из пространства модели в последний активный лэйаут пространства листа можно так:

ThisDrawing.ActiveSpace = acPaperSpace2. ThisDrawing.MSpace = FALSE.

Когда вы находитесь в пространстве листа AutoCAD отображает иконку ПСК в нижнем левом углу графической области. Перекрестие указывает, что область пространства листа может быть редактирована. (не виды в видовых экранах)

Переключение в пространство модели

Из пространства листа можно переключаться в плавающие или закрепленные стык в стык видовые экраны пространства модели. Для переключения в плавающий видовой экран инициализируем дисплей ThisDrawing.ActivePViewport.Display=TRUE и переключаемся ThisDrawing.MSpace = TRUE. Для переключения к состыкованным видовым экранам нужно выполнить дополнительный шаг ThisDrawing.MSpace = TRUE

Создание видовых экранов пространства листа

Видовые экраны пространства листа создаются методом AddPViewport. Метод требует указания центральной точки, а также ширины и высоты. Перед применением метода следует установить пространство листа текущим, обычно TILEMODE = 0. После создания объекта PViewport можно устанавливать свойства Direction, LensLength, GridOn, Layer, Linetype, LinetypeScale. Пример переключений между пространствами и создания плавающего видового экрана:

Sub SwitchToPaperSpace()
    ' Установка активным пространства листа
    ThisDrawing.ActiveSpace = acPaperSpace

    ' Создание видового экрана листа
    Dim newVport As AcadPViewport
    Dim center(0 To 2) As Double
    center(0) = 3.25 : center(1) = 3 : center(2) = 0
    Set newVport = ThisDrawing.PaperSpace.AddPViewport(center, 6, 5)

    ' Изменим направление вида
    Dim viewDir(0 To 2) As Double
    viewDir(0) = 1 : viewDir(1) = 1 : viewDir(2) = 1
    newVport.direction = viewDir

    ' Включим видовой экран
    newVport.Display True

    ' Обратно в пространство модели
    ThisDrawing.MSpace = True

    ' Сделаем вид активным
    ' (не всегда нужно, но неплохая идея)
    ThisDrawing.ActivePViewport = newVport

    ZoomExtents

    ' Отключим редактирование
    ThisDrawing.MSpace = False

    ' ZoomExtents в пространстве листа
    ZoomExtents
End Sub

Порядок шагов в вышеприведенном коде очень важен! Для того чтобы менять значения свойств объекта Viewport метод Display должен ьыть отключен, а перед тем как делать видовой экран текущим, метод Display нужно включить. Пример создания плавающего видового экрана использует предыдущий пример и устанавливает для четырех видовых экранов вид сверху, спереди, справа и изометрический соответствующим образом. Чтобы увидеть результаты следует создать сферу 3DSolid.

Sub FourPViewports()
    Dim topVport, frontVport As AcadPViewport
    Dim rightVport, isoVport As AcadPViewport
    Dim pt(0 To 2) As Double
    Dim viewDir(0 To 2) As Double
    ThisDrawing.ActiveSpace = acPaperSpace
    ThisDrawing.MSpace = True
' Возьмем существующий PViewport и сделаем его topVport
    pt(0) = 2.5: pt(1) = 5.5: pt(2) = 0
    Set topVport = ThisDrawing.ActivePViewport
' Нет необходимости указывать направление для вида с верху
    topVport.center = pt
    topVport.width = 2.5
    topVport.height = 2.5
    topVport.Display True
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = topVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' Создадим и настроим фронтальный вид frontVport
    pt(0) = 2.5: pt(1) = 2.5: pt(2) = 0
    Set frontVport = ThisDrawing.PaperSpace.AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 0: viewDir(1) = 1: viewDir(2) = 0
    frontVport.direction = viewDir
    frontVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = frontVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' А теперь вид с права rightVport
    pt(0) = 5.5: pt(1) = 5.5: pt(2) = 0
    Set rightVport = ThisDrawing.PaperSpace.AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 1: viewDir(1) = 0: viewDir(2) = 0
    rightVport.direction = viewDir
    rightVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = rightVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' И наконец изометрический isoVport
    pt(0) = 5.5: pt(1) = 2.5: pt(2) = 0
    Set isoVport = ThisDrawing.PaperSpace.AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 1: viewDir(1) = 1: viewDir(2) = 1
    isoVport.direction = viewDir
    isoVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = isoVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
    ThisDrawing.Regen True
End Sub

Изменение вида и содержимого видовых экранов

Чтобы изменить вид объекта ViewPort надо находиться в пространстве модели и видовой экран должен быть активен. Для редактирования в плавающем видовом экране в пространстве модели сделайте видовой экран активным установкой свойства ActiveViewport следующим образом Thisdrawing.ActiveViewport = MyViewportObject и редактируйте. Можно также создавать объекты такие как примечания, размерности и др. в пространстве листа. Однако для этого следует установить ActiveSpace в состояние FALSE и включить пространство листа через свойство MSpace. Объекты, создаваемые в пространстве листа, только там и видны.

Масштабирование видов относительно пространства листа

Перед печатью можно подобрать точный масштаб для каждой секции чертежа, (видового экрана). Масштабирование видов относительно пространства листа основывается на последовательном изменении масштаба каждого видового экрана. При работе в пространстве листа масштаб представляет собой отношение размера листа к реальному размеру вычерчиваемого объекта, отображаемого в видовых экранах. Метод ZoomScaled, масштабирует видовые экраны относительно пространства листа. Он принимает три параметра: видовой экран, фактор масштабирования, и тип масштабирования. Третий параметр необязателен, он позволяет выбрать масштабирование относительно границ рисунка, относительно текущего вида, относительно единиц пространства листа (acZoomScaledRelativePSpace). Дробные значения фактора масштаба уменьшают изображение.

Масштабирование образцов типов линий в пространстве листа

В пространстве листа любой тип линий может масштабироваться двумя путями:

  • основываясь на единицах вычерчивания пространства, в котором объект создавался
  • в универсальной форме основываясь на единицах пространства листа.

Системная переменная PSLTSCALE позволяет содержать различные масштабы типов линий для объектов отображаемых в различных масштабах и в разных видовых экранах. Это так же затрагивает линии в 3D-видах.

Скрытие линий в видовых экранах

Если чертеж содежит трехмерные объекты, то можно убрать скрытые линии с заданного видового экрана перед тем как выводить на печать. Для этого используется свойство RemoveHiddenLines для заданного видового экрана, которое принимает значение TRUE или FALSE. Для отмены вывода на печать скрытых линий видовых экранов пространства модели есть свойство PlotHidden объекта Layout.

Печать чертежей

Печатать чертеж можно в том виде, в котором он представлен в пространстве модели или в виде, подготовленном для печати через пространство листа. Печать из пространства модели часто предпочтительна, когда нужно распечатать черновик для предварительного просмотра-проверки. Когда же модель готова можно печатать из пространства листа. Печать задействует два объекта ActiveX Layout и Plot. Первый содержит настройки печати для данного лэйаута, второй методы и свойства для запуска и отслеживания процесса печати.

Выполнение базовых операций

Объектом Plot обладает следующими свойствами и методами: PlotToFile, PlotToDevice, DisplayPlotPreview, SetLayoutsToPlot, StartBatchMode, QuietErrorMode, NumberOfCopies, BatchPlotProgress (получить состояние или прервать печать). Метод SetLayoutsToPlot, следует вызывать перед каждым методом PlotToDevice и PlotToFile. В противном случае будет печататься активный лэйаут. Если свойство NumberOfCopies не переустановлено, то будет использовано значение от предыдущего задания. Перед началом пакетной печати установите QuietErrorMode=TRUE, чтобы печать шла непрерывно. Далее метод StartBatchMode начинает печать.

Печать из пространства модели

Обычно при печати больших чертежей указывается масштаб преобразования из единиц вычерчивания в единицы печати. Однако при печати из пространства модели используются следующие умолчания: печать на системный принтер текущего дисплея, масштабируется так чтобы полностью уместилось вращение 0 и смещение 0, 0. Для изменения умолчаний - измените свойство объекта Layout ассоциированного с пространством модели. Пример печати границ активного лэйаута.

Sub PrintModelSpace()
    ' Проверим что активно пространство модели
    If ThisDrawing.ActiveSpace = acPaperSpace Then
        ThisDrawing.MSpace = True
        ThisDrawing.ActiveSpace = acModelSpace
    End If
    
    ' Зададим границы и масштаб печатаемой области.
    ThisDrawing.ModelSpace.Layout.PlotType = acExtents
    ThisDrawing.ModelSpace.Layout.StandardScale = acScaleToFit
    
    ' И число копий
    ThisDrawing.Plot.NumberOfCopies = 1
    
    ' Запустим печать
    ThisDrawing.Plot.PlotToDevice
End Sub

Имя устройства печати задается с помощью ConfigName, но может быть переопределено методом PlotToDevice с указанием файла PC3.

Печать из пространства листа

В любой момент времени можно распечатать сразу несколько лэйаутов, указав их имя. Пример печати двух таких на плотере по умолчанию:

Sub PrintPaperSpace()
    ' Установим лэйауты пространства листа которые будем печатать
    Dim strLayouts(0 To 1) As String
    Dim varLayouts As Variant
    strLayouts(0) = "Layout1"
    strLayouts(1) = "Layout2"
    varLayouts = strLayouts
    ThisDrawing.Plot.SetLayoutsToPlot varLayouts
    ' Число копий
    ThisDrawing.Plot.NumberOfCopies = 1
    ' Печать
    ThisDrawing.Plot.PlotToDevice
End Sub
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub