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');
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!