xBIM 插入复制功能
目录
插入复制功能
在IFC 模型中合并和删除实体是一项不重要的任务,因为IFC不是一个分层结构。而是具有潜在循环关系的复杂结构,是一个双向导向。在单个实体上执行这些任务不是问题(STEP21文件中。可以想象成单行)
#= IFCBUILDINGSTOREY('026ajlHVj1HBm_osQm7IDT',#,'Lower Roof - Slab Level',$,$,#,$,'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 < && !(
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 < && !(
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);
}
}
}
}
}
xBIM 插入复制功能的更多相关文章
- xBIM 高级02 插入复制功能
系列目录 [已更新最新开发文章,点击查看详细] IFC 模型中的合并和删除实体是一个非常重要的任务,因为 IFC 不是一个分层结构.它是一个复杂的结构,具有潜在的循环关系,是一个双向导航.在单 ...
- XBIM 基于 WexBIM 文件在 WebGL 浏览和加载
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM 多个IFC文件合并
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM IFC 层次结构
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM IFC 输出 Excel 报表
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM 使用Linq 来优化查询
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM 格式之间转换
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM IFC 墙壁案例
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM 日志操作
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
随机推荐
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...
- HDU2504-又见GCD-递归
又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 2017ecjtu-summer training #4 UESTC 30
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入 ...
- UnityShader 表面着色器简单例程集合
0.前言 这些简单的shader程序都是写于2015年的暑假.当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目.这些文章闲置在我个人博客中,一年将过,师弟也到了 ...
- python+appium+unittest
一个流行语言,一个主流工具,一个实用框架: For android 实例如下: import unittest from appium import webdriver from time impor ...
- 算法-java代码实现希尔排序
希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...
- WEBZIP为什么打不开网页
先试三个办法 一.打开IE,点工具,点internet选项,点高级,点恢复默认设置,点保存,退出,重新打开IE 二.打开IE,刷新五次以上 三.打开IE,点工具,点internet选项,点删除文件,点 ...
- struts异常:Caused by: Parent package is not defined: json-default - [unknown location]解决办法
问题描述: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.Configura ...
- intent详解(一)
摘录自:http://blog.csdn.net/harvic880925/article/details/38399723 前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知 ...
- winform程序压缩文件上传,服务器端asp.net mvc进行接收解压
期间编程没什么难度,唯一可能忽略导致结果失败是asp.net mvc配置 对于压缩文件大的话,需要配置mvc的最大接收量: <system.web> <httpRuntime ma ...