首页 > 其他分享 >Revit二次开发实战04(元素搜集过滤器FilteredElementCollector)

Revit二次开发实战04(元素搜集过滤器FilteredElementCollector)

时间:2023-05-21 21:44:50浏览次数:47  
标签:FilteredElementCollector 04 搜集 uidoc new 二次开发 using Revit

Revit二次开发实战

 

FilteredElementCollector元素搜集过滤器

1、创建搜集器

FilteredElementCollector(Document);搜集文档中所有元素;

FilteredElementCollector(Document,List<ElementId>);在指定id集合中搜集;

FilteredElementCollector(Document,ElementId viewId);在指定视图中搜集;

2、调用过滤函数

OfCategoryId(new ElementId(BuiltInCategory.OST_Doors));

OfCategory(BuiltInCategory.OST_Doors);

OfClass(typeof(Wall));

WherePasses(new RoomFilter());

WherePasses(intersectsFilter);

 

源码

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RevitHello
{
    [Transaction(TransactionMode.Manual)]
    class CElement : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //获取当前UI文档
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            //获取当前文档
            Document doc = uidoc.Document;


            //创建搜集过滤器
            //■构造函数1,搜集文档中所有元素
            FilteredElementCollector collector1 = new FilteredElementCollector(doc);
            //按照类别进行过滤
            FilteredElementCollector filtered1 = collector1.OfCategory(BuiltInCategory.OST_Doors);
            ShowElements(filtered1, uidoc, "filtered1");

            //选择多个对象,并获取其id集合
            var refs = uidoc.Selection.PickObjects(ObjectType.Element);
            List<ElementId> ids = new List<ElementId>();
            refs.ToList().ForEach(r => ids.Add(r.ElementId));
            //■构造函数2,搜集集合中的元素
            FilteredElementCollector collector2 = new FilteredElementCollector(doc, ids);
            //按照类别Id进行过滤 所有的门
            FilteredElementCollector filtered2 = collector2.OfCategoryId(new ElementId(BuiltInCategory.OST_Doors));
            ShowElements(filtered2, uidoc, "filtered2");

            //获取当前文档的当前视图
            View view = uidoc.ActiveView;
            //■构造函数3,搜集视图中的元素
            FilteredElementCollector collector3 = new FilteredElementCollector(doc, view.Id);
            //按照class的Type类型进行过滤
            FilteredElementCollector filtered3 = collector3.OfClass(typeof(Wall));
            ShowElements(filtered3, uidoc, "filtered3");

            FilteredElementCollector collector4 = new FilteredElementCollector(doc);
            List<Room> filtered4 = collector4.WherePasses(new RoomFilter()).Cast<Room>().ToList();
            ShowElements(filtered4, uidoc, "filtered4");

            //获取一个包围盒,并过滤出与该包围盒相交的元素
            var refe = uidoc.Selection.PickObject(ObjectType.Element, new DoorSelectionFilter());
            var ele = doc.GetElement(refe);
            var box = ele.get_BoundingBox(view);
            BoundingBoxIntersectsFilter intersectsFilter = new BoundingBoxIntersectsFilter(new Outline(box.Min, box.Max));
            FilteredElementCollector collector5 = new FilteredElementCollector(doc);
            var filtered5 = collector5.WherePasses(intersectsFilter).ToElements();
            ShowElements(filtered5, uidoc, "filtered5");

            return Result.Succeeded;
        }

        //把输出元素集合信息封装成一个函数
        void ShowElements(IEnumerable<Element> elements, UIDocument uidoc, string title)
        {
          
            StringBuilder sb = new StringBuilder();
            sb.AppendLine($"Count={elements.Count()}");
            List<ElementId> ids = new List<ElementId>();
            elements.ToList().ForEach((e) =>
            {
                sb.AppendLine($"Id={e.Id},Name={e.Name},Category={e.Category.Name}");
                ids.Add(e.Id);
            });
            //高亮显示所有过滤的对象
            uidoc.Selection.SetElementIds(ids);
            //对话框显示所有过滤对象的信息
            TaskDialog.Show(title, sb.ToString());
        }
    }
    class DoorSelectionFilter : ISelectionFilter
    {
        public bool AllowElement(Element elem)
        {
            if (elem.Category.Id.IntegerValue==(int)BuiltInCategory.OST_Doors) return true;
            return false;
        }

        public bool AllowReference(Reference reference, XYZ position)
        {
            return true;
        }
    }
}

 

