GraphicElement (arcpy.mapping)
Краткая информация
Объект GraphicElement обеспечивает доступ к свойствам, которые включают позиционирование на странице компоновки, а также к методам, которые разрешают дублирование или удаление имеющихся графических элементов.
Обсуждение
Элемент GraphicElement работает со всеми типами элементов, добавляемых на странице компоновки. Он работает с группами элементов, таблицами, графиками, рамками, маркерами, линиями, формами областей и т.д., которые добавляются на страницу компоновки. Наиболее распространенные операции над графическими элементами – это выбор или изменение его местоположения и размера. Функция ListLayoutElements возвращает список Python с объектами элементов компоновки страницы. Затем необходимо пройти по всем элементами списка в цикле или указать номер индекса для ссылки на определенный объект элемента страницы. Чтобы только получить список GraphicElements, используйте константу GRAPHIC_ELEMENT с параметром element_type. Подстановочные знаки также могут использоваться для поиска по имени элемента.
Имеющиеся графические элементы можно копировать и удалять. Эта возможность исходно была добавлена для поддержки создания на странице компоновки динамических графических таблиц, в которых каждая ячейка может быть обозначена с помощью линейной графики. Для этого, документ карты должен содержать как минимум два линейных графических элемента: вертикальную и горизонтальную линии. При чтении информации из таблицы, линии могут копироваться с помощью метода clone, и располагаться и меняться в размерах в соответствии со свойствами других графических элементов. При клонировании элемента, очень удобно использовать значение suffix, чтобы клонированные элементы можно было бы легко определить с помощью функции ListLayoutElements со значениями wildcard и тем же самым suffix. Возвращенный список элементов затем можно отредактировать или удалить, с помощью метода delete. Внизу раздела приведен полный пример кода для построения динамической графической таблицы.
Сгруппированные графические элементы копировать нельзя. Это происходит из-за того, что сгруппированные элементы могут содержать не только графику; они также могут включать такие элементы, как стрелки севера, масштабные линейки и т.д. Используйте свойство isGroup для определения, не является ли графический элемент групповым, перед его клонированием.
ListLayoutElements возвращает упрощенный список элементов. Например, применение ListLayoutElements к графическому элементу, который представляет группу из трех текстовых элементов, вернет всего четыре элемента: групповой элемент и отдельные текстовые. Можно использовать GraphicElement для изменения положения всех элементов одновременно, или для обработки каждого текстового элемента по отдельности.
Рекомендуется присваивать каждому элементу страницы компоновки уникальное имя, чтобы их можно было легко изолировать с помощью скриптов arcpy. Их можно задать в закладке Размер и положение (Size and Position) диалогового окна Свойства (Properties) в ArcMap.
Положения X и Y элемента основаны на положении якоря элемента, который также задается в закладке Размер и положение диалогового окна Свойства (Properties) в ArcMap.
Единицы измерения страницы в ArcMap можно изменить с помощью Настройка (Customize) > Опции ArcMap (ArcMap Options) > закладка Вид компоновки (Layout View).
Свойства
Свойство | Объяснение | Тип данных |
elementHeight (чтение и запись) |
Высота элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionX (чтение и запись) |
Положение x якоря элемента во фрейме данных. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionY (чтение и запись) |
Положение y якоря элемента во фрейме данных. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementWidth (чтение и запись) |
Ширина элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
isGroup (только чтение) |
Возвращает True, если элемент компоновки является групповым. Нельзя клонировать или удалять групповые элементы. | Boolean |
name (чтение и запись) |
Имя элемента. | String |
type (только чтение) |
Возвращает тип любого элемента на странице компоновки.
| String |
Обзор метода
Метод | Объяснение |
clone ({suffix}) |
Обеспечивает механизм клонирования существующего графического элемента на странице компоновки. |
delete () |
Обеспечивает механизм удаления существующего графического элемента на странице компоновки. |
Методы
Параметр | Объяснение | Тип данных |
suffix |
Дополнительная строка, использующаяся для добавления тега каждому вновь созданному графическому элементу. Новый элемент получит то же имя, что и родительская графика, суффикс и числовой секвенсер. К примеру, если имя родительского элемента Line, суффикс – _copy, то клонируемые элементы получат имена Line_copy, Line_copy_1, Line_copy_2 и т.д. Если суффикс отсутствует, результат будет выглядеть следующим образом: Line_1, Line_2, Line_3 и т.д. | String |
Сгруппированные графические элементы копировать нельзя. Сначала проверьте, не является ли графический элемент групповым, с помощью isGroup.
Клонированные элементы бывает необходимо удалить. Клонированным элементам, при создании, можно присваивать собственный suffix, чтобы их можно было легко найти с помощью параметра wildcard функции ListLayoutElements.
Пример кода
Следующий скрипт перемещает групповой элемент, называющийся Title Block, на новое местоположение на странице компоновки, затем сохраняет изменения.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for elm in arcpy.mapping.ListLayoutElements(mxd, "GRAPHIC_ELEMENT"):
if elm.name == "Title Block":
elm.elementPositionX = 4.75
elm.elementPositionY = 10.5
mxd.save()
del mxd
Этот скрипт строит графическую таблицу, основанную на значениях данных из таблицы документа карты. Документ карты был создан с вертикальной линией vertLine, горизонтальной линией horzLine и текстовым элементом TableText. Каждый из этих элементов был создан с соответствующими символами. Якори элементов установлены в верхнем левом положении, а вертикальное и горизонтальное выравнивание текстового элемента – вверх и влево.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
#Reference items in the map document
lyr = arcpy.mapping.ListLayers(mxd, "Accidents")[0]
horzLine = arcpy.mapping.ListLayoutElements(mxd, "GRAPHIC_ELEMENT", "horzLine")[0]
vertLine = arcpy.mapping.ListLayoutElements(mxd, "GRAPHIC_ELEMENT", "vertLine")[0]
tableText = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "TableText")[0]
#Get/set information about the table
numRows = int(arcpy.GetCount_management(lyr).getOutput(0))
rowHeight = 0.2
fieldNames = ["X", "Y", "Accidents"]
numColumns = len(fieldNames)
colWidth = 1.5
#Build graphic table lines based on upper left coordinate
# set the proper size of the original, parent line, then clone it and position appropriately
upperX = 1.0
upperY = 5.0
#Vertical lines
vertLine.elementPositionX = upperX
vertLine.elementPositionY = upperY
vertLine.elementHeight = (rowHeight * numRows) + rowHeight #extra line for column names
x = upperX
for vert in range(1, numColumns+1):
x = x + colWidth
vert_clone = vertLine.clone("_clone")
vert_clone.elementPositionX = x
#Horizontal lines
horzLine.elementPositionX = upperX
horzLine.elementPositionY = upperY
horzLine.elementWidth = numColumns * colWidth
y = upperY - rowHeight
for horz in range(1, numRows +2 ): #need to accommodate the extra line for field names
temp_horz = horzLine.clone("_clone")
temp_horz.elementPositionY = y
y = y - rowHeight
#Place text column names
tableText.elementPositionX = upperX + 0.05 #slight offset
tableText.elementPositionY = upperY
tableText.text = fieldNames[0]
accumWidth = colWidth
for field in range(1, numColumns):
newFieldTxt = tableText.clone("_clone")
newFieldTxt.text = fieldNames[field]
newFieldTxt.elementPositionX = newFieldTxt.elementPositionX + accumWidth
accumWidth = accumWidth + colWidth
#Create text elements based on values from the table
table = arcpy.SearchCursor(lyr.dataSource)
y = upperY - rowHeight
for row in table:
x = upperX + 0.05 #slight offset
try:
for field in fieldNames:
newCellTxt = tableText.clone("_clone")
newCellTxt.text = row.getValue(field)
newCellTxt.elementPositionX = x
newCellTxt.elementPositionY = y
accumWidth = accumWidth + colWidth
x = x + colWidth
y = y - rowHeight
except:
print"Invalid value assignment"
#Export to PDF and delete cloned elements
arcpy.mapping.ExportToPDF(mxd, r"C:\Temp\test.pdf")
for elm in arcpy.mapping.ListLayoutElements(mxd, wildcard="_clone"):
elm.delete()
del mxd