Mstn的视图操作功能中有一个“Fit View”的工具,可以将指定视图中所有显示的元素充满视图显示。但是在设计过程中我们有时会需要专门查看某一个特定元素,我们当然可以选中这个元素,然后使用显示集(Display Set)将其单独显示在视图中,再使用“Fit View”工具使其充满屏幕显示,然后再清除显示集即可。这样操作显然有点过于繁琐了,我们可以通过编程直接将选中的元素充满屏幕显示,如下是我们的测试代码:
void ElementFitToView() { ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (selectset.GetCount() < 1) { return; } DRange3d range; EditElementHandle& eeh = selectset[0]; eeh.GetDisplayHandler()->CalcElementRange(eeh, range, NULL); for (int i = 1; i < selectset.GetCount(); i++) { EditElementHandleR curEeh= selectset[i]; DRange3d curRange; curEeh.GetDisplayHandler()->CalcElementRange(curEeh, curRange, NULL); range.UnionOf(range, curRange); } RotMatrix rotMatrix; mdlRMatrix_fromView(&rotMatrix, tcb->lstvw, FALSE); mdlRMatrix_multiplyPoint(&range.low, &rotMatrix); mdlRMatrix_multiplyPoint(&range.high, &rotMatrix); FitViewOptions fitViewOptions = { 0 }; if (mdlView_fitViewToRange(&range.low, &range.high, &fitViewOptions, tcb->lstvw) == SUCCESS) { mdlView_updateSingle(tcb->lstvw); } }
我们在视图中选中若干元素,再执行这段代码,就会将选中的元素居中并充满显示在当前激活的视图中。在这段代码中我们先获取了一下所有选中元素的包围盒,然后获取了一下当前激活视图的旋转矩阵,将包围盒的两个点变换到视图的坐标系下,最后调用mdlView_fitViewToRange函数,将视图显示设置在这个范围。