元素充满视图


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函数,将视图显示设置在这个范围。