参考 https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/123991/microstation-v8i-c/376481#376481 此帖最后一条回复的代码
在OBD及OPM中实现射线与元素交点计算的代码。
在OBD中,普通的墙体是可以正确计算交点的,但是对于相同位置的幕墙,样例代码无结果。
将mdlSolid_elementToBody改为mdlSolid_elementToBodyList ,测试结果相同(mdlSolid_elementToBodyList 仅返回一个body)。
在OPM中,管道也同样无结果,改为mdlSolid_elementToBodyList,函数执行失败,无法转为list。
感觉问题出在Body上,请问此类复杂元素应该如何构造body?
请先检查一下OBD中的幕墙和OPM中的管道的元素类型,看是什么类型的。可以用键入命令Analyze Element来打开老使的元素属性对话框来检查。
请分别截图上来供我们分析。或者提供两个DGN文件供我们分析。
OBD版本Update 7,OPM版本 Update 7
OBD.dgn
OPM.dgn
测试的射线为原点,方向为y轴正负向。
递归失败,同样的代码不能遍历第二层,不知道为什么
ElementHandle pipeEH(2426L, ACTIVEMODEL); for (ChildElemIter child(pipeEH); child.IsValid(); child = child.ToNext()) { if (child.GetElementType() == CELL_HEADER_ELM) { MSElementCP childMECP = child.GetElementCP(); ElementHandle childEH(childMECP, ACTIVEMODEL); for (ChildElemIter bottomChild(childEH); bottomChild.IsValid(); bottomChild = bottomChild.ToNext()) { //此循环不进入? MSElementCP bottomChildMECP = bottomChild.GetElementCP(); } } }
代码见上,麻烦帮忙看看哪里有问题
第六行child.GetElementCP()改成调用GetElementDescrCP试试
Answer Verified By: Chao Cheng
可以了,感谢,不同构造函数创建的ElementHandle对象还不一样么。。。
有没有哪个帖子有详细说明这个ElementHandle的?
SDK帮助文档MicroStationApi.chm中就有如下一句话:
它是一个只读的指向任意元素的一个句柄。不同构造函数创建的ElementHandle指向的对象当然是不一样的了。就像我们Windows编程中的窗口句柄HWND(Handle of Window),可以指向任意一个窗口是一个意思的。