首页 > 解决方案 > 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-api

解决方案


(我不确定我会接受我自己的答案)。我的回答是,在更新文档绑定之前,您可以通过扫描整个 revit 数据库中现有的参数值来避免这个问题。之后,您将 VariesAcrossGroups 重置为其丢失的值。然后,您遍历收集的参数,并验证哪些参数已丢失其原始值,并将它们重置回其预期值。

一个可以加快速度的技巧是您可以检查 Element.GroupId <> -1。也就是说,那些是组成员的元素。您只需要跟踪属于组成员的元素,因为正是那些受此 Revit 错误影响的元素。另一个提示是,您不应该只注意丢失其原始值的参数值。您还必须注意意外获得值但应保持未设置的参数值。

我只是将 FilteredElementCollector 与 WhereElementIsNotElementType() 一起使用。在性能方面,这样做当然很糟糕,但考虑到 Revit 的行为方式,如果您必须向客户发货,我认为没有其他解决方案。


推荐阅读