Bentley中在.NET下监听元素双击事件

在用C#进行Bentley二次开发的过程中,我们可能有这个需求:希望获取双击的元素,然后响应修改命令。通过查找相关资料,最终实现方式如下。

在继承自 Bentley.MstnPlatformNET.AddIn 的类中,重写 Run 方法,并在此处监听 OnSelectionChanged 事件,从事件参数中可以获取 Action,当 ActionSelectionChangedEventArgs.ActionKind.DoubleClickElement 时,就代表双击的元素。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 该类继承 Bentley.MstnPlatformNET.AddIn

protected override int Run(string[] commandLine)
{
// 其它操作
// ...

// 监听双击鼠标事件,实现修改
this.SelectionChangedEvent += OnSelectionChanged;
return 0;
}

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (e.Action)
{
case SelectionChangedEventArgs.ActionKind.DoubleClickElement:
// 通过 FilePosition 获取元素
var elem = GetElementByFilePosition(e.FilePosition);
// 对元素进行其它操作
break;
default:return;
}
}

// 通过 filePosition 获取 Element
// 采用 COM 接口获取 filePosition 对应的 ElementId
// 然后通过 elementId 获取.NET下的 Element
private Element GetElementByFilePosition (uint filePosition)
{
var app = Utilities.ComApp;
var elemCache = app.ActiveModelReference.GraphicalElementCache;
var index = elemCache.IndexFromFilePosition((int)filePosition);
if (elemCache.IsElementValid(index))
{
var elem = elemCache.GetElement(index);
var longId = elem.ID;
return Session.Instance.GetActiveDgnModel().FindElementById((ElementId)eleId);
}

return null;
}

程序使用了 COM 接口,所以需要的引入 Bentley.MicroStation.dll,COM接口位于 Bentley.MstnPlatformNET.InteropServices 命名空间中。