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

news/2024/7/8 3:26:23 标签: arcgis, c#, arcgis pro sdk, gis

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 应该是要使用的 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");
}

http://www.niftyadmin.cn/n/5536202.html

相关文章

小程序 npm 支持

使用 npm 包 目前小程序已经支持使用 npm 安装第三方包&#xff0c;因为 node_modules 目录中的包不会参与小程序项目的编译、 上传和打包&#xff0c;因此在小程序 项目中要使用的 npm 包&#xff0c;必须走一遍构建 npm 的过程。在构建成功以后&#xff0c;默认 会在小程序目…

VSCode常用的一些插件

Chinese (Simplified) 汉语&#xff08;简体&#xff09;拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

山西车间应用LP-LP-SCADA系统的好处有哪些

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 LP-SCADA&#xff08;监控控制与数据采集&#xff09;系统是工业控制系统的一种&#xff0c;主要用于实时监控、控制和管理工业生产过程。 在车间应用LP-SCADA系统&#xf…

图像练习-识别中圆形锡点 (04)

图片 代码 cv::Mat src cv::imread("light_point.png", cv::IMREAD_COLOR);cv::Mat draw src.clone();cv::Rect rt0(20, 80, src.cols - 30, 190);cv::Rect rt1(20, 480, src.cols - 30, 190);cv::Mat gray;cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);cv::Mat …

Semantic Kernel:微软大模型开发框架——LangChain 替代

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

【超级实用的一些adb命令】

实用的一些adb命令 #实用的一些adb命令 ##获取屏幕分辨率 adb shell wm size Physical size: 1920x1080##获取屏幕密度 adb shell wm density Physical density: 240##获取CPU信息 adb shell cat /proc/cpuinfo##获取内存信息 adb shell cat /proc/meminfo##给模拟器输入框输…

Avalonia应用在基于Linux的国产操作deepin上运行

deepin系统介绍 deepin(原名Linux Deepin)致力于为全球用户提供美观易用&#xff0c;安全可靠的 Linux发行版。deepin项目于2008年发起&#xff0c;并在2009年发布了以 linux deepin为名称的第一个版本。2014年4月更名为 deepin&#xff0c;在中国常被称为“深度操作系统”。 …

docker集群部署主从mysql

搭建一个mysql集群&#xff0c;1主2从&#xff0c;使用docker容器 一、创建docker的mysql镜像 下次补上&#xff0c;因为现在很多网络不能直接pull&#xff0c;操作下次补上。 二、创建mysql容器 创建容器1 docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --…