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 ...
随机推荐
- poj--3630--Phone List(字典树+前缀判断)
Phone List Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit St ...
- Android Fragment RecycleListView
1.新建SuperActivity package com.example.ting.criminalintentpractise; import android.os.Bundle;import a ...
- SVG实现波浪效果
SVG实现波浪效果 svg path:C 贝塞尔曲线绘制波浪形状 A 绘制圆弧形 svg animate:制作波浪动画,为了波浪动画效果自然,设置values关键点 attributeName: ...
- JAVA 日期工具类的总结
一般,在项目中,我们会会经常使用到日期的各种方式的处理,在各个业务逻辑操作中,都需要相关的日期操作,因此,实现项目中的日期工具类的提出,还是十分重要的,下面,就项目中常用到的日期的相关操作方式,做了一 ...
- 防范CSRF(三)
除了可以更改微软默认的cookie的名字外,还可以更改默认的加密方法.继承IAntiForgeryAdditionalDataProvider接口,实现里面的方法即可. 采用的加密方法有加盐和使用时间 ...
- 「JavaSE 重新出发」05.02 泛型数组列表、包装类
泛型数组列表 ArrayList 是一个采用类型参数(type parameter)的泛型类(generic class). java ArrayList<Employee> staff ...
- 第五章 Python之装饰器
函数对象 函数是第一类对象:即函数可以当作数据传递 #可以被引用,可以被当作参数传递,返回值可以是函数,可以当作容器类型的元素 #引用 def func(x,y): print(x,y) f=func ...
- EL表达式的作用与限制条件
限制条件 只能访问域对象的数据 用法 访问基本数据类型 首先把数据保存在域对象中 pagecontext.setAttribute("name","eric") ...
- MySQL ERROR 1366(HY000) Incorrect string value
有以下两张表: mysql> show tables; +---------------+ | Tables_in_old | +---------------+ | book | | pres ...
- 【XSY2892】【GDSOI2018】谁是冠军
题目来源:noi2018模拟测试赛(二十三)T3 san 为什么noi模拟赛里会做到省选原题啊…… 题意: Description 有n个人,简单起见把他们编号为1到n,每个人有三项指标分别是攻击力, ...