原理就是,先从梁的LocationCurve上取点,然后向板的上表面投影。如果有投影点,再从投影点(板上)向梁的底面投影,这时候如果有投影点的话就能得到距离了。

运用该分析的第一条件是梁是在板的上方,勿忘哈!

  1. var beamBottomFaces = FaceUtils.GetBottomFaces(beam); //这个方法是自己封装的
  2. if (null != beamBottomFaces && beamBottomFaces.Any())
  3. {
  4. var beamLocationCurve = beam.Location as LocationCurve;
  5. var beamCurve = beamLocationCurve.Curve;
  6. if (beamCurve != null)
  7. {
  8. if (beamCurve is Line)
  9. {
  10. beamCurve = GetExtLocationCurve(beamCurve); //如果LocationCurve是Line,最好做个延伸算法来延长,不然有些梁因为扣减的话,locationCurve容易缺少一部分
  11. }
  12. var beamPoints = GetPoints(beamCurve, pointRange); //pointRange是取点间隔
  13. if (beamPoints != null && beamPoints.Any())
  14. {
  15. var floorDataList = GetBeamFloorsPairCore(beamBottomFaces, beamPoints, floors); //floors为建筑板
  16. }
  17. }
  18. }

LocationCurve的延伸:

  1. private Curve GetExtLocationCurve(Curve curve)
  2. {
  3. XYZ dir0 = XYZ.Zero;
  4. XYZ dir1 = XYZ.Zero;
  5. if (curve is Line)
  6. {
  7. dir0 = (curve as Line).Direction.Negate();
  8. dir1 = (curve as Line).Direction;
  9. }
  10. Curve extCurve = Line.CreateBound(curve.GetEndPoint() + 1E3 * dir0, curve.GetEndPoint() + 1E3 * dir1);
  11. return extCurve;
  12. }

在Curve上按PointRange选取点位:

  1. private List<XYZ> GetPoints(Curve curve, double pointRange)
  2. {
  3. var points = new List<XYZ>();
  4. var beamLength = curve.Length;
  5. var pointsNumber = beamLength % pointRange == ? ((beamLength / pointRange) - ) : Math.Floor((beamLength / pointRange));
  6.  
  7. for(var i = ; i <= pointsNumber; i++)
  8. {
  9. var point = curve.Evaluate(pointRange * i, false);
  10. points.Add(point);
  11. }
  12. return points;
  13. }

获取距离:

  1. private List<KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>> GetBeamFloorsPairCore(List<PlanarFace> beamBottomFaces, IEnumerable<XYZ> beamPoints, List<Element> floors)
  2. {
  3. var floorDataList = new List<KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>>();
  4. //寻找每一块结构梁下的板
  5. foreach (var floor in constructionFloors)
  6. {
  7. //获取该板的最上点坐标
  8. var floorTopFaces = FaceUtils.GetTopFaces(floor);
  9. if (null != floorTopFaces && floorTopFaces.Any())
  10. {
  11. var defaultFloorOriginZ = floorTopFaces.FirstOrDefault().Origin.Z;
  12. foreach (var tf in floorTopFaces)
  13. {
  14. var originZ = tf.Origin.Z;
  15. if (defaultFloorOriginZ <= originZ)
  16. {
  17. defaultFloorOriginZ = originZ;
  18. }
  19. }
  20.  
  21. var defaultBeamOriginZ = beamBottomFaces.FirstOrDefault().Origin.Z;
  22. foreach (var bf in beamBottomFaces)
  23. {
  24. var originZ = bf.Origin.Z;
  25. if (defaultBeamOriginZ >= originZ)
  26. {
  27. defaultBeamOriginZ = originZ;
  28. }
  29. }
  30. //板在梁下面
  31. var isLower = defaultFloorOriginZ < defaultBeamOriginZ;
  32.  
  33. if (isLower)
  34. {
  35. var datalist = new List<KeyValuePair<XYZ, double>>();
  36. //梁上一点能投影到板上
  37. foreach (var point in beamPoints)
  38. {
  39. foreach (var tf in floorTopFaces)
  40. {
  41. var isProject = tf.Project(point);
  42. if (null != isProject)
  43. {
  44. //投影到板上点的坐标
  45. var projectPoint = isProject.XYZPoint;
  46.  
  47. //投影点到梁上点的距离
  48. foreach (var bf in beamBottomFaces)
  49. {
  50. var bp = bf.Project(projectPoint);
  51. if (null != bp)
  52. {
  53. var distance = bp.Distance;
  54. distance = UnitUtils.ConvertFromInternalUnits(distance, DisplayUnitType.DUT_MILLIMETERS);
  55. distance = Math.Floor(distance);
  56.  
  57. var pointAndDistance = new KeyValuePair<XYZ, double>(projectPoint, distance);
  58. datalist.Add(pointAndDistance);
  59. break;
  60. }
  61. }
  62. }
  63. }
  64. }
  65.  
  66. if (datalist != null && datalist.Any())
  67. {
  68. var floorAndData = new KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>(floor, datalist);
  69. floorDataList.Add(floorAndData);
  70. }
  71. }
  72. }
  73. }
  74. return floorDataList;
  75. }

【Revit API】梁的净高分析的更多相关文章

  1. 【Revit API】梁构件支座检查算法

    一.前言         应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...

  2. Revit API 判断一个构件在某个视图中的可见性

    查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...

  3. Revit API 操作共享参数和项目参数

    1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...

  4. Revit API射线法读取空间中相交的元素

    Revit API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd  ...

  5. Revit API 加载族并生成实例图元

    在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...

  6. 【Revit API】调用Revit内部命令PostableCommand

    Revit内置了一些命令,直接调用Revit操作方式. 可以去API文档查询PostableCommand枚举,还是很多的. 话不多说,直接上代码 var commandId = RevitComma ...

  7. 【Revit API】创建相机视角

    在Revit中有一个相机功能可以以相机视角产生一个视图.一开始我在Revit2016的API文档中找关键词Camera,但是没什么收获. 其实这个相机功能的真正核心是创建透视视图:View3D.Cre ...

  8. Revit API判断是不是柱族模板

    OwnerFamily即族模板.获取类别的方法:Document.Settings.Categories.get_Item(BuiltInCategory.OST_Columns); //判断是不是柱 ...

  9. revit API 生成墙图元

    由于Revit的版本问题,在网上找的生成墙图元的代码,在我机器上的Revit 2016中编译不能通过,通过多次调试,终于找到在revit 2016中使用API生成墙图元的代码,现在贴出来. 下面的代码 ...

随机推荐

  1. python中安装Tensorflow

    执行命令:pip install --upgrade tensorflow 即可.

  2. 【H5】直接拨打电话

    一般<a href="tel:400-663-5999">400-663-5999</a>实现. 而形如<a href="tel:*9204 ...

  3. 20155238 2016-2017-2《Java程序设计》课程总结

    每周作业链接汇总(按顺序) 预备作业1 预备作业2 预备作业3 第一周作业 第二周作业 第三周作业 第四周作业 第五周作业 第六周作业 第七周作业 第八周作业 第九周作业 第十周作业 自认为写得最好一 ...

  4. 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...

  5. vector 去重

    1.使用unique函数: sort(v.begin(),v.end()); v.erase(unique(v.begin(), v.end()), v.end()); //unique()函数将重复 ...

  6. libgdx退出对话框

    package com.fxb.newtest; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; i ...

  7. 使用Python实时获取cmd的输出

    最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...

  8. pycharm 调试 scrapy

    http://blog.csdn.net/shijichao2/article/details/61940931

  9. Alpha阶段_团队分数分配

    小组成员 分数分配 薄霖 74 徐越 65 赵庶宏 65 赵铭 41 武鑫 39 卞忠昊 36 叶能端 30

  10. 2-Seventeenth Scrum Meeting-20151217

    任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码  编写与服务器交互的代码 史烨轩 获取视频url   余帆  本地 ...