共享参数
从Revit的用户界面可以知道共享参数是被存储在一个文件里面的。如何通过API来对它进行查询和创建,以及应用到具体的构建类型上面呢?
下面是一些关键的API和代码实现。
设置共享参数文件路径
// RevitApp 为你当前代码中的 Autodesk.Revit.ApplicationServices.ControlledApplication
RevitApp.SharedParametersFilename = @"C:\YourDefinitionFile.txt";
读取共享参数信息
// RevitApp 为你当前代码中的 Autodesk.Revit.ApplicationServices.ControlledApplication
DefinitionFile definitionFile = RevitApp.OpenSharedParameterFile();
读取具体内容
- 读取存储共享参数的文件的名称;
- 读取各个分组;
- 读取分组中各个参数的定义。
// 以下代码来自 Revit API 公开文档。
private void ShowDefinitionFileInfo(DefinitionFile myDefinitionFile)
{
StringBuilder fileInformation = new StringBuilder(500);
// 存储共享参数的文件名
fileInformation.AppendLine("File Name: " + myDefinitionFile.Filename);
// 访问所有参数分组
foreach (DefinitionGroup myGroup in myDefinitionFile.Groups)
{
// 得到分组名称
fileInformation.AppendLine("Group Name: " + myGroup.Name);
// 得到分组中的所有定义
foreach (Definition definition in myGroup.Definitions)
{
// 得到定义的名称
fileInformation.AppendLine("Definition Name: " + definition.Name);
}
}
TaskDialog.Show("Revit",fileInformation.ToString());
}
创建共享参数
用在“墙”,这种构建类型上添加共享参数为例:
- 创建一个新的group到共享参数定义文件, 名称为
MyParameters1
; - 创建一个参数定义,
Instance_ProductDate
,到名为MyParameters1
的group; - 创建类别集合用于绑定,把墙这个类别加入;
- 创建
InstanceBinding
; - 得到当前文档的 BingdingMap,并把创建出来的InstanceBinding绑定上去。
// 以下代码来自 Revit API 公开文档。
public bool SetNewParameterToInstanceWall(UIApplication app, DefinitionFile myDefinitionFile)
{
// 创建一个新的group到共享参数定义文件
DefinitionGroups myGroups = myDefinitionFile.Groups;
DefinitionGroup myGroup = myGroups.Create("MyParameters1");
// 创建一个参数定义
ExternalDefinitionCreationOptions option = new ExternalDefinitionCreationOptions("Instance_ProductDate", ParameterType.Text);
// 只读,仅API可以修改
option.UserModifiable = false;
// 设置说明字符串
option.Description = "Wall product date";
// 加入 `MyParameters1` group
Definition myDefinition_ProductDate = myGroup.Definitions.Create(option);
// 创建类别集合用于绑定,把墙这个类别加入
CategorySet myCategories = app.Application.Create.NewCategorySet();
Category myCategory = Category.GetCategory(app.ActiveUIDocument.Document, BuiltInCategory.OST_Walls);
myCategories.Insert(myCategory);
//创建 InstanceBinding
InstanceBinding instanceBinding = app.Application.Create.NewInstanceBinding(myCategories);
// 得到当前文档的 BingdingMap,并把创建出来的InstanceBinding绑定上去
BindingMap bindingMap = app.ActiveUIDocument.Document.ParameterBindings;
bool instanceBindOK = bindingMap.Insert(myDefinition_ProductDate,
instanceBinding, BuiltInParameterGroup.PG_TEXT);
return instanceBindOK;
}