乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 106|回复: 9

[综合讨论] [revit二次开发讲座]Revit的参数

[复制链接]

1

主题

21

帖子

20

银币

初来乍到

Rank: 1

铜币
5
发表于 2010-11-16 20:17:50 | 显示全部楼层 |阅读模式
各人好,男的们,女的们好。注册论坛很长时间了,作为版主我很愧疚(对不起你啊。。。站长大人),不停没有对这个插件板块作出本身应有的贡献。每次点开这个版面,都是共享Revit插件的,我猛烈发起再开一个Revit AddIns Store板块,提供各人专门下载插件。
回到我没有贡献的话题,重要是忙。。。太忙了,不外忙是有代价的,向导没有拖欠工资(站长。。。你懂的)。

ok,废话不说了,回到revit二次开发的技能讲座,我是如许想的,先开两个:参数和族。为什么呢,由于Revit起首是一个参数化建模软件,然后是一个以构件为聚集的建模软件,这里的构件在revit里的专业名称是族(e文是family,下文皆称family,由于作为二次开发,我们一样平常使用e文编程。。。)。固然,这是我个人的明确,有贰言,请拍砖。

我们先看看Revit的参数吧,从界面上看revit有两种参数范例-project/family parameter和shared parameter。

进入点:Manage(Tab)->Project Parameters(button)->Project Parameters(Dailog)->Add(button)->Paramter Properties(dialog).
这两种参数的区别:
project parameter:其界说仅存在于项目文件中,但不能在tags里。
shared parameter:其界说存在于一个文本文件,可以在差别的项目和族文件间共享。这个共享的名字可不是白给的,在定制tag族时起到了关联tag中的label和project中模子的参数的作用。

