Revit二开--Revit管线随板功能

Revit二开--Revit管线随板功能


今天在这里解密一个管线随板的功能

在这里插入图片描述

代码如下

  class Cmd_MepsAlongFloor : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uidoc = commandData.Application.ActiveUIDocument;
            var doc = uidoc.Document;
            var sel = uidoc.Selection;

            //选择管线
            var mep = sel.PickObject(ObjectType.Element,
                doc.GetSelectionFilter(m => m is MEPCurve && !(m is InsulationLiningBase)),"选择管线").GetElement(doc) as MEPCurve;
             
            //选择楼板
            var floor =
                sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Floor),"选择楼板").GetElement(doc) as Floor;

            var bottomfaceref = HostObjectUtils.GetBottomFaces(floor).First();

            var bottomface = floor.GetGeometryObjectFromReference(bottomfaceref) as Face;

            var planarFace = (bottomface as PlanarFace);

            var planeNorm = planarFace.FaceNormal;
            var planeOrigin = planarFace.Origin;
            var plane = Plane.CreateByNormalAndOrigin(planeNorm, planeOrigin);

            Transform trs = Transform.Identity;
            trs.Origin = planeOrigin;
            trs.BasisX = planarFace.XVector;
            trs.BasisY = planarFace.YVector;
            trs.BasisZ = planeNorm;
             
            var inputboxStr = Microsoft.VisualBasic.Interaction.InputBox("输入距离楼板距离","距离","0");

            var distance = default(double);
             
            var parseresult =double.TryParse(inputboxStr, out distance);
            if (!parseresult) return Result.Cancelled;

            distance = distance.MetricToFeet();

            var locationline = mep.LocationLine();
            var startpo = locationline.StartPoint();
            var endpo = locationline.EndPoint();

            var startpo_intrans = trs.Inverse.OfPoint(startpo);
            var endpo_intrans = trs.Inverse.OfPoint(endpo);

            var startpo_proj = new XYZ(startpo_intrans.X, startpo_intrans.Y,0);
            var endpo_proj = new XYZ(endpo_intrans.X, endpo_intrans.Y, 0); ;

            startpo_proj = trs.OfPoint(startpo_proj);
            endpo_proj = trs.OfPoint(endpo_proj);
             
            var dir = (endpo - endpo_proj).Normalize();

            var newstart = startpo_proj + dir * distance;
            var newend = endpo_proj + dir * distance;

            Transaction ts = new Transaction(doc, "更改管线到楼板距离");
             
            ts.Start();

            (mep.Location as LocationCurve).Curve = Line.CreateBound(newstart, newend);

            ts.Commit();
             
            return Result.Succeeded;
        }

里面封装的方法请参照 https://github.com/binbinstrong/tangsengjiewa

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


在这里插入图片描述

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

猜你喜欢

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