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");
}