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. C++单链表反转

    单链表反转笔记: #include<iostream> #include<string.h> using namespace std; struct ListNode { in ...

  2. linux(CentOS7)中安装erlang(20.3)以及rabbitmq(3.7.9)的步骤以及一些注意事项

    首先下载安装包,之后先安装erlang,安装erlang需要很多依赖,所以一步步来: 首先 wxWidgets会报错,这个不是必须的,可以不安装,不影响 然后需要安装一些必须的依赖: yum inst ...

  3. perl6: Proc::Async (new)

    # command with arguments my $proc = Proc::Async.new('whoami'); # subscribe to new output from out an ...

  4. Kafka入门经典教程【转】

    问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有 ...

  5. !!!sql_mode=only_full_group_by配置

    Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoicecer ...

  6. css-实现图标在输入框中显示

    一:JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有 ...

  7. _findfirst和_findnext

    1.首先是_finddata结构体,用于存储文件信息的结构体. 2._findfirst函数:long _findfirst(const char *, struct _finddata_t *); ...

  8. BZOJ 1934 Vote 善意的投票(最小割+二分图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1934 题目大意: 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题 ...

  9. Java编程的逻辑 (1) - 数据和变量

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  10. 使用prometheus抓取k8s的metrics作监控时,cAdvisor和kubelet配置有何差别?

    按网上说法: 目前cAdvisor集成到了kubelet组件内,可以在kubernetes集群中每个启动了kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有容器相关的性能指 ...