我的观点是只管使用shared parameter,由于它包罗了project parameter全部的内容而且可以使用一个guid来唯一标识,这是project parameter所不及的。我们通常只能通过名字来获取一个element的parameter,如下面代码所示(一样平常的代码都用c#,除非特别声明),但是我们的目标是国际化的族库和国际化的插件,这就意味着参数名字大概不太稳固,被翻译成其他国家的语言,下面的代码仅能对英语国家起作用,于是我们的插件必须对每个国家做一套代码。
<code>
Parameter param = element.get_Parameter(&quot;projectParamName&quot;);
</code>
这个实际对插件的开发职员是痛楚的。。。以是我保举使用shared parameter(信任我,没错的),你可以使用guid来得到parameter,快,很准。
<code>
GUID guid = new GUID(&quot;{E5E0AE36-D962-43F7-B1B6-2E590D58A1CF}&quot;);
Parameter param = element.get_Parameter(guid);
</code>
而且Revit API仅提供shared parameter的创建接口。

我们先来看看怎样从Revit 模子中得到parameter信息,没有parameter的对象,统统都是浮云。。。

1. 检察当前项目文件的parameters。
界面的入口点:Revit->manage(tab)->Settings(Panel)->Project Parameters(button)

API的访问方法:Document.ParameterBindings 属性
通过这个属性,我们可以访问到如上图所示的3个参数。有人大概要问,我的模子里有那么多的参数,这里怎么只有3个。这个标题会引出另一种范例的参数-BuiltInParameter,我们反面再详细阐明。这里列出的3个是用户自行添加的参数。
<code>
BindingMap bindingMap = _dbdocument.ParameterBindings;
// iterate the binding map via iterator.
DefinitionBindingMapIterator itor = bindingMap.ForwardIterator();
while (itor.MoveNext())
{
Definition definition = itor.Key;
Binding binding = bindingMap.get_Item(definition);
}
</code>
我们可以通过Definition的到Parameter的名字,范例(长度,坡度,。。。),参数组等信息,通过Binding可以知道这个parameter 和那些category绑定,即那些category的对象会包罗这个参数。
备注:有童鞋大概喜好通过foreach来访问容器对象,但是对于map来说,我们只能foreach它的内容,即Binding。如许我们就缺少了definition的信息。
<code>
// iterate the binding map via foreach.
foreach (Binding binding in bindingMap)
{
...
}
</code>

2. 从模子对象里得到parameters。
界面入口点:选择一个对象,Revit->Modify|...(Tab)->Properties(Panel)->Properties(button)。

API的访问方法:Element.Parameters 属性
通过这个属性,我们可以得到模子对象的全下属性。
<code>
void GetElementParameterInformation(Document document, Element element)
{
// Format the prompt information string
String prompt = &quot;Show parameters in selected Element:&quot;;
StringBuilder st = new StringBuilder();
// iterate element's parameters
foreach (Parameter para in element.Parameters)
{
...
}
// Give the user some information
TaskDialog.Show(&quot;Revit&quot;, prompt);
}
</code>
假如渴望访问element的某个parameter,怎么办呢。
API提供了4个重载方法。
Element.get_Parameter(BuiltInParameter builtInparameter)
BuiltInParameter是一个摆列范例,枚举了全部的内建参数,Revit并不是全部的族都是可加载的,有些族是内建的体系族,如墙,楼板等,Revit须要为他们界说一些内建的参数。固然对于可加载的族也会有一些内建参数,这个跟创建族的模板有关。遗憾的是我们并没有一个官方文档来形貌,哪些element有哪些内建参数,对于这个只能凭履历,由于内建参数是不能被删除的,以是履历是可靠的。
Element.get_Parameter(Definition definition)
Definition可以通过前面先容的BindingMap得到。说真话这个方法用起来比力贫苦,不如下面先容的直接通过参数名字得到参数。
Element.get_Parameter(Guid guid)
这个方法很紧张,但只对共享参数起作用。以是我常说自界说参数用共享参数。
Element.get_Parameter(String paramName)
不多说,通过参数名得到参数。

得到了Parameter,下面我们看一下怎样对Parameter举行操纵-读,写。这部门比力简单,直接检察资助文档中Parameter范例的接口即可,这里只夸大以下几点:
1. 通过Parameter.AsDouble得到的参数值的单元都是国际标准单元,除了长度单元,在Revit里长度单元是feet。
2. 通过Parameter.AsValueString可以得到带单元的字符串,比方长度为12米,的到的值是&quot;12m&quot;,这个单元关联到模板的单元设置。
3. Parameter.IsShared可以判定一个parameter是共享参数还是别的范例的参数。Parameter.GUID可以的到其guid。
4. (Parameter.Definition as InternalDefintion).BuiltInParameter可以判定一个参数是内建参数还是其他参数。

终于到末了一部门了,怎样创建parameter。这里只先容共享参数的创建。
我们看看怎样在界面上创建shared parameter,并先容相应的API方法。
1. 设置/创建shared parameter文件。 创建shared parameter时,我们须要一个生存shared parameter界说(参数名称,guid等信息)的文本文件。UI入口点:Revit->Manage(tab)->Settings(panel)->Shared Parameters(button)->Edit Shared Parameters(Dialog)。
假如当地硬盘已经有一个shared parameter的界说文件,可以直接指定。
<code>
Autodesk.Revit.ApplicationServices.Application applicaton = ...;  //得到application对象
application.SharedParametersFilename = ...;   //设置界说文件路径。
DefinitionFile sharedDefintionFile = application.OpenSharedParameterFile(); //打开文件,得到界说文件。
</code>
假如当查询的文件不存在时,渴望新建一个shared parameter的界说文件,可以使用如下代码。
<code>
try{
definitionFile = application.OpenSharedParameterFile();
}catch(Exception)  //查询的文件不存在。
{
//新建一个shared parameter的界说文件。
IO.StreamWriter fs = new StreamWriter(application.SharedParametersFilename);
fs.Close();
definitionFile = application.OpenSharedParameterFile();
}
</code>

2. 得到/新建一个parameter group。
<code>
DefinitionGroup sharedGroup = null;
//查找一个名叫parameter group的参数组。
sharedGroup = sharedDefinitionFile.Groups.get_Item(&quot;parameter group&quot;);
//没找到,就新建一个。
if(sharedGroup == null)
{
sharedGroup = definitionFile.Groups.Create(&quot;parameter group&quot;);}
</code>

3. 访问组里的parameter。
<code>
DefinitionsBaseIterator itor = sharedGroup.Defintions.ForwardIterator();
while(itor.MoveNext())
{
ExternalDefinition externalDefinition = itor.Current as ExternalDefinition;
...
}
</code>

4. 创建shared parameter界说。

API提供两个重载函数来创建shared parameter的界说。
Definitions.Create(string name, ParameterType paramType)
Definitions.Create(string name, ParameterType paramType, bool isVisible)
带bool参数的函数是创建一个界面不可见的参数界说,也就是说这个参数假如加到project里去了,用户从界面上是访问不到的。这个功能也是界面上没有的,API独家奉送。假如你须要生存一些本身的数据,可以创建不可见的参数,然后生存起来。
<code>
Definition definition = sharedGroup.Definitions.Create(&quot;parameter name&quot;, ParameterType.Text, true);
</code>

5. 将参数绑定到project里去吧。

绑定一个参数到project里须要注意几点:
project parameter还是shared parameter。对于API来说,只有shared parameter一个选项。
parameter group,这个跟上面界说文件里的group不一样,上面的是用户本身的分组,这个是Revit内建的分组。
Type还是Instance,是范例参数还是实例参数。
Categories,这个参数绑定到哪些category上。
<code>
// 得到须要绑定的category,并插入到一个新的set里。
Category doorsCategory = document.Settings.Categories.get_Item(BuiltInCategory.OST_Doors)
...
CategorySet categories = application.Create.NewCategorySet();
categories.Insert(doorsCategory);
...
// 确定好是Type还是Instance
Binding instanceBinding = application.Create.NewInstanceBinding(categories);
//Binding typeBinding = application.Create.NewTypeBinding(categories);
// 绑定到project里去。
document.ParameterBindings.Insert(definition, instanceBinding, BuiltInParameterGroup.PG_DATA);
</code>


<根本上完>
回复

使用道具 举报

50

主题

502

帖子

457

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
342
发表于 2010-11-16 21:30:18 | 显示全部楼层
大师就是大师,这资料别的地方可找不到!
回复

使用道具 举报

FHK

29

主题

202

帖子

161

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
210
发表于 2010-11-16 23:51:15 | 显示全部楼层
怎么是英文板面啊……汗……
回复

使用道具 举报

7

主题

40

帖子

33

银币

初来乍到

Rank: 1

铜币
35
发表于 2010-11-17 09:01:31 | 显示全部楼层
值得慢慢细看研究学习.收藏先
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2010-11-17 16:04:00 | 显示全部楼层
真给力,老大。
回复

使用道具 举报

5

主题

135

帖子

130

银币

初来乍到

Rank: 1

铜币
26
发表于 2010-11-18 10:14:29 | 显示全部楼层
太强了,学习了!!
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
0
发表于 2010-11-27 11:34:16 | 显示全部楼层
Thank you very much , This is very nice ...
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2010-11-28 13:06:23 | 显示全部楼层
这个我得顶的。
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
0
发表于 2010-12-21 15:18:45 | 显示全部楼层
楼主的境界只能仰止
回复

使用道具 举报

1

主题

21

帖子

20

银币

初来乍到

Rank: 1

铜币
5
发表于 2010-12-21 17:44:16 | 显示全部楼层
呵呵,谢谢捧场。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-24 22:38 , Processed in 0.328036 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表