如何在Revit API中添加前检查共享参数定义是否存在?
Revit共享参数添加前的存在性检查实现方案
问题分析
你的代码目前存在两个核心问题导致无法实现参数存在性检查:
- 每次执行都会删除并重建共享参数文件,既丢失原有参数,也失去了检查基础
- 直接创建参数组和参数,未做任何存在性判断,重复执行会抛出重复定义异常
解决方案代码
using Autodesk.Revit.UI; using Autodesk.Revit.DB; using System.IO; using System.Reflection; public Autodesk.Revit.UI.Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { Transaction transaction = new Transaction(commandData.Application.ActiveUIDocument.Document, "添加共享参数"); try { transaction.Start(); // 获取共享参数文件路径 string path = Assembly.GetExecutingAssembly().Location; int index = path.LastIndexOf("\\"); string newPath = path.Substring(0, index) + "\\TPMechanicalRevitParameters.txt"; Application revitApp = commandData.Application.Application; // 处理共享参数文件:不存在则创建,存在则直接使用 if (!File.Exists(newPath)) { using (FileStream fs = File.Create(newPath)) { } } revitApp.SharedParametersFilename = newPath; // 打开共享参数文件 DefinitionFile parafile = revitApp.OpenSharedParameterFile(); if (parafile == null) { message = "无法打开共享参数文件"; transaction.RollBack(); return Result.Failed; } // 获取目标类别 Category tpCat = commandData.Application.ActiveUIDocument.Document.Settings.Categories.get_Item(BuiltInCategory.OST_FabricationPipework); CategorySet categories = revitApp.Create.NewCategorySet(); categories.Insert(tpCat); InstanceBinding binding = revitApp.Create.NewInstanceBinding(categories); BindingMap bindingMap = commandData.Application.ActiveUIDocument.Document.ParameterBindings; // 1. 检查参数组是否存在,不存在则创建 DefinitionGroup apiGroup = parafile.Groups.get_Item("TpFabricationPipe"); if (apiGroup == null) { apiGroup = parafile.Groups.Create("TpFabricationPipe"); } // 2. 检查"FullFabricationServiceName"参数是否存在,不存在则创建并绑定 bool isVisibleParamExists = false; foreach (Definition def in apiGroup.Definitions) { if (def.Name.Equals("FullFabricationServiceName")) { isVisibleParamExists = true; break; } } if (!isVisibleParamExists) { ExternalDefinitionCreationOptions options1 = new ExternalDefinitionCreationOptions("FullFabricationServiceName", ParameterType.Text); Definition visibleParamDef = apiGroup.Definitions.Create(options1); bindingMap.Insert(visibleParamDef, binding); } // 3. 检查"InvisibleParam"参数是否存在,不存在则创建并绑定 bool isInvisibleParamExists = false; foreach (Definition def in apiGroup.Definitions) { if (def.Name.Equals("InvisibleParam")) { isInvisibleParamExists = true; break; } } if (!isInvisibleParamExists) { ExternalDefinitionCreationOptions options2 = new ExternalDefinitionCreationOptions("InvisibleParam", ParameterType.Text); Definition invisibleParamDef = apiGroup.Definitions.Create(options2); bindingMap.Insert(invisibleParamDef, binding); } transaction.Commit(); return Result.Succeeded; } catch (Exception e) { transaction.RollBack(); message = e.ToString(); return Result.Cancelled; } }
关键实现说明
- 共享参数文件处理:不再强制删除重建,仅在文件不存在时创建,保留原有参数数据
- 参数组检查:通过
parafile.Groups.get_Item()判断目标组是否存在,避免重复创建 - 参数存在性检查:遍历参数组的
Definitions集合,通过参数名称判断是否已存在,仅在不存在时执行创建和绑定操作 - 资源优化:使用
using语句自动释放文件流,避免资源泄漏
内容的提问来源于stack exchange,提问作者nhilson
相关产品推荐
相关产品推荐

