管件族的连接件有一个属性叫“半径”,我们想使用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的参数和族参数之间的关联关系,代码步骤解释如下:
- 调用GetOrderedParameters()获取connectorElement的所有参数,并进行遍历
- 通过Document.FamilyManager.Parameters遍历所有的族参数FamilyParameter
- 通过FamilyParameter.AssociatedParameters属性获取所有和该族参数关联的元素参数
- 遍历所有关联参数,判断connectorElement的参数和关联参数的Id一致,并且对应的Element也是同一个,即找到了关联关系
结果如图:
如此,则设置半径的可以这样做:
- 获取连接件半径属性的关联参数
- 使用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)
{
}