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)
{
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值