5.2.1 创建视图
每个视图相当一个窗口,对于视图的创建,平台提供的接口在BPUIFrameWorkUtil
类中,接口为createView
,调用此接口,会返回创建视图基类CFrameWnd
。此时只是创建了一个视口,如果想要在视口中绘制对象,需要同时创建相应的model
,数据装在model
中,然后调用BPViewManager
中的displayModelOnViewPort
,把model
中存的数据显示出来,完成了构件的显示过程。在操作数据的过程中,视图显示不会立即更新,需要调用BPViewManager
中的forceHealImmediate
对视图进行刷新。
示例5-1展示了创建视图的整个过程,包括把需要的model
显示到创建的视图中。
void CreatViewDemo::CreateViewDemo()
{
//获取当前工程
BIMBase::Core::IBPProjectManagerP pProjectManager = BIMBase::Core::BPApplication::getInstance().getProjectManager();
if (pProjectManager == nullptr)
return;
BPProjectP pProject= pProjectManager->getMainProject();
if (pProject== nullptr)
return;
//创建view
CFrameWnd* pView = BIMBase::FrameWork::BPUIFrameWorkUtil::createView();
if (pView == nullptr)
return;
//获取创建view的number
int nNum = BIMBase::FrameWork::BPUIFrameWorkUtil::getViewNumber(pView);
//创建新的model
P3DStatus status;
p3d::Utf8String modelName = "newModel";
p3d::platform::P3DModelType modelType = p3d::platform::P3DModelType::enPhysical;
BIMBase::Core::ModelTreeItemInfo modelTreeItemInfo;
BPModelPtr ptrNewModel = pProject->createNewModel(status, modelName, modelType, true, modelTreeItemInfo);
if (ptrNewModel.isNull())
return;
PModelId modelId = ptrNewModel ->getModelId();
//创建的新model在view中显示
BPViewManager::getInstance().displayModelOnViewPort(modelId , nNum);
}
AutoDoRegisterFunctionsBegin
BPToolsManager::registerFun("createViewDemo", &CreatViewDemo::CreateViewDemo);
AutoDoRegisterFunctionsEnd
代码5-1:创建视图
平台最多可打开8个视窗,每个视窗可以显示不同的model
,通过创建视图实现多视图的功能。平台提供了平铺视图、单视口显示、两视口显示、三视口显示、多视口平铺等功能。
5.2.2 删除视图
平台关闭视图的方式主要通过给平台发送消息来实现。如示例代码5-2所示,根据视图编号拿到对应视图基类,通过调用sendMessage
(WM_CLOSE)来发消息关闭视图及窗口。切记不能用MFC的方法直接Destroy
窗口,这样会导致平台信息没有更新,出现不该出现的问题。
void CloseViewDemo::CloseViewDemo()
{
//获取活跃的view的number
int nNum = BIMBase::FrameWork::BPUIFrameWorkUtil::getActiveViewIndex();
//关闭视图
CFrameWnd* pView = BIMBase::FrameWork::BPUIFrameWorkUtil::getView(nNum);
if (pView != nullptr)
pView->SendMessage(WM_CLOSE); //post message
}
AutoDoRegisterFunctionsBegin
BPToolsManager::registerFun("CloseViewDemo", &CloseViewDemo::CloseViewDemo);
AutoDoRegisterFunctionsEnd
代码5-2:删除视图