本文来源:微信公众号
一、前言
前几日深夜对如何获取相交构件及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));
图示如下:
最新文章
政策新闻 | 蓬江区住建局创新“体检式监管” 为工程建设领域高质量发展赋能 政策新闻 | 珠海市商品住房销售价格备案公示表(华发香山湖畔苑1、2栋52套) 政策新闻 | 关于2025年上半年定西市城市建成区黑臭水体自查情况的公示 政策新闻 | 滨州住建局关于2025年第十批建筑业企业资质审查意见的公示 政策新闻 | 聊城:城发公司开展“全国低碳日”节能宣传活动 政策新闻 | 龙海区│市政设施焕新升级,匠心助推品质提升 政策新闻 | 宿迁彭雪枫纪念馆二楼廉政展厅和一楼贵宾接待室内采购及安装新风系统项目招标代理服务成交结果公告 政策新闻 | 广西住建厅关于公布2025年第G18批建筑业企业资质(增项)审查结果的通告 政策新闻 | 德州住建局关于庆云县俊英勘察施工有限公司的勘察设计企业资质核准情况的公告 政策新闻 | 贵州:改造老旧小区4695个 城市更新提升群众“三感”