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射线法读取空间中相交的元素的更多相关文章

  1. 【转】Revit二次开发——读取cad中的文字信息

    Revit读取cad的文字信息需要借助Teigha的开源dll,在程序中添加下图中红色框的dll文件的引用,其他的dll文件全部放在同一个文件夹中即可,运行的时候,会自动把这些dll文件全部复制到bi ...

  2. 【Revit API】获取链接模型中构件

    话不多说,直接代码 var doc = commandData.Application.ActiveUIDocument.Document; FilteredElementCollector link ...

  3. HBase-scan API 通过scan读取表中数据

    直接贴代码啦 /** * * @param zkIp * @param zkPort * @param tablename * @param startRow 传null扫全表 * @param st ...

  4. WebGL模型拾取——射线法

    今天要把WebGL中一个非常重要的算法记录下来——raycaster射线法拾取模型.首先我们来了解一下为什么要做模型拾取,我们在做webgl场景交互的时候经常要选中场景中的某个模型,比如鼠标拖拽旋转, ...

  5. WebGL和ThreeJs学习6--射线法确定3D空间中所选物体

    一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...

  6. Revit API 判断一个构件在某个视图中的可见性

    查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...

  7. 【Revit API】梁构件支座检查算法

    一.前言         应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...

  8. WebGL模型拾取——射线法二

    这篇文章是对射线法raycaster的补充,上一篇文章主要讲的是raycaster射线法拾取模型的原理,而这篇文章着重讲使用射线法要注意的地方.首先我们来看下图. 我来解释一下上图中的originTr ...

  9. 射线法(1190 - Sleepwalking )

    题目:http://lightoj.com/volume_showproblem.php?problem=1190 参考链接:https://blog.csdn.net/gkingzheng/arti ...

随机推荐

  1. Python 入门基础1 --语言介绍

    本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...

  2. Submatrix Sum

    Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return ...

  3. Space Replacement

    Write a method to replace all spaces in a string with %20. The string is given in a characters array ...

  4. 数组中累加和小于等于k的最长子数组

    问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...

  5. SQL语句导致性能问题

    前阵子,突然收到服务器的报警信息,于是上服务器找问题,我擦,top看到mysql占的%cpu高得把我吓尿了 从以上的信息看,相信大家已经可以定位到底是那个程序导致服务器CPU负载过高了,但我们要做的是 ...

  6. 使用nginx统一代理dashboard,grafana,Prometheus二级目录访问

    k8s上的这些管理工具必不可少,可以统一在nginx下的二级目录下. ingress是好,但我们不方便使用内部域名,相信么...:) 一,prometheus改造 在prometheus的deploy ...

  7. Java第三阶段学习(十、XML学习)

    一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...

  8. linux下如何查看命令的绝对路径

    在linux上经常使用ls,grep,vi等命令,如何查看这些命令的绝对路径呢? 通过whereis/which 就可以啦,但是这两个命令之间还是有一些区别.网上查了一下资料,解释如下: which ...

  9. mybatis中的一点优化问题(数据库连接分开,别名,日志打印)

    一:数据的链接 1.目录 2.新建一个db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3308/mybati ...

  10. ZOJ Monthly, March 2018 题解

    [题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...