您的位置:首页 > 财经 > 金融 > ArcGIS Pro SDK (七)编辑 12 编辑模版

ArcGIS Pro SDK (七)编辑 12 编辑模版

2024/12/22 0:05:06 来源:https://blog.csdn.net/szy13323042191/article/details/140150536  浏览:    关键词:ArcGIS Pro SDK (七)编辑 12 编辑模版

ArcGIS Pro SDK (七)编辑 12 编辑模版

文章目录

  • ArcGIS Pro SDK (七)编辑 12 编辑模版
    • 1 在图层上按名称查找编辑模板
    • 2 查找属于独立表的表模板
    • 3 当前模板
    • 4 更改模板的默认编辑工具
    • 5 隐藏或显示模板上的编辑工具
    • 6 使用图层创建新模板
    • 7 使用表创建新表模板
    • 8 更新表模板
    • 9 创建注释模板
    • 10 删除表模板
    • 11 活动模板已更改

环境: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 应该是要使用的 symbolIDvar symbolName = label.TextSymbol.SymbolName;int symbolID = -1;if (!int.TryParse(symbolName, out symbolID)){// int.TryParse 失败 - 尝试在符号集合中查找 symbolNameforeach (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 而不是 guidstring 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");
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com