public static IfcTypeObject GetDefiningType(this IfcObject tObj)
        {
            IfcRelDefinesByType def = tObj.ModelOf.Instances.Where <IfcRelDefinesByType>(rd => rd.RelatedObjects.Contains(tObj)).FirstOrDefault();

            if (def != null)
            {
                return(def.RelatingType);
            }
            else
            {
                return(null);
            }
        }
Example #2
0
        public void Defines(SemElement element)
        {
            if (IfcRelDefinesByType == null)
            {
                IfcRelDefinesByType = new IfcRelDefinesByType
                {
                    GlobalId     = IfcGloballyUniqueId.NewGuid(),
                    OwnerHistory = SemHeaderSetting.Setting3D.IfcOwnerHistory,
                    RelatingType = IfcTypeProduct,
                };
                IfcRelDefinesByType.RelatedObjects = new List <IfcObject>();
            }

            if (DefinedElements == null)
            {
                DefinedElements = new List <SemElement>();
            }
            DefinedElements.Add(element);
            IfcRelDefinesByType.RelatedObjects.Add(element.IfcObject);
        }
Example #3
0
        public void Defines(SemElement element)
        {
            if (IfcRelDefinesByType == null)
            {
                IfcRelDefinesByType = new IfcRelDefinesByType
                    {
                        GlobalId = IfcGloballyUniqueId.NewGuid(),
                        OwnerHistory = SemHeaderSetting.Setting3D.IfcOwnerHistory,
                        RelatingType = IfcTypeProduct,
                    };
                IfcRelDefinesByType.RelatedObjects  = new List<IfcObject>();
            }

            if (DefinedElements == null)
            {
                DefinedElements = new List<SemElement>();
            }
            DefinedElements.Add(element);
            IfcRelDefinesByType.RelatedObjects.Add(element.IfcObject);
        }
        //Removes the current object from any RelDefinesByType relationships and adds a relationship to the specified Type
        public static void SetDefiningType(this IfcObject obj, IfcTypeObject typeObj, IModel model)
        {
            //divorce any exisitng related types
            IEnumerable <IfcRelDefinesByType> rels = model.Instances.Where <IfcRelDefinesByType>(rd => rd.RelatedObjects.Contains(obj));

            foreach (var rel in rels)
            {
                rel.RelatedObjects.Remove(obj);
            }
            //find any existing relationships to this type
            IfcRelDefinesByType typeRel = model.Instances.Where <IfcRelDefinesByType>(rd => rd.RelatingType == typeObj).FirstOrDefault();

            if (typeRel == null) //none defined create the relationship
            {
                IfcRelDefinesByType relSub = model.Instances.New <IfcRelDefinesByType>();
                relSub.RelatingType = typeObj;
                relSub.RelatedObjects.Add(obj);
            }
            else //we have the type
            {
                typeRel.RelatedObjects.Add(obj);
            }
        }
Example #5
0
        /// <summary>
        /// Validate component sheet for merge types depending on the role of the model this worksheet was built from
        /// </summary>
        /// <param name="model">model the cobie file was generated from</param>
        /// <param name="fileRoles">the file roles</param>
        public List <string> ValidateComponentMerge(XbimModel model, COBieMergeRoles fileRoles)
        {
            List <string> typeObjectGlobalId     = new List <string>();
            List <string> typeObjectGlobalIdKeep = new List <string>();

            //RowsRemoved.Clear();
            if (fileRoles != COBieMergeRoles.Unknown) //if role is a single value of unknown then do no merging
            {
                COBieColumn colExtObj = Columns.Where(c => c.Value.ColumnName == "ExtObject").Select(c => c.Value).FirstOrDefault();
                COBieColumn colExtId  = Columns.Where(c => c.Value.ColumnName == "ExtIdentifier").Select(c => c.Value).FirstOrDefault();

                List <IfcElement> elements = model.InstancesLocal.OfType <IfcElement>().ToList(); //get all IfcElements,

                List <T> RemainRows = new List <T>();
                if (colExtObj != null)
                {
                    FilterValuesOnMerge mergeHelper = new FilterValuesOnMerge();

                    for (int i = 0; i < Rows.Count; i++)
                    {
                        COBieRow  row       = Rows[i];//.ElementAt(i);
                        COBieCell cell      = row[colExtObj.ColumnOrder];
                        string    extObject = cell.CellValue;
                        if (mergeHelper.Merge(extObject)) //object can be tested on
                        {
                            COBieCell cellExtId = row[colExtId.ColumnOrder];
                            string    extId     = cellExtId.CellValue;

                            IfcElement IfcElement = elements.Where(ie => ie.GlobalId.ToString() == extId).FirstOrDefault();
                            if (IfcElement != null)
                            {
                                //we need to remove the ObjectType from the type sheet
                                IfcRelDefinesByType elementDefinesByType = IfcElement.IsDefinedBy.OfType <IfcRelDefinesByType>().FirstOrDefault(); //should be only one
                                IfcTypeObject       elementType          = null;
                                if (elementDefinesByType != null)
                                {
                                    elementType = elementDefinesByType.RelatingType;
                                }

                                if (mergeHelper.Merge(IfcElement, fileRoles))
                                {
                                    RemainRows.Add((T)row);
                                    if ((elementType != null) && (!typeObjectGlobalIdKeep.Contains(elementType.GlobalId)))
                                    {
                                        typeObjectGlobalIdKeep.Add(elementType.GlobalId);
                                    }
                                }
                                else
                                {
                                    RowsRemoved.Add((T)row);
                                    if ((elementType != null) && (!typeObjectGlobalId.Contains(elementType.GlobalId)))
                                    {
                                        typeObjectGlobalId.Add(elementType.GlobalId);
                                    }
                                }
                            }
                            else
                            {
                                RemainRows.Add((T)row); //cannot evaluate IfcType so keep
                            }
                        }
                    }
                    Rows = RemainRows;
                }
            }

            typeObjectGlobalId.RemoveAll(Id => typeObjectGlobalIdKeep.Contains(Id)); //ensure we remove any type we have kept from the type object GlobalId list (ones to remove)
            return(typeObjectGlobalId);
        }