revit 二次开发之读取参数

Posted Xincubus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)。

 

以上是关于revit 二次开发之读取参数的主要内容,如果未能解决你的问题,请参考以下文章

Revit二次开发——读取cad中的文字信息

Revit二次开发获取参数

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

Revit API二次开发入门,完整学习流程,附源码

Revit二次开发之 视图

Revit二次开发之载入族