博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xBIM 插入复制功能
阅读量:6275 次
发布时间:2019-06-22

本文共 4138 字,大约阅读时间需要 13 分钟。

     目录

     插入复制功能

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

转载地址:http://wryva.baihongyu.com/

你可能感兴趣的文章
PLM产品技术的发展趋势 来源:e-works 作者:清软英泰 党伟升 罗先海 耿坤瑛
查看>>
vue part3.3 小案例ajax (axios) 及页面异步显示
查看>>
浅谈MVC3自定义分页
查看>>
.net中ashx文件有什么用?功能有那些,一般用在什么情况下?
查看>>
select、poll、epoll之间的区别总结[整理]【转】
查看>>
CSS基础知识(上)
查看>>
PHP中常见的面试题2(附答案)
查看>>
26.Azure备份服务器(下)
查看>>
mybatis学习
查看>>
LCD的接口类型详解
查看>>
Spring Boot Unregistering JMX-exposed beans on shutdown
查看>>
poi 导入导出的api说明(大全)
查看>>
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>