[MSCE C++] SubEntity对应的TopologyId 值失效

各位老师好,先描述一下我项目的场景:

用LocateSubEntity选择功能选到元素的点,线,面,然后获取这些元素的唯一标识符(类似元素的ElementID)。我的处理方法如下:

Step1:  用GetAcceptedSubEntities() 获取选择的元素 

Step2:  用SolidUtil::TopologyID::IdFromFace(),  用SolidUtil::TopologyID::IdFromEdge(), 用SolidUtil::TopologyID::IdFromFace() 获取FaceId,EdgeId, VertexId

Step3:分别打印出FaceId,EdgeId, VertexId

我实验了一个Cube, 打印出的结果如下:

如图,是一些无意义值。

另外,如果不用TopologyID来获取元素唯一标识符, 还有其他方法吗?

提前感谢

  • 我看您打印的Face是有NodeId和EntityId的呀。一个FaceId是由一个NodeId和一个EntityId组成的。一个EdgeId是由两个相邻的FaceId组成的,一个VertexId是由三个FaceId组成的。



    Answer Verified By: mkt 

  • 多谢符老师 另外还有一个疑问,我做了一个实验,点选Cube上的一个面,然后用GetAcceptedSubEntities()得到的ISubEntityPtr面 用 IsEqual() 函数去和 SolidUtil::GetBodyFaces()在该Cube上得到的ISubEntityPtr面组逐一比较,发现没有一个面是相等的。按照预期结果,应该是有一个是相等的。  想知道问题是出在 GetAcceptedSubEntities() 还是 IsEqual()?

  • LocateSubEntityTool派生于ElementGraphicsTool,在ElementGraphicsTool中为了加快实体的操作速度(避免反复从模型中取得实体往ParaSolid空间转换)引入了一个缓存机制,有可能是这个机制导致的。即GetAcceptedSubEntities()获得的是缓存的那个实体中的数据,而GetBodyFaces获得的是真实实体的数据。

    当然这只是我的推测。还没有用代码去验证。



  • 多谢符老师,其实我主要是想得到鼠标选择的面的唯一索引值。

    //选择面索引
    bvector<FaceId> SelectFacesId;

    SelectFacesId.resize(GetAcceptedSubEntities().size());

    for (int i = 0; i < (int)GetAcceptedSubEntities().size(); i++) {
    printf("select face status : %d\n", SolidUtil::TopologyID::IdFromFace(SelectFacesId[i], *GetAcceptedSubEntities()[i], true));

    printf("[SELECTFACE] NodeId: %u EntityId: %u\n", SelectFacesId[i].nodeId, SelectFacesId[i].entityId);
    }

    发现IdFromFace返回值Bentley Status为 "BSIERROR",  因此无法用这种方法获取点选的面的FacesId。

    想请教一下,这个问题是否有可能解决,或者是否有别的替换方法?

  • 我对SDK中的例子C:\Program Files\Bentley\MicroStationCONNECTSDK\examples\Elements\exampleSolids\exampleModifyFaceTool.cpp做了如下修改。红色框中的内容是我添加的。

    然后编译后MDL LOAD exampleSolids,再键入命令Example Face Offset,此时选中一个体的面,就能打印出该面对应的nodeId和entityId。下图是我执行了三次后的结果。