revit 二次开发之读取参数

revit中使用api读取元素的参数主要有两种方法:

1,使用Element.Parameters获得元素所有参数,然后通过遍历参数名找到需要的参数。

我们以读取墙的面积参数为例,代码如下:

 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 namespace Xincubus
16 {
17     [Transaction(TransactionMode.Manual)]
18     public class Test1 : IExternalCommand
19     {
20         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
21         {
22             UIApplication uiapp = document.Application;
23             Document doc = uiapp.ActiveUIDocument.Document;
24             FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
25             wallCollector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls)).WhereElementIsNotElementType();
26             double wallArea = 0;
27             double  wallsArea =0;
28             foreach (Wall wall in wallCollector)
29             {
30                 ParameterSet parameters = wall.Parameters;
31                 foreach (Parameter parameter in parameters)
32                 {
33                     if (parameter.Definition.Name == "面积")
34                     {
35                         wallArea = parameter.AsDouble();
36                         wallsArea = wallsArea+wallArea;
37                     }
38                 }
39             }
40             MessageBox.Show("所有墙面积之和为" + wallsArea.ToString() + "。");
41             return Result.Succeeded;
42         }
43     }
44 }

2.使用Element.get_Parameter()来获得()中限定的参数。

Element.get_Parameter()总共可以通过加载四类参数属性来获得参数值,分别是:

Element.get_Parameter(BuiltInParameter builtInParam)

Element.get_Parameter(string name) (已更改为IList<Parameter> GetParameters(string name) 和LookUpParameter(string name))

Element.get_Parameter(Guid guid)

Element.get_Parameter(Definition definition)

下面分别叙述这四种方法;

①Element.get_Parameter(BuiltInParameter builtInParam)

通过BuiltInParameter来读取参数,首先需要知道参数的BuiltInParameter值,使用look up工具可以找到revit自带参数的BuiltInParameter值,还是以墙的面积参数为例:

可以得到墙的面积参数的BuiltInParameter值为HOST_AREA_COMPUTED,代码如下:

 
 1 [Transaction(TransactionMode.Manual)]
 2     public class Test2 : IExternalCommand
 3     {
 4         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
 5         {
 6             UIApplication uiapp = document.Application;
 7             Document doc = uiapp.ActiveUIDocument.Document;
 8             FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
 9             wallCollector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls)).WhereElementIsNotElementType();
10             double wallArea = 0;
11             double wallsArea = 0;
12             foreach (Wall wall in wallCollector)
13             {
14                 Parameter parameter= wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED);
15                         wallArea = parameter.AsDouble();
16                         wallsArea = wallsArea + wallArea;
17
18
19             }
20             MessageBox.Show("所有墙面积之和为" + wallsArea.ToString() + "。");
21             return Result.Succeeded;
22         }
23     }

②Element.get_Parameter(string name)(原)

Element.get_Parameter(string name),在revit2015之后将此函数一分为二,

Ⅰ,IList<Parameter> GetParameters(string name) ,即通过查找参数名字获得所有名称为name的参数,不举例了。

Ⅱ,LookUpParameter(string name),即通过查找参数名字获得第一个名称为name的参数,同样我们以墙的面积为例:

 1 [Transaction(TransactionMode.Manual)]
 2     public class Test3 : IExternalCommand
 3     {
 4         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
 5         {
 6             UIApplication uiapp = document.Application;
 7             Document doc = uiapp.ActiveUIDocument.Document;
 8             FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
 9             wallCollector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls)).WhereElementIsNotElementType();
10             double wallArea = 0;
11             double wallsArea = 0;
12             string parameterName = "面积";
13             foreach (Wall wall in wallCollector)
14             {
15                 Parameter parameter = wall.LookupParameter(parameterName);
16                 wallArea = parameter.AsDouble();
17                 wallsArea = wallsArea + wallArea;
18             }
19             MessageBox.Show("所有墙面积之和为" + wallsArea.ToString() + "。");
20             return Result.Succeeded;
21         }
22     }

③Element.get_Parameter(Guid guid)

通过Guid来读取参数,Guid的值在创建共享参数的TXT文件中。

事实上TXT文件中还有一个Group值以及Name关系到下一种方法,在此截图说明:

