revit 二次开发之基于族获得实例

Revit并没有直接开放基于族获取实例元素的过滤器。不过有两个相关的过滤器,一个是FamilySymbolFilter(ElementId familyId),可以基于族ID过滤出所有这个族的族类型,另一个是FamilyInstanceFilter(Document document,ElementId familySymbolId),可以基于族类型ID过滤出所有这个族类型的实例元素。结合使用两者就能基于族获取实例元素,以下为代码:

 1 using System.Text;
 2 using System.Threading.Tasks;
 3 using Autodesk.Revit.DB;
 4 using Autodesk.Revit.UI;
 5 using Autodesk.Revit.ApplicationServices;
 6 using Autodesk.Revit.UI.Selection;
 7 using Autodesk.Revit.Attributes;
 8 using System.Windows.Forms;
 9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Diagnostics;
13 using System.IO;
14
15
16
17 namespace Xincubus
18 {
19  [Transaction(TransactionMode.Manual)]
20     public class TestParameterPass : IExternalCommand
21     {
22         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
23         {
24             UIApplication uiapp = document.Application;
25             Document doc = uiapp.ActiveUIDocument.Document;
26             string test = "";
27             string familyName = "检查井";
28             //收集所有族
29             FilteredElementCollector familiyCollector = new FilteredElementCollector(doc);
30             familiyCollector.OfClass(typeof(Family)).ToElements();
31             ElementId familyID = new ElementId(-1);
32             //寻找特定名称的族
33             foreach (var family in familiyCollector)
34             {
35                 if (family.Name == familyName)
36                 {
37                     familyID = family.Id;
38                 }
39             }
40             if (familyID != new ElementId(-1))
41             {
42                 //收集族类型
43                 familiyCollector = new FilteredElementCollector(doc);
44                 familiyCollector.WherePasses(new FamilySymbolFilter(familyID));
45             }
46             //收集以上族类型的族
47             List<Element> familyInstances = new List<Element>();
48             foreach (var familySymbol in familiyCollector)
49             {
50                 FilteredElementCollector collector = new FilteredElementCollector(doc);
51                 collector.OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType();
52                 collector.WherePasses(new FamilyInstanceFilter(doc, familySymbol.Id));
53                 familyInstances.AddRange(collector);
54             }
55
56
57
58
59
60
61
62
63             test += familyInstances.Count.ToString();
64             MessageBox.Show("项目中共有" + test + "个" + familyName + "的族实例");
65                 return Result.Succeeded;
66         }
67     }
68 }

当然,也可遍历所有收集器中的实例元素,依靠 FamilyInstance.Symbol.Family来筛选出需要的元素。

鉴于FamilyInstanceFilter(Document document,ElementId familySymbolId)是一个慢速过滤器,遍历法应该也满不了多少。

时间: 2024-10-01 02:20:40

revit 二次开发之基于族获得实例的相关文章

Revit二次开发之载入族

载入族 此方法载入族无法覆盖原有族,即若存在相同名称的族则会载入失败 1 Family family = null; //族 2 3 Transaction transaction = new Transaction(document); //事务 4 5 transaction.Start("载入族"); 6 7 bool b = document.LoadFamily(path, out family); //载入族 8 9 if (!b) { MessageBox.Show(&q

Revit二次开发,删除载入的族

Document doc = commandData.Application.ActiveUIDocument.Document; Family family = null; string s = "c:/xxx.rfa"; Transaction tran = new Transaction(doc,"载入族"); tran.Start(); bool b = doc.LoadFamily(s, out family); tran.Commit(); if (b)

Revit二次开发实现BIM盈利(以橄榄山快模为例讲解) 视频讲座下载

应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 由于参与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的讲解, 以非程序员能听懂的方式讲解Revit二次开发.使这些行业领导或负责人能明白Revit二次开发的大概特点,以及其能实现的功能. 便于他们在自己的业务需要Revit插件时,能更好的思考和决策插件项目的立项和推动. 下面是这次讲座的提纲: Revit二次开发纵览,以橄榄山快模为例演示API概念Revit二次开发原理Revit二

踏上Revit二次开发之路 1 准备工作

1 准备工作 工欲善其事,必先利其器.在正式开始之前,我觉得有必要先盘点一下需要准备些什么. 1.1 硬件设备 PC机一台(谢绝Apple). 配置不能太低,至少要i3以上的cpu.4g以上的内存和支持DX11的独立显卡,否则跑不动Revit,建议不低于i5 CPU和8g内存.SSD不是必须品,我敢保证,当你把360.电脑管家和金山毒霸之类装了四五个以后,开机时间肯定会比裸奔的5400转机械硬盘长很多(珍爱生命,远离国产软件全家桶). 1.2 必要软件 1.2.1 64位Windows 7或8操

Revit 二次开发 修改对象的颜色

//修改对象颜色 [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class ChangeColor : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { ChangeElementColor(comm

Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载

应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式解说Revit二次开发.使这些行业领导或负责人能明确Revit二次开发的大概特点,以及其能实现的功能. 便于他们在自己的业务须要Revit插件时,能更好的思考和决策插件项目的立项和推动. 以下是这次讲座的提纲: Revit二次开发纵览,以橄榄山快模为例演示API概念Revit二次开发原理Revit二

Revit 二次开发 自动选中对象

//获取选中对象 [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class setSelectEle : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { SetSelectionElement(co

Revit二次开发基础-在附加模块中添加外部工具选项

想必想投身与Revit二次开发的朋友们可能会出现这样的一种情景,当我们打开自己的revit(2014版本以上)时,点击附加模块,会发现缺少一个外部工具这个按钮!!!是不是Autodesk给你藏起来了,其实还真是! 接下来我就给大家演示下如何在附加模块下添加外部工具这个按钮. 本人使用的是Revit2016,所以以下是以该版本进行演示. 首先我们需要在Autodesk官网下载一个2016版本的SDK,如图所示: 另附网站:http://usa.autodesk.com/adsk/servlet/i

Revit二次开发(一)获取参数

对于Revit的二次开发,基本技能需要Revit熟练使用,C#基本的语法,WPF的使用(MVVM或其他框架的使用),在此基础上进行开发 基本的格式 namespace ClassLibrary2 { [Transaction(TransactionMode.Manual)] public class Class1:IExternalCommand # 外部命令的接口 { public Result Execute(ExternalCommandData commandData, ref stri