コード例 #1
0
        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));
            }
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        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());
        }
コード例 #4
0
        /// <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);//被取代的物件需要還原
                }
            }
        }
コード例 #5
0
 /// <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;
         }
     }
 }
コード例 #6
0
        /// <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);
            }
        }
コード例 #7
0
ファイル: IFCUpdate.cs プロジェクト: J-YingHuang/IFCLite
 /// <summary>
 /// 更新單一IFC物件
 /// </summary>
 /// <param name="ifcObject"></param>
 /// <returns></returns>
 public bool Object(IFCObject ifcObject)
 {
     return(Database.IFCModel.Update(ifcObject.ToBson()));
 }
コード例 #8
0
        //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));
        }
コード例 #9
0
ファイル: IFCDelete.cs プロジェクト: J-YingHuang/IFCLite
 /// <summary>
 /// 透過IFC物件刪除單一物件。
 /// </summary>
 /// <param name="ifcObject"></param>
 public void ByObject(IFCObject ifcObject)
 {
     ByP21Id(ifcObject.P21Id);
 }
コード例 #10
0
 /// <summary>
 /// 新增IFC物件至資料庫中。
 /// </summary>
 /// <param name="obj">IFC物件</param>
 public void IFCObject(IFCObject obj)
 {
     Database.IFCModel.Insert(obj.ToBson());
 }