Revit二次开发之通过写族给火警设备绑定探测圈
我们知道Revit二次开发环境无法实现像CAD那样,实时预览和区域检测功能,比如我们想在放置感烟探测器或监控探头时,能够实时预览到它的覆盖范围,辅助我们确定一个空间内需要放置探头的数量,其实我们可以通过写族的方式——为探头设备添加一个探测圈,并设置参数半径绑定,实现参数化,这样我们在布置探头时就可以动态的改变这个探头的探测范围,进而实时预览不同的布置方案,核心代码如下:
本博文这里,假设感烟或监控探头已经载入到项目中
获得此族的族类型集合
ISet(ElementId) familySymbolIds = family.GetFamilySymbolIds();
随便获取一个类型
FamilySymbol symbol = family.Document.GetElement(familySymbolIds.First()) as FamilySymbol;
首先判断此族中是否存在我们要添加的参数,也可以说是判断这个族是否已添加了探测圈,如果添加了就不在进行任何操作,如果没有,则继续添加探测圈
bool boolen = false;
foreach (Parameter p1 in symbol.Parameters)
{
if (p1.Definition.Name == "R半径" || p1.Definition.Name == "R可见")
{
boolen = true;
break;
}
}
if (boolen == true)
{
Autodesk.Revit.UI.TaskDialog.Show("友情提示", "该火警设备已被绑定,可以直接使用!");
return;
}
使用EditFamily方法打开族,获得族文档document
Document familyDoc = doc.EditFamily(family);
Transaction ts = new Transaction(familyDoc, "BIM");
ts.Start();
设置族当前视图的工作平面,如果族打开后不是平面视图,可以过滤族所有平面视图进行替换和项目视图切换方法一样
Plane plane = new Plane(XYZ.BasisZ, XYZ.Zero);
SketchPlane sp = SketchPlane.Create(familyDoc, plane);
参数 探测圈默认半径
double radius = 5.8 / 0.3048;
绘制闭合探测圈,使用模型线
double startAngle = 0;
double endAngle = 2 * Math.PI;
Arc arc = Arc.Create(XYZ.Zero, radius, startAngle, endAngle, XYZ.BasisX, XYZ.BasisY);
ModelCurve mc = familyDoc.FamilyCreate.NewModelCurve(arc, sp);
获得模型线的引用,以为其添加驱动标注,实现参数化
Reference reference = new Reference(mc);
Dimension dison = familyDoc.FamilyCreate.NewRadialDimension(uiapp.ActiveUIDocument.ActiveView, reference, XYZ.Zero);
FamilyManager fm = familyDoc.FamilyManager;
使用族的参数管理器,添加"R半径"参数,参数类型为 长度 规程为 公共
FamilyParameter param = fm.AddParameter("R半径", BuiltInParameterGroup.PG_GENERAL, ParameterType.Length, false);
关键部分 实现参数关联
dison.FamilyLabel = param;
使用族的参数管理器,添加"R可见"参数,参数类型为 是/否 规程为 可见性
FamilyParameter param_visible = fm.AddParameter("R可见", BuiltInParameterGroup.INVALID, ParameterType.YesNo, true);
实现 族图形-可见 参数关联,设置可见就是为了放置所有探头后能够批量隐藏探测圈
Parameter p = mc.get_Parameter(BuiltInParameter.IS_VISIBLE_PARAM);
fm.AssociateElementParameterToFamilyParameter(p, param_visible);
ts.Commit();
MyFamilyLoadOptions myOption = new MyFamilyLoadOptions();
familyDoc.LoadFamily(doc, myOption);
familyDoc.Dispose();
////////////// 覆盖项目理的原有的族文件,以前的博文都介绍了 这里就不再赘述
public class MyFamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Project;
overwriteParameterValues = true;
return true;
}
}
相关图片和最后的放置图: