我们在Mstn中出图时,通常是要在三维模型中使用Clip元素(如ClipVolume,NamedBoundary等)对模型做一个剪切,然后创建SavedView,最后创建一个Sheet Model,将刚刚创建的SavedView参考到新创建的Sheet Model中。创建的SavedView通常是与一个Clip元素关联起来的,这样在Sheet Model中参考了SavedView以后,看到的就是模型剪切后的效果,我们也可以设置Clip各个部分(Forward、Back、Cut、Outside)的显示样式等。那么我们如何通过程序创建SavedView使之与指定的Clip元素关联呢?Mstn SDK中NamedView类型代表了Mstn中的SavedView,在NamedView下有一个SetViewInfo成员函数,如下所示:
-
在ViewInfo下有一个SetDynamicViewSettings成员函数,如下所示:
这个函数的参数类型为DynamicViewSettingsR,DynamicViewSettings下有一个SetClipBoundElementId成员函数可以设置新创建的NamedView关联的Clip元素,而且在DynamicViewSettings还有如下所示的成员变量可以设置Clip各个部分的显示设置。
我们以NamedBoundary为例,给大家演示具体如实现创建一个跟Clip元素关联的SavedView,如下代码所示:
ElementAgenda eleAgen; SelectionSetManager::GetManager().BuildAgenda(eleAgen); if (eleAgen.GetCount() < 1) return; EditElementHandleR eeh = eleAgen[0]; NamedBoundaryPtr namedptr = NamedBoundary::Create(); namedptr->SetModelRef(ACTIVEMODEL); namedptr->SetName(L"Untitled-1"); namedptr->SetDrawingScale(1.0); namedptr->SetGraphicalElement(eeh); namedptr->Save(); NamedBoundaryGroupPtr boundarygrop = NamedBoundaryGroup::Create(*ISessionMgr::GetActiveDgnModelP(), WString(L"NamedGroupTest"), WString(L"")); boundarygrop->InsertBoundary(namedptr); boundarygrop->WriteToFile(); DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile(); NamedViewPtr namedView = nullptr; NamedViewCollectionCR nvCollect = ISessionMgr::GetActiveDgnFile()->GetNamedViews(); namedView = nvCollect.FindByName(L"Untitled-1", false); if (namedView != NULL) { namedView->DeleteFromFile(); } if (NamedViewStatus::Success != NamedView::Create(namedView, *dgnFile, L"Untitled-1")) { return; } ViewGroupCollectionCR viewGrpCol = dgnFile->GetViewGroups(); ViewGroupP activeViewGrp = viewGrpCol.GetActiveP(); ViewInfoR viewInfo = activeViewGrp->GetViewInfoR(tcb->lstvw); DynamicViewSettingsR dvSetting = viewInfo.GetDynamicViewSettingsR(); dvSetting.SetClipBoundElementId(eeh.GetElementId()); viewInfo.SetDynamicViewSettings(dvSetting); ViewPortInfoCR viewPortInfo = activeViewGrp->GetViewPortInfo(tcb->lstvw); namedView->SetViewInfo(viewInfo); namedView->SetViewPortInfo(viewPortInfo); namedView->SynchViewBoundaryWithClipVolume(ViewBoundarySynchOptions()); namedView->WriteToFile();