using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
namespace HStation.RevitDev.RevitDataExport.Common
{
public class MEPHelper
{
///
/// 获取MEP构件连接关系
///
public static List GetConnecters(Element elem)
{
var MEPConnecter = new List();
if (elem is MEPCurve mepCurve)
{
return GetMEPConnecters(mepCurve);
}
else if (elem is FamilyInstance fi)
{
return GetMEPConnecters(fi);
}
return MEPConnecter;
}
///
/// 获取MEP构件连接关系
///
///
///
private static List GetMEPConnecters(MEPCurve elem)
{
var MEPConnecter = new List();
try
{
ConnectorSet connectors = elem.ConnectorManager?.Connectors;
if (connectors == null) { return MEPConnecter; }
int connectIndex = -1;
foreach (Connector conn in connectors)
{
connectIndex++;
if (conn.IsConnected == false || conn.MEPSystem == null)
{
continue;
}
ConnectorSet connectorSet = conn.AllRefs;
var systemId = conn.MEPSystem.UniqueId;
foreach (Connector currentConnector in connectorSet)
{
if (currentConnector == null)
{
continue;
}
if (currentConnector.Owner.UniqueId == elem.UniqueId || currentConnector.Owner.UniqueId == systemId)
{
continue;
}
ConnectorInfo data = new ConnectorInfo
{
Index = connectIndex,
ElementId = currentConnector.Owner.Id.IntegerValue,
Position = $"{currentConnector.Origin.X.InnerToMM():f6},{currentConnector.Origin.Y.InnerToMM():f6},{currentConnector.Origin.Z.InnerToMM():f6}"
};
MEPConnecter.Add(data);
}
}
return MEPConnecter;
}
catch (Exception ex)
{
return MEPConnecter;
}
}
///
/// 获取MEP构件连接关系
///
///
///
private static List GetMEPConnecters(FamilyInstance elem)
{
var MEPConnecter = new List();
try
{
var mepModel = elem.MEPModel;
ConnectorSet connectors = mepModel.ConnectorManager?.Connectors;
if (connectors == null) { return MEPConnecter; }
int connectIndex = -1;
foreach (Connector conn in connectors)
{
connectIndex++;
if (conn.IsConnected == false || conn.MEPSystem==null)
{
continue;
}
ConnectorSet connectorSet = conn.AllRefs;
var systemId = conn.MEPSystem.UniqueId;
foreach (Connector currentConnector in connectorSet)
{
if (currentConnector == null)
{
continue;
}
if (currentConnector.Owner.UniqueId == elem.UniqueId || currentConnector.Owner.UniqueId == systemId)
{
continue;
}
ConnectorInfo data = new ConnectorInfo
{
Index = connectIndex,
ElementId = currentConnector.Owner.Id.IntegerValue,
Position = $"{currentConnector.Origin.X.InnerToMM():f6},{currentConnector.Origin.Y.InnerToMM():f6},{currentConnector.Origin.Z.InnerToMM():f6}"
};
MEPConnecter.Add(data);
}
}
return MEPConnecter;
}
catch (Exception ex)
{
return MEPConnecter;
}
}
}
public static class StaticUtils
{
///
/// 长度:Revit内置单位转毫米
///
///
///
public static double? InnerToMM(this object obj)
{
if (obj == null) return null;
try
{
return UnitUtils.ConvertFromInternalUnits(Convert.ToDouble(obj), /*DisplayUnitType.DUT_MILLIMETERS*/ UnitTypeId.Millimeters);
}
catch (Exception ex)
{
return null;
}
}
///
/// 英尺转毫米
///
///
///
public static double FeetToMM(this object obj, int prec = -1)
{
try
{
return Convert.ToDouble(obj) * 304.8;
}
catch (Exception ex)
{
return double.MinValue;
}
}
}
public class ConnectorInfo
{
public int Index { get; set; }
public int ElementId { get; set; }
public string Position { get; set; }
}
}