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 ...
随机推荐
- Python 入门基础1 --语言介绍
本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...
- Submatrix Sum
Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return ...
- Space Replacement
Write a method to replace all spaces in a string with %20. The string is given in a characters array ...
- 数组中累加和小于等于k的最长子数组
问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...
- SQL语句导致性能问题
前阵子,突然收到服务器的报警信息,于是上服务器找问题,我擦,top看到mysql占的%cpu高得把我吓尿了 从以上的信息看,相信大家已经可以定位到底是那个程序导致服务器CPU负载过高了,但我们要做的是 ...
- 使用nginx统一代理dashboard,grafana,Prometheus二级目录访问
k8s上的这些管理工具必不可少,可以统一在nginx下的二级目录下. ingress是好,但我们不方便使用内部域名,相信么...:) 一,prometheus改造 在prometheus的deploy ...
- Java第三阶段学习(十、XML学习)
一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...
- linux下如何查看命令的绝对路径
在linux上经常使用ls,grep,vi等命令,如何查看这些命令的绝对路径呢? 通过whereis/which 就可以啦,但是这两个命令之间还是有一些区别.网上查了一下资料,解释如下: which ...
- mybatis中的一点优化问题(数据库连接分开,别名,日志打印)
一:数据的链接 1.目录 2.新建一个db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3308/mybati ...
- ZOJ Monthly, March 2018 题解
[题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...