我们在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();