Revit除了有內建的參數,還允許用戶自定義參數,分別是:共享參數和項目參數。
對應界面上的菜單分別是"管理->共享參數"和"管理->項目參數"
共享參數被定義在Revit之外的一個共享參數文件(.txt中)。刪掉這個文件,共享參數就會丟失。
程序入口代碼:
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Autodesk.Revit.ApplicationServices.Application revitApp = commandData.Application.ActiveUIDocument.Application.Application; Autodesk.Revit.DB.Document revirDoc = commandData.Application.ActiveUIDocument.Document; TaskDialog.Show("Revit", GetSharInfo(revitApp)); return Result.Succeeded; }
1.獲取共享參數
/// <summary> /// 獲取共享參數信息 /// </summary> /// <param name="commandData"></param> /// <returns></returns> private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { StringBuilder str = new StringBuilder(); DefinitionFile definitionFile = revitApp.OpenSharedParameterFile(); DefinitionGroups groups = definitionFile.Groups; foreach (DefinitionGroup group in groups) { foreach (Definition definition in group.Definitions) { string name = definition.Name; ParameterType type = definition.ParameterType; str.AppendLine(string.Format("{0}---{1}", name, type.ToString())); } } return str.ToString(); }
2.創建共享參數
/// <summary> /// 創建共享參數 /// </summary> /// <param name="commandData"></param> private void CreateSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp, Autodesk.Revit.DB.Document revitDoc) { try { string sharedParametersFilename = @"C:\shared-parameters.txt"; string groupName = "MyGroup"; string definitionName = "MyDefinition"; ParameterType parameterType = ParameterType.Text; CategorySet categorySet = new CategorySet(); Category wallCategory = revitDoc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls); categorySet.Insert(wallCategory); bool instanceParameter = true; BuiltInParameterGroup parameterGroup = BuiltInParameterGroup.PG_DATA; if (!System.IO.File.Exists(sharedParametersFilename)) { try { System.IO.StreamWriter sw = System.IO.File.CreateText(sharedParametersFilename); sw.Close(); } catch (Exception) { throw new Exception(string.Format("Can't create shared parameter file:{0}", sharedParametersFilename)); } } revitApp.SharedParametersFilename = sharedParametersFilename; DefinitionFile definitionFile = revitApp.OpenSharedParameterFile(); if (definitionFile == null) { throw new Exception("Can not open shared parameter file"); } DefinitionGroups groups = definitionFile.Groups; DefinitionGroup group = groups.get_Item(groupName); if (group == null) { group = groups.Create(groupName); } Definition definition = group.Definitions.get_Item(definitionName); if (definition == null) { definition = group.Definitions.Create(new ExternalDefinitionCreationOptions(definitionName, parameterType)); } ElementBinding binding = null; if (instanceParameter) { binding = revitApp.Create.NewInstanceBinding(categorySet); } else { binding = revitApp.Create.NewTypeBinding(categorySet); } bool insertSuccess = revitDoc.ParameterBindings.Insert(definition, binding, parameterGroup); if (!insertSuccess) { throw new Exception("Failed to bind definition to category"); } } catch (Exception ex) { throw ex; } }
3.獲取項目參數(API無法創建項目參數的)
/// <summary> /// 獲取項目參數(API無法創建項目參數) /// </summary> /// <param name="revitDoc"></param> /// <returns></returns> private string GetProjectParam(Autodesk.Revit.DB.Document revitDoc) { StringBuilder strBuild = new StringBuilder(); BindingMap map = revitDoc.ParameterBindings; DefinitionBindingMapIterator dep = map.ForwardIterator(); while (dep.MoveNext()) { Definition definition = dep.Key; string definitionName = definition.Name; ParameterType parameterType = definition.ParameterType; InstanceBinding instanceBinding = dep.Current as InstanceBinding; if (instanceBinding != null) { CategorySet categorySet = instanceBinding.Categories; strBuild.AppendLine(string.Format("Name:{0} Type:{1} CategorySet:{2}", definitionName, parameterType, categorySet.GetType().ToString())); } else { strBuild.AppendLine(string.Format("Name:{0} Type:{1}", definitionName, parameterType)); } } return strBuild.ToString(); }