applyStyleItem
Краткая информация
Объект TextElement обеспечивает доступ к свойствам и методам для управления элементами текстов в компоновке или в слое графики карты.
Обсуждение
Объект TextElement представляет собой текст, вставленный в компоновку или в графический слой карты. Он включает такие элементы, как текст, выноски, текст в прямоугольнике, заголовки и т.д. В него не входят текстовые строки, являющиеся частью легенды, рамки таблицы или другие элементы зарамочного оформления карты. Метод listElements для объекта Layout возвращает список Python из объектов элементов компоновки страницы. Затем для каждого элемента списка надо указать номер индекса, который будет ссылаться на определенный объект элемента страницы. Чтобы получить список только объектов TextElement, используйте константу TEXT_ELEMENT для параметра elementType. Значение wildcard также может быть использовано для дальнейшей тонкой настройки поиска на основе значения name элемента. Дайте каждому элементу текста уникальное имя, на которое можно будет легко ссылаться.
Существует два метода создания элементов текста. Первый - это метод createTextElement на объекте ArcGISProject, который позволяет создать текстовый элемент в компоновке или слое графики с использованием геометрии Point, Polygon или Polyline. Второй метод заключается в клонировании существующих текстовых элементов с помощью метода clone на объекте TextElement. Это удобно, поскольку в некоторых случаях проще начать с уже существующего элемента. При клонировании элемента укажите значение suffix, чтобы клонированные элементы можно было впоследствии легко распознать с помощью метода listElements, при котором используется групповой символ и такое же значение suffix. Возвращенный список элементов затем можно изменить или удалить с помощью метода delete.
Значения elementPositionX и elementPositionY базируются на положении якорной точки элемента, которое установлено на вкладке Формат в ArcGIS Pro. Положения якорных точек можно изменить с помощью метода setAnchor. Важно понимать разницу между свойствами elementRotation и textAngle. Наилучшим примером будет вставленный текст в прямоугольнике. Свойство elementRotation отвечает за поворот прямоугольника, а свойство textAngle управляет углом поворота текста в этом прямоугольнике. Для точечного текста оба значения синхронизированы вне зависимости от того, какой из свойств задано.
Для элементов текста предусмотрены методы getDefinition и setDefinition, которые позволяют изменять дополнительные свойства, недоступные классу TextElement. Более подробную информацию см. в разделе справки Доступ к CIM в Python.
Синтаксис
applyStyleItem()
Свойства
| Имя | Объяснение | Тип данных |
|---|---|---|
|
anchor (Только для чтения) |
Возвращает одно из следующих строковых значений, которые описывают текущую позицию якоря. Чтобы изменить значение, используйте метод
|
String |
|
elementHeight (Чтение / Запись) |
Высота элемента в единицах страницы. |
Double |
|
elementPositionX (Чтение / Запись) |
x-положение позиции точки якоря элемента. Единицы измерения задаются или считываются в единицах страницы. |
Double |
|
elementPositionY (Чтение / Запись) |
y-положение позиции точки якоря элемента. Единицы измерения задаются или считываются в единицах страницы. |
Double |
|
elementRotation (Чтение / Запись) |
Угол поворота элемента в градусах. Положительные значения поворачивают по часовой стрелке, а отрицательные – против часовой стрелки. |
Double |
|
elementWidth (Чтение / Запись) |
Ширина элемента в единицах страницы. |
Double |
|
fontFamilyName (Чтение / Запись) |
Шрифт текстового символа, связанный с элементом. Примечание:Значение, отображаемое в раскрывающемся списке Имя шрифта на ленте, не всегда совпадает со свойством |
String |
|
fontStyleName (Чтение / Запись) |
В зависимости от шрифта стили могут включать нормальный, полужирный, курсив, сочетание этих вариантов или расширенный список. Примечание:Значение, отображаемое в раскрывающемся списке Стиль шрифта на ленте, не всегда совпадает со свойством |
String |
|
isOverflowing (Только для чтения) |
Возвращает |
Boolean |
|
locked (Чтение / Запись) |
Если установлено значение |
Boolean |
|
longName (Только для чтения) |
Полное имя элемента, включая информацию о группе, если она существует. Например, элемент с именем ' |
String |
|
name (Чтение / Запись) |
Имя элемента. Важно, чтобы все элементы имели уникальное имя, благодаря чему на них было бы легко ссылаться по имени. |
String |
|
parentGroupElement (Только для чтения) |
Если элемент находится в группе, возвращаемым значением будет |
GroupElement |
|
text (Чтение / Запись) |
Текстовая строка, связанная с элементом. |
String |
|
textAngle (Чтение / Запись) |
Угол в градусах, на который поворачивается текстовая строка. Положительные значения поворачивают по часовой стрелке, а отрицательные – против часовой стрелки. |
Double |
|
textSize (Чтение / Запись) |
Размер текста элемента в точках. |
Double |
|
type (Только для чтения) |
Возвращает значение |
String |
|
visible (Чтение / Запись) |
Указывает, виден ли элемент в компоновке или слое графики. |
Boolean |
Методы
applyStyleItem(style_item)
Применяет StyleItem к TextElement.
| Имя | Объяснение | Тип данных |
|---|---|---|
|
style_item |
A reference to a |
StyleItem |
clone({suffix})
Предоставляет механизм для клонирования существующего текстового элемента в компоновке страницы.
| Имя | Объяснение | Тип данных |
|---|---|---|
|
suffix (Дополнительный) |
Дополнительная строка, использующаяся для добавления тега к созданным текстовым элементам. Новый элемент получает имя родительского элемента, суффикс и числовой секвенсер. Например, если имя родительского элемента |
String |
delete()
Обеспечивает механизм удаления существующего текстового элемента на странице компоновки.
getDefinition(cim_version)
Получает определение CIM текстового элемента.
| Имя | Объяснение | Тип данных |
|---|---|---|
|
cim_version |
A string that represents the major version of the CIM that will be used.
|
String |
Возвращаемое значение
| Тип данных | Объяснение |
|---|---|
|
Object |
Возвращает определение CIM для |
setAnchor(anchor)
Метод setAnchor, управляющий положением якоря.
| Имя | Объяснение | Тип данных |
|---|---|---|
|
anchor |
A string that specifies an anchor position.
|
String |
setDefinition(definition_object)
Задает определение CIM текстового элемента.
| Имя | Объяснение | Тип данных |
|---|---|---|
|
definition_object |
A modified CIM definition object originally retrieved using |
Object |
Пример кода
Следующий скрипт заменяет 2022 на 2023 во всех содержащих год строках текстовых элементов компоновки и во всех компоновках проекта.
import arcpy
search_text = '2022'
replace_text = '2023'
p = arcpy.mp.ArcGISProject(r'C:\Projects\YosemiteNP\Yosemite.aprx')
for lyt in p.listLayouts():
for txt in lyt.listElements('TEXT_ELEMENT'):
if search_text in txt.text:
print(f'For element: "{txt.name}" in layout: "{lyt.name}"')
print(f' Replacing: "{txt.text}"')
txt.text = txt.text.replace(search_text, replace_text)
print(f' With: "{txt.text}"')
print('')
p.save()
Следующий скрипт создает компоновку и элемент текста, используя элемент системного стиля. Далее он изменяет положение точки якоря, чтобы при изменении размера текста он оставался по центру компоновки. Наконец, он изменяет размер текста под ширину компоновки с 10%-ным отступом от краев.
p = arcpy.mp.ArcGISProject('current')
#Create a layout
lyt = p.createLayout(8.5, 11, 'INCH', 'New Layout with Point Text')
lyt.openView()
#Create point text element using a system style item
txtStyleItem = p.listStyleItems('ArcGIS 2D', 'TEXT', 'Title (Serif)')[0]
ptTxt = p.createTextElement(lyt, arcpy.Point(4.25, 10), 'POINT',
'Fit My Title To Layout Width, Less 10%',
10, style_item=txtStyleItem)
#Change the anchor position and reposition the text to center
ptTxt.setAnchor('Center_Point')
ptTxt.elementPositionX = 4.25
ptTxt.elementPositionY = 10
#Adjust text size to fit the width of the layout
while ptTxt.elementWidth < (lyt.pageWidth - (lyt.pageWidth * 0.1)):
ptTxt.textSize = ptTxt.textSize + 0.1
Следующий скрипт создает карту, добавляет файл слоя и создает слой графики. Затем по каждому объекту в слое он создает текстовый элемент графики карты в зависимости от значения name объекта.
p = arcpy.mp.ArcGISProject('current')
#Create a map, add a layer file and create a graphics layer
m = p.createMap('New Map with Text Graphics', 'Map')
lyrFile = arcpy.mp.LayerFile(r'C:\Projects\GreatLakes\GreatLakes_CenterPts.lyrx')
m.addLayer(lyrFile)
lyr = m.listLayers('GreatLakes_CenterPoint')[0]
gl = m.createGraphicsLayer('New Graphics Layer')
#Create a map graphic at each point location using each feature's name value
txtStyleItem = p.listStyleItems('ArcGIS 2D', 'TEXT', 'Water (Large)')[0]
for row in arcpy.da.SearchCursor(lyr, ['SHAPE@XY', 'NAME']):
x, y = row[0]
txt = p.createTextElement(gl, arcpy.Point(x,y), 'POINT', row[1])
m.openView()
Следующий скрипт использует шаблон JSON для создания кривой (дуги) и геометрии Безье. Эта геометрия используется для создания двух графических элементов и двух текстовых элементов в новой компоновке. Дополнительно доступ к Python CIM используется для изменения свойств кривой Безье. Дополнительные сведения о создании геометрических объектов с использованием JSON см. в разделе справки для разработчиков Геометрические объекты.
p = arcpy.mp.ArcGISProject('current')
lyt = p.createLayout(6, 3, 'INCH', 'New Layout with 2 curves')
#Construct a curve/arc graphic element using a default symbol
arcPath = {"curvePaths" : [[[3.5,1.25],{"c" : [[5,1.25],[4.25, 1.75]]}]]}
arc = arcpy.AsShape(arcPath, esri_json=True)
arcGra = p.createGraphicElement(lyt, arc, name='ArcPy_Arc')
arcTxt = p.createTextElement(lyt, arc, 'LINE', 'Arc-e-Text', 24, 'Comic Sans MS', name='ArcPy_ArcText')
#Construct a bezier curve graphic element using a system style item
curveStyle = p.listStyleItems('ArcGIS 2D', 'Line', 'Dashed 1 Long 1 Short')[0]
curvePath = {"curvePaths" : [[[1.25,1.25],
{"b" : [[3,1.5],[1.6875,2.75],[2.125,0]]}]]}
curve = arcpy.AsShape(curvePath, esri_json=True)
curveGra = p.createGraphicElement(lyt, curve, curveStyle, 'ArcPy_Curve')
curveTxt = p.createTextElement(lyt, curve, 'LINE', 'Curved text', 24, 'Comic Sans MS', name='ArcPy_CurveText')
#Optional CIM modification
curveTxt_cim = curveTxt.getDefinition('V3')
curveTxt_cim.graphic.symbol.symbol.verticalAlignment = 'Center'
curveTxt.setDefinition(curveTxt_cim)
lyt.openView()
Следующий скрипт создает в новой компоновке графический и текстовый элементы прямоугольника. Строка текста сделана специально длинной, чтобы можно было продемонстрировать, как изменить размер текста, чтобы он поместился в прямоугольник. Функция используется для создания прямоугольника, а свойство isOverflowing - для того, чтобы определить, поместится ли текст в данную геометрию.
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])
rect = arcpy.Polygon(array)
return rect
p = arcpy.mp.ArcGISProject('current')
#Create a layout
lyt = p.createLayout(8.5, 11, 'INCH', 'New Layout with Rectangle Text')
lyt.openView()
#Rectangle Text
text = '''THIS TEXT WILL BE REDUCED UNTIL ALL THE TEXT FITS IN THE RECTANGLE AREA.
AGAIN - THIS TEXT WILL BE REDUCED UNTIL ALL THE TEXT FITS IN THE RECTANGLE AREA.
AND AGAIN - THIS TEXT WILL BE REDUCED UNTIL ALL THE TEXT FITS IN THE RECTANGLE AREA.'''
recTxt = p.createTextElement(lyt, MakeRec_UL(0.5, 10.5, 7.5, 1), 'POLYGON',
text, 25, 'Arial', 'Regular', name='ArcPy_RecText')
#Reduce text to fix rectangle
while recTxt.isOverflowing:
recTxt.textSize = recTxt.textSize - 1
Следующий скрипт создает в новой компоновке пользовательский графический и текстовый полигональный элемент. Строка текста намеренно длинная, чтобы с помощью свойства isOverflowing можно было продемонстрировать, как она накладывается на данную геометрию, а также как изменяется размер текста, чтобы он соответствовал форме этой геометрии. Скрипт также показывает, как с помощью доступа Python CIM установить фон и символы границы текстового элемента.
p = arcpy.mp.ArcGISProject('current')
#Create a layout
lyt = p.createLayout(8.5, 11, 'INCH', 'New Layout with Polygon Text')
lyt.openView()
#Polygon Text
polyCoords = [[0.5, 10], [4.25, 10], [4.25, 9.5], [8, 9.5], [8, 8.5], [0.5, 8.5], [0.5, 10]]
polyShp = arcpy.Polygon(arcpy.Array([arcpy.Point(*coords) for coords in polyCoords]))
text = 'Some Text String that is really long and is <BOL>forced to wrap to other \
lines</BOL> so that we can see how it fits the polygon shape provided to the function.'
polyTxt = p.createTextElement(lyt, polyShp, 'POLYGON', text, 25,
'Arial', 'Regular', name='ArcPy_PolygonText')
#Reduce text to fit shape
while polyTxt.isOverflowing:
polyTxt.textSize = polyTxt.textSize - 1
#OPTIONAL CIM modifications
polyTxt_cim = polyTxt.getDefinition('V3')
#CIM Change text color
polyTxt_cim.graphic.symbol.symbol.symbol.symbolLayers[0].color.values = [0,0,255,100]
#CIM Create a graphic frame background symbol
bgRGBColor = arcpy.cim.CreateCIMObjectFromClassName('CIMRGBColor', 'V3')
bgRGBColor.values = [225, 225, 225, 100]
bgSolidFillLyr = arcpy.cim.CreateCIMObjectFromClassName('CIMSolidFill', 'V3')
bgSolidFillLyr.color = bgRGBColor
bgPolySym = arcpy.cim.CreateCIMObjectFromClassName('CIMPolygonSymbol', 'V3')
bgPolySym.symbolLayers = [bgSolidFillLyr]
bgSymRef = arcpy.cim.CreateCIMObjectFromClassName('CIMSymbolReference', 'V3')
bgSymRef.symbol = bgPolySym
GraphicFrame = arcpy.cim.CreateCIMObjectFromClassName('CIMGraphicFrame', 'V3')
GraphicFrame.backgroundSymbol = bgSymRef
#CIM Create a graphic frame border symbol
brdRGBColor = arcpy.cim.CreateCIMObjectFromClassName('CIMRGBColor', 'V3')
brdRGBColor.values = [255, 0, 0, 100]
brdSolidStrokeLyr = arcpy.cim.CreateCIMObjectFromClassName('CIMSolidStroke', 'V3')
brdSolidStrokeLyr.color = brdRGBColor
brdSolidStrokeLyr.miterLimit = 10
brdSolidStrokeLyr.width = 5
brdLineSym = arcpy.cim.CreateCIMObjectFromClassName('CIMLineSymbol', 'V3')
brdLineSym.symbolLayers = [brdSolidStrokeLyr]
brdSymRef = arcpy.cim.CreateCIMObjectFromClassName('CIMSymbolReference', 'V3')
brdSymRef.symbol = brdLineSym
GraphicFrame.borderSymbol = brdSymRef
polyTxt_cim.graphic.frame = GraphicFrame
polyTxt.setDefinition(polyTxt_cim)
Этот скрипт строит графическую таблицу, основанную на значениях данных из таблицы в карте. Компоновка был создана с вертикальной линией с именем vertLine, горизонтальной линией с именем horzLine и текстовым элементом cellText. Каждый из этих элементов был создан с необходимыми свойствами символов и текста. Якорные точки элемента были установлены в верхнее левое положение, и выполнено верхнее левое выравнивание текстового элемента по вертикали и по горизонтали.
def MakeRec_LL(llx, lly, w, h):
xyRecList = [[llx, lly], [llx, lly+h], [llx+w,lly+h], [llx+w,lly], [llx,lly]]
xyRecList = [[1,1],[1, 2], [2.75, 2], [2.75, 1], [1, 1]]
array = arcpy.Array([arcpy.Point(*coords) for coords in xyRecList])
rec = arcpy.Polygon(array)
return rec
p = arcpy.mp.ArcGISProject('CURRENT')
#Create a layout
lyt = p.createLayout(6, 3, 'INCH', 'New Layout with Rectangles')
#Construct a pre-defined rectangle graphic element using a system style item
# and a rectangle function that takes x/y min/max and a width/height
# using the lower left corner as a start location
polyStyle = p.listStyleItems('ArcGIS 2D', 'Polygon', 'Orchard')[0]
p.createPredefinedGraphicElement(lyt, MakeRec_LL(1, 1, 1.75, 1), 'RECTANGLE',
polyStyle, 'ArcPy_Rectangle_Env',
lock_aspect_ratio=False)
#Construct the same element above using a point location
rec = p.createPredefinedGraphicElement(lyt, arcpy.Point(3, 1), 'RECTANGLE',
polyStyle, 'ArcPy_Rectangle_Pt',
lock_aspect_ratio=False)
rec.elementWidth = 1.75
rec.elementHeight = 1
lyt.openView()