下载app免费领取会员
本文来源:微信公众号
一、前言
前几日深夜对如何获取相交构件及Face重合的判断做了些探索,也和行内的大佬进行了一定的技术交流,我觉得还是有必要写一写,探讨一下。
二、获取相交构件
获取相交构件是一件非常可怕的事情,小模型速度还行,当模型大起来之后,如何快速获取一个构件的相交构件是一件比较头疼的事情。有位大佬告诉我,当你追求速度的时候强烈推荐使用BoundingBoxIntersectsFilter(Outline),Outline可以通过将当前构件的BoundingBox进行各方向的延伸来获得:
然后将此Outline传入BoundingBoxIntersectsFilter获取相交构件。
那么可不可以使用ElementIntersectSolidFilter去获取周围的相交构件,答案是:不可以!
原因有以下2条:
1. 由于建模人员的水平层次不齐,很多时候相交的东西会画的像贴合一样,并没有产生相交的solid,所以你用SolidFilter是获取不到的;
2. 模型建模本身的要求就是贴合,并不是相交,但是你在分析模型时需要将与之贴合的构件分析进去,用SolidFilter会忽略这些构件。
三、怎么判断两个构件的贴合面
说到两个面是否重合,我觉得是个人都会先想到Face.Intersect(Face)的方法。但是经过实测,这个方法并不靠谱。肉眼观察一模型,发现一个柱子与一块板有一面是相互重合的,但是取相应的面用Face.Intersect(Face)的结果返回的是false。
这里插个题外话,判断两个构件接触(非相交)不能用
var intersect = ExecuteBooleanOperation(solid1, solid2, BooleanOperationsType.Intersect),然后判断Intersect!=null && Intersect.Volumn == 0, 以为这样就能通过Intersect.Faces获取接触面。 这样是不对的。
回到判断接触面的算法,该如何去获取两个构件相应的接触面?另一位大佬和我说,可以使用面的法向去产生一个薄片,厉害厉害:
var curveloops = (f as PlanarFace).
GetEdgesAsCurveLoops().ToList();
Solid tempSolid = GeometryCreationUtilities.
CreateExtrusionGeometry(curveloops,
(f as PlanarFace).FaceNormal,
UnitUtils.ConvertToInternalUnits(0.5, DisplayUnitType.DUT_MILLIMETERS));
图示如下:
本文版权归腿腿教学网及原创作者所有,未经授权,谢绝转载。
下一篇:Revit如何合并空间