原理就是,先从梁的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】梁的净高分析的更多相关文章

  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. Android开发四大组件之Service(具体解释篇)

    Android开发之四大组件--Service 一.Service 简单介绍 Service是android系统中的四大组件之中的一个(Activity.Service.BroadcastReceiv ...

  2. MySQL ERROR 1054 的问题

    MySQL 1054错误的情况 在用命令插入数据时提示 1054错误的问题: 这种情况下的解决方法: 是因为引号的问题    ‘  ’  . 字符串应该加上引号,解决问题.如下:

  3. 20155227辜彦霖《基于Cortex-M4的UCOSIII的应用》课程设计个人报告

    20155227辜彦霖<基于Cortex-M4的UCOSIII的应用>课程设计个人报告 一.个人贡献 参与课设题目讨论及完成全过程: 资料收集: 负责主要代码调试: 撰写小组结题报告. 二 ...

  4. 20155311高梓云《网络对抗》逆向及Bof基础

    20155311高梓云<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  5. 《网络对抗》Exp7 网络欺诈防范

    20155336<网络对抗>Exp7 网络欺诈防范 实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 (1分 ...

  6. source insight之quicker.em宏的使用

    source insight有很多宏可以用,这里介绍的宏是quicker.em这个宏,它是华为的一个员工写的,很实用. 1.安装quicker.em宏 一.打开base这个工程Project-> ...

  7. cocos2d-x学习记录3——CCTouch触摸响应

    游戏不同于影音,强交互性是其一大特色,在游戏中主要体现为接受用户的输入并响应.智能手机触摸是其重要的输入方式. 在cocos2d-x中,触摸分为单点触摸和多点触摸. 单点触摸:主要继承CCTarget ...

  8. 微信小程序之授权 wx.authorize

    一. wx.authorize(Object object) 提前向用户发起授权请求.调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口.如果用户之前已 ...

  9. css小技巧::not()选择器的妙用

    比如,要实现下面的效果(例如:一个列表的最后一项没有边框): See the Pen gmrGOV by 杨友存 (@Gavin-YYC) on CodePen. 一般的文档结构如下: <!-- ...

  10. 详解JavaScript中的Event Loop(事件循环)机制

    前言 我们都知道,javascript从诞生之日起就是一门单线程的非阻塞的脚本语言.这是由其最初的用途来决定的:与浏览器交互. 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程 ...