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 ...
随机推荐
- Expression Tree Build
The structure of Expression Tree is a binary tree to evaluate certain expressions.All leaves of the ...
- Parameters.Add和Parameters.AddWithValue
因为vs2013没有更新update 5所以Parameters.Add可以用Parameters.AddWithValue赋值无效 更新后可以. Parameters.AddWithValue的底层 ...
- Linux:安装mysql
#install mysql$ rpm -ivh MySQL-client-5.5.28-1.rhel5.x86_64.rpm --nodeps$ rpm -ivh MySQL-server-5.5. ...
- (转)javascript方法--bind()
地址:https://www.cnblogs.com/xxxxBW/p/4914567.html bind方法,顾名思义,就是绑定的意思,到底是怎么绑定然后怎么用呢,下面就来说说我对这个方法的理解. ...
- UE没法远程修改文件
UE没法远程修改文件修改ftp和sftp修改方式都没有作用,考虑可能是防火墙的作用,关闭防火墙可以.于是在控制面板->防火墙->修改策略中将UE的公用网络打开.
- LeetCode(17):电话号码的字母组合
Medium! 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...
- rabbitmq route
AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程 ...
- word2vec 中的数学原理三 背景知识 语言模型
主要参考: word2vec 中的数学原理详解 自己动手写 word2vec
- linux(centos)安装升级ruby
参考文章:http://www.ruby-lang.org/zh_cn/documentation/installation/ 文章给出了不同平台的多种方法.我的是centos,我选择了一个比较简单的 ...
- mybatis中的一点优化问题(数据库连接分开,别名,日志打印)
一:数据的链接 1.目录 2.新建一个db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3308/mybati ...