revit-api - ReInsert_ing doc.ParameterBindings 时 VariesAcrossGroups 丢失?
问题描述
我们的插件在许多元素(包括组中的元素)中维护一些实例参数值。有时最终用户会引入激活未使用类别的数据,因此我们必须更新文档参数绑定,以包含这些类别。但是,当我们调用
doc.ParameterBindings.ReInsert()
我们现有的组内参数值丢失,因为我们的 VariesAcrossGroups 标志被切换回 false?
Revit 打算如何让它工作 - 我们是否应该以不同的方式使用它,而不是触发这个问题?
ReInsert() 需要一个基本的定义参数,并且通常会得到一个 ExternalDefinition 提供。
为了学习,我尝试扫描现有绑定的定义键并匹配它们。这样,我得到了文档的 InternalDefinition,并尝试用它调用 Reinsert(我的希望是,因为它现有的 InternalDefinition DID 包括 VariesAcrossGroups=true,这会有所帮助)。唉,重新插入似乎并不在意。
正如您可能猜到的那样,问题是在 VariesAcrossGroups=False 之后,我的许多实例参数已经相互折叠,因此它们都具有相同的值。鉴于它们是 ID,这不太理想。
我当前(预期)的解决方案是在我更新绑定之前获取所有现有参数值的备份,然后在 binding-update 和 variablesAcrossGroups 恢复为 true 之后,然后检查所有值并重新分配所有参数值破碎的。但正如您可能猜到的那样,这不太理想 - 用户使用我们的插件会非常慢,坦率地说,这似乎是 revitAPI 应该处理的事情,而不是插件开发人员。
我们是不是用错了方法?
我考虑过的一种方法是预先绑定我能想到的所有可能的类别,并且只绑定一次。但我不确定这是可能的。类别本身也很难使用,因为您只能通过将项目文档用作工厂来间接创建它们(即您不能自己创建类别,您只能间接要求文档 - 也许! - 创建一个您要求的类别)。因此,我认为您不能预先绑定所有类别 - 某些类别仅在文档中可用,在您的项目中包含给定的系列/类型之后。
总结一下:首先,我
doc.ParameterBindings.ReInsert()
我的绑定,带有更新的类别。然后,我打电话
InternalDefinition.SetAllowVaryBetweenGroups()
(在确定 IDEF.VariesAcrossGroups 已恢复为 false 之后。)我很想知道在不破坏客户现有数据的情况下执行此操作的最佳方法。
非常感谢您提前。
解决方案
(我不确定我会接受我自己的答案)。我的回答是,在更新文档绑定之前,您可以通过扫描整个 revit 数据库中现有的参数值来避免这个问题。之后,您将 VariesAcrossGroups 重置为其丢失的值。然后,您遍历收集的参数,并验证哪些参数已丢失其原始值,并将它们重置回其预期值。
一个可以加快速度的技巧是您可以检查 Element.GroupId <> -1。也就是说,那些是组成员的元素。您只需要跟踪属于组成员的元素,因为正是那些受此 Revit 错误影响的元素。另一个提示是,您不应该只注意丢失其原始值的参数值。您还必须注意意外获得值但应保持未设置的参数值。
我只是将 FilteredElementCollector 与 WhereElementIsNotElementType() 一起使用。在性能方面,这样做当然很糟糕,但考虑到 Revit 的行为方式,如果您必须向客户发货,我认为没有其他解决方案。
推荐阅读
- typescript - 按顺序在可观察对象中执行
- python - Pandas 中的 .dropna() 问题
- ruby-on-rails - 在不知道文件名的情况下在 rails 公共目录中派生文件的自动化方法
- c# - 如何在 Web 浏览器控件中单击单独的网页元素
- mysql - 如何为 Spring 和 MySql 设置 Kubernetes
- postgresql - 将 postgres 分区添加到现有表
- ffmpeg - 使用 NVENC 的 FFmpeg GPU 10 位 HEVC 编码
- javascript - 当用户错误地将完整的电子邮件地址包含为用户名时,想要从输入中删除“@email.com”
- azure - 使用用户名和密码写入 Azure Blob
- java - 无法使用 MappedByteBuffer 读取块中的文件