描述
GraphicElement 对象提供了对属性和方法的访问,属性用于在页面布局上重新定位图形元素,而方法用于复制和删除现有图形元素。
讨论
对于添加到页面布局中的大多数通用元素来说,GraphicElement 是一种万能型元素类型。它包含了可添加到页面布局中的各种项目(如元素组、插入表、图表、图廓线、标记、线、区域形状等)。对图形元素执行的最常见操作是获取或设置其页面布局的位置和大小。ListLayoutElements 函数将返回页面布局元素对象的 Python 列表。随后需要遍历列表中的每个项目,或指定一个索引号以引用具体的页面元素对象。要返回一个只包含 GraphicElements 的列表,应对 element_type 参数使用 GRAPHIC_ELEMENT 常量。您可使用通配符根据元素名对搜索过程进行优化。
可以复制和删除现有图形元素。添加此功能的初衷是为了支持在页面布局中创建动态图表,布局中的表中的每个单元格都可使用线图形进行描画。要实现此目的,至少须使用两种线图形元素制作地图文档:垂直线和水平线。从表格中读取信息后,可以使用 clone 方法复制这些线,同时,可使用其他图形元素属性调整其位置和大小。克隆元素时,提供一个 suffix 值将会非常有用,因为在使用 ListLayoutElements 函数时结合 wildcard 和 suffix 值,因此可以轻易识别出克隆的元素。可以使用 delete 方法进一步修改或删除返回的元素列表。下面列出了一个构建动态图表的完整代码示例。
无法克隆分组的图形元素。这是因为分组的元素可能不仅仅包括图形元素;还可能包括诸如指北针、比例尺等要素。在克隆图形元素前可使用 isGroup 属性确定该元素是否为分组的元素。
ListLayoutElements 将返回元素列表。例如,对表示三个文本元素的图形元素执行 ListLayoutElements 将返回四个元素:组元素和每个文本元素。GraphicElement 可用于同时对所有项目重新定位,也可以分别管理文本元素的文本值。
建议您为每个页面布局元素赋予唯一的名称,以便在使用 arcpy 脚本时便于区分。可以在 ArcMap 属性 对话框的大小和位置选项卡中对其进行设置。
X 和 Y 元素的位置以元素的锚点位置为基础,也可以通过 ArcMap 属性 对话框中的大小和位置选项卡进行设置。
页面单位只能在 ArcMap 中通过自定义 > ArcMap 选项 > 布局视图选项卡来更改。
属性
属性 | 说明 | 数据类型 |
elementHeight (可读写) | 元素的高度(以页面单位计)。分配或报告的单位为页面单位。 | Double |
elementPositionX (可读写) | 数据框元素的锚点位置的 x 位置。分配或报告的单位为页面单位。 | Double |
elementPositionY (可读写) | 数据框元素的锚点位置的 y 位置。分配或报告的单位为页面单位。 | Double |
elementWidth (可读写) | 元素的宽度(以页面单位计)。分配或报告的单位为页面单位。 | Double |
isGroup (只读) | 如果布局元素是组元素,则返回 True。无法克隆或删除组元素。 | Boolean |
name (可读写) | 元素的名称。 | String |
type (只读) | 返回任何给定页面布局元素的元素类型。
| String |
方法概述
方法 | 说明 |
clone ({suffix}) | 提供了一种克隆页面布局中现有图形元素的机制。 |
delete () | 提供了一种删除页面布局中现有图形元素的机制。 |
方法
clone ({suffix})
参数 | 说明 | 数据类型 |
suffix | 用于标记每个新建图形元素的可选字符串。新元素的元素名称为父项图形元素的元素名称加上后缀值以及数值定序符。例如,如果父元素名称为 Line 且后缀值为 _copy,则新克隆的元素的名称为 Line_copy、Line_copy_1、Line_copy_2 等。如果未提供后缀,则结果将类似于 Line_1、 Line _ 2 、Line_3 等。 | String |
分组的图形元素无法克隆。首先使用 isGroup 属性检查图形元素是否分组。
delete ()
可能需要删除已克隆元素。已克隆元素在创建时可以具有自定义后缀,因此,可以使用 ListLayoutElements 函数的通配符参数轻松找到这些元素。
代码示例
GraphicElement 示例 1
以下脚本将名为 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
GraphicElement 示例 2
以下脚本将通过地图文档中的表构建基于数据值的图表。使用名为 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