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 ...
随机推荐
- hdu_1019Least Common Multiple(最小公倍数)
太简单了...题目都不想贴了 //算n个数的最小公倍数 #include<cstdio> #include<cstring> #include<algorithm> ...
- 数值积分之Simpson公式与梯形公式
Simpson(辛普森)公式和梯形公式是求数值积分中很重要的两个公式,可以帮助我们使用计算机求解数值积分,而在使用过程中也有多种方式,比如复合公式和变步长公式.这里分别给出其简单实现(C++版): 1 ...
- Java应用开发中的字符集与字符编码
事出有因 在向HttpURLConnection的输出流写入内容时,因没有设置charset,导致接收方对数据的验签不一致. URL url = new URL(requestUrl); //打开连接 ...
- Asp.Net Core Use MongoDB
前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...
- Angular(2+) 国际化方案(ngx-translate)
本文只针对ngx-translate/core 6.x版本,如果你使用的是5.x或者更低的版本,请参照以下链接. https://github.com/ngx-translate/core/blob/ ...
- Java | 原来 try 还可以这样用啊?!
本文首发于 http://youngzy.com/ 习惯了这样的try: try { } catch (Exception e) { } 看到了这样的try,觉得有点神奇: try(...) { } ...
- PHP操作MySQL对表增加一列(一个字段)
2014-03-19 16:59 1471人阅读 评论(0) 收藏 举报 分类: MySQL(12) 对于已经建立好的数据库,在一个已经有字段的表内新加字段可用以下方法: mysql_query(&q ...
- 关于在vue-cli中使用微信自动登录和分享
(以下所有接口由后台提供) 一.微信自动登录 //定义事件 methods:{ //判断是否微信登陆 是不是微信浏览器 isWeiXin() { let ua = window.navigator.u ...
- php数组根据某一个键值,把相同键值的合并生成一个新的二维数组
http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...
- 读书笔记——《C++ Concurrency IN ACTION》
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...