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); } }
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); }
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); } }
/// <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); }