Сводка
Объект GraphicElement обеспечивает доступ к свойствам, которые включают позиционирование на странице компоновки, а также к методам, которые разрешают дублирование или удаление имеющихся графических элементов.
Описание
Элемент GraphicElement работает со всеми типами элементов, добавляемых на странице компоновки. Он работает с группами элементов, точками, линиями, полигонами и т.д., которые добавляются на страницу компоновки. Наиболее распространенные операции над графическими элементами – это выбор или изменение его местоположения и размера. Метод listElements для Layout возвращает список Python объектов элементов компоновки страницы. Затем необходимо пройти по всем элементами списка в цикле или указать номер индекса для ссылки на определенный объект элемента страницы. Чтобы получить список только элементов GraphicElements, используйте константу GRAPHIC_ELEMENT для параметра element_type. Подстановочные знаки также могут использоваться для поиска по имени элемента. Важно давать каждому элементу компоновки страницы уникальное имя, чтобы их можно было легко изолировать с помощью скриптов ArcPy.
Метод listElements возвращает упрощенный список элементов. Например, применение listElements к графическому элементу, который представляет группу из трех текстовых элементов, возвращает всего четыре элемента: групповой элемент и отдельные текстовые. Можно использовать GraphicElement для изменения положения всех элементов одновременно, или для обработки каждого текстового элемента по отдельности.
Все сгруппированные элементы рассматриваются как графические. Сгруппированные графические элементы нельзя скопировать, поскольку они могут содержать не только графику и текст. Там также могут быть такие элементы как стрелки севера, масштабные линейки, текст масштаба и легенда. Используйте isGroup для определения, не является ли графический элемент групповым, перед его клонированием.
Имеющиеся графические элементы можно копировать и удалять. Эта возможность исходно была добавлена для поддержки создания на странице компоновки динамических графических таблиц, в которых каждая ячейка может быть обозначена с помощью линейной графики. Для этого, компоновка должна содержать как минимум два линейных графических элемента: вертикальную и горизонтальную линии. При чтении информации из таблицы, линия может клонироваться с помощью метода clone и масштабироваться соответствующим образом в компоновке с помощью свойств позиционирования других графических элементов. При клонировании элемента, очень удобно использовать значение suffix, чтобы клонированные элементы можно было бы легко определить с помощью функции ListLayoutElements со значениями wildcard и тем же suffix. Возвращенный список элементов затем можно отредактировать или удалить, с помощью метода delete. Внизу раздела приведен полный пример кода для построения динамической графической таблицы.
Значения elementPositionX и elementPositionY базируются на положении якорной точки элемента, которое установлено на закладке Format выбранного элемента.
Свойства
Владение | Объяснение | Тип данных |
elementHeight (чтение и запись) | Высота элемента в единицах страницы. | Double |
elementPositionX (чтение и запись) | x-местоположение позиции якорной точки элемента. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionY (чтение и запись) | y-местоположение позиции якорной точки элемента. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementRotation (чтение и запись) | Угол поворота элемента в градусах. Положительные значения определяют угол поворота по движению часовой стрелки, а отрицательные значения определяют угол поворота против движения часовой стрелки. | Double |
elementWidth (чтение и запись) | Ширина элемента в единицах страницы. | Double |
isGroup (только чтение) | Возвращает True, если элемент компоновки является составным. Составные элементы невозможно clone или delete. | Boolean |
name (чтение и запись) | Имя элемента. Является важным, чтобы все элементы имели уникальное имя, благодаря чему на них было бы легко ссылаться по имени. | String |
type (только чтение) | Возвращает значение GRAPHIC_ELEMENT. | String |
visible (чтение и запись) | Возвращает True, если элемент является видимым в компоновке. Вместо перемещения нежелательных элементов за пределы страницы перед печатью или экспортом, вы можете переключать видимость элемента. | Boolean |
Обзор метода
Метод | Объяснение |
clone ({suffix}) | Обеспечивает механизм клонирования существующего графического элемента на странице компоновки. |
delete () | Обеспечивает механизм удаления существующего графического элемента на странице компоновки. |
Методы
clone ({suffix})
Parameter | Объяснение | Тип данных |
suffix | Дополнительная строка, использующаяся для добавления тега каждому вновь созданному графическому элементу. Новый элемент получит то же имя, что и родительская графика, плюс к нему добавится значок suffix и порядковый номер. Например, если имя родительского элемента Line и у suffix значение равно _copy, клонированные элементы будут называться Line_copy, Line_copy_1, Line_copy_2 и т.п. А если suffix не указан, результаты будут выглядеть как Line_1, Line_2, Line_3 и т.п. | String |
Сгруппированные текстовые элементы копировать нельзя. Все сгруппированные элементы являются графическими. Проверьте, не является ли графический элемент групповым, с помощью свойства isGroup объекта GraphicElement.
delete ()
Может понадобиться удалить существующие или клонированные графические элементы. Клонированным элементам, при создании, можно присваивать собственный suffix, чтобы их можно было легко найти с помощью параметра wildcard для метода listElements на объекте Layout .
Пример кода
Следующий скрипт перемещает групповой элемент, называющийся Title Block, на новое местоположение на странице компоновки, и сохраняет изменения.
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\YosemiteNP\Yosemite.aprx")
lyt = aprx.listLayouts("Main attractions*")[0]
elm = lyt.listElements("GRAPHIC_ELEMENT", "Title Block")
elm.elementPositionX = 4.75
elm.elementPositionY = 10.5
aprx.save()
del aprx
Этот скрипт строит графическую таблицу, основанную на значениях данных из таблицы в карте. Компоновка был создана с вертикальной линией с именем vertLine, горизонтальной линией с именем horzLine и текстовым элементом cellText. Каждый из этих элементов был создан в соответствии со свойствами символов и текста. Якори элементов установлены в верхнем левом положении, а вертикальное и горизонтальное выравнивание текстового элемента – вверх и влево.
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\YosemiteNP\Yosemite.aprx")
#Reference items in the project
m = aprx.listMaps("Yosemite National Park")[0]
lyr = m.listLayers("Valley_Pts")[0]
lyt = aprx.listLayouts("Points of Interest")[0]
horzLine = lyt.listElements("GRAPHIC_ELEMENT", "horzLine")[0]
vertLine = lyt.listElements("GRAPHIC_ELEMENT", "vertLine")[0]
tableText = lyt.listElements("TEXT_ELEMENT", "cellText")[0]
#Get/set information about the table
numRows = int(arcpy.GetCount_management(lyr).getOutput(0))
rowHeight = 0.2
fieldNames = ["COMPLEXID", "NAME"]
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
lyt.exportToPDF(r"C:\Temp\test.pdf")
for elm in lyt.listElements(wildcard="_clone"):
elm.delete()
del aprx