DayDreamInGIS 之 ArcGIS Pro二次开发 图层属性中换行符等特殊字符替换

具体参考ArcMap中类似的问题,本帖开发一个ArcGISPro版的工具

1.基础库部分

插件开发,经常需要处理图层与界面的交互。基础库把常用的交互部分做了封装,方便之后的重复使用。

(1)下述类定义了数据存储结构,主要用于保存Combox中的label与值。比如,Name_Index类,用于保存名称-数值索引,Name_Layer类,用于保存图层名-图层

using ArcGIS.Desktop.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace GISCommonHelper
{/// <summary>/// 名称与索引,用于数据绑定时界面的显示,适用于字段名与索引,图层名与索引等/// </summary>public class Name_Index{public string name { get; set; }public int index { get; set; }public Name_Index(string name, int index){this.name = name;this.index = index;}}/// <summary>/// 字段名与假名/// </summary>public class Name_AliasName{public string name { get; set; }public string alias_name { get; set; }public Name_AliasName(string name, string alias_name){this.name = name;if (string.IsNullOrEmpty(this.alias_name)){this.alias_name = alias_name;}else{this.alias_name = name;}}}/// <summary>/// 图层名与图层/// </summary>public class Name_Layer{public string Name { get; set; }public Layer layer { get; set; }public Guid id { get; set; }public Name_Layer(string name, Layer layer){this.Name = name;this.layer = layer;this.id = Guid.NewGuid();}}public class name_obj{public string name { get; set; }public object obj { get; set; }public Guid id { get; set; }public string tp { get; set; }public name_obj() { }public name_obj(string name, object obj, string tp){this.name = name;this.obj = obj;this.tp = tp;this.id = Guid.NewGuid();}}
}

(2)下述代码实通过静态扩展的方式,扩展WPF 中Combox组件,新增方法 

setLyrlist<T>,通过数据绑定的形式设置Combox的Items集合,通过提供一个Map对象,以及泛型类型T

setDftLyr,通过lambda表达式的方式,配置Combox默认的选中值。

通过该扩展类, Combox.SelectedValue 即可获取该下拉框的选中对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using ArcGIS.Desktop.Mapping;namespace GISCommonHelper
{public static class CartoLyrHelper{/// <summary>/// 设置图层/// </summary>/// <typeparam name="T"></typeparam>/// <param name="cmb"></param>/// <param name="map"></param>public static void setLyrlist<T>(this ComboBox cmb,Map map) where T:Layer{var lyrlist = map.GetLayersAsFlattenedList().OfType<T>().ToList();List<Name_Layer> nlist = new List<Name_Layer>();lyrlist.ForEach(item =>{Layer l = (Layer)item;nlist.Add(new Name_Layer(l.Name, l));});cmb.ItemsSource = nlist;cmb.DisplayMemberPath = "Name";cmb.SelectedValuePath = "layer";}/// <summary>/// 设置下拉集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="cmb"></param>/// <param name="map"></param>/// <param name="clause"></param>public static void setLyrlist<T>(this ComboBox cmb,Map map,Func<Layer,bool> clause) where T : Layer{cmb.setLyrlist<T>(map);cmb.setDftLyr(clause);}/// <summary>/// 设置默认选中的图层/// </summary>/// <param name="cmb"></param>/// <param name="clause"></param>public static void setDftLyr(this ComboBox cmb,Func<Layer,bool> clause){List<Name_Layer>? lyrlist = new List<Name_Layer>();if (cmb.ItemsSource == null){return;}else{lyrlist = cmb.ItemsSource as List<Name_Layer>;}for (int i = 0; i < lyrlist.Count; i++){var item = lyrlist[i].layer;if (clause(item)){cmb.SelectedIndex = i;}}}}}

2.界面部分

ProWindow

<controls:ProWindow x:Class="DayDreamInGISTool.AttrSpecialStrRemove.RemoveAttrSpecialStrFrm"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:extensions="clr-namespace:ArcGIS.Desktop.Extensions;assembly=ArcGIS.Desktop.Extensions"mc:Ignorable="d" ResizeMode="NoResize"Title="移除属性中特殊字符" Height="300" Width="300"WindowStartupLocation="CenterOwner" Loaded="ProWindow_Loaded"><controls:ProWindow.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><extensions:DesignOnlyResourceDictionary Source="pack://application:,,,/ArcGIS.Desktop.Framework;component\Themes\Default.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></controls:ProWindow.Resources><Grid Name="RootGrid"><Label Content="图层" HorizontalAlignment="Left" Margin="12,8,0,0" VerticalAlignment="Top"/><ComboBox Name="cmbLayer" HorizontalAlignment="Left" Margin="51,10,0,0" VerticalAlignment="Top" Width="229" SelectionChanged="cmbLayer_SelectionChanged"/><GroupBox Header="待移除特殊字符" HorizontalAlignment="Left" Margin="12,41,0,0" VerticalAlignment="Top" Height="101" Width="268" Name="ToBeRemovedGroup"><Grid Height="90" Margin="0,0,0.2,-0.4" VerticalAlignment="Top"><CheckBox Name="chkEnter" IsChecked="True"  Content="换行符 \r\n" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/><CheckBox Name="chkA" Content="响铃 \a" IsChecked="True" HorizontalAlignment="Left" Margin="142,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.313,0.526"/><CheckBox Name="chkF" IsChecked="True"  Content="换页 \f" HorizontalAlignment="Left" Margin="10,34,0,0" VerticalAlignment="Top"/><CheckBox Name="chkT" IsChecked="True"  Content="水平制表 \t" HorizontalAlignment="Left" Margin="142,34,0,0" VerticalAlignment="Top"/><CheckBox Name="chkV" IsChecked="True"  Content="垂直制表 \v" HorizontalAlignment="Left" Margin="142,58,0,0" VerticalAlignment="Top" Checked="chkV_Checked"/><CheckBox Name="chkStartEndSpace" IsChecked="True" Content="首尾空格符" HorizontalAlignment="Left" Margin="10,58,0,0" VerticalAlignment="Top"/></Grid></GroupBox><Label Content="替换为" HorizontalAlignment="Left" Margin="12,151,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.155,0.477"/><TextBox HorizontalAlignment="Left" Name="txtReplace" Height="23" Margin="64,151,0,0" TextWrapping="Wrap" Text="、" VerticalAlignment="Top" Width="216"/><Button Content="确定" IsDefault="True" Name="btnOK" HorizontalAlignment="Left" Margin="49,220,0,0" VerticalAlignment="Top" Width="83" Height="30" Click="btnOK_Click"/><Button Content="取消" IsCancel="True" Name="btnCancel" HorizontalAlignment="Left" Margin="174,220,0,0" VerticalAlignment="Top" Width="83" RenderTransformOrigin="-0.557,1.094" Height="30" Click="btnCancel_Click"/><CheckBox Content="处理TOC中所有图层" Name="chkAll" HorizontalAlignment="Left" Margin="51,193,0,0" VerticalAlignment="Top"/></Grid>
</controls:ProWindow>

下述代码为界面逻辑,主要实现交互获取,通过属性的方式

using ArcGIS.Desktop.Mapping;
using GISCommonHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace DayDreamInGISTool.AttrSpecialStrRemove
{/// <summary>/// Interaction logic for RemoveAttrSpecialStrFrm.xaml/// </summary>public partial class RemoveAttrSpecialStrFrm : ArcGIS.Desktop.Framework.Controls.ProWindow{private FeatureLayer ftlyr = null;public FeatureLayer Ftlyr { get => ftlyr; set => ftlyr = value; }public char[] SpecialCharArray { get => specialCharArray; set => specialCharArray = value; }public bool IsAll { get => isAll; set => isAll = value; }public bool IsTrim { get => isTrim; set => isTrim = value; }public List<char> Special_char { get => special_char; set => special_char = value; }public string Replace_str { get => replace_str; set => replace_str = value; }private char[] specialCharArray;private bool isAll = false;private bool isTrim;private List<char> special_char;private string replace_str;public RemoveAttrSpecialStrFrm(){InitializeComponent();special_char = new List<char>();//获取所有图层var map = MapView.Active.Map;this.cmbLayer.setLyrlist<FeatureLayer>(map);}private void cmbLayer_SelectionChanged(object sender, SelectionChangedEventArgs e){if (this.cmbLayer.SelectedIndex >= 0){this.ftlyr = this.cmbLayer.SelectedValue as FeatureLayer;}}private void btnOK_Click(object sender, RoutedEventArgs e){replace_str = txtReplace.Text;isAll = chkAll.IsChecked.Value;if (chkA.IsChecked.Value){special_char.Add('\a');}if (chkEnter.IsChecked.Value){special_char.Add('\r');special_char.Add('\n');}if (chkF.IsChecked.Value){special_char.Add('\f');}if (chkT.IsChecked.Value){special_char.Add('\t');}if (chkV.IsChecked.Value){special_char.Add('\v');}isTrim = chkStartEndSpace.IsChecked.Value;this.DialogResult = true;}private void btnCancel_Click(object sender, RoutedEventArgs e){this.DialogResult = false;}private void chkV_Checked(object sender, RoutedEventArgs e){}private void ProWindow_Loaded(object sender, RoutedEventArgs e){}}
}

3.逻辑代码

using ArcGIS.Core.CIM;
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Catalog;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Editing;
using ArcGIS.Desktop.Extensions;
using ArcGIS.Desktop.Framework;
using ArcGIS.Desktop.Framework.Contracts;
using ArcGIS.Desktop.Framework.Dialogs;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Layouts;
using ArcGIS.Desktop.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace DayDreamInGISTool.AttrSpecialStrRemove
{internal class btnRemoveAttrSpecialStr : Button{private List<char> special_char_list;private string replacestr = ";";private bool isTrim = false;int cnt = 0;RemoveAttrSpecialStrFrm rsf = null;protected override void OnClick(){rsf = new RemoveAttrSpecialStrFrm();if (rsf.ShowDialog().Value){cnt = 0;special_char_list = rsf.Special_char;replacestr = rsf.Replace_str;isTrim = rsf.IsTrim;if (rsf.IsAll){var map = MapView.Active.Map;var lyrlist= map.GetLayersAsFlattenedList().OfType<FeatureLayer>().ToList();lyrlist.ForEach(p =>{Execute_specialStr_Remove(p);});}else{Execute_specialStr_Remove(rsf.Ftlyr);}MessageBox.Show("处理完成");}}/// <summary>/// 遍历要素,替换要素各字段中的特殊字符/// </summary>/// <param name="pftlyr"></param>/// <returns></returns>private async void Execute_specialStr_Remove(FeatureLayer pftlyr){var fields = await QueuedTask.Run(() =>{return pftlyr.GetFieldDescriptions();});await QueuedTask.Run(() =>{using(Table table= pftlyr.GetTable()){using(RowCursor rowCursor= table.Search(null, false)){while(rowCursor.MoveNext()){using(Row row= rowCursor.Current){System.Diagnostics.Debug.WriteLine("正在处理:"+row.GetObjectID());remove_feature_attr_specialStr(row,fields);}}}}});//return cnt;}/// <summary>/// 替换要素所有字段中的特殊字符/// </summary>/// <param name="pFeature"></param>private void remove_feature_attr_specialStr(Row row,List<FieldDescription> fields){for (int i = 0; i < fields.Count; i++){FieldDescription pfd = fields[i];if (pfd.Type == FieldType.String){//只处理字符类型的值string val = row[pfd.Name].ToString();if(val!= null){string val_r = remove_specialStrInString(val);if (!string.Equals(val, val_r)){row[pfd.Name]= val_r;row.Store();}}}}}/// <summary>/// 替换字符串中的特殊字符/// </summary>/// <param name="str"></param>/// <returns></returns>private string remove_specialStrInString(string str){if (isTrim){str = str.Trim();}special_char_list.ForEach(p =>{str = str.Replace(p.ToString(), replacestr);});return str;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DFA还原白盒AES密钥

本期内容是关于某app模拟登录的,涉及的知识点比较多,有unidbg补环境及辅助还原算法,ida中的md5以及白盒aes,fart脱壳,frida反调试 本章所有样本及资料均上传到了123云盘 llb资料官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 目录 首先抓包 fart脱壳 加密位置定位…

0048__Unix传奇

Unix传奇 &#xff08;上篇&#xff09;_unix传奇(上篇)-CSDN博客 Unix传奇 &#xff08;下篇&#xff09;-CSDN博客 Unix现状与未来——CSDN对我的采访_nuix邮件系统行业地位-CSDN博客

win11安装nodejs

一、下载安装包 链接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取码: psjm 二、安装步骤 1.双击安装包 2.Next> 3.勾选之后&#xff0c;Next> 4.点击Change&#xff0c;选择你要安装的路径&#xff0c;然后Next> 5.点击Install安装 二、…

学生云服务器腾讯云_腾讯云学生学生_腾讯云学生云主机

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

基于扩散模型的图像编辑:首篇综述

AIGC 大模型最火热的任务之一——基于 Diffusion Model 的图像编辑(editing)领域的首篇综述。长达 26 页&#xff0c;涵盖 297 篇文献&#xff01;本文全面研究图像编辑前沿方法&#xff0c;并根据技术路线精炼地划分为 3 个大类、14 个子类&#xff0c;通过表格列明每个方法的…

查询缓存-缓存更新-缓存穿透-缓存雪崩-缓存击穿

1.查询缓存 1.2.出现的原因 用户高并发访问带来的服务器读写的压力 1.3.解决方法 添加缓存 2.缓存更新 2.1.出现的原因 出现数据不一致的问题 2.2.解决方法 操作数据库的时候 更新数据库删除缓存 查询数据的时候设置过期时间 3.缓存穿透 3.1.出现的原因 在高并发访…

LeetCode 热题 100 | 图论(一)

目录 1 200. 岛屿数量 2 994. 腐烂的橘子 2.1 智障遍历法 2.2 仿层序遍历法 菜鸟做题&#xff0c;语言是 C 1 200. 岛屿数量 解题思路&#xff1a; 遍历二维数组&#xff0c;寻找 “1”&#xff08;若找到则岛屿数量 1&#xff09;寻找与当前 “1” 直接或间接连接在…

Java输入输出流详细解析

Java I/O&#xff08;输入/输出&#xff09;主要被用来处理输入数据和输出结果。 在Java中&#xff0c;输入/输出操作被当作流&#xff08;Stream&#xff09;进行处理。流是一个连续的数据流入或数据流出的通道。流操作在Java中主要可以分为两种类型&#xff1a;字节流和字符…

基于ssm疫情期间高校防控系统+vue论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;学生信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

如果你在运行 conda 命令时收到了 ‘conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 的错误消息&#xff0c;这可能意味着 Anaconda 并没有正确地添加到你的系统路径中。 1.你可以尝试手动添加 Anaconda 到系统路径中。以下是在 Windows 系统上添加…

19.2 DeepMetricFi:基于深度度量学习改进Wi-Fi指纹定位

P. Chen and S. Zhang, "DeepMetricFi: Improving Wi-Fi Fingerprinting Localization by Deep Metric Learning," in IEEE Internet of Things Journal, vol. 11, no. 4, pp. 6961-6971, 15 Feb.15, 2024, doi: 10.1109/JIOT.2023.3315289. 摘要 Wi-Fi RSSI指纹定位…

C++内存泄漏:原因、预防、定位

内存泄漏是 C 中常见的问题之一&#xff0c;可能导致程序运行时资源消耗过大、性能下降&#xff0c;甚至程序崩溃。 内存泄漏的原因 1. 未释放动态分配的内存 在 C 中&#xff0c;通过 new 操作符分配的内存需要手动使用 delete 操作符进行释放。如果忘记或者由于某种原因未…

调用“每日诗词”在你的页面添加一句诗

概述 前几天浏览网站的时候看到页面上有句诗&#xff0c;打开调试看了下调用的是“每日诗词”的SDK。本文基于此SDK实现你的页面添加一句诗。 实现效果 实现 1. 引入SDK <script src"https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset"utf-…

mysql服务治理

一、性能监控指标和解决方案 1.QPS 一台 MySQL 数据库&#xff0c;大致处理能力的极限是&#xff0c;每秒一万条左右的简单 SQL&#xff0c;这里的“简单 SQL”&#xff0c;指的是类似于主键查询这种不需要遍历很多条记录的 SQL。 根据服务器的配置高低&#xff0c;可能低端…

【BUUCTF web】通关 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

MAC-键盘command快捷键、设置windows快捷键

在 Windows PC 专用键盘上&#xff0c;请用 Alt 键代替 Option 键&#xff0c;用 Ctrl 键或 Windows 标志键代替 Command 键。 Mac 键盘快捷键 - 官方 Apple 支持 (中国) 设置windows快捷键 使用mac外接适用于windows的键盘时&#xff0c;如何设置快捷键&#xff1f;_mac外…

2024年2月国内如何快速注册OnlyFans最新小白教学

前言 onlyface软件是一个创立于2016年的订阅式社交媒体平台&#xff0c;创作者可以在自己的账号发布原创的照片或视频&#xff0c;并将其设置成付费模式&#xff0c;若用户想查看则需要每月交费订阅。 需要注意的是&#xff0c;网络上可能存在非法或不道德的应用程序&#xff…

Java:性能优化细节31-45

Java&#xff1a;性能优化细节31-45 31、合理使用java.util.Vector 在使用java.util.Vector时&#xff0c;需要注意其性能特性和最佳实践&#xff0c;以确保应用程序运行高效。Vector是一个同步的集合类&#xff0c;提供了动态数组的实现。由于它是线程安全的&#xff0c;所以…

获取当前数据 上下移动

点击按钮 上下移动 当前数据 代码 // 出国境管理 登记备案人员列表 <template><a-row><a-col span"24"><a-card :class"style[a-table-wrapper]"><!-- 出国境 登记备案人员列表 --><a-table:rowKey"records >…

淘宝开放平台获取商家订单数据API接口接入流程

taobao.custom 自定义API操作 接口概述&#xff1a;通过此API可以调用淘宝开放平台的API&#xff0c;通过技术对接&#xff0c;您可以轻松实现无账号调用官方接口。进入测试&#xff01; 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&…