RevitAPI: 设置管件族的连接件的半径属性抛异常 - 如何获取关联族参数

管件族的连接件有一个属性叫“半径”,我们想使用api来修改它的值,直观的做法可能是这样的:

connectorElement.Radius = 0.041;
但是,Radius属性是只读的,编译不过,或者编译过了,但是抛异常。

另外一种做法是使用Parameter:

var radiusPara = connectorElement.get_Parameter(BuiltInParameter.CONNECTOR_RADIUS);
radiusPara.Set(0.041);
然而radiusPara也是只读的,照样会抛出异常。

我知道在界面上也无法直接修改,而是修改它的关联参数,例如下图中,我们修改的是”公称半径“




那么如何通过api获得这个关联参数呢?

下面的代码给出了答案:

var sb = new StringBuilder();
foreach (var connectorPara in connectorElement.GetOrderedParameters())
{
    foreach (FamilyParameter familyPara in doc.FamilyManager.Parameters)
    {
        foreach (Parameter associatedPara in familyPara.AssociatedParameters)
        {
            if (connectorPara.Id == associatedPara.Id && associatedPara.Element.Id == connectorElement.Id)
            {
                //associate parameter found
                sb.AppendLine("'" + associatedPara.Definition.Name + 
                    "(" + (BuiltInParameter)associatedPara.Id.IntegerValue + 
                    ")' <-> '" + familyPara.Definition.Name + "'");
            }
        }
    }
}
TaskDialog td = new TaskDialog("Parameter associations");
td.MainContent = sb.ToString();
td.TitleAutoPrefix = false;
td.Show();
该代码会打印出所有connectorElement的参数和族参数之间的关联关系,代码步骤解释如下:

  1. 调用GetOrderedParameters()获取connectorElement的所有参数,并进行遍历
  2. 通过Document.FamilyManager.Parameters遍历所有的族参数FamilyParameter
  3. 通过FamilyParameter.AssociatedParameters属性获取所有和该族参数关联的元素参数
  4. 遍历所有关联参数,判断connectorElement的参数和关联参数的Id一致,并且对应的Element也是同一个,即找到了关联关系

结果如图:


如此,则设置半径的可以这样做:

  1. 获取连接件半径属性的关联参数
  2. 使用Document.FamilyManager.Set(FamilyParameter, Value)来设置该关联参数

完整代码如下:

var doc = commandData.Application.ActiveUIDocument.Document;
var uiSel = commandData.Application.ActiveUIDocument.Selection;
ConnectorElement connectorElement = null;
try
{
    var reference = uiSel.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Pick a connector");
    connectorElement = doc.GetElement(reference) as ConnectorElement;

    if (connectorElement != null)
    {
        var radiusPara = connectorElement.get_Parameter(BuiltInParameter.CONNECTOR_RADIUS);
        foreach (FamilyParameter familyPara in doc.FamilyManager.Parameters)
        {
            foreach (Parameter associatedPara in familyPara.AssociatedParameters)
            {
                if (radiusPara.Id == associatedPara.Id && associatedPara.Element.Id == connectorElement.Id)
                {
                    //associate parameter found
                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Set Radius");
                        doc.FamilyManager.Set(familyPara, 0.041);
                        transaction.Commit();
                    }
                }
            }
        }
    }
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
}


阅读更多
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lushibi/article/details/50696182
文章标签: RevitAPI Family
个人分类: RevitAPI Family
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

RevitAPI: 设置管件族的连接件的半径属性抛异常 - 如何获取关联族参数

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