模型中发生的每一个变化都是事务的一部分,这是我们设计的核心。所有事务都是由 IModel 的实现创建的,并且从中被弱引用,因此当使用 using 语句模型时,只要保留事务,就只保留对该事务的引用。这意味着有一个单一的点,所有的变化都在发生,我们可以用它们来做一些事情。

  一件很重要的事情是记录所有的更改、以前的状态和下一个状态。将所有这些结合起来,您可以创建 back-log 或 forward-log。为了简化这个任务,我们实现了一个 xbim.io.delta.TransactionLog 类。在下面的示例中,我们将了解如何使用它。

using System;
using Xbim.Common;
using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;
using Xbim.IO.Delta;
using Xbim.IO.Step21; var editor = new XbimEditorCredentials
{
ApplicationDevelopersName = "You",
ApplicationFullName = "Your app",
ApplicationIdentifier = "Your app ID",
ApplicationVersion = "4.0", EditorsFamilyName = "Santini Aichel",
EditorsGivenName = "Johann Blasius",
EditorsOrganisationName = "Independent Architecture"
}; using (var model = IfcStore.Open("SampleHouse.ifc", editor, true))
{
using (var txn = model.BeginTransaction("Modification"))
{
using (var log = new TransactionLog(txn))
{
// 修改一个已经存在的 墙 对象
var wall = model.Instances.FirstOrDefault<IIfcWall>();
wall.Name = "Unexpected name";
wall.GlobalId = Guid.NewGuid().ToPart21();
wall.Description = "New and more descriptive description"; // 打印所有由此引起的更改
PrintChanges(log);
txn.Commit();
}
Console.WriteLine();
}
}
private static void PrintChanges(TransactionLog log)
{
foreach (var change in log.Changes)
{
switch (change.ChangeType)
{
case ChangeType.New:
Console.WriteLine(@"New entity: {0}", change.CurrentEntity);
break;
case ChangeType.Deleted:
Console.WriteLine(@"Deleted entity: {0}", change.OriginalEntity);
break;
case ChangeType.Modified:
Console.WriteLine(@"Changed Entity: #{0}={1}", change.Entity.EntityLabel, change.Entity.ExpressType.ExpressNameUpper);
foreach (var prop in change.ChangedProperties)
Console.WriteLine(@" Property '{0}' changed from {1} to {2}", prop.Name, prop.OriginalValue, prop.CurrentValue);
break;
default:
break;
}
}
}

生成的更改日志将如下所示。它包含更多的更改,因为当您更改或创建任何ifcroot实体时,xbim会自动为您处理所有者历史记录。

Changed Entity: #=IFCWALL
Property 'Name' changed from 'Basic Wall:Wall-Ext_102Bwk-75Ins-100LBlk-12P:285330' to 'Unexpected name'
Property 'OwnerHistory' changed from # to #
Property 'GlobalId' changed from '3cUkl32yn9qRSPvBJVyWw5' to '0zxW3$9z95n8U_H9YOcyiE'
Property 'Description' changed from $ to 'New and more descriptive description'
New entity: #=IFCOWNERHISTORY(#,#,$,.MODIFIED.,$,$,$,);
New entity: #=IFCPERSON($,'Santini Aichel','Johann Blasius',$,$,$,$,$);
New entity: #=IFCORGANIZATION($,'Independent Architecture',$,$,$);
New entity: #=IFCPERSONANDORGANIZATION(#,#,$);
New entity: #=IFCORGANIZATION($,'You',$,$,$);
New entity: #=IFCAPPLICATION(#,$,'Your app','Your app ID');
 

