BIMBase SDK中对象的编辑主要包括属性、夹点、移动复制等通用编辑操作。本节中主要介绍洞口的属性编辑和立方体的移动操作。

9.3.1 洞口对象属性编辑

在3.2.6节中已详细介绍立方体的属性,洞口属性获取与立方体属性获取相似,但洞口属性修改后需要刷新关联立方体,实现重新开洞,详见示例代码9-7。

#include "pch.h"
#include "MyOpenningPropertyDemo.h"

using namespace DemoObject;

TIErrorStatus MyOpenningPropertyDemo::OnPropertySet(std::vector<BPEntityP> const& refps, int index, PBBimUIPropertyItem const& item)
{
    BPProjectP pProject = BPApplication::getInstance().getProjectManager()->getMainProject();
    if (pProject == nullptr)
        return TIErrorStatus::failed;

    std::vector<IBPObjectPtr> pbObjs;
    for (auto elementRef : refps)
    {
        IBPObjectPtr pbObjPtr = BPObjectExtensionManager::getInstance().getBPObject(*elementRef);
        if (!pbObjPtr.isValid())
            continue;
        pbObjs.push_back(pbObjPtr);
    }

    if (pbObjs.size() < 1)
        return TIErrorStatus::failed;

    for (int indexGj = 0; indexGj < pbObjs.size(); ++indexGj)
    {
        IBPObjectPtr objectPtr = pbObjs.at(indexGj);
        OpenningDemoP pOpenning = dynamic_cast<OpenningDemo*>(objectPtr.get());
        if (pOpenning == nullptr)
            continue;

        switch (index)
        {
        case OpenningPropName::Length:
        {
            int nLen = 0;
            item.getValue(nLen);
            pOpenning->setLength(nLen);
        }
        break;
        case OpenningPropName::Height:
        {
            int nHeight = 0;
            item.getValue(nHeight);
            pOpenning->setHeight(nHeight);
        }
        break;
        default:
            break;
        }
        pOpenning->replaceInProject(*pProject);
        BPDataKeyArray relDataIds;
        BPRelationshipFinder::getRelatedDatasByRelationship(relDataIds, pOpenning->getDataKey(), *pProject, PBM_SCHEMA_Demo, PBM_RELSHIP_CUBEWITHOPENNING);
        for each (auto dataKey in relDataIds)
        {
            BPDataPtr ptrData = BPDataUtil::getDataByKey(dataKey, *pProject);
            if (ptrData == nullptr)
                continue;
            CubeDemoPtr ptrCube = CubeDemo::create(*ptrData);
            if (ptrCube == nullptr)
                continue;

            ptrCube->replaceGraphics(*pProject);
        }
    }
    return TIErrorStatus::succeed;
}


代码9-7:洞口属性

示例代码9-7为洞口属性类中OnPropertySet接口的实现,可以看到在设置了洞口的长或高,并刷新洞口后,需要通过BPRelationshipFinder::getRelatedDatasByRelationship获取洞口关联的立方体对象,并刷新立方体的图素修改开洞大小。洞口属性效果实现如图9-3所示。


图9-3 洞口属性实现效果

9.3.2 立方体对象编辑时联动洞口

本节主要展示在立方体对象移动时相应的修改关联的洞口,立方体移动在3.2节已详细讲解,本节主要体现对关联对象的操作。

void ToolCubeMoveDemo::Move(std::vector<BPEntityPtr> const& refps, GeTransformCR transform)
{
    for (BPEntityPtr refP : refps)
    {
        if (refP.isNull())
            continue;
        BPProjectP pProject = refP->getBPProject();
        if (pProject == nullptr)
            continue;
        //根据传入的BPEntity信息获取对象实例
        BIMBase::Core::BPDataPtr ptrData =BPDataUtil::getDataOnEntity(*refP);
        if (!ptrData.isValid())
            continue;
        DemoObject::CubeDemo pbCube;
        pbCube.initFromData(*ptrData);
        //选中的墙乘以移动的转换矩阵,移动到点击的位置
        pbCube.onTransform(transform);
        //查找关联洞口
        BPDataKeyArray keyArray;
        BPDataKey instanceKey = pbCube.getDataKey();
        BPRelationshipFinder::getRelatedDatasByRelationship(keyArray, instanceKey, *pProject, PBM_SCHEMA_DEMO, PBM_RELSHIP_CUBEWITHOPENNING);
        for each (auto dataKey in keyArray)
        {
            BPDataPtr ptrData = BPDataUtil::getDataByKey(dataKey,*pProject);
            if (ptrData == nullptr)
                continue;
            DemoObject::OpenningDemoPtr ptrOpenning =DemoObject::OpenningDemo::create(*ptrData);
            if (ptrOpenning == nullptr)
                continue;
            //移动洞口
            ptrOpenning->onTransform(transform);ptrOpenning->replaceInProject(*pProject);}//刷新立方
            pbCube.replaceInProject(*pProject);
        }
    }
}

代码9-8:立方体移动

在刷新立方体前,需要通过关联关系找到立方体关联的洞口,对洞口进行移动并刷新洞口。此时,移动立方体时,洞口会跟随移动。