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;

 

        }

    }

 

相关图片和最后的放置图:

Revit二次开发之通过写族给火警设备绑定探测圈
Revit二次开发之通过写族给火警设备绑定探测圈
Revit二次开发之通过写族给火警设备绑定探测圈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值