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:立方体移动