|
各人好,男的们,女的们好。注册论坛很长时间了,作为版主我很愧疚(对不起你啊。。。站长大人),不停没有对这个插件板块作出本身应有的贡献。每次点开这个版面,都是共享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("projectParamName");
</code>
这个实际对插件的开发职员是痛楚的。。。以是我保举使用shared parameter(信任我,没错的),你可以使用guid来得到parameter,快,很准。
<code>
GUID guid = new GUID("{E5E0AE36-D962-43F7-B1B6-2E590D58A1CF}");
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 = "Show parameters in selected Element:";
StringBuilder st = new StringBuilder();
// iterate element's parameters
foreach (Parameter para in element.Parameters)
{
...
}
// Give the user some information
TaskDialog.Show("Revit", 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米,的到的值是"12m",这个单元关联到模板的单元设置。
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("parameter group");
//没找到,就新建一个。
if(sharedGroup == null)
{
sharedGroup = definitionFile.Groups.Create("parameter group");}
</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("parameter name", 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>
<根本上完> |
|