/*-------------------------------------------------------------------------
* 功能描述:JBimParseContext
* 作者:xulisong
* 创建时间: 2019/6/13 16:50:43
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JBIM;
using JBIM.Component;
using JBIM.Relationship;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RevitExport;
using RevitToJBim.JsonConverter;
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 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的对应关系
*/
var useShips = new List();
foreach (var relationshipBase in RelationShips)
{
if (!relationshipBase.IsProperty)
{
Document.NewObject(relationshipBase);
}
else
{
//var bimId = GetBimId(relationshipBase.re)
}
}
#endregion
return BimJsonUtil.Serializer(Document);
}
private RelationshipBase UpdateRelationShipInfo(RelationshipBase ship)
{
if (ship is OneToOneRel singleRel)
{
var relatingid = GetBimId(singleRel.RelatingObject);
var relatedid = GetBimId(singleRel.RelatedObject);
}
else if (ship is OneToManyRel manyRel)
{
var relatingid = GetBimId(manyRel.RelatingObject);
List relatedIds = new List();
if (manyRel.RelatedObjects != null)
{
foreach (var manyRelRelatedObject in manyRel.RelatedObjects)
{
var relatedid = GetBimId(manyRelRelatedObject);
if (relatedid != null)
{
relatedIds.Add(relatedid);
}
}
}
}
return ship;
}
#endregion
}
}