xBIM 高级03 更改日志创建的更多相关文章

  1. xBIM 基础03 基本模型操作

    系列目录    [已更新最新开发文章,点击查看详细]  本篇将使用基本的代码示例来表示如何使用xBIM.我们将介绍持久存储的四个基本功能,即 CRUD(创建,检索,更新和删除).以下示例通常适用于IF ...

  2. SAP更改日志记录表

    CDHDR  更改日志表头 CDPOS  更改日志行项目 SAP中修改频率较低的定制表(T001等)一般都会有修改记录存在,查看一个表有没有修改记录可以在SE11中查看他的技术设置,如果其中的LOG ...

  3. JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链

    继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...

  4. Nginx教程---03.Nginx日志切割

    Nginx的定时任务与自动切割 明确: 如果这个网站的访问量比较大,那么一天下来 nginx日志可能会特别的大,所以当出现这种情况呢,如果 把每天的日志都存在同一个日志文件里,会使你的日志文件大到让你 ...

  5. webdriver高级应用- 使用日志模块记录测试过程中的信息

    在自动化脚本执行过程中,使用Python的日志模块记录在测试用例执行过程中一些重要信息或者错误日志等,用于监控和后续调试脚本. 在pycharm下新建工程,并创建Log.py.Logger.conf以 ...

  6. xBIM 实战03 使用WPF技术实现IFC模型的加载与浏览

    系列目录    [已更新最新开发文章,点击查看详细]  WPF应用程序在底层使用 DirectX ,无论设计复杂的3D图形(这是 DirectX 的特长所在)还是绘制简单的按钮与文本,所有绘图工作都是 ...

  7. xBIM 高级02 插入复制功能

    系列目录    [已更新最新开发文章,点击查看详细]  IFC 模型中的合并和删除实体是一个非常重要的任务,因为 IFC 不是一个分层结构.它是一个复杂的结构,具有潜在的循环关系,是一个双向导航.在单 ...

  8. xBIM 高级01 IFC多模型合并

    系列目录    [已更新最新开发文章,点击查看详细]  多模型合并可以实现以下功能: 覆盖多个模型以表现得像一个模型 统一访问数据,就像它是单个模型一样 只读.要修改模型的内容,您必须使用特定模型 不 ...

  9. MySQL高级查询之索引创建、删除、增加、修改、慢sql、explain解释sql

    day04数据库 昨日知识点回顾 1.单表操作 1.单表的操作 条件查询的优先级别: where > group by >having > order by > limit; ...

随机推荐

  1. [jzoj 5662] 尺树寸泓 解题报告 (线段树+中序遍历)

    interlinkage: https://jzoj.net/senior/#contest/show/2703/1 description: solution: 发现$dfs$序不好维护 注意到这是 ...

  2. myeclipse打开jsp页面慢或者卡死

    不知道你们有没有这种经历,反正无论是公司电脑还是自己电脑,myeclipse打开jsp页面卡的不行不行的,又是甚至会出现卡死的现象,几经周折,找到了解决办法,亲测有效 打开window-prefere ...

  3. 限制textfield的文字长度

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...

  4. jsoup HTML parser hello world examples--转

    原文地址:http://www.mkyong.com/java/jsoup-html-parser-hello-world-examples/ Jsoup, a HTML parser, its “j ...

  5. [转]数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  6. Centos7 minimal 系列之rabbitmq的理解(九)

    一.前言 传送门:rabbitmq安装 第一次接触消息队列,有很多不熟悉的地方,可能也有很多写的不对的,大家一起学习. RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统. 使用场景: ...

  7. JavaScript 获取某个字符的 Unicode 码

    function getUnicode (charCode) { return charCode.charCodeAt(0).toString(16); } 获取的是 UTF-16 编码的值,不足4位 ...

  8. TF基础2

    1.常用API 1.图,操作和张量 tf.Graph,tf.Operation,tf.Tensor 2.可视化 TensorBoard 3.变量作用域 在TF中有两个作用域(scope),一个是nam ...

  9. TCP/IP 三次握手和HTTP过程

    0 引言 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. 1 T ...

  10. 关于Number的属性和方法你知晓几分?速来围观!

    1.Number.isFinite() 方法用来检测传入的参数是否是一个有穷数(finite number)返回值为布尔值. 和全局的 isFinite() 函数相比,这个方法不会强制将一个非数值的参 ...