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 应该是要使用的 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.mfbz.cn/a/770911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】机器学习与图像识别的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在图像识别中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 卷积神经网络1.2.2 迁移学习1.2.3 混合模型 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 1.4 模型评估与性能优…

Docker镜像加速配置

由于当前运营商网络问题&#xff0c;可能会导致您拉取 Docker Hub 镜像变慢&#xff0c;索引可以配置阿里云镜像加速器。阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 每个人镜像地址都不一样&#xff0c;需要登陆阿里云自行查看&#xff0c;地址在上面&a…

ctfshow-web入门-文件包含(web78、web79、web80、web81)

目录 1、web78 2、web79 3、web80 4、web81 1、web78 存在文件包含函数&#xff1a;include 直接上 php 伪协议&#xff0c;用 php://filter 读文件&#xff08;flag.php&#xff09;的源码&#xff0c;payload&#xff1a; ?filephp://filter/readconvert.base64-encode…

轻松实现百度大模型ERNIE对话

该代码直接可用&#xff0c;实现了流式输出&#xff0c;只需要在你自己的开发环境配置百度申请的QIANFAN_AK和QIANFAN_SK即可使用啦。// # 在.env文件中&#xff0c;设置以下内容&#xff0c;安全认证Access Key替换your_iam_ak&#xff0c;Secret Key替换your_iam_sk 不过需要…

Linux Ubuntu 将指定ip添加到DNS

请严格按照如下步骤操作 以ip地址&#xff1a;202.96.134.133 为例 1.修改 /etc/resolv.conf 文件 sudo gedit /etc/resolv.conf 添加 nameserver 8.8.8.8 和 nameserver 202.96.134.133&#xff0c; 如下图方框指定内容&#xff1a; 2.修改 /etc/resolvconf/resolv.conf.d…

Python28-7.1降维算法之LDA线性判别分析

线性判别分析&#xff08;Linear Discriminant Analysis, LDA&#xff09;是一种用于模式识别和机器学习的分类和降维技术。LDA通过找到能最大化类别间方差和最小化类别内方差的投影方向&#xff0c;实现样本的降维和分类。 LDA的基本思想 LDA的核心思想是通过线性变换将数据…

Docker学习笔记(一)概念理解

一、什么是docker容器 Docker容器是一种轻量级、可移植的软件封装技术&#xff0c;它允许开发者将应用程序及其依赖、配置文件、运行环境等打包到一个独立的、自包含的执行单元中。容器与虚拟机相似&#xff0c;都提供了隔离的运行环境&#xff0c;但容器更加轻量级&#xff0c…

Echarts折线+柱状图的多y轴

实现效果&#xff1a; 代码&#xff1a; <template><div class"test-echart"><div id"barLineChart" ref"barLineChart" :style"barLineStyle"></div></div> </template> <script> // imp…

MySQL之MHA高可用集群及故障切换

一、MHA概述 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的mysql高可用环境下故障切换和主从复制的软件。MHA的出现就是为了解决mysql单点故障。Mysql故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障性切换操作。MHA能在故障切换的过程中最大程度…

【路由交换技术】Cisco Packet Tracer基础入门教程(五)

这一期我们来学习端口聚合&#xff0c;这是针对交换机的技术 前言 不知道大家有没有注意到&#xff0c;我们之前的实验在交换机与交换机之间只用一条线连接&#xff0c;像这样 通过今天的学习&#xff0c;我们要用两条线来连接交换机&#xff0c;就像这样&#xff08;为了能…

3D问界—法线空间与应用举例

问题提出&#xff1a;什么是法线空间&#xff0c;有哪些应用的场景&#xff1f; 法线空间&#xff08;Normal Space&#xff09;在计算机图形学中是一个重要的概念&#xff0c;特别是在处理表面法线&#xff08;Normal&#xff09;时常被提及。 1. 法线空间的分类 法线空间是相…

“工控机”是什么?和普通电脑有区别嘛!

在现代工业生产中,有一种特殊的计算机,它不像普通电脑那样被放置于明亮的办公室内,而是常常藏身于机器轰鸣、环境恶劣的工厂车间里,这就是工控机——工业控制计算机的简称。作为工业自动化领域不可或缺的核心设备,工控机不仅承载着监控与数据采集(SCADA)、过程控制、数据…

python 实现docx指定语言翻译(不丢失格式)

我这边有个需求需要把一份docx翻译成指定语言的文档并且保存&#xff0c;研究了下&#xff0c;记录。 首先先安装依赖 pip install python-docx1.1.2 googletrans4.0.0rc1 python-docx是用来读取docx的&#xff0c;googletrans使用来翻译的。 googletrans PyPI 这个是官方文…

【大语言模型系列之Transformer】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

什么是YUV和IPB,PTS和DTS,视频编码解码过程

YUV 是一种在视频处理和压缩中常用的颜色空间。 它将图像的亮度 (Y) 与色度 (U 和 V) 成分分开。 这种分离对视频压缩和广播非常有益&#xff0c; 因为人眼对亮度变化比对颜色变化更敏感。 YUV 组件简介 Y (亮度)&#xff1a;表示图像的亮度或灰度信息。U (色度)&#xff1a;…

每日一练:攻防世界:Hidden-Message

追踪UDP数据流&#xff0c;没有任何隐藏信息&#xff1a; WP&#xff1a; 观察流量包 每个流的唯一的区别就是UDP的源地址srcport的最后一位在变化 都提取出来就是二进制序列 用tshark提取一下 //使用tshark过滤出源端口&#xff0c;使用cut裁取端口的最后一位 tshark -r 8…

[C/C++] -- gdb调试与coredump

1.gdb调试 GDB&#xff08;GNU 调试器&#xff09;是一个强大的工具&#xff0c;用于调试程序。 安装 1. wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz 2. tar -zxvf gdb-8.1.1.tar.gz 3. cd gdb-8.1.1 4. ./configure 5. make 6. make install 基础用法 …

git上传文件

git init git add . git commit -m " " git remote add origin 仓库的地址 git push -u origin master 如果出现以下问题 可以用这一句强制上传 git push -f origin master

BME688 环境传感器

型号简介 BME688是博世&#xff08;bosch-sensortec&#xff09;的一款首款具有人工智能 (AI) 和集成高线性度和高精度压力、湿度和温度传感器的气体传感器。它采用坚固而紧凑的 3.0 x 3.0 x 0.9 mm 封装&#xff0c;专为移动和联网应用而开发&#xff0c;在这些应用中&#xf…

C++之boost智能指针

1、boost智能指针 资源获取即初始化&#xff1a;在构造函数中对资源进行初始化&#xff0c;在析构函数中释放。 智能指针的本质思想是&#xff1a;将堆对象的生存期&#xff0c;用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候&#xff0c;立刻用智能指针…