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
效果如下:点击我查看效果