ArcGIS Pro SDK (七)编辑 12 编辑模版
文章目录
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 在图层上按名称查找编辑模板
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 获取模板
var map = ArcGIS.Desktop.Mapping.MapView.Active.Map;
if (map == null)
return;
var mainTemplate = map.FindLayers("main").FirstOrDefault()?.GetTemplate("Distribution");
var mhTemplate = map.FindLayers("Manhole").FirstOrDefault()?.GetTemplate("Active");
});
2 查找属于独立表的表模板
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
var map = ArcGIS.Desktop.Mapping.MapView.Active.Map;
if (map == null)
return;
// 获取特定的表模板
var tableTemplate = map.FindStandaloneTables("Address Points").FirstOrDefault()?.GetTemplate("Residences");
// 获取独立表的所有模板
var ownersTableTemplates = map.FindStandaloneTables("Owners").FirstOrDefault()?.GetTemplates();
var statisticsTableTemplates = MapView.Active.Map.GetStandaloneTablesAsFlattenedList().First(l => l.Name.Equals("Trading Statistics")).GetTemplates();
});
3 当前模板
EditingTemplate template = EditingTemplate.Current;
4 更改模板的默认编辑工具
public Task ChangeTemplateDefaultToolAsync(ArcGIS.Desktop.Mapping.FeatureLayer flayer,
string toolContentGUID, string templateName)
{
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 通过名称从图层中检索编辑模板
var template = flayer?.GetTemplate(templateName) as ArcGIS.Desktop.Editing.Templates.EditingTemplate;
// 获取图层的定义
var layerDef = flayer?.GetDefinition() as ArcGIS.Core.CIM.CIMFeatureLayer;
if ((template == null) || (layerDef == null))
return;
if (template.DefaultToolID != this.ID)
{
bool updateLayerDef = false;
if (layerDef.AutoGenerateFeatureTemplates)
{
layerDef.AutoGenerateFeatureTemplates = false;
updateLayerDef = true;
}
// 检索 CIM 编辑模板定义
var templateDef = template.GetDefinition();
// 分配工具 DAML 定义中的 GUID,例如
// <tool id="TestConstructionTool_SampleSDKTool" categoryRefID="esri_editing_construction_polyline" ….>
// <tooltip heading="">Tooltip text<disabledText /></tooltip>
// <content guid="e58239b3-9c69-49e5-ad4d-bb2ba29ff3ea" />
// </tool>
// 然后 toolContentGUID 将是 "e58239b3-9c69-49e5-ad4d-bb2ba29ff3ea"
// 在 2.x 版本中 -
//templateDef.ToolProgID = toolContentGUID;
templateDef.DefaultToolGUID = toolContentGUID;
// 设置定义
template.SetDefinition(templateDef);
// 也更新图层定义
if (updateLayerDef)
flayer.SetDefinition(layerDef);
}
});
}
5 隐藏或显示模板上的编辑工具
QueuedTask.Run(
() =>
{
// 隐藏图层上的所有工具,除了线工具
var featLayer = MapView.Active.Map.FindLayers("Roads").First();
var editTemplates = featLayer.GetTemplates();
var newCIMEditingTemplates = new List<CIMEditingTemplate>();
foreach (var et in editTemplates)
{
// 初始化模板,通过激活默认工具
et.ActivateDefaultToolAsync();
var cimEditTemplate = et.GetDefinition();
// 获取此模板上的可见工具
var allTools = et.ToolIDs.ToList();
// 添加此模板上的隐藏工具
allTools.AddRange(cimEditTemplate.GetExcludedToolIDs().ToList());
// 隐藏所有工具,然后允许线工具
// 在 2.x 版本中 -
//allTools.AddRange(cimEditTemplate.GetExcludedToolDamlIds().ToList());
allTools.AddRange(cimEditTemplate.GetExcludedToolIDs().ToList());
// 在 2.x 版本中 -
//cimEditTemplate.SetExcludedToolDamlIds(allTools.ToArray());
//cimEditTemplate.AllowToolDamlID("esri_editing_SketchLineTool");
cimEditTemplate.SetExcludedToolIDs(allTools.ToArray());
cimEditTemplate.AllowToolID("esri_editing_SketchLineTool");
newCIMEditingTemplates.Add(cimEditTemplate);
}
// 更新图层模板
var layerDef = featLayer.GetDefinition() as CIMFeatureLayer;
// 将 AutoGenerateFeatureTemplates 设置为 false 以使模板更改生效
layerDef.AutoGenerateFeatureTemplates = false;
layerDef.FeatureTemplates = newCIMEditingTemplates.ToArray();
featLayer.SetDefinition(layerDef);
});
6 使用图层创建新模板
var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
if (layer == null)
return;
QueuedTask.Run(
() =>
{
var insp = new Inspector();
insp.LoadSchema(layer);
insp["Field1"] = value1;
insp["Field2"] = value2;
insp["Field3"] = value3;
var tags = new[] { "Polygon", "tag1", "tag2" };
// 使用 daml-id 设置默认工具
string defaultTool = "esri_editing_SketchCirclePolygonTool";
// 工具过滤器是要过滤掉的工具
var toolFilter = new[] { "esri_editing_SketchTracePolygonTool" };
// 创建一个新模板
var newTemplate = layer.CreateTemplate("My new template", "description", insp, defaultTool, tags, toolFilter);
});
7 使用表创建新表模板
var table = MapView.Active.Map.GetStandaloneTablesAsFlattenedList().FirstOrDefault();
if (table == null)
return;
QueuedTask.Run(
() =>
{
var tableTemplate = table.GetTemplate("Template1");
var definition = tableTemplate.GetDefinition();
definition.Description = "New definition";
definition.Name = "New name";
// 使用此定义创建新表模板
table.CreateTemplate(definition);
// 也可以使用此扩展方法创建新表模板。可以像使用 layer.CreateTemplate 方法一样使用此方法。
table.CreateTemplate("New template name", "Template description", tags: new string[] { "tag 1", "tag 2" });
});
8 更新表模板
QueuedTask.Run(
() =>
{
var tableTemplate = table.GetTemplate("Template1");
var definition = tableTemplate.GetDefinition();
definition.Description = "New definition";
definition.Name = "New name";
// 更新定义
tableTemplate.SetDefinition(definition);
});
9 创建注释模板
// 获取注释图层
AnnotationLayer annoLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<AnnotationLayer>().FirstOrDefault();
if (annoLayer == null)
return;
QueuedTask.Run(
() =>
{
Inspector insp = null;
// 获取注释要素类
var fc = annoLayer.GetFeatureClass() as ArcGIS.Core.Data.Mapping.AnnotationFeatureClass;
// 获取包含标签、符号的要素类 CIM 定义
var cimDefinition = fc.GetDefinition() as ArcGIS.Core.Data.Mapping.AnnotationFeatureClassDefinition;
var labels = cimDefinition.GetLabelClassCollection();
var symbols = cimDefinition.GetSymbolCollection();
// 确保有标签和符号
if ((labels.Count == 0) || (symbols.Count == 0))
return;
// 查找所需的标签类
// 通常会使用子类型名称或其他特征
// 在此情况下,只使用第一个
var label = labels[0];
// 每个标签都有一个 textSymbol
// symbolName 应该是要使用的 symbolID
var symbolName = label.TextSymbol.SymbolName;
int symbolID = -1;
if (!int.TryParse(symbolName, out symbolID))
{
// int.TryParse 失败 - 尝试在符号集合中查找 symbolName
foreach (var symbol in symbols)
{
if (symbol.Name == symbolName)
{
symbolID = symbol.ID;
break;
}
}
}
// 没有符号?
if (symbolID == -1)
return;
// 加载架构
insp = new Inspector();
insp.LoadSchema(annoLayer);
// 可以使用 inspector[fieldName] 方法分配这些字段
// 这些字段在注释架构中保证存在
insp["AnnotationClassID"] = label.ID;
insp["SymbolID"] = symbolID;
// 设置一些附加的注释属性
AnnotationProperties annoProperties = insp.GetAnnotationProperties();
annoProperties.FontSize = 36;
annoProperties.TextString = "My Annotation feature";
annoProperties.VerticalAlignment = VerticalAlignment.Top;
annoProperties.HorizontalAlignment = HorizontalAlignment.Justify;
insp.SetAnnotationProperties(annoProperties);
var tags = new[] { "Annotation", "tag1", "tag2" };
// 使用 daml-id 而不是 guid
string defaultTool = "esri_editing_SketchStraightAnnoTool";
// 工具过滤器是要过滤掉的工具
var toolFilter = new[] { "esri_editing_SketchCurvedAnnoTool" };
// 创建一个新模板
var newTemplate = annoLayer.CreateTemplate("new anno template", "description", insp, defaultTool, tags, toolFilter);
});
10 删除表模板
var table = MapView.Active.Map.GetStandaloneTablesAsFlattenedList().FirstOrDefault();
if (table == null)
return;
QueuedTask.Run(
() =>
{
var tableTemplate = table.GetTemplate("Template1");
// 删除表模板
table.RemoveTemplate(tableTemplate);
// 通过名称删除模板
table.RemoveTemplate("Template2");
});
11 活动模板已更改
ArcGIS.Desktop.Editing.Events.ActiveTemplateChangedEvent.Subscribe(OnActiveTemplateChanged);
async void OnActiveTemplateChanged(ArcGIS.Desktop.Editing.Events.ActiveTemplateChangedEventArgs args)
{
// 如果传入的模板为空则返回
if (args.IncomingTemplate == null)
return;
// 为图层地图中的 Freeway 模板激活两点线工具
if (args.IncomingTemplate.Name == "Freeway" && args.IncomingMapView.Map.Name == "Layers")
await args.IncomingTemplate.ActivateToolAsync("esri_editing_SketchTwoPointLineTool");
}