private void FindInverseData(Dictionary <string, IFCObject> dist) { Dictionary <string, List <string> > inverseData = new Dictionary <string, List <string> >(); foreach (IFCObject data in dist.Values) { foreach (BsonValue prop in data.GetValues()) { string value = ""; if (prop.Type == BsonType.String) { value = prop.AsString; } if (prop.Type == BsonType.Array && (prop as BsonArray).Count != 0) { BsonValue propData = (prop as BsonArray).First(); while (propData.Type == BsonType.Array) { propData = (propData as BsonArray).First(); } if (propData.Type != BsonType.String) { continue; } else { value = propData.AsString; } } if (!value.Contains("#")) //不含#代表沒有上下層關係則不處理 { continue; } if (dist.ContainsKey(value)) //含該物件 { IFCObject downObj = dist[value]; if (inverseData.ContainsKey(downObj.EntityName)) { if (!inverseData[downObj.EntityName].Contains(data.EntityName)) { inverseData[downObj.EntityName].Add(data.EntityName); } } else { inverseData.Add(downObj.EntityName, new List <string>() { data.EntityName }); } } } } foreach (var data in inverseData) { InverseTable.Add(new IFCInverseRecord(data.Key, data.Value)); } }
/// <summary> /// 深複製IFC物件。 /// </summary> /// <param name="data">需複製的IFC物件</param> /// <returns></returns> private IFCObject CopyObject(IFCObject data) { var config = new MapperConfiguration(cfg => cfg.CreateMap <IFCObject, IFCObject>()); config.AssertConfigurationIsValid(); var mapper = config.CreateMapper(); return(mapper.Map <IFCObject>(data)); }
private static bool IsColumnLoadBearing(IFCObjectDefinition entity) { if (entity == null) { throw new InvalidOperationException("Function called for null entity."); } // TODO: Figure out load bearing for IfcColumnType. if (!(entity is IFCObject)) { return(false); } IFCObject columnEntity = entity as IFCObject; IDictionary <string, IFCPropertySetDefinition> columnPropertySets = columnEntity.PropertySets; IFCPropertySetDefinition psetColumnCommonDef = null; if (columnPropertySets == null || (!columnPropertySets.TryGetValue("Pset_ColumnCommon", out psetColumnCommonDef))) { return(false); } if (!(psetColumnCommonDef is IFCPropertySet)) { throw new InvalidOperationException("Invalid Pset_ColumnCommon class."); } IFCPropertySet psetColumnCommon = psetColumnCommonDef as IFCPropertySet; IDictionary <string, IFCProperty> columnCommonProperties = psetColumnCommon.IFCProperties; IFCProperty loadBearingPropertyBase = null; if (columnCommonProperties == null || (!columnCommonProperties.TryGetValue("LoadBearing", out loadBearingPropertyBase))) { return(false); } if (!(loadBearingPropertyBase is IFCSimpleProperty)) { throw new InvalidOperationException("Invalid Pset_ColumnCommon::LoadBearing property."); } IFCSimpleProperty loadBearingProperty = loadBearingPropertyBase as IFCSimpleProperty; IList <IFCPropertyValue> propertyValues = loadBearingProperty.IFCPropertyValues; if (propertyValues == null || propertyValues.Count == 0) { return(false); } return(propertyValues[0].AsBoolean()); }
/// <summary> /// 透過EntityName找IFC物件。 /// </summary> /// <param name="entityName">EntityName</param> /// <returns></returns> public IEnumerable <IFCObject> ByEntityName(string entityName) { List <IFCObject> res = new List <IFCObject>(); foreach (BsonDocument data in Database.IFCModel.Find(x => x["EntityName"] == entityName)) { IFCObject obj = new IFCObject(data); yield return(obj); foreach (IFCObject recover in GetAllRecoverObjectByReplace(obj)) { yield return(recover);//被取代的物件需要還原 } } }
/// <summary> /// Get the entity type and shape type for the IfcTypeObject of the entity. /// </summary> /// <param name="entity">The entity.</param> /// <param name="typeEntityType">The IfcTypeObject entity type, if it exists.</param> /// <param name="typeShapeType">The IfcTypeObject shape type, if it exists.</param> private static void GetAssociatedTypeEntityInfo(IFCObjectDefinition entity, out IFCEntityType?typeEntityType, out string typeShapeType) { typeEntityType = null; typeShapeType = null; if (entity is IFCObject) { IFCObject ifcObject = entity as IFCObject; if (ifcObject.TypeObjects != null && ifcObject.TypeObjects.Count > 0) { IFCTypeObject typeObject = ifcObject.TypeObjects.First(); typeEntityType = typeObject.EntityType; typeShapeType = typeObject.ShapeType; } } }
/// <summary> /// 透過取代者,還原所有被取代的IFC物件。 /// </summary> /// <param name="oldObject">取代者物件</param> /// <returns></returns> private IEnumerable <IFCObject> GetAllRecoverObjectByReplace(IFCObject oldObject) { List <string> replaceData = new List <string>(); foreach (IFCReplaceRecord record in Database.ReplaceTable.Find(x => x.ValueElement == oldObject.P21Id)) { replaceData.Add(record.KeyElement); } List <IFCObject> res = new List <IFCObject>(); foreach (string repId in replaceData) { IFCObject newObj = CopyObject(oldObject); newObj.P21Id = repId; yield return(newObj); } }
/// <summary> /// 更新單一IFC物件 /// </summary> /// <param name="ifcObject"></param> /// <returns></returns> public bool Object(IFCObject ifcObject) { return(Database.IFCModel.Update(ifcObject.ToBson())); }
//IFCModel /// <summary> /// 透過P21Id找IFC物件。 /// </summary> /// <param name="p21Id">P21Id</param> /// <returns></returns> public IFCObject ByP21Id(string p21Id) { IFCObject res = new IFCObject(Database.IFCModel.FindOne(x => x["P21Id"] == p21Id)); return(res ?? GetRecoverObject(p21Id)); }
/// <summary> /// 透過IFC物件刪除單一物件。 /// </summary> /// <param name="ifcObject"></param> public void ByObject(IFCObject ifcObject) { ByP21Id(ifcObject.P21Id); }
/// <summary> /// 新增IFC物件至資料庫中。 /// </summary> /// <param name="obj">IFC物件</param> public void IFCObject(IFCObject obj) { Database.IFCModel.Insert(obj.ToBson()); }