首页/技术分享

Revit二次开发教程:获取相交构件及Face重合的判断

发布于:2019-02-18 17:15:53
16910人 分享

本文来源:微信公众号:bimliang   作者:BIMCoder梁老师  更多内容请关注微信公众号



一、前言


       前几日深夜对如何获取相交构件及Face重合的判断做了些探索,也和行内的大佬进行了一定的技术交流,我觉得还是有必要写一写,探讨一下。


二、获取相交构件


       获取相交构件是一件非常可怕的事情,小模型速度还行,当模型大起来之后,如何快速获取一个构件的相交构件是一件比较头疼的事情。有位大佬告诉我,当你追求速度的时候强烈推荐使用BoundingBoxIntersectsFilter(Outline),Outline可以通过将当前构件的BoundingBox进行各方向的延伸来获得:

腿腿教学网-Revit二次开发教程:获取相交构件及Face重合的判断


然后将此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二次开发教程:获取相交构件及Face重合的判断

转载请注明来源本文地址:https://www.tuituisoft/blog/2088.html

上一篇:

Revit二次开发教程:如何对插件进行双数字签名

下一篇:

Revit如何合并空间