[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来获取元素唯一标识符, 还有其他方法吗?

提前感谢

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

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



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

    //选择面索引
    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。下图是我执行了三次后的结果。



  • 符老师,exampleModifyFaceTool这个工具您有没有重写其他函数? 这个工具在我这边运行时,操作无法选中一个具体的面,只能选中一个体。(操作流程不像exampleSubEntityTool,先选一个体使之高亮,再选一个面使之高亮) 于是我鼠标左键选择一个体,再左键,就直接退出工具了。

    按您说的一模一样做,打印出的结果是 ,依然取不到ID值。

    您的工程文件可否上传一下?

    感谢

  • exampleModifyFaceTool这个工具您有没有重写其他函数?

    没有,仅修改了我上面说的内容

    这个工具在我这边运行时,操作无法选中一个具体的面,只能选中一个体。(操作流程不像exampleSubEntityTool,先选一个体使之高亮,再选一个面使之高亮) 于是我鼠标左键选择一个体,再左键,就直接退出工具了。

    不应该呀,这个工具类也是派生于LocateSubEntityTool的呀

    struct          TestModifyFaceTool : LocateSubEntityTool

    你的MSCE版本是最新版的U14吗?

    您的工程文件可否上传一下?

    exampleSolids.zip



  • 符老师,无关乎MS版本,是我之前操作步骤有问题,感谢。 还有一个疑问,我现在对C:\Program Files\Bentley\MicroStationCONNECTSDK\examples\Elements\exampleSolids\exampleSubEntityTool.cpp进行如下修改:

    仅重写红框内的函数体。

    然后左键选中一个元素,左键选中一个面,左键完成操作。 打印如下:

    无法取到FaceID

    想请您帮我看下,是哪一步操作流程有问题? 亦或是GetAcceptedSubEntities()不能放在_OnModifyComplete里使用。