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

来源:互联网 发布:阿里云手机云空间 编辑:程序博客网 时间:2024/04/30 14:32

管件族的连接件有一个属性叫“半径”,我们想使用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 0
原创粉丝点击