Revit API射线法读取空间中相交的元素
Revit API提供根据射线来寻找经过的元素。方法是固定模式,没什么好说。
关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd - ptStart), view3d)
//射线法寻找穿过的对象
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class FindSupporting : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{ UIApplication app = commandData.Application;
Document doc = app.ActiveUIDocument.Document;
Transaction trans = new Transaction(doc, "ExComm");
trans.Start(); Selection sel = app.ActiveUIDocument.Selection;
//Reference ref1 = sel.PickObject(ObjectType.Element, "Please pick a beam");
//FamilyInstance beam = doc.GetElement(ref1) as FamilyInstance;
Reference ref1 = sel.PickObject(ObjectType.Element, "Please pick a duct");
Duct duct = doc.GetElement(ref1) as Duct; //Read the beam's location line
//LocationCurve lc = beam.Location as LocationCurve;
LocationCurve lc = duct.Location as LocationCurve;
Curve curve = lc.Curve;
//取得线端点的方法
XYZ ptStart = curve.get_EndPoint();
XYZ ptEnd = curve.get_EndPoint(); //move the two point a little bit lower, so the ray can go through the wall
XYZ offset = new XYZ(, , 0.01);//向量偏移的方法,这里向下偏移。
ptStart = ptStart - offset;
ptEnd = ptEnd - offset; View3D view3d = null;
view3d = doc.ActiveView as View3D;
if (view3d == null)
{
TaskDialog.Show("3D view", "current view should be 3D view");
return Result.Failed;
} double beamLen = curve.Length;
//终点-起点就是线的方向。这里是射线法的关键代码。必须在三维视图下。
IList<ReferenceWithContext> references = doc.FindReferencesWithContextByDirection(ptStart, (ptEnd - ptStart), view3d); //ElementSet wallSet = app.Application.Create.NewElementSet(); sel.Elements.Clear();
double tolerate = 0.00001;
foreach (ReferenceWithContext reference in references)
{
Reference ref2 = reference.GetReference();//取得引用
ElementId id = ref2.ElementId;
Element elem = doc.get_Element(id); if (elem is Wall)
{
if (reference.Proximity < (beamLen + tolerate))//Proximity接近,即与射线原点的距离。
{
sel.Elements.Add(elem);
}
}
} trans.Commit(); return Result.Succeeded;
}
}
url:http://greatverve.cnblogs.com/p/FindReferencesWithContextByDirection.html
Revit API射线法读取空间中相交的元素的更多相关文章
- 【转】Revit二次开发——读取cad中的文字信息
Revit读取cad的文字信息需要借助Teigha的开源dll,在程序中添加下图中红色框的dll文件的引用,其他的dll文件全部放在同一个文件夹中即可,运行的时候,会自动把这些dll文件全部复制到bi ...
- 【Revit API】获取链接模型中构件
话不多说,直接代码 var doc = commandData.Application.ActiveUIDocument.Document; FilteredElementCollector link ...
- HBase-scan API 通过scan读取表中数据
直接贴代码啦 /** * * @param zkIp * @param zkPort * @param tablename * @param startRow 传null扫全表 * @param st ...
- WebGL模型拾取——射线法
今天要把WebGL中一个非常重要的算法记录下来——raycaster射线法拾取模型.首先我们来了解一下为什么要做模型拾取,我们在做webgl场景交互的时候经常要选中场景中的某个模型,比如鼠标拖拽旋转, ...
- WebGL和ThreeJs学习6--射线法确定3D空间中所选物体
一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...
- Revit API 判断一个构件在某个视图中的可见性
查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...
- 【Revit API】梁构件支座检查算法
一.前言 应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...
- WebGL模型拾取——射线法二
这篇文章是对射线法raycaster的补充,上一篇文章主要讲的是raycaster射线法拾取模型的原理,而这篇文章着重讲使用射线法要注意的地方.首先我们来看下图. 我来解释一下上图中的originTr ...
- 射线法(1190 - Sleepwalking )
题目:http://lightoj.com/volume_showproblem.php?problem=1190 参考链接:https://blog.csdn.net/gkingzheng/arti ...
随机推荐
- VS 多工程代码编写
VS工作目录,输出目录 C++项目,解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件 ...
- python3迭代器和生成器
1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...
- iptables-25个常用用法【转】
本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇iptables详细教程:基础.架构.清空规则.追加规则.应用实例,看完这篇文章,你就能明白iptables ...
- NEERC Southern Subregional 2011
NEERC Southern Subregional 2011 A - Bonnie and Clyde solution 双指针搞搞就好. 时间复杂度:\(O(n)\) B - Building F ...
- VMware下三种网络连接模式
VMware下三种网络连接模式 Bridged(桥接模式) 在桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一独立的主机,它可以访问该类网段内任何一台机器. 桥接网络环境下需要做到: 手动 ...
- centos 6.8 启动损坏修复实验
前两天遇到了一个问题,centos必须借助CD的启动才能进入系统,当时想着做个测试,这会儿正好有时间,在VMWare里面试试. 思想是这样的,删除boot里面的文件,然后重启看效果. 具体过程如下: ...
- KnockoutJs学习笔记(六)
这篇文章主要涉及control flow部分的binding. foreach binding主要作用于lists或是tables内数据单元的动态绑定.下面是一个简单的例子: js部分: ko.app ...
- T-SQL语句3
一.删除表 1.drop table语句 drop table database_name,schema_name,table_name 2.删除数据表 drop table dbo.t_delete ...
- 【LeetCode】167. Two Sum II - Input array is sorted
Difficulty:easy More:[目录]LeetCode Java实现 Description Given an array of integers that is already sor ...
- Db2与Oracle的区别
这个部分是自己随便整理下. 在工作上需要,公司需要DB2兼容Oracle. 不懂DB2与Oracle的细节,这里努力整理,以后精通了再回来重新修改. https://www.2cto.com/data ...