通过Guid获得的参数不能是revit自带的参数,只能是后期添加的共享参数(Definition亦是如此),我们以上述截图中创建的“测试”参数为例,通过Guid获得参数的的示例代码如下:

 1  [Transaction(TransactionMode.Manual)]
 2     public class Test4 : IExternalCommand
 3     {
 4         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
 5         {
 6             UIApplication uiapp = document.Application;
 7             Document doc = uiapp.ActiveUIDocument.Document;
 8             FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
 9             wallCollector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls)).WhereElementIsNotElementType();
10             string walltest = "";
11             string wallstest = "";
12             Guid guid = new Guid ("cca4f606-7bd5-413f-97f3-68b9689c5e9b");
13             foreach (Wall wall in wallCollector)
14             {
15                 Parameter parameter = wall.get_Parameter(guid);
16                 walltest = parameter.AsString();
17                 wallstest= wallstest + walltest+"\n";
18             }
19             MessageBox.Show("所有墙的测试参数值分别为" + wallstest );
20             return Result.Succeeded;
21         }
22     }

④Element.get_Parameter(Definition definition)

Element.get_Parameter(Definition definition)同样只能获得共享参数,且方法相对繁琐,需要创建Definition文件,建议通过api创建共享参数的可以使用此方法。同样以“测试”为例,代码如下:

 1  [Transaction(TransactionMode.Manual)]
 2     public class Test5: IExternalCommand
 3     {
 4         public Result Execute(ExternalCommandData document, ref string message, ElementSet elements)
 5         {
 6             UIApplication uiapp = document.Application;
 7             Document doc = uiapp.ActiveUIDocument.Document;
 8             FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
 9             wallCollector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls)).WhereElementIsNotElementType();
10             string walltest = "";
11             string wallstest = "";
12             Autodesk.Revit.ApplicationServices.Application app = document.Application.Application;
13             app.SharedParametersFilename = @"C:\Users\xincubus\Desktop\test.txt";
14             DefinitionFile definitionFile = app.OpenSharedParameterFile();
15             DefinitionGroup group = definitionFile.Groups.get_Item("wall");
16             Definition definition = group.Definitions.get_Item("测试");
17             foreach (Wall wall in wallCollector)
18             {
19                 Parameter parameter = wall.get_Parameter(definition);
20                 walltest = parameter.AsString();
21                 wallstest = wallstest + walltest + "\n";
22             }
23             MessageBox.Show("所有墙的测试参数值分别为" + wallstest);
24             return Result.Succeeded;
25         }
26     }

以上一共有6种方法,

Element.Parameters遍历法速度最慢,不推荐使用。

Element.get_Parameter(BuiltInParameter builtInParam) 速度最快,但是共享参数无法光靠此函数获得,因为所有共享参数的BuiltInParameter 值均为INVALID,推荐需获得revit自带参数的时候使用。

IList<Parameter> GetParameters(string name) 和LookUpParameter(string name)速度比Element.get_Parameter(BuiltInParameter builtInParam)、Element.get_Parameter(Guid guid)和Element.get_Parameter(Definition definition)都慢,但比Element.Parameters快,建议在特殊情况下使用。

Element.get_Parameter(Guid guid)和Element.get_Parameter(Definition definition)速度相似,且都是用于共享参数的,我个人比较喜欢事先将共享参数TXT文件先创建好,然后使用Element.get_Parameter(Guid guid);倘若读者是通过api创建共享参数TXT文件的,由于事先已经定义了Definition变量,可以选择Element.get_Parameter(Definition definition)。

时间: 2024-12-09 12:33:00

revit 二次开发之读取参数的相关文章

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

Revit二次开发之十六 IExportContext的使用

如何将revit文件进行数据导出和数据转换,是非常重要的问题,是解决我们如何将revit的数据解析为我们自己的数据,在revit的二次开发中,给我们提供IExportContext接口.当前接口可用户模型轻量化导出.自定义格式导出等. 当前接口在数据导出中,执行如下的顺序: 通过以上的导出,可以将revit的信息全部导出为需要的数据格式. 原文地址:https://www.cnblogs.com/minhost/p/12005635.html