ArcGIS Pro SDK (七)编辑 10 捕捉

ArcGIS Pro SDK (七)编辑 10 捕捉

文章目录

  • [ArcGIS Pro SDK (七)编辑 10 捕捉](#ArcGIS Pro SDK (七)编辑 10 捕捉)
    • [1 配置捕捉 - 打开或关闭捕捉](#1 配置捕捉 - 打开或关闭捕捉)
    • [2 配置捕捉 - 应用程序捕捉模式](#2 配置捕捉 - 应用程序捕捉模式)
    • [3 配置捕捉 - 图层捕捉可捕捉性](#3 配置捕捉 - 图层捕捉可捕捉性)
    • [4 配置捕捉 - 图层捕捉模式](#4 配置捕捉 - 图层捕捉模式)
    • [5 配置捕捉 - 组合示例](#5 配置捕捉 - 组合示例)
    • [6 捕捉选项](#6 捕捉选项)

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 配置捕捉 - 打开或关闭捕捉

csharp 复制代码
// 启用捕捉
ArcGIS.Desktop.Mapping.Snapping.IsEnabled = true;

// 禁用捕捉
ArcGIS.Desktop.Mapping.Snapping.IsEnabled = false;

2 配置捕捉 - 应用程序捕捉模式

csharp 复制代码
// 仅设置点和边捕捉模式,清除其他所有模式
// 在 2.x 版本中 - ArcGIS.Desktop.Mapping.Snapping.SetSnapModes(SnapMode.Point, SnapMode.Edge);
ArcGIS.Desktop.Mapping.Snapping.SetSnapModes(
  new List<SnapMode>() { SnapMode.Point, SnapMode.Edge });

// 清除所有捕捉模式
// 在 2.x 版本中 - ArcGIS.Desktop.Mapping.Snapping.SetSnapModes();
ArcGIS.Desktop.Mapping.Snapping.SetSnapModes(null);

// 一次设置一个捕捉模式
ArcGIS.Desktop.Mapping.Snapping.SetSnapMode(SnapMode.Edge, true);
ArcGIS.Desktop.Mapping.Snapping.SetSnapMode(SnapMode.End, true);
ArcGIS.Desktop.Mapping.Snapping.SetSnapMode(SnapMode.Intersection, true);

// 获取当前捕捉模式
var snapModes = ArcGIS.Desktop.Mapping.Snapping.SnapModes;

// 获取特定捕捉模式的状态
bool isOn = ArcGIS.Desktop.Mapping.Snapping.GetSnapMode(SnapMode.Vertex);

3 配置捕捉 - 图层捕捉可捕捉性

csharp 复制代码
// 图层是否可捕捉?
bool isSnappable = fLayer.IsSnappable;

// 设置特定图层的可捕捉性 - 需要在 MCT 上运行
await QueuedTask.Run(() =>
                     {
                         // 使用扩展方法
                         fLayer.SetSnappable(true);

                         // 或直接使用 CIM
                         //var layerDef = fLayer.GetDefinition() as ArcGIS.Core.CIM.CIMGeoFeatureLayerBase;
                         //layerDef.Snappable = true;
                         //fLayer.SetDefinition(layerDef);
                     });

// 关闭所有图层的可捕捉性
layerList = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>();
await QueuedTask.Run(() =>
                     {
                         foreach (var layer in layerList)
                         {
                             layer.SetSnappable(false);
                         }
                     });

4 配置捕捉 - 图层捕捉模式

csharp 复制代码
layerList = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>();

// 按图层配置
foreach (var layer in layerList)
{
    // 查找图层捕捉模式的状态
    var lsm = ArcGIS.Desktop.Mapping.Snapping.GetLayerSnapModes(layer);
    bool vertexOn = lsm.Vertex;
    // 或使用
    vertexOn = lsm.GetSnapMode(SnapMode.Vertex);

    bool edgeOn = lsm.Edge;
    // 或使用
    edgeOn = lsm.GetSnapMode(SnapMode.Edge);

    bool endOn = lsm.End;
    // 或使用
    endOn = lsm.GetSnapMode(SnapMode.End);

    // 更新一些捕捉模式
    // 关闭顶点捕捉
    lsm.SetSnapMode(SnapMode.Vertex, false);
    // 开启交点捕捉
    lsm.SetSnapMode(SnapMode.Intersection, true);

    // 并设置回图层
    ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layer, lsm);

    // 一次分配一个捕捉模式
    ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layer, SnapMode.Vertex, false);

    // 打开所有捕捉模式
    ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layer, true);
    // 关闭所有捕捉模式
    ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layer, false);
}

// 为一组图层配置

// 为一组图层设置顶点、边、结束捕捉,其他捕捉模式为 false
var vee = new LayerSnapModes(false);
vee.Vertex = true;
vee.Edge = true;
vee.End = true;
ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layerList, vee);

// 确保一组图层的交点捕捉开启而不更改其他任何捕捉模式

// 获取一组图层的捕捉模式
var dictLSM = ArcGIS.Desktop.Mapping.Snapping.GetLayerSnapModes(layerList);
foreach (var layer in dictLSM.Keys)
{
    var lsm = dictLSM[layer];
    lsm.Intersection = true;
}
ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(dictLSM);

// 为一组图层关闭所有捕捉模式
ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(layerList, false);

5 配置捕捉 - 组合示例

csharp 复制代码
// 仅对特定感兴趣的图层的顶点进行捕捉,而不对其他图层的顶点进行捕捉
// 所有其他捕捉模式应关闭。

// 必须启用捕捉
ArcGIS.Desktop.Mapping.Snapping.IsEnabled = true;

// 关闭所有应用程序捕捉模式
// 在 2.x 版本中 - ArcGIS.Desktop.Mapping.Snapping.SetSnapModes();
ArcGIS.Desktop.Mapping.Snapping.SetSnapModes(null);

// 设置应用程序捕捉模式顶点开启
ArcGIS.Desktop.Mapping.Snapping.SetSnapMode(SnapMode.Vertex, true);

// 确保图层捕捉开启
await QueuedTask.Run(() =>
{
  fLayer.SetSnappable(true);
});

// 仅设置顶点捕捉
var vertexOnly = new LayerSnapModes(false);
vertexOnly.Vertex = true;

// 仅对特定图层设置顶点捕捉,清除其他所有捕捉模式
var dict = new Dictionary<Layer, LayerSnapModes>();
dict.Add(fLayer, vertexOnly);
ArcGIS.Desktop.Mapping.Snapping.SetLayerSnapModes(dict, true);  // true = 重置其他图层

6 捕捉选项

csharp 复制代码
//通过 get/set 选项设置捕捉选项
var snapOptions = ArcGIS.Desktop.Mapping.Snapping.GetOptions(myMap);
// 在 2.x 版本中 - snapOptions.SnapToSketchEnabled = true;
snapOptions.IsSnapToSketchEnabled = true;
snapOptions.XYTolerance = 100;
// 在 2.x 版本中 - snapOptions.ZToleranceEnabled = true;
snapOptions.IsZToleranceEnabled = true;
snapOptions.ZTolerance = 0.6;

// 开启捕捉提示显示部分
snapOptions.SnapTipDisplayParts = (int)SnapTipDisplayPart.SnapTipDisplayLayer + (int)SnapTipDisplayPart.SnapTipDisplayType;

// 关闭所有捕捉提示
//snapOptions.SnapTipDisplayParts = (int)SnapTipDisplayPart.SnapTipDisplayNone;

// 仅开启图层显示
//snapOptions.SnapTipDisplayParts = (int)SnapTipDisplayPart.SnapTipDisplayLayer;

// 在 2.x 版本中 - snapOptions.GeometricFeedbackColor = ColorFactory.Instance.RedRGB;
snapOptions.SnapTipColor = ColorFactory.Instance.RedRGB;

ArcGIS.Desktop.Mapping.Snapping.SetOptions(myMap, snapOptions);
相关推荐
布鲁飞丝1 小时前
对 .NET线程 异常退出引发程序崩溃的反思
数据库·c#·.net
SamChan902 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
geovindu2 小时前
CSharp: LogHelper
开发语言·后端·c#·.net
caishenzhibiao2 小时前
顺势捕猎者副图 同花顺期货通指标
java·c语言·c#
YouGIS顽石工坊3 小时前
免费|中国1km分辨率逐月平均气温数据集(1976-2025,50年600期):附Python/Matlab/R读取代码
gis·遥感·平均气温·netcdf·长时间序列·空间数据库·气候数据
明如正午4 小时前
【C#】LINQ_HashSet_BitField解析
c#·linq
脚踏实地皮皮晨4 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
caishenzhibiao4 小时前
市场同步系统 同花顺期货通指标
java·c语言·c#
魔术师Dix5 小时前
StartGame:Unity TDD 外部工程指南
学习·游戏·unity·c#·测试驱动开发
GISBox5 小时前
倾斜摄影逆向反切技术:3DTiles恢复原生OSGB模型全流程
gis·3dtiles·osgb·gisbox·切片转换·倾斜摄影反切