Программирование на 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, то есть переключаться по мере необходимости.
Свойство 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