ArcGIS Pro SDK (七)编辑 9 使用草图
文章目录
- [ArcGIS Pro SDK (七)编辑 9 使用草图](#ArcGIS Pro SDK (七)编辑 9 使用草图)
-
- [1 切换草图选择模式](#1 切换草图选择模式)
- [2 聆听草图修改事件](#2 聆听草图修改事件)
- [3 收听草图完成前事件并修改草图](#3 收听草图完成前事件并修改草图)
- [4 收听草图完成事件](#4 收听草图完成事件)
- [5 触发草图事件的自定义构造工具](#5 触发草图事件的自定义构造工具)
- [6 自定义自定义草图工具的草图符号](#6 自定义自定义草图工具的草图符号)
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 切换草图选择模式
csharp
//UseSelection = true; (UseSelection 必须在工具构造函数或工具激活中设置为 true)
private bool _inSelMode = false;
public bool IsShiftKey(MapViewKeyEventArgs k)
{
return (k.Key == System.Windows.Input.Key.LeftShift ||
k.Key == System.Windows.Input.Key.RightShift);
}
protected override async void OnToolKeyDown(MapViewKeyEventArgs k)
{
//使用自定义键切换草图选择模式
if (k.Key == System.Windows.Input.Key.W)
{
if (!_inSelMode)
{
k.Handled = true;
// 切换工具到选择模式。
// 如果 UseSelection = true 则保存草图;
if (await ActivateSelectAsync(true))
_inSelMode = true;
}
}
else if (!_inSelMode)
{
// 禁用 Shift 在基类中的效果。
// 将键事件标记为已处理以防止进一步处理
k.Handled = IsShiftKey(k);
}
}
protected override void OnToolKeyUp(MapViewKeyEventArgs k)
{
if (k.Key == System.Windows.Input.Key.W)
{
if (_inSelMode)
{
_inSelMode = false;
k.Handled = true; //处理这个
// 切换回草图模式。如果 UseSelection = true
// 草图将被恢复
ActivateSelectAsync(false);
}
}
else if (_inSelMode)
{
// 禁用 Shift 在基类中的效果。
// 将键事件标记为已处理以防止进一步处理
k.Handled = IsShiftKey(k);
}
}
2 聆听草图修改事件
csharp
// SketchModified 事件由以下工具触发:
// - COTS 构造工具(除注释、尺寸几何类型外),
// - 编辑顶点、重塑、对齐要素
// - 触发 FireSketchEvents = true 的第三方工具
//订阅草图修改事件
//ArcGIS.Desktop.Mapping.Events.SketchModifiedEvent.Subscribe(OnSketchModified);
private void OnSketchModified(ArcGIS.Desktop.Mapping.Events.SketchModifiedEventArgs args)
{
// 如果不是撤销操作
if (!args.IsUndo)
{
// 修改前的草图是什么?
var prevSketch = args.PreviousSketch;
// 当前的草图是什么?
var currentSketch = args.CurrentSketch;
if (currentSketch is Polyline polyline)
{
// 检查线段草图中的当前(最后)顶点
var lastSketchPoint = polyline.Points.Last();
// 对最后一个点进行一些操作
}
}
}
3 收听草图完成前事件并修改草图
csharp
// BeforeSketchCompleted 事件由以下工具触发:
// - COTS 构造工具(除注释、尺寸几何类型外),
// - 编辑顶点、重塑、对齐要素
// - 触发 FireSketchEvents = true 的第三方工具
//订阅草图完成前事件
//ArcGIS.Desktop.Mapping.Events.BeforeSketchCompletedEvent.Subscribe(OnBeforeSketchCompleted);
private Task OnBeforeSketchCompleted(BeforeSketchCompletedEventArgs args)
{
// 从默认表面分配草图 Z 值并设置草图几何
var modifiedSketch = args.MapView.Map.GetZsFromSurfaceAsync(args.Sketch).Result;
args.SetSketchGeometry(modifiedSketch.Geometry);
return Task.CompletedTask;
}
4 收听草图完成事件
csharp
// SketchCompleted 事件由以下工具触发:
// - COTS 构造工具(除注释、尺寸几何类型外),
// - 编辑顶点、重塑、对齐要素
// - 触发 FireSketchEvents = true 的第三方工具
//订阅草图完成事件
//ArcGIS.Desktop.Mapping.Events.SketchCompletedEvent.Subscribe(OnSketchCompleted);
private void OnSketchCompleted(SketchCompletedEventArgs args)
{
// 获取草图
var finalSketch = args.Sketch;
// 对草图进行一些操作 - 例如审计跟踪
}
5 触发草图事件的自定义构造工具
csharp
internal class ConstructionTool1 : MapTool
{
public ConstructionTool1()
{
IsSketchTool = true;
UseSnapping = true;
// 选择要实现的构造工具类型。
// 确保工具在 daml 中正确注册到正确的组件类别类型
SketchType = SketchGeometryType.Line;
// 获取或设置草图是否用于创建要素并应使用 CurrentTemplate。
UsesCurrentTemplate = true;
// 设置 FireSketchEvents 属性为 true
FireSketchEvents = true;
}
// ...
}
6 自定义自定义草图工具的草图符号
csharp
//自定义工具可以更改在绘制新要素时使用的符号。
//可以使用正确的设置方法修改草图段符号和顶点符号。
//这在工具的激活方法中设置。
protected override Task OnToolActivateAsync(bool active)
{
QueuedTask.Run(() =>
{
// 获取当前的草图段符号选项
var segmentOptions = GetSketchSegmentSymbolOptions();
// 修改段符号选项的主颜色和次颜色以及宽度
var deepPurple = new CIMRGBColor();
deepPurple.R = 75;
deepPurple.G = 0;
deepPurple.B = 110;
segmentOptions.PrimaryColor = deepPurple;
segmentOptions.Width = 4;
segmentOptions.HasSecondaryColor = true;
var pink = new CIMRGBColor();
pink.R = 219;
pink.G = 48;
pink.B = 130;
segmentOptions.SecondaryColor = pink;
// 创建一个新的顶点符号选项实例,并使用你想要的值
var vertexOptions = new VertexSymbolOptions(VertexSymbolType.RegularUnselected);
var yellow = new CIMRGBColor();
yellow.R = 255;
yellow.G = 215;
yellow.B = 0;
var purple = new CIMRGBColor();
purple.R = 148;
purple.G = 0;
purple.B = 211;
vertexOptions.AngleRotation = 45;
vertexOptions.Color = yellow;
vertexOptions.MarkerType = VertexMarkerType.Star;
vertexOptions.OutlineColor = purple;
vertexOptions.OutlineWidth = 3;
vertexOptions.Size = 5;
// 设置草图段符号选项的值
SetSketchSegmentSymbolOptions(segmentOptions);
// 使用上面创建的 vertexOptions 实例设置常规未选中顶点的顶点符号选项的值。
SetSketchVertexSymbolOptions(VertexSymbolType.RegularUnselected, vertexOptions);
});
return base.OnToolActivateAsync(active);
}