using Autodesk.Revit.DB;
|
using System;
|
using System.Collections.Generic;
|
|
namespace HStation.RevitDev.RevitDataExport.Common
|
{
|
public class MEPHelper
|
{
|
/// <summary>
|
/// 获取MEP构件连接关系
|
/// </summary>
|
public static List<ConnectorInfo> GetConnecters(Element elem)
|
{
|
var MEPConnecter = new List<ConnectorInfo>();
|
if (elem is MEPCurve mepCurve)
|
{
|
return GetMEPConnecters(mepCurve);
|
}
|
else if (elem is FamilyInstance fi)
|
{
|
return GetMEPConnecters(fi);
|
}
|
return MEPConnecter;
|
}
|
|
|
/// <summary>
|
/// 获取MEP构件连接关系
|
/// </summary>
|
/// <param name="elem"></param>
|
/// <returns></returns>
|
private static List<ConnectorInfo> GetMEPConnecters(MEPCurve elem)
|
{
|
var MEPConnecter = new List<ConnectorInfo>();
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 获取MEP构件连接关系
|
/// </summary>
|
/// <param name="elem"></param>
|
/// <returns></returns>
|
private static List<ConnectorInfo> GetMEPConnecters(FamilyInstance elem)
|
{
|
var MEPConnecter = new List<ConnectorInfo>();
|
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
|
{
|
/// <summary>
|
/// 长度:Revit内置单位转毫米
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 英尺转毫米
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
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; }
|
}
|
}
|