Mstn中的碰撞检查工具可以让我们根据不同的条件(例如层,参考,命名组等)构建两组元素,在这两组元素之间进行碰撞检查,并将检查结果反馈给我们,此工具的用户界面图下所示:
此工具还提供了很多输入选项可以让我们调整碰撞检测的一些条件,例如缝隙,接触公差等。设置好这些条件以后,点击“Process”按钮就可以开始检测了。检测的结果可以在“Results”选项卡中查看,如下图所示:
那么在程序中如何获取这个工具的检查结果呢?在Mstn SDK C#编程框架下有一个WindowManager类型,此类型有一个GetForMicroStation的成员函数可以将Mstn中所有打开的子对话框返回给我们,此函数的原型如下所示:
我们通过这个函数可以获取到碰撞检测工具对应的对话框,由于此对话框是基于.Net的,所以我们可以通过.Net特有的技术获取到此对话框类型的成员变量或者属性。通过这些成员变量或者属性就可以获取到碰撞检测的结果,例如获取发生碰撞的两个元素,具体实现代码如下所示:
var windows = WindowManager.GetForMicroStation().Windows;
foreach (var curWin in windows)
{
DictionaryEntry dictEn = (DictionaryEntry)curWin;
WindowContent winCont = dictEn.Value as WindowContent;
if (winCont.Caption.Contains("Clash Detection"))
{
var curConent = winCont.Content;
var curType = curConent.GetType();
FieldInfo fieldInfo=curType.GetField("m_resultsContentControl", BindingFlags.NonPublic | BindingFlags.Instance);
var resultsContentControl= fieldInfo.GetValue(curConent) as Bentley.ClashDetection.ResultsContentControl;
curType = resultsContentControl.GetType();
fieldInfo = curType.GetField("m_interferencesPanel", BindingFlags.NonPublic | BindingFlags.Instance);
var interferencesPanel=fieldInfo.GetValue(resultsContentControl);
curType = interferencesPanel.GetType();
fieldInfo = curType.GetField("m_clashInstances", BindingFlags.NonPublic | BindingFlags.Instance);
IList<IECInstance> listECInstance= fieldInfo.GetValue(interferencesPanel) as IList<IECInstance>;
foreach (var ccurInstance in listECInstance)
{
PersistentElementPath persisPath = new PersistentElementPath(ccurInstance["ElementA"].StringValue);
Element eleA = persisPath.EvaluateElement(Session.Instance.GetActiveDgnModel());
if (null == eleA)
continue;
persisPath = new PersistentElementPath(ccurInstance["ElementB"].StringValue);
var fileName = eleA.DgnModel.GetDgnFile().GetFileName();
Element eleB = persisPath.EvaluateElement(Session.Instance.GetActiveDgnModel());
}
}
}