/*-------------------------------------------------------------------------
* 功能描述:JBimParseContext
* 作者:xulisong
* 创建时间: 2019/6/13 16:50:43
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using JBIM;
using JBIM.Common;
using JBIM.Component;
using JBIM.Relationship;
using RevitExport;
using RevitExport.Export;
using RevitExport.Parse;
using RevitToJBim.ComponentParse;
using RevitToJBim.JsonConverter;
using RevitToJBim.ParseData;
namespace RevitToJBim
{
///
/// JBimParseContext解析上下文
///
public class JBimParseContext: ParseContext
{
public JBimParseContext(List parsers)
{
Parser = new RevitToJBimParser(this, parsers);
Document = new BimDocument();
RelationShips = new List();
}
public RevitToJBimParser Parser { get; private set; }
public BimDocument Document { get;private set; }
#region 数据缓存相关
private Dictionary m_RevitIdMap = new Dictionary();
public BimId GetBimId(string revitSourceId)
{
if (string.IsNullOrWhiteSpace(revitSourceId))
{
return null;
}
m_RevitIdMap.TryGetValue(revitSourceId, out BimId result);
return result;
}
public List GetBimIds(List sourceIds)
{
List relatedIds = null;
if (sourceIds != null)
{
relatedIds = new List();
foreach (var sourceId in sourceIds)
{
var relatedid = GetBimId(sourceId);
if (relatedid != null)
{
relatedIds.Add(relatedid);
}
}
}
return relatedIds;
}
public BimId AddBimObject(BimObject obj)
{
var id= this.Document.NewObject(obj)?.Id;
if (obj is ComponentObject cObject&&!string.IsNullOrWhiteSpace(cObject.SourceId))
{
m_RevitIdMap[cObject.SourceId] = id;
}
return id;
}
#endregion
#region 关系数据统一存储
public List RelationShips { get; private set; }
#endregion
#region 解析方法
public List Parse(ElementWrapper wrapper)
{
return Parser.ParseElement(wrapper);
}
#endregion
#region 序列化相关信息
public string Serialize()
{
#region 关系数据处理
/*
* 当前关系数据是一个临时数据,需要不全信息之后才能真实使用
* 临时数据中,存储的是SourceId的对应关系
*/
foreach (var relationshipBase in RelationShips)
{
if (relationshipBase.IsProperty)
{
UpdateRelationShipInfo(relationshipBase);
}
else
{
var bimRelation = ConvertRelationShipInfo(relationshipBase);
Document.NewObject(bimRelation);
}
}
#endregion
return BimJsonUtil.Serializer(Document);
}
///
/// 获取关联对象的BimId
///
///
///
private BimId GetRelatingBimId(ElementRelationShip ship)
{
BimId relatingid = null;
if (ship.RelatingObjectIsBimId)
{
relatingid = new BimId(ship.RelatingObject);
}
else
{
relatingid = GetBimId(ship.RelatingObject);
}
return relatingid;
}
private RelationshipBase ConvertRelationShipInfo(ElementRelationShip ship)
{
BimId relatingid = GetRelatingBimId(ship);
RelationshipBase useShip = null;
if (relatingid == null)
{
return null;
}
if (ship is ElementOneToOneRel singleRel)
{
var relatedid = GetBimId(singleRel.RelatedObject);
if (relatedid != null)
{
useShip = new OneToOneRel(relatingid, relatedid);
}
}
else if (ship is ElementOneToManyRel manyRel)
{
var relatedIds = GetBimIds(manyRel.RelatedObjects);
if (relatedIds != null)
{
useShip = new OneToManyRel(relatingid, relatedIds);
}
}
return useShip;
}
private void UpdateRelationShipInfo(ElementRelationShip ship)
{
var relatingid = GetRelatingBimId(ship);
if (relatingid == null)
{
return;
}
var bimObject = Document.GetBimObject(relatingid);
if (bimObject == null)
{
return;
}
if (ship is ElementOneToOneRel singleRel)
{
var relatedid = GetBimId(singleRel.RelatedObject);
if (relatedid != null)
{
BimObjectUtil.AcceptRelation(bimObject, ship.PropertyName, relatedid);
}
}
else if (ship is ElementOneToManyRel manyRel)
{
var relatedIds = GetBimIds(manyRel.RelatedObjects);
if (relatedIds != null)
{
BimObjectUtil.AcceptRelations(bimObject, ship.PropertyName, relatedIds);
}
}
return;
}
#endregion
}
}