using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FittingSet
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//选择风管
Reference reference1 = uidoc.Selection.PickObject(ObjectType.Element, "选择风管1");
Reference reference2 = uidoc.Selection.PickObject(ObjectType.Element, "选择风管2");
//获取风管对象、
Duct duct1 = doc.GetElement(reference1) as Duct;
Duct duct2 = doc.GetElement(reference2) as Duct;
//获得风管定位线
Line line1 = (duct1.Location as LocationCurve).Curve as Line;
Line line2= (duct2.Location as LocationCurve).Curve as Line;
//获取风管端点的集合
List<XYZ> ps1 = new List<XYZ> { line1.GetEndPoint(0), line1.GetEndPoint(1) };
List<XYZ> ps2 = new List<XYZ> { line2.GetEndPoint(0), line2.GetEndPoint(1) };
//求最相近的两个端点
//预设一个大数,然后遍历找最小的距离
double distance = int.MaxValue;
XYZ origin1 = null;
XYZ origin2 = null;
foreach (XYZ xYZ1 in ps1)
{
foreach (XYZ xyz2 in ps2)
{
if (xYZ1.DistanceTo(xyz2)<distance)
{
origin1 = xYZ1;
origin2 = xyz2;
distance = xYZ1.DistanceTo(xyz2);
}
}
}
//获得匹配风管的连接件
Connector connector1 = ConnectorAtPoint(duct1, origin1);
Connector connector2 = ConnectorAtPoint(duct2, origin2);
//创建并启动事务
Transaction transaction = new Transaction(doc, "创建弯头");
transaction.Start();
//创建弯头
try
{
doc.Create.NewElbowFitting(connector1, connector2);
}
catch
{
TaskDialog.Show("信息提示", "创建弯头失败");
return Result.Succeeded;
}
//提交事务
transaction.Commit();
return Result.Succeeded;
}
public Connector ConnectorAtPoint(Element e, XYZ point)
{
ConnectorSet connectorSet = null;
//风管连接件集合
if (e is Duct)
connectorSet = (e as Duct).ConnectorManager.Connectors;
//管线连接件集合
if (e is Pipe)
connectorSet = (e as Pipe).ConnectorManager.Connectors;
//桥架的连接件集合
if (e is CableTray)
connectorSet = (e as CableTray).ConnectorManager.Connectors;
//管件等可载入族的连接件集合
if (e is FamilyInstance)
{
FamilyInstance fi = e as FamilyInstance;
connectorSet = fi.MEPModel.ConnectorManager.Connectors;
}
//遍历连接件集合
foreach (Connector connector in connectorSet)
{
//如果连接件的中心和目标点相距很小时视为目标连接件
if (connector.Origin.DistanceTo(point) < 1 / 304.8)
//返回该连接件
return connector;
}
//如果没有匹配到,则返回null
return null;
}
}
}
自动创建风管弯头(测试同一平面下可行)
最新推荐文章于 2021-05-21 09:09:59 发布