Revit二开--三通支管提升

Revit二开–三通支管提升

在Revit机电建模过程中,修改三通支管高度的时候很麻烦,通常我们需要删除三通然后修改支管高度然后,再将主管连接,最后将支管延伸至主管,由软件自动生成登高立管。
像这样子:
在这里插入图片描述
太麻烦了有木有?

其实我想这样子,设置好提升的高度差, 点一下支管自动升高。像下面这样子:

在这里插入图片描述

那么怎么一步到位呢,当然是用二开写个程序来实现啦。

  • 以下就是实现支管提升的代码
	 /// <summary>
    /// 管道三通支管提升
    /// </summary>
    [Transaction(TransactionMode.Manual)]
    class Cmd_RaiseTeeBranch : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiapp = commandData.Application;
            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;
            var sel = uidoc.Selection;
            var acview = doc.ActiveView;

            ValueSettingUI settingWin = new ValueSettingUI();
            n:;
            settingWin.ShowDialog();

            var valuestring = settingWin.settingValue.Text;
            var value = default(double);

            var parseResult = double.TryParse(valuestring, out value);

            if (!parseResult)
            {
                MessageBox.Show("数值错误,请重新输入");
                settingWin.Hide();
                goto n;
            }

            while (true)
            {
                try
                {
                    var eleref = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Pipe));

                    var pipe = eleref.GetElement(doc) as Pipe;

                    var pipecons = pipe.ConnectorManager.Connectors.Cast<Connector>();

                    var validcons = pipecons.Where(m =>
                            m.IsConnected && (m.ConnectorType == ConnectorType.End || m.ConnectorType == ConnectorType.Curve))
                        .ToList();

                    if (validcons.Count < 1) return Result.Cancelled;
                    var connectedPipeFittings = validcons.Select(m => m.GetConnectedCon().Owner).Cast<FamilyInstance>().Where(m => m != null);
                    //MessageBox.Show(connectedPipeFittings.Count().ToString());

                    var teeFitting = default(IEnumerable<FamilyInstance>);
                    teeFitting = connectedPipeFittings.Where(m => m.Symbol.Family.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE).AsValueString().Contains("三通")&&m.FacingOrientation.IsParallel(pipe.LocationLine().Direction));

                    if (teeFitting.Count() == 1)
                    {
                        var tee = teeFitting.FirstOrDefault();
                        var location = (tee.Location as LocationPoint).Point;
                        var facingdir = tee.FacingOrientation;
                        var handdir = tee.HandOrientation;
                        var anxisline = Line.CreateUnbound(location, handdir);

                        var updir = -facingdir.CrossProduct(handdir);
                        var newupdir = default(XYZ);
                        if (updir.AngleTo(XYZ.BasisZ) <= Math.PI / 2)
                        {
                            newupdir = updir;
                        }
                        else
                        {
                            newupdir = -updir;
                        }
                         
                        var consOfTee = tee.MEPModel.ConnectorManager.Connectors.Cast<Connector>();
                        var branchCon = consOfTee.Where(m => m.CoordinateSystem.BasisZ.IsSameDirection(-facingdir)).FirstOrDefault();

                        var connectedconOfBranchCon = branchCon.GetConnectedCon();

                        Transaction ts = new Transaction(doc, "提升支管高度");
                        ts.Start();

                        branchCon.DisconnectFrom(connectedconOfBranchCon);
                        //改变支管高度
                        ElementTransformUtils.MoveElement(doc, pipe.Id, newupdir * value / 304.8);
                        
                        //旋转Tee
                        ElementTransformUtils.RotateElement(doc, tee.Id, anxisline, facingdir.AngleOnPlaneTo(newupdir * (value) / Math.Abs(value), -handdir) );
                        doc.Regenerate();

                        var branchConPosition = branchCon.Origin;
                        var distance = branchConPosition.DistanceTo(pipe.LocationLine());

                        //新创建管道
                        var startpo = branchConPosition;
                        var endpo = startpo + newupdir * (value) / Math.Abs(value) * distance;

                        var newline = Line.CreateBound(startpo, endpo);

                        var newpipeid = ElementTransformUtils.CopyElement(doc, pipe.Id, new XYZ()).FirstOrDefault();

                        var newpipe = newpipeid.GetElement(doc) as Pipe;

                        (newpipe.Location as LocationCurve).Curve = newline;

                        foreach (Connector con in newpipe.ConnectorManager.Connectors)
                        {
                            var conorigin = con?.Origin;
                            if (conorigin == null) continue;
                            if (conorigin.IsAlmostEqualTo(branchConPosition))
                            {
                                con.ConnectTo(branchCon);
                            }
                        }

                        pipe.ElbowConnect(newpipe);

                        ts.Commit();

                    }
                    else if (teeFitting.Count() == 2)
                    {
                       
                    }
                }
                catch (Exception e)
                {
                    break;
                }
            }
            return Result.Succeeded;
        }
    }

更多revit二开知识 请关注 唐僧课堂
唐僧课堂BIM开发


在这里插入图片描述

发布了47 篇原创文章 · 获赞 51 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/binbinstrong/article/details/103560735