zoukankan      html  css  js  c++  java
  • xBIM 高级03 更改日志创建

      模型中发生的每一个变化都是事务的一部分,这是我们设计的核心。所有事务都是由 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: #1229=IFCWALL
            Property 'Name' changed from 'Basic Wall:Wall-Ext_102Bwk-75Ins-100LBlk-12P:285330' to 'Unexpected name'
            Property 'OwnerHistory' changed from #42 to #83873
            Property 'GlobalId' changed from '3cUkl32yn9qRSPvBJVyWw5' to '0zxW3$9z95n8U_H9YOcyiE'
            Property 'Description' changed from $ to 'New and more descriptive description'
    New entity: #83873=IFCOWNERHISTORY(#83876,#83877,$,.MODIFIED.,$,$,$,0);
    New entity: #83874=IFCPERSON($,'Santini Aichel','Johann Blasius',$,$,$,$,$);
    New entity: #83875=IFCORGANIZATION($,'Independent Architecture',$,$,$);
    New entity: #83876=IFCPERSONANDORGANIZATION(#83874,#83875,$);
    New entity: #83878=IFCORGANIZATION($,'You',$,$,$);
    New entity: #83877=IFCAPPLICATION(#83878,$,'Your app','Your app ID');
     
  • 相关阅读:
    ES6 正则的扩展(待细读)
    ES6 字符串的扩展(待细读)
    CImage访问像素及其像素操作总结
    Top-Down和Bottom-Up位图的区别
    C++运算符优先级
    图像处理库CImg
    DDX_Text详细用法
    DDX和DDV——控件与变量之间值的传递
    JavaScript实现的9大排序算法
    Visual Studio快捷键
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/10983414.html
Copyright © 2011-2022 走看看