Revit二次開發——管道倒角

    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.UsingCommandData)]

    class Cmd_ChamferPipes : 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;

            var chamferDis = 300d; //倒角距離

            var ref1 = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Pipe));
            var ref2 = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Pipe));
            var pipe1 = ref1.GetElement(doc) as Pipe;
            var pipe2 = ref2.GetElement(doc) as Pipe;

            var pickpoint1 = ref1.GlobalPoint;
            var pickpoint2 = ref2.GlobalPoint;

            var line1 = (pipe1.Location as LocationCurve).Curve as Line;
            var line2 = (pipe2.Location as LocationCurve).Curve as Line;

            //取得拾取點在管道軸線上的投影點
            pickpoint1 = pickpoint1.ProjectToXLine(line1);
            pickpoint2 = pickpoint2.ProjectToXLine(line2);

            var line1copy = line1.Clone();
            var line2copy = line2.Clone();
            line1copy.MakeUnbound();
            line2copy.MakeUnbound();
            //取得交點
            var intersectionresult = default(IntersectionResult);
            IntersectionResultArray resultarr = default(IntersectionResultArray);
            var comparisonResult = line1copy.Intersect(line2copy, out resultarr);
            if (comparisonResult != SetComparisonResult.Disjoint)
            {
                intersectionresult = resultarr.get_Item(0);
            }
            var intersection = intersectionresult.XYZPoint;

            var dir1 = (pickpoint1 - intersection).Normalize();
            var dir2 = (pickpoint2 - intersection).Normalize();

            var chamferpoint1 = intersection + dir1 * chamferDis.MetricToFeet();
            var chamferpoint2 = intersection + dir2 * chamferDis.MetricToFeet();
             
            Transaction ts = new Transaction(doc, "管線倒角");
            try
            {
                ts.Start();

                pipe1 = changeSizeOfpipe(pipe1, dir1, chamferpoint1);
                pipe2 = changeSizeOfpipe(pipe2, dir2, chamferpoint2);

                var resultpipeid = ElementTransformUtils.CopyElements(doc, new Collection<ElementId>() {pipe1.Id}, new XYZ()).First();
                var resultpipe = resultpipeid.GetElement(doc) as Pipe ;
                (resultpipe.Location as LocationCurve).Curve = Line.CreateBound(chamferpoint1, chamferpoint2);

                //連接管道
                var con1 = pipe1.ConnectorManager.Connectors.Cast<Connector>().Where(m => m?.Origin != null && m.Origin.IsAlmostEqualTo(chamferpoint1)).First();
                var con2 = resultpipe.ConnectorManager.Connectors.Cast<Connector>().Where(m => m?.Origin != null && m.Origin.IsAlmostEqualTo(chamferpoint1)).First();

                doc.Create.NewElbowFitting(con1, con2);

                var con3 = pipe2.ConnectorManager.Connectors.Cast<Connector>().Where(m => m?.Origin != null && m.Origin.IsAlmostEqualTo(chamferpoint2)).First();
                var con4 = resultpipe.ConnectorManager.Connectors.Cast<Connector>().Where(m => m?.Origin != null && m.Origin.IsAlmostEqualTo(chamferpoint2)).First();

                doc.Create.NewElbowFitting(con3, con4);

                ts.Commit();
            }
            catch (Exception)
            {
                if (ts.GetStatus() == TransactionStatus.Started)
                {
                    ts.RollBack();
                }
                //throw;
            }
            return Result.Succeeded;
        }

        private Pipe changeSizeOfpipe(Pipe pipe, XYZ dir, XYZ chamferpoint1)
        {
            var locationline = (pipe.Location as LocationCurve).Curve as Line;
            var startpo = locationline.GetEndPoint(0);
            var endpo = locationline.GetEndPoint(1);

            var stablepoint = default(XYZ);
            if (Math.Abs((startpo - endpo).Normalize().DotProduct(dir) - 1) < 1e-6)
            {
                stablepoint = startpo;
            }
            else
            {
                stablepoint = endpo;
            }
            var newstart = stablepoint.IsAlmostEqualTo(startpo) ? stablepoint : chamferpoint1;
            var newend = stablepoint.IsAlmostEqualTo(endpo) ? stablepoint : chamferpoint1;
            (pipe.Location as LocationCurve).Curve = Line.CreateBound(newstart, newend);
            return pipe;
        }
    }

1、獲取兩條管線交點,沿交點向管道保留部分的方向計算倒角距離。
2、將兩條管線重置長度。
3、連接管線。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章