Revit二开——翻转喷头

Revit二开——翻转喷头

Revit绘制喷淋时,有时需要翻转喷头调整喷头的方向,有的插件已经有此功能,不过是收费的,今天分享一下这个功能的实现思路及源代码。

  • 实现过程:
    1.通过喷头递归找到喷头连接件方向的三通弯头 或者 一端开放的管道。
    2.将递归查找过的元素打包。
    3.通过递归查找到的末端元素的相关信息,建立 旋转轴。
    4.在revit事务中将打包的元素,绕着第3部的旋转轴,旋转180°。
    5.代码中封装的方法请参照唐僧解瓦项目。
  • 代码如下
/// <summary>
    /// 上下喷转换
    /// </summary>
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.UsingCommandData)]
    public class Cmd_ModifySprinkler : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection sel = uidoc.Selection;

            View acview = uidoc.ActiveView;
            //UIView acuivew = uidoc.Activeuiview();

            var collector = new FilteredElementCollector(doc);

            var elementGroup = new List<Element>();
            //1 select sprinkler

            var sprinkler = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is FamilyInstance && m.Category.Id.IntegerValue == (int)BuiltInCategory.OST_Sprinklers)).GetElement(doc) as FamilyInstance;
 
            var mepmodel = sprinkler.MEPModel;
            var sprinklerCon = mepmodel.ConnectorManager.Connectors.Cast<Connector>().First(m => m.ConnectorType == ConnectorType.End);

            var backendEle = GetBackEndElement(sprinklerCon, ref elementGroup);
             
            var rotationAnxis = default(Line);

            if(backendEle is FamilyInstance ins)
            {
                var location = (backendEle.Location as LocationPoint).Point;

                var temmodel = ins.MEPModel;
                var dir = temmodel.ConnectorManager.Connectors.Cast<Connector>().Where(m=>m.CoordinateSystem.BasisZ.IsPerpendicular(sprinklerCon.CoordinateSystem.BasisZ)).First().CoordinateSystem.BasisZ;  

                rotationAnxis = Line.CreateUnbound(location, dir);

            }
            else if(backendEle is Pipe p)
            {
                var opencon = p.ConnectorManager.Connectors.Cast<Connector>().First(m => !m.IsConnected);
                var location = opencon.Origin;

                var originalDir = opencon.CoordinateSystem.BasisZ;
                var anxisDir = opencon.CoordinateSystem.BasisX;

                rotationAnxis = Line.CreateUnbound(location, anxisDir);
                
            }

            Transaction ts = new Transaction(doc, "翻转喷头");
            ts.Start();

            ElementTransformUtils.RotateElements(doc, elementGroup.Select(m=>m.Id).ToList(), rotationAnxis, Math.PI );

            ts.Commit();

             
            //sel.SetElementIds(new List<ElementId>() { (backendEle.Id) });
            
            return Result.Succeeded;
        }

        public Element  GetBackEndElement(Connector con ,ref List<Element> elegroup)
        {
            
            Element result = default(Element);

            elegroup.Add(con.Owner);
            var connectedCon = con.GetConnectedCon(); //ele1
            if (connectedCon is null || connectedCon.ConnectorType == ConnectorType.Logical)
            {
                result = con.Owner;
                return  result;
            }

            var backCon = connectedCon.GetBackConInStraight();//ele1

            if (backCon == null) { result = connectedCon.Owner; elegroup.Add(result); }
            else
            {
                result = GetBackEndElement(backCon, ref elegroup);
            }

            return result;
        }
    }
更多Revit二开知识尽在唐僧课堂!

唐僧课堂BIM开发

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值