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