如何将共享参数绑定到类型和实例的元素



Using Revit 2018.1 API。我以编程方式创建一个共享参数。这很有效。我还可以将该参数绑定到不同的元素类型(类别(,如窗户或门。但是,一旦完成,我很难创建一个新的绑定,例如一个不是家庭类型的房间,并且应该绑定到实例

我有一些有人提供给我的代码。我相信创建共享参数的部分,或者按名称找到共享参数并为类别创建绑定的部分来自一些最佳实践。帮助参数.cs。

//this code is all about finding a parameter
Application app = doc.Application;
DefinitionBindingMapIterator iterator = doc.ParameterBindings.ForwardIterator();
while (iterator.MoveNext())
{
Definition definition = iterator.Key;
if (paramName.Equals(definition.Name, StringComparison.CurrentCultureIgnoreCase))
{
ElementBinding elementBinding = (ElementBinding)iterator.Current;
CategorySet categorySet = elementBinding.Categories;
if (elementBinding.Categories.Contains(elementCategory))
{
if (paramType != definition.ParameterType)
{
return BindSharedParamResult.eWrongParamType;
}
var bindingType = elementBinding.GetType();
if ((instanceBinding && bindingType == typeof(InstanceBinding)) || (!instanceBinding && bindingType == typeof(TypeBinding)))
{
return BindSharedParamResult.eAlreadyBound;
}
}
if (!categorySet.Contains(elementCategory))
{
//HK this is the original code that was in the if (!categorySet.Contains(elementCategory)) above
elementBinding.Categories.Insert(elementCategory);
if (doc.ParameterBindings.ReInsert(definition, elementBinding))
{
return BindSharedParamResult.eSuccessfullyBound;
}
else
{
WriteToLog("BindSharedParam unable to update category for " + definition.Name);
return BindSharedParamResult.eFailed;
}
}
return BindSharedParamResult.eAlreadyBound;
}
//This code shows how to create new binding for an element category
CategorySet categorySet = app.Create.NewCategorySet();
categorySet.Insert(elementCategory);
Binding newBinding = null;
if (instanceBinding)
{
newBinding = app.Create.NewInstanceBinding(categorySet);
}
else
{
newBinding = app.Create.NewTypeBinding(categorySet);
}
//HK insert success
var inserted = doc.ParameterBindings.Insert(definition, newBinding);
if (inserted)
{
return BindSharedParamResult.eSuccessfullyBound;
}
}

如果我有一个想要创建的参数。我有将创建共享参数 (SP( 的代码。那行得通。此外,如果尝试按名称查找参数的代码的第一部分第一次找不到参数,并且将在代码的第二部分为类型或实例创建一个新绑定,具体取决于此代码所在的函数的输入参数 (bool instanceBinding(。

因此,如果第一个元素类别是Windows。 将创建 SP,以及类型为"NewTypeBinding"的新绑定。 一切正常。如果我随后尝试将同一 SP 绑定到另一种类型(如门(,则参数将按名称找到,但是元素绑定的类型是"类型"而不是实例。在门的情况下,这是有效的,并且参数将被绑定。 然后,我将尝试对房间元素类别执行相同的操作。现在这不是族类型,因此它没有类型信息,只有实例。代码将找到相同的参数,通过代码正常流程,但由于唯一可用的绑定元素是类型,因此在尝试绑定(插入(参数时会出现异常

我已经尝试了一些标志和测试,以检查参数(bool instanceBinding(是否与我们迭代的ParameterBinding的ElementBinding类型不同。通过这样做,我可以强制代码执行转到代码的第二部分,然后尝试创建类型为"实例"的新出价。这是行不通的。 插入的变量 = 文档。ParameterBindings.Insert(definition, newBinding(; 插入为"假"。

相反的情况也会发生。如果我从"房间"开始,则第一个绑定将是实例类型。但是,由于类型可以具有实例,因此代码执行不会失败,并且类型将在实例级别具有参数。

有没有办法能够使用一个共享参数并将其绑定到类型和实例???

我相信不是。共享参数绑定到类型或实例,而不是同时绑定两者。

最新更新