/*-------------------------------------------------------------------------
* 功能描述:ParseCore
* 作者:xulisong
* 创建时间: 2019/6/13 18:03:03
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using JBIM;
using JBIM.Component;
using JBIM.Definition;
using RevitExport;
using RevitExport.Export;
using RevitToJBim.Common;
using RevitToJBim.ParseData;
using SAGA.RevitUtils.Extends;
using JConnector = JBIM.Component.Connector;
namespace RevitToJBim.ComponentParse
{
/*
* 核心解析类不解析关系
*/
///
/// 核心解析类
///
public class ParseCore
{
//获取可用的解析类
public static List GetUseParsers()
{
List result = new List();
Assembly assembly = Assembly.GetCallingAssembly();
Type[] types = assembly.GetTypes();
foreach (var type in types)
{
if (typeof(ParseBase).IsAssignableFrom (type))
{
if (type.IsAbstract || type.IsGenericTypeDefinition)
continue;
var attribute = type.GetCustomAttribute();
if (attribute == null)
continue;
var construstor = type.GetConstructor(Type.EmptyTypes);
if (construstor == null)
continue;
if (construstor.Invoke(null) is ParseBase parse)
result.Add(parse);
}
}
return result;
}
public static void AttachObject(ComponentObject bimObj, ElementWrapper wrapper)
{
bimObj.SourceId = wrapper.SourceId;
bimObj.Name = wrapper.RefElement?.Name;
}
public static JConnector CreateConnector(Autodesk.Revit.DB.Connector connector)
{
var result= new JConnector();
result.SourceId = RevitIdGenerator.GetConnectorId(connector);
switch (connector.Domain)
{
case Domain.DomainHvac:
{
result.Domain = ConnectorDomain.DomainHvac.ToString();
break;
}
case Domain.DomainPiping:
{
result.Domain = ConnectorDomain.DomainPiping.ToString();
break;
}
}
result.IsConnected = connector.IsConnected;
result.Description = connector.Description;
result.Origin = BimConvert.ConvertToXYZ(connector.Origin);
return result;
}
///
/// 获取Connector包装类
///
///
///
public static ElementWrapper GetConnectorWrapper(Autodesk.Revit.DB.Connector connector)
{
ElementWrapper wrapper = new ElementWrapper(connector, RevitIdGenerator.GetConnectorId(connector));
return wrapper;
}
///
/// 获取元素关联的connector关联信息,若connector数量为0,则返回null
///
///
///
///
public static ElementOneToManyRel GetConnectorRels(Element element,List connectors)
{
ElementOneToManyRel relMany = new ElementOneToManyRel(element.Id.ToString()) { RelatedObjects = new List() };
relMany.SetElementType(TypeDefinition.Property_ConnectedIds);
foreach (var refConnector in connectors)
{
relMany.RelatedObjects.Add(RevitIdGenerator.GetConnectorId(refConnector));
}
if (relMany.RelatedObjects.Any())
{
return relMany;
}
return null;//创建关系无效
}
///
/// 解析定位信息
///
///
///
public static GeometryLocation GetLocation(Location location)
{
if (location == null)
return null;
if (location is LocationPoint point)
{
var usePoint = point.Point;
return GeometryLocation.CreatePointLocation(BimConvert.ConvertToXYZ(usePoint));
}
else if (location is LocationCurve curve)
{
var useCurve = curve.Curve.GetPoints();
return GeometryLocation.CreateLineLocation(useCurve.Select(xyz=>BimConvert.ConvertToXYZ(xyz)).ToList());
}
return null;
}
}
}