xBIM 应用与学习 (一)html
xBIM 日志操做app
xBIM 多个IFC文件合并code
在IFC 模型中合并和删除实体是一项不重要的任务,由于IFC不是一个分层结构。而是具备潜在循环关系的复杂结构,是一个双向导向。在单个实体上执行这些任务不是问题(STEP21文件中。能够想象成单行)
#144= IFCBUILDINGSTOREY('026ajlHVj1HBm_osQm7IDT',#47,'Lower Roof - Slab Level',$,$,#143,$,'Lower Roof - Slab Level',.ELEMENT.,3199.99999999704);
一旦要隔离定义实体的完整数据岛,并但愿将其删除,而不会对数据岛以外的其余实体产生反作用,或者但愿将其合并到现有数据中,而不会形成重复和不一致,则会变得愈来愈困难。 因为这些缘由,咱们更喜欢第三种选择,即选择你想要的,并把它复制到一个空的模型中。 这显然是一个复杂而复杂的任务,但至少让事情控制在你的控制之下更容易。如今是IModel
界面成员的核心功能是InsertCopy()
:
T InsertCopy<T>(T toCopy, XbimInstanceHandleMap mappings, PropertyTranformDelegate propTransform, bool includeInverses, bool keepLabels);
正如对全部参数的简要描述同样:
从全部这些PropertyTranformDelegate看起来有点神秘。可是, 它是上述方法的一个基本部分, 由于它容许控制被复制的数据的范围。若是你容许逆并不提供任何额外的过滤, 可能会最终与模型包含98% 的原始模型, 要正确使用它,您须要了解IFC的结构。 这是一个强大的转换的简单例子,它将省去全部的几何和布局,只容许描述产品类型和属性的反向关系。几何一般须要大约90%的文件,因此若是您对基于几何的图形或分析不感兴趣,您可使用它来建立仅包含描述性数据的很是小的IFC文件。
PropertyTranformDelegate semanticFilter = (property, parentObject) => { //几何和对象位置 if (parentObject is IIfcProduct && (property.PropertyInfo.Name == nameof(IIfcProduct.Representation) || property.PropertyInfo.Name == nameof(IIfcProduct.ObjectPlacement))) return null; //映射几何 if (parentObject is IIfcTypeProduct && property.PropertyInfo.Name == nameof(IIfcTypeProduct.RepresentationMaps)) return null; // IsDefinedBy 和 IsTypedBy 反向关系 if (property.EntityAttribute.Order < 0 && !( property.PropertyInfo.Name == nameof(IIfcProduct.IsDefinedBy) || property.PropertyInfo.Name == nameof(IIfcProduct.IsTypedBy) )) return null; return property.PropertyInfo.GetValue(parentObject, null); };
PropertyTranformDelegate 采用两个参数, 其中第一个是 ExpressMetaProperty, 另外一个是表示 IPersistEntity 的对象。ExpressMetaProperty 是一个缓存的对象, 这是咱们本身的反射元模型的一部分, 咱们用于某些数据操做。该委托在使用 c# 反射的其余代码中用于检查数据和复制值。若是未指定委托 InsertCopy (), 将使用实体中的全部属性并将其复制过来。
using Xbim.Common; using Xbim.Ifc; using Xbim.Ifc4.Interfaces; namespace BasicExamples { class InsertCopy { public void CopyWallsOver() { const string original = "SampleHouse.ifc"; const string inserted = "SampleHouseWalls.ifc"; PropertyTranformDelegate semanticFilter = (property, parentObject) => { //几何和对象位置 if (parentObject is IIfcProduct && (property.PropertyInfo.Name == nameof(IIfcProduct.Representation) || property.PropertyInfo.Name == nameof(IIfcProduct.ObjectPlacement))) return null; //几何映射 if (parentObject is IIfcTypeProduct && property.PropertyInfo.Name == nameof(IIfcTypeProduct.RepresentationMaps)) return null; if (property.EntityAttribute.Order < 0 && !( property.PropertyInfo.Name == nameof(IIfcProduct.IsDefinedBy) || property.PropertyInfo.Name == nameof(IIfcProduct.IsTypedBy) )) return null; return property.PropertyInfo.GetValue(parentObject, null); }; using (var model = IfcStore.Open(original)) { var walls = model.Instances.OfType<IIfcWall>(); using (var iModel = IfcStore.Create(model.IfcSchemaVersion, XbimStoreType.InMemoryModel)) { using (var txn = iModel.BeginTransaction("Insert copy")) { //单个映射应用于两个模型之间的全部插入 var map = new XbimInstanceHandleMap(model, iModel); foreach (var wall in walls) { iModel.InsertCopy(wall, map, semanticFilter, true, false); } txn.Commit(); } iModel.SaveAs(inserted); } } } } }