获取碰撞检查结果


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