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()); } } }