标签:FilteredElementCollector,04,搜集,uidoc,new,二次开发,using,Revit
From: https://www.cnblogs.com/zhangdezhang/p/17419238.html

相关文章

  • 【CPP0040】list应用测试
    应用STL中的list完成功能测试。设计要求: 定义一个空的list,将用户输入的数组a[10]的10个数插入到list中,在list头部插入数b,用迭代器遍历list并输出其中的元素值。然后将list从大到小排序,删除list尾部的元素,用迭代器遍历list并输出其中的元素值。最后将list清空。#include<iostr......
  • 04-多路选择器
    1.多路选择器组合逻辑是Verilog设计中的一个重要组成部分,从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没有反馈电路组合逻辑电路输出信号的电平变化仅仅与输入信号的电平变化有关,不涉及信号跳变沿的处理......
  • 【代码随想录算法训练营第一天】704. 二分查找、27. 移除元素
    Day1-数组Leetcode704二分查找初解已经不记得二分查找了,遍历找O(n)其实也过了,只是借此复习一下二分,确实快很多。二分的前提条件题目里也都明示了:无重复,(从小到大)排序。我没有用到这个条件,自然时间复杂度高于最优解。看完解答我再看了一眼题目的标题,才知道是考BinarySearch嗯......
  • Dockfile练习一:给ubuntu1804设置Java环境
    [root@mondoopt]#catDockerfile#BaseimageFROMubuntu:18.04#MAINTAINERMAINTAINERzhangjq<[email protected]># 将宿主机的软件包,复制到容器里的/usr/local/src目录下面去ADDjdk-8u321-linux-x64.tar.gz/usr/local/src/# 将上面的容器软件包进行解压,解压到jdk1.8.......
  • Revit二次开发实战03(事务Transaction)
    Revit二次开发实战事务必须首先要启动Start,操作完成后提交事务Commit,如果执行异常,则要执行回滚操作RollBack;可以通过GetStatus获取事务的当前状态,根据事务状态决定程序的走向;事务Transaction是非托管对象,必须手动释放Dispose,或者放到using代码块中,让编译器自动释放;如果要对文......
  • Ubuntu20.04清华版配置以及ROS的安装和rosdep的初始化
    一、配置Linux清华镜像源这里我以 Ubuntu20.04LTS 为例来配置 清华源首先进入清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn)在列表里选择自己的系统,这里我选择的是 Ubuntu,点击后面的问号图案    进入后选择自己的系统版本 20.04LTS 随即文......
  • Revit二次开发实战02(选择对象Selection)
    Revit二次开发实战 Selection主要用于和用户交互,通过用户的选择,设置操作对象,以便进行处理;Selection属于界面操作的范畴,因此位于UIDocument类下面,而不是Document类下面;可以选择一个对象、多个对象、选择点、选择矩形框、框选多个对象等;通过过滤器可以提供一个强大的功能,可以......
  • Revit二次开发实战
    Revit二次开发实战     第一个程序 RevitHello插件安装Revit2019并注册安装、注册教程百度一下;安装VS2019Community安装教程百度一下;安装两个Revit插件RevitLookup和AddInManager;AddInManager.dll、Autodesk.AddInManager.addin、RevitLo......
  • 安装ubuntu22.04.2后的操作
    一、更新系统指令一:sudoapt-getupdate指令二:sudoapt-get-ydist-upgrade指令三:sudoapt-getclean说明:清除更新时下载回来的软件包。指令四:sudoapt-getautoremove说明:自动清除更新后用不到的旧版本文件(例如旧的核心文件)备注:若不及时移除旧核心文件,容易造成/boot空......
  • Revit二次开发 知识点总结(表格)
    Revit二次开发知识点总结(表格) 宏Macro概述宏是一种程序,用来实现重复任务的自动化;宏可以执行一系列预定义的步骤,从而完成特定任务;模块是对宏的分组;实际上是一个编程项目;应用程序级的宏:可以在任何文档中使用,可以自行运行;可以独立于Revit运行;可以向Revit添加工具;......