Краткая информация
Объект Класс PictureElement обеспечивает доступ к свойствам рисунка, которые разрешают изменение его положения в компоновке страницы, а также получение и задание его источника данных.
Обсуждение
Объект PictureElement - это растр или изображение, вставленное на компоновку страницы. Метод listElements для Layout возвращает список Python объектов элементов компоновки страницы. Затем необходимо пройти по всем элементами списка в цикле или указать номер индекса для ссылки на определенный объект элемента страницы. Чтобы вернуть список только объектов PictureElement, используйте константу PICTURE_ELEMENT для параметра element_type. wildcard также может быть использована для дальнейшей настройки поиска на основе элемента name.
У объекта PictureElement есть свойство sourceImage, которое позволяет вам получить его источник или задать новое местоположение источника рисунка. Если вы планируете заменить рисунок изображениями разных размеров и соотношений сторон, создайте исходный рисунок, указав высоту и ширину, соответствующие всей области, которую будут занимать остальные изображения на компоновке страницы. Если рисунок заменяется через свойство sourceImage и у него отличается соотношение сторон, он будет вписан в площадь исходного изображения по своей длинной стороне. Замененные изображения не будут больше исходного авторского размера. Вам также потребуется установить положение якоря, чтобы все новые изображения располагались относительно этого местоположения. Если вы не хотите, чтобы рисунки растягивались, убедитесь, что для параметра Сохранять пропорции установлено значение True.
Рисунки всегда сохраняются в проекте. Свойство sourceImage отображает исходное местоположение изображения на момент его вставки, но файл можно удалить с диска, а изображение рисунок продолжит отображаться в компоновке.
Метод createPictureElement объекта ArcGISProject позволяет добавлять изображения либо к объекту Layout, используя единицы страницы, либо в графический слой в объекте Map, используя единицы карты. Рисунки можно создавать с помощью геометрии Point и Polygon. Положением якоря по умолчанию для вновь созданного изображения будет левый верхний угол, и именно это место является началом координат X и Y элементов.
Примечание:
Дополнительные свойства рисунка в компоновке можно изменить с помощью Python CIM Access, но это не касается элементов-рисунков графического слоя. Это связано с тем, что все данные рисунков сохраняются в двоичной форме с целью оптимизации производительности работы с ними. У графического слоя также есть жесткое ограничение в 4000 элементов или 10 МБ. То есть вы не можете вставить изображение размером более 10 МБ, а также несколько изображений, размер которых превышает 10 МБ.
Свойства
Свойство | Описание | Тип данных |
anchor (только чтение) | Возвращает одно из следующих строковых значений, которые описывают текущую позицию якоря. Чтобы изменить значение, используйте метод setAnchor.
| String |
elementHeight (чтение и запись) | Высота элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionX (чтение и запись) | x-положение рисунка позиции точки якоря элемента. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionY (чтение и запись) | y-положение рисунка позиции точки якоря элемента. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementRotation (чтение и запись) | Угол поворота элемента в градусах. Положительные значения поворачивают по часовой стрелке, а отрицательные – против часовой стрелки. | Double |
elementWidth (чтение и запись) | Ширина элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
locked (чтение и запись) | Если установлено значение True, элемент нельзя выбрать графически в виде компоновки. | Boolean |
longName (только чтение) | Полное имя элемента, включая информацию о группе, если она существует. Например, элемент с именем 'Picture' в групповом элементе с именем 'Group Element' вернет значение longName, равное 'Group Element\\Picture'. Если элемент не входит в группу, longName будет таким же, как и значение name. | String |
name (чтение и запись) | Имя элемента. | String |
parentGroupElement (только чтение) | Если элемент находится в группе, возвращаемым значением будет GroupElement, в противном случае будет возвращено NoneType. | GroupElement |
sourceImage (чтение и запись) | Текстовая строка, представляющая путь к источнику данных рисунка. | String |
type (только чтение) | Возвращает PICTURE_ELEMENT. | String |
visible (чтение и запись) | Возвращает True, если элемент является видимым в компоновке. Вместо того, чтобы перемещать ненужные объекты со страницы перед печатью или экспортом, вы можете включать и выключать видимость элемента. | Boolean |
Обзор метода
Метод | Описание |
getDefinition (cim_version) | Возвращает определение CIM элемента изображения. |
setAnchor (anchor) | Метод setAnchor, управляющий положением якоря для PictureElement. |
setDefinition (definition_object) | Задает определение CIM элемента изображения. |
Методы
getDefinition (cim_version)
Параметр | Описание | Тип данных |
cim_version | A string that represents the major version of the CIM that will be used.
| String |
Тип данных | Описание |
Object | Возвращает определение CIM для PictureElement. |
Более подробно о работе с CIM и примеры см. Доступ к CIM в Python.
setAnchor (anchor)
Параметр | Описание | Тип данных |
anchor | A string that specifies the location of the anchor position.
| String |
Задание положения якоря привязки полезно, поскольку с его помощью вы можете контролировать, как элемент будет расширяться при изменении размера. Например, вы можете задать положение якоря CENTER_POINT, если хотите, чтобы изображение было центрировано относительно какой-то точки. Это полезно при размещении изображений в виде графики карты на основе местоположения точечного объекта.
setDefinition (definition_object)
Параметр | Описание | Тип данных |
definition_object | A modified CIM definition object originally retrieved using getDefinition. | Object |
Более подробно о работе с CIM и примеры см. Доступ к CIM в Python.
Пример кода
Следующий скрипт обходит структуру каталогов в поисках файлов проекта. Для каждого найденного проекта скрипт проходит по всем компоновкам в поисках элементов-рисунков. Если будет найден oldSourcePath, он меняется на newSourcePath, а внесенные в проекты и компоновки изменения выводятся на экран.
import arcpy, os
rootFolder = r'C:\Projects'
oldSourcePath = r'C:\Projects\OldLogo.png'
newSourcePath = r'C:\Projects\NewLogo.png'
for (rootFolder, dirs, files) in os.walk(rootFolder):
for file in files:
if file.endswith('.aprx'):
p = arcpy.mp.ArcGISProject(os.path.join(rootFolder,file))
print(os.path.join(rootFolder,file))
for lyt in p.listLayouts():
for pic in lyt.listElements('picture_element'):
if pic.sourceImage == oldSourcePath:
pic.sourceImage = newSourcePath
print(f'Found OldLogo: /n Project: {file} /n :Layout: {lyt.name}')
#p.save() #Test before permenantly replacing
Следующий скрипт добавит в компоновку два новых рисунка с помощью конверта. Функция используется для создания геометрии путем указания положения привязки X, Y, а также ширины и высоты в единицах страницы. После вставки изображений они добавятся в новый GroupElement.
def MakeRec_UL(ulx, uly, w, h):
xyRecList = [[ulx, uly], [ulx+w, uly], [ulx+w,uly-h], [ulx,uly-h], [ulx,uly]]
array = arcpy.Array([arcpy.Point(*coords) for coords in xyRecList])
rec = arcpy.Polygon(array)
return rec
p = arcpy.mp.ArcGISProject('current')
lyt = p.listLayouts('Layout')[0]
picPath1 = r'C:\Projects\Fenway.jpg'
picPath2 = r'C:\Projects\Chowdah.png'
pic1 = p.createPictureElement(lyt, MakeRec_UL(1,7.5,8.67,6.5), picPath1, 'Fenway')
pic2 = p.createPictureElement(lyt, MakeRec_UL(5.8,7.34,4.2,6.43), picPath2, 'Chowdah')
newGroup = p.createGroupElement(lyt, [pic1, pic2], 'Favorite Pets')
Следующий скрипт добавит изображение в местоположение каждого точечного объекта класса объектов, используя точечную геометрию. Скрипт также размещает рисунок так, чтобы его центр находился на точечном объекте в соответствии с его указанными шириной и высотой.
p = arcpy.mp.ArcGISProject('current')
m = p.listMaps('Map')[0] #USA Contiguous Albers Equal Area Conic USGS_1
ptLyr = m.listLayers('*Point')[0]
graLyr = m.createGraphicsLayer()
m.moveLayer(ptLyr, graLyr, 'AFTER')
picPath = r'C:\Projects\Chowdah.png'
for row in arcpy.da.SearchCursor(ptLyr, ['SHAPE@XY']):
x, y = row[0]
centeredPt = arcpy.Point(x-50000, y+75000) #1/2 width and height
pic = p.createPictureElement(graLyr, centeredPt, picPath, 'Chowdah')
pic.elementWidth = 100000 #map units meters
pic.elementHieght = 150000 #map units meters
Следующий скрипт использует Python CIM Access для задания строки AltText рисунка.
p = arcpy.mp.ArcGISProject('current')
lyt = p.listLayouts('Layout')[0]
picPath = r'C:\Projects\Fenway.jpg'
picElm = p.createPictureElement(lyt, arcpy.Point(1,5), picPath, 'Fenway')
picElm.elementWidth = 4
picElm.elementHeight = 3
#Create AltText using Python CIM Access
lyt_cim = lyt.getDefinition('V3')
for elm in lyt_cim.elements:
if elm.name == 'Fenway Pic':
altTxt = arcpy.cim.CreateCIMObjectFromClassName("CIMStringMap", "V3")
altTxt.key = "AltText"
altTxt.value = "Picture of Fenway, a Golden Retriever, staring at sushi."
elm.customProperties.append(altTxt)
lyt.setDefinition(lyt_cim)