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:删除视图