Revit二次开发之管线随板

Revit二次开发之管线随板

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;


namespace 管线随板
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
    [Autodesk.Revit.Attributes.Journaling(JournalingMode.UsingCommandData)]
    public class Command:IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elementSet)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection selection = uidoc.Selection;

            //选择管线
            Reference refMep = selection.PickObject(ObjectType.Element,new MEPFilter() ,"请选择管线");
            MEPCurve mep = doc.GetElement(refMep) as MEPCurve;

            //选择楼板
            Reference reffFloor = selection.PickObject(ObjectType.Element, new FloorFilter(), "请选择楼板");
            Floor floor = doc.GetElement(reffFloor) as Floor;

            //获取楼板的下面的面
            Reference bottomFaceref = HostObjectUtils.GetBottomFaces(floor).First();
            Face bottomFace = floor.GetGeometryObjectFromReference(bottomFaceref) as Face;

            PlanarFace planarFace = bottomFace as PlanarFace;
            //面的信息
            XYZ planarNormal = planarFace.FaceNormal;
            XYZ planeOrigin = planarFace.Origin;
            Plane plane = new Plane(planarNormal, planeOrigin);

            //设置Transform信息
            Transform trans = Transform.Identity;
            trans.Origin = planeOrigin;
            trans.BasisX = planarFace.XVector;
            trans.BasisY = planarFace.YVector;
            trans.BasisZ = planarNormal;

            //距离楼板的距离,这里是写死的
            //可以按照需求,添加一个用户的输入框
            double distance = -1600/ 304.8;

            LocationCurve lc = mep.Location as LocationCurve;
            Line locationLine = lc.Curve as Line;

            XYZ start_pt = locationLine.GetEndPoint(0);
            XYZ end_pt = locationLine.GetEndPoint(1);

            XYZ startpo_intrans = trans.Inverse.OfPoint(start_pt);
            XYZ endpo_intrans = trans.Inverse.OfPoint(end_pt);

            XYZ startPoint_Project = new XYZ(startpo_intrans.X, startpo_intrans.Y, 0);
            XYZ endPoint_Project = new XYZ(endpo_intrans.X, endpo_intrans.Y, 0);

            startPoint_Project = trans.OfPoint(startPoint_Project);
            endPoint_Project = trans.OfPoint(endPoint_Project);

            //方向
            XYZ dir = (start_pt - end_pt).Normalize();

            XYZ newStart = startPoint_Project + dir * distance;
            XYZ newEnd = endPoint_Project + dir * distance;

            using (Transaction ts = new Transaction(doc, "管线随板"))
            {
                ts.Start();
                (mep.Location as LocationCurve).Curve = Line.CreateBound(newStart, newEnd);
                ts.Commit();
            }



                return Result.Succeeded;
        }
    }
    /// <summary>
    /// 楼板过滤器
    /// </summary>
    public class FloorFilter:ISelectionFilter
    {
        public bool AllowElement(Element element)
        {
            return (element is Floor);
        }
        public bool AllowReference(Reference reff,XYZ position)
        {
            return true;
        }
    }
    /// <summary>
    /// 过滤mepcurve
    /// </summary>
    public class MEPFilter : ISelectionFilter
    {
        public bool AllowElement(Element elem)
        {
            //throw new NotImplementedException();
            return (elem is MEPCurve && !(elem is InsulationLiningBase));
        }

        public bool AllowReference(Reference reference, XYZ position)
        {
            return true;
        }
    }
}

参考:唐曾老师的Github
效果如下:点击我查看效果

发布了65 篇原创文章 · 获赞 8 · 访问量 3237

猜你喜欢

转载自blog.csdn.net/yasenRK/article/details/103721627