GraphicElement

Краткая информация

Объект 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
locked
(чтение и запись)

Если установлено значение True, элемент нельзя выбрать графически в виде компоновки.

Boolean
name
(чтение и запись)

Имя элемента. Важно, чтобы все элементы имели уникальное имя, благодаря чему на них было бы легко ссылаться по имени.

String
type
(только чтение)

Возвращает значение GRAPHIC_ELEMENT.

String
visible
(чтение и запись)

Возвращает True, если элемент является видимым в компоновке. Вместо того, чтобы перемещать ненужные объекты со страницы перед печатью или экспортом, вы можете включать и выключать видимость элемента.

Boolean

Обзор метода

МетодОписание
clone ({suffix})

Обеспечивает механизм клонирования существующего графического элемента на странице компоновки.

delete ()

Обеспечивает механизм удаления существующего графического элемента на странице компоновки.

Методы

clone ({suffix})
ПараметрОписаниеТип данных
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 .

Пример кода

GraphicElement пример 1

Следующий скрипт перемещает групповой элемент, называющийся 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
GraphicElement пример 2

Этот скрипт строит графическую таблицу, основанную на значениях данных из таблицы в карте. Компоновка был создана с вертикальной линией с именем 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