/*------------------------------------------------------------------------- * 功能描述: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 } }