各位老师好,先描述一下我项目的场景:
用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。下图是我执行了三次后的结果。
符老师,exampleModifyFaceTool这个工具您有没有重写其他函数? 这个工具在我这边运行时,操作无法选中一个具体的面,只能选中一个体。(操作流程不像exampleSubEntityTool,先选一个体使之高亮,再选一个面使之高亮) 于是我鼠标左键选择一个体,再左键,就直接退出工具了。
按您说的一模一样做,打印出的结果是,依然取不到ID值。
您的工程文件可否上传一下?
感谢