OBD自带的Space功能可以根据鼠标指向点自动计算出周围是否有闭合区域
请问此部分的API是否公开?
试一下mdlRegion_floodFill函数。该函数是MS平台的,在OBD中都可以调用的。
经测试,不太理想。
上图红圈处有根柱子,如果把这个柱子加到Chain中,结果有问题。
seedPoint为红X处时,返回红色线圈;黄X处时,返回黄色线圈(我把线圈移出来,方便查看)
不把红圈处柱子加入Chain,则结果正确。
Space布置的算法,这根柱子貌似没影响。
regionTest.dgn
我指出的这个函数仅适合对二维图形执行Flood算法,不适合三维的。OBD中的Space看看有没有专门的API。我会请OBD专家帮助你
我咨询了OBD专家,目前关于这个Space,其实OBD SDK中是提供了API的。但可惜没有例子,也几乎没有什么说明。
API Summary
这些我在tfcdoc.chm里看到了
全部看下来,感觉需要通过上面这两个构造,用线圈来创建?所以提问看下有没有直接的API可以获取闭合线圈。
花了两天时间大致读了一下内部代码,发现想要创建一个Space目前公开的API还相去甚远。内部代码是通过数千行才实现的这种Flood放置。仅仅提取Space的参数目前公开的API都不够,我写了如下代码使用了三个未公开函数和一个未公开头文件才实现。故,目前OBD中的Space编程基本不可行。
#include <tfapi/tfspaceboundary.h> //Copy internal tftransform.h to tfapi folder first, then comment #include<tfentity.h> line #include <tfapi/mdltfspace.fdf> extern "C" StatusInt mdlTFSpaceList_free(TFSpaceList** ppThis); extern "C" StatusInt mdlTFElmdscr_getSpaceNode(MSElementDescrP pThis, TFSpaceList** ppSpaces, MSElementDescrP pDGSource, bool force); extern "C" TFSpace* mdlTFSpaceList_getSpace(TFSpaceList* pThis); /*--------------------------------------------------------------------------------------------- | extractSpace +--------------------------------------------------------------------------------------------*/ void extractSpace() { MSElementDescrP pSpaceEd = NULL; mdlAssoc_getElementDescr (&pSpaceEd, NULL, 14922L, ACTIVEMODEL, false); if (NULL == pSpaceEd) { mdlDialog_dmsgsPrint (L"Can't get space element"); return; } TFSpaceList* pSpaceList = NULL; mdlTFElmdscr_getSpaceNode(pSpaceEd, &pSpaceList, NULL, true); mdlElmdscr_freeAll (&pSpaceEd); pSpaceEd = NULL; if (NULL == pSpaceList) { mdlDialog_dmsgsPrint (L"SpaceList is null"); return; } TFSpace* pSpace = mdlTFSpaceList_getSpace(pSpaceList); double area = mdlTFSpace_getArea(pSpace); double programArea = mdlTFSpace_getProgramArea(pSpace); double sqrtAreaMU, sqrtProgramAreaMU; mdlCnv_UORToMaster (&sqrtAreaMU, sqrt(area), ACTIVEMODEL); mdlCnv_UORToMaster (&sqrtProgramAreaMU, sqrt(programArea), ACTIVEMODEL); WPrintfString wStr(L"Area = %.2f, Program Area=%.2f", sqrtAreaMU*sqrtAreaMU, sqrtProgramAreaMU*sqrtProgramAreaMU); mdlDialog_dmsgsPrint(wStr); mdlTFSpaceList_free(&pSpaceList); pSpaceList = NULL; }
Answer Verified By: Chao Cheng
感谢符工答疑。
看来,需要暂时使用自定义构件来表示房间了。
希望OBD能封装传入点坐标,返回最小闭合线圈的API。