xBIM 插入复制功能

     目录

     插入复制功能

        在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);

正如全部参数简要描述同样:

  • toCopy: 要复制的实体
  • mappings: 之前插入的映射。对于两个模型之间的全部插入, 应该始终只有一个实例。
  • propTransform: 可选的委托, 您可使用它来筛选将在复制以前得到 coppied 或转换它的内容。这是很是棒的一个功能。
  • includeInverses: 选项引入全部反转实体。这是潜在的危险, 由于若是不受 propTransform 委托的限制, 它可能会轻易地带来几乎整个模型。
  • 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);
                }
            }
        }
    }
}
相关文章
相关标签/搜索