xBIM 高级02 插入复制功能
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
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; // 仅通过反向关系(它将接管所有属性和类型)实现 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);
}; 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 高级02 插入复制功能的更多相关文章
- xBIM 插入复制功能
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- MySQL高级02
索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.你可以简单理解为“排好序的快速查找数据结构”. 在数据之外,数据库系统还维护着满足特定查找算法的 ...
- xBIM 基础02 快速入门
系列目录 [已更新最新开发文章,点击查看详细] 一.新建项目 Visual Studio 新建项目.项目创建完成后 Nuget ,项目添加 Xbim.Essentials,那么如果项目需要几何 ...
- xBIM 高级03 更改日志创建
系列目录 [已更新最新开发文章,点击查看详细] 模型中发生的每一个变化都是事务的一部分,这是我们设计的核心.所有事务都是由 IModel 的实现创建的,并且从中被弱引用,因此当使用 using ...
- xBIM 高级01 IFC多模型合并
系列目录 [已更新最新开发文章,点击查看详细] 多模型合并可以实现以下功能: 覆盖多个模型以表现得像一个模型 统一访问数据,就像它是单个模型一样 只读.要修改模型的内容,您必须使用特定模型 不 ...
- JS高级. 02 面向对象、创建对象、构造函数、自定义构造函数、原型
面向对象的三大特性: 封装 a) 把一些属性和方法装到一个对象里 2. 继承 a) js中的继承是指: 一个对象没有一些方法和属性,而另一个对象有 把另一个个对象的属性和方法,拿过来自己用, ...
- xBIM 实战02 在浏览器中加载IFC模型文件并设置特效
系列目录 [已更新最新开发文章,点击查看详细] 在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...
- xBIM 学习与应用系列目录
xBIM 实战04 在WinForm窗体中实现IFC模型的加载与浏览 xBIM 实战03 使用WPF技术实现IFC模型的加载与浏览 xBIM 实战02 在浏览器中加载IFC模型文件并设 ...
- XBIM 基于 WexBIM 文件在 WebGL 浏览和加载
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
随机推荐
- 什么是BOM头(字节顺序标记(ByteOrderMark))
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑ut ...
- 不使用Store安装WSL
Windows Store经常会因为各种原因打不开, 这时候我们可以尝试直接下载安装WSL 1. PowerShell里运行下载: PS C:\WINDOWS\system32> Inv ...
- iis 部署
配置错误1: 由于权限不足而无法读取配置文件 建立一个新用户,分配所有权限 http://blog.csdn.net/jaychouliyu/article/details/7237143 配置错误2 ...
- MongoDB在MacOS上的客户端Robo 3T 的简单使用(二)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 本篇文章只做简单介绍,能够使用起来 ...
- Android开发中:小米2S DDMS 不显示
参考:http://bbs.xiaomi.cn/thread-5672159-1-1.html
- ubuntu16.04 安装配置matlab+python +cuda8.0+cudnn+opencv3.1的caffe环境
网络上有很多ubuntu上caffe配置环境的帖子,本人照着其中的许多进行了参考,都出现了或多或少的错误,很多地方也有差异. 于是自己整理了下自己的安装过程,成功进行了测试,跑通了faster-rcn ...
- Python笔记26----正则表达式匹配
1.语法: 2.题目1:数据类型: 如果要选择 time 为2014-12-18那天的数据:采用正则化来处理 代码: import re regex = re.compile(r'^2014-12 ...
- php 密码hash加密
做密码加密,记录一下. password_hash 函数在 PHP 5.5 时被引入. 此函数现在使用的是目前 PHP 所支持的最强大的加密算法 BCrypt .例子: $passwordHash = ...
- Python笔记(2)
Python 一些常用的运算符: 1.算术运算符:+(加).-(减).*(乘)./(除).//(取整).%(取余).**(乘方): 2.比较运算符:>(大于).<(小于).>=(大于 ...
- 2019-03-18 用Task Schedule定时调用Python脚本
1.空白处右键新建Task(Create New Task)设置每日定时(Daily) 2.新建Actions 3.填写 Program+Start in 为Python的路径:C:\python36 ...