【Revit API】梁的净高分析
原理就是,先从梁的LocationCurve上取点,然后向板的上表面投影。如果有投影点,再从投影点(板上)向梁的底面投影,这时候如果有投影点的话就能得到距离了。
运用该分析的第一条件是梁是在板的上方,勿忘哈!
- var beamBottomFaces = FaceUtils.GetBottomFaces(beam); //这个方法是自己封装的
- if (null != beamBottomFaces && beamBottomFaces.Any())
- {
- var beamLocationCurve = beam.Location as LocationCurve;
- var beamCurve = beamLocationCurve.Curve;
- if (beamCurve != null)
- {
- if (beamCurve is Line)
- {
- beamCurve = GetExtLocationCurve(beamCurve); //如果LocationCurve是Line,最好做个延伸算法来延长,不然有些梁因为扣减的话,locationCurve容易缺少一部分
- }
- var beamPoints = GetPoints(beamCurve, pointRange); //pointRange是取点间隔
- if (beamPoints != null && beamPoints.Any())
- {
- var floorDataList = GetBeamFloorsPairCore(beamBottomFaces, beamPoints, floors); //floors为建筑板
- }
- }
- }
LocationCurve的延伸:
- private Curve GetExtLocationCurve(Curve curve)
- {
- XYZ dir0 = XYZ.Zero;
- XYZ dir1 = XYZ.Zero;
- if (curve is Line)
- {
- dir0 = (curve as Line).Direction.Negate();
- dir1 = (curve as Line).Direction;
- }
- Curve extCurve = Line.CreateBound(curve.GetEndPoint() + 1E3 * dir0, curve.GetEndPoint() + 1E3 * dir1);
- return extCurve;
- }
在Curve上按PointRange选取点位:
- private List<XYZ> GetPoints(Curve curve, double pointRange)
- {
- var points = new List<XYZ>();
- var beamLength = curve.Length;
- var pointsNumber = beamLength % pointRange == ? ((beamLength / pointRange) - ) : Math.Floor((beamLength / pointRange));
- for(var i = ; i <= pointsNumber; i++)
- {
- var point = curve.Evaluate(pointRange * i, false);
- points.Add(point);
- }
- return points;
- }
获取距离:
- private List<KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>> GetBeamFloorsPairCore(List<PlanarFace> beamBottomFaces, IEnumerable<XYZ> beamPoints, List<Element> floors)
- {
- var floorDataList = new List<KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>>();
- //寻找每一块结构梁下的板
- foreach (var floor in constructionFloors)
- {
- //获取该板的最上点坐标
- var floorTopFaces = FaceUtils.GetTopFaces(floor);
- if (null != floorTopFaces && floorTopFaces.Any())
- {
- var defaultFloorOriginZ = floorTopFaces.FirstOrDefault().Origin.Z;
- foreach (var tf in floorTopFaces)
- {
- var originZ = tf.Origin.Z;
- if (defaultFloorOriginZ <= originZ)
- {
- defaultFloorOriginZ = originZ;
- }
- }
- var defaultBeamOriginZ = beamBottomFaces.FirstOrDefault().Origin.Z;
- foreach (var bf in beamBottomFaces)
- {
- var originZ = bf.Origin.Z;
- if (defaultBeamOriginZ >= originZ)
- {
- defaultBeamOriginZ = originZ;
- }
- }
- //板在梁下面
- var isLower = defaultFloorOriginZ < defaultBeamOriginZ;
- if (isLower)
- {
- var datalist = new List<KeyValuePair<XYZ, double>>();
- //梁上一点能投影到板上
- foreach (var point in beamPoints)
- {
- foreach (var tf in floorTopFaces)
- {
- var isProject = tf.Project(point);
- if (null != isProject)
- {
- //投影到板上点的坐标
- var projectPoint = isProject.XYZPoint;
- //投影点到梁上点的距离
- foreach (var bf in beamBottomFaces)
- {
- var bp = bf.Project(projectPoint);
- if (null != bp)
- {
- var distance = bp.Distance;
- distance = UnitUtils.ConvertFromInternalUnits(distance, DisplayUnitType.DUT_MILLIMETERS);
- distance = Math.Floor(distance);
- var pointAndDistance = new KeyValuePair<XYZ, double>(projectPoint, distance);
- datalist.Add(pointAndDistance);
- break;
- }
- }
- }
- }
- }
- if (datalist != null && datalist.Any())
- {
- var floorAndData = new KeyValuePair<Element, List<KeyValuePair<XYZ, double>>>(floor, datalist);
- floorDataList.Add(floorAndData);
- }
- }
- }
- }
- return floorDataList;
- }
【Revit API】梁的净高分析的更多相关文章
- 【Revit API】梁构件支座检查算法
一.前言 应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...
- Revit API 判断一个构件在某个视图中的可见性
查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...
- Revit API 操作共享参数和项目参数
1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...
- Revit API射线法读取空间中相交的元素
Revit API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd ...
- Revit API 加载族并生成实例图元
在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...
- 【Revit API】调用Revit内部命令PostableCommand
Revit内置了一些命令,直接调用Revit操作方式. 可以去API文档查询PostableCommand枚举,还是很多的. 话不多说,直接上代码 var commandId = RevitComma ...
- 【Revit API】创建相机视角
在Revit中有一个相机功能可以以相机视角产生一个视图.一开始我在Revit2016的API文档中找关键词Camera,但是没什么收获. 其实这个相机功能的真正核心是创建透视视图:View3D.Cre ...
- Revit API判断是不是柱族模板
OwnerFamily即族模板.获取类别的方法:Document.Settings.Categories.get_Item(BuiltInCategory.OST_Columns); //判断是不是柱 ...
- revit API 生成墙图元
由于Revit的版本问题,在网上找的生成墙图元的代码,在我机器上的Revit 2016中编译不能通过,通过多次调试,终于找到在revit 2016中使用API生成墙图元的代码,现在贴出来. 下面的代码 ...
随机推荐
- python中安装Tensorflow
执行命令:pip install --upgrade tensorflow 即可.
- 【H5】直接拨打电话
一般<a href="tel:400-663-5999">400-663-5999</a>实现. 而形如<a href="tel:*9204 ...
- 20155238 2016-2017-2《Java程序设计》课程总结
每周作业链接汇总(按顺序) 预备作业1 预备作业2 预备作业3 第一周作业 第二周作业 第三周作业 第四周作业 第五周作业 第六周作业 第七周作业 第八周作业 第九周作业 第十周作业 自认为写得最好一 ...
- 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现
个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...
- vector 去重
1.使用unique函数: sort(v.begin(),v.end()); v.erase(unique(v.begin(), v.end()), v.end()); //unique()函数将重复 ...
- libgdx退出对话框
package com.fxb.newtest; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; i ...
- 使用Python实时获取cmd的输出
最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...
- pycharm 调试 scrapy
http://blog.csdn.net/shijichao2/article/details/61940931
- Alpha阶段_团队分数分配
小组成员 分数分配 薄霖 74 徐越 65 赵庶宏 65 赵铭 41 武鑫 39 卞忠昊 36 叶能端 30
- 2-Seventeenth Scrum Meeting-20151217
任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作 写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码 编写与服务器交互的代码 史烨轩 获取视频url 余帆 本地 ...