xBIM 基础03 基本模型操作
IfcStore
需要一个XbimEditorCredentials
表示当前应用程序和用户的配置对象,并使用它来维护OwnerHistory
根实体。这是一项要求,可以更轻松地处理创建合规IFC模型所需的众多方面之一。此IFC未定义任何模型视图定义(MVD), 因此除了WHERE
规则和所需属性之外没有其他限制。您应始终设置编辑器凭据并使用应用程序的首字母和当前用户填写它。1 XbimEditorCredentials editor = new XbimEditorCredentials 2 { 3 ApplicationDevelopersName = "NJQY", //应用开发商名称 4 ApplicationFullName = "SparkDigitalReview", //应用程序名称 5 ApplicationIdentifier = "NJQYf43a-faa7-4a49-b06d-4cb21f81d220", //应用程序标示符,通过Guid来表示 6 ApplicationVersion = "4.0", 7 8 //个人信息 9 EditorsFamilyName = "Zhang", 10 EditorsGivenName = "ChuanNing", 11 EditorsOrganisationName = "bim" 12 };
IModel
xBIM中的所有实现都是 IDisposable
这样的,你应该总是在这样的 using
语句中使用它们
1 using (var model = IfcStore.Create(editor, IfcSchemaVersion.Ifc4, XbimStoreType.InMemoryModel)) 2 { 3 //...do something with the model 4 }
如果要在模型中创建或修改任何内容,则必须使用事务。这些也应该在 using
语句中使用,因此它们具有适当的范围,以便在发生某些情况时进行最终回滚操作。您必须明确提交事务以保留更改。事务不能嵌套,因此当时总是只有一个事务。
1 using (var txn = model.BeginTransaction("Hello Wall")) 2 { 3 //....do something in the scope of this transaction 4 txn.Commit() 5 }
所有与实体相关的操作都可通过IModel.Instances
。这是您在模型中获取,更改和创建新实体的访问点。要创建任何新对象,请使用此模板化函数。您始终必须指定要创建的非抽象类型。这是在xBIM中构建的,如果不这样,就会出现编译时错误。每个模型都是特定于模式的,因此它是IFC2x3或IFC4或其他特定模式。IfcStore
使它更容易,因为它可以打开两个IFC版本,并会告诉你它是什么,但是当你想要创建数据时,请确保你不要搞砸你的using
陈述。如果您尝试使用初始化为IFC2x3的模型创建IFC4实体,则会抛出运行时异常。
1 var newWall = mode.Instances.New<IfcWall>();
除了使用此功能之外,无法以任何其他方式创建新实体。您将在上面的代码中看到,此函数使用可选的类型化对象初始值设定项来设置对象的值。没有必要使用它们,但我个人喜欢它,因为我可以看到结果实体的结构。
使用所有这些基本部件,我们可以建造第一面墙。这面墙没有任何几何形状,因此大多数IFC观众都不会向您展示任何东西。但这只是一个基本的例子。这是完整的代码:
1 var editor = new XbimEditorCredentials 2 { 3 ApplicationDevelopersName = "xBIM Team", 4 ApplicationFullName = "xBIM Toolkit", 5 ApplicationIdentifier = "xBIM", 6 ApplicationVersion = "4.0", 7 EditorsFamilyName = "Santini Aichel", 8 EditorsGivenName = "Johann Blasius", 9 EditorsOrganisationName = "Independent Architecture" 10 }; 11 using (var model = IfcStore.Create(editor, IfcSchemaVersion.Ifc4, XbimStoreType.InMemoryModel)) 12 { 13 using (var txn = model.BeginTransaction("Hello Wall")) 14 { 15 // 创建模型前应该先创建项目 16 var project = model.Instances.New<IfcProject>(p => p.Name = "Basic Creation"); 17 // 定义基本的单位 SIUnitsUK 为英制单位 18 project.Initialize(ProjectUnits.SIUnitsUK); 19 20 // 创建简单的对象并使用lambda初始值设定名称 21 var wall = model.Instances.New<IfcWall>(w => w.Name = "The very first wall"); 22 23 // 设置一些基本的属性 24 model.Instances.New<IfcRelDefinesByProperties>(rel => { 25 rel.RelatedObjects.Add(wall); 26 rel.RelatingPropertyDefinition = model.Instances.New<IfcPropertySet>(pset => { 27 pset.Name = "Basic set of properties"; 28 pset.HasProperties.AddRange(new[] { 29 model.Instances.New<IfcPropertySingleValue>(p => 30 { 31 p.Name = "Text property"; 32 p.NominalValue = new IfcText("Any arbitrary text you like"); 33 }), 34 model.Instances.New<IfcPropertySingleValue>(p => 35 { 36 p.Name = "Length property"; 37 p.NominalValue = new IfcLengthMeasure(56.0); 38 }), 39 model.Instances.New<IfcPropertySingleValue>(p => 40 { 41 p.Name = "Number property"; 42 p.NominalValue = new IfcNumericMeasure(789.2); 43 }), 44 model.Instances.New<IfcPropertySingleValue>(p => 45 { 46 p.Name = "Logical property"; 47 p.NominalValue = new IfcLogical(true); 48 }) 49 }); 50 }); 51 }); 52 53 txn.Commit(); 54 } 55 model.SaveAs("BasicWall.ifc"); 56 }
IFC 文件格式如下(Revit 自带示例转换 rac_advanced_sample_project.ifc)
ISO-10303-21; HEADER; FILE_DESCRIPTION ((''), '2;1'); FILE_NAME ('', '2016-10-27T13:14:43', (''), (''), 'Xbim File Processor version 3.2.0.0', 'Xbim version 3.2.0.0', ''); FILE_SCHEMA (('IFC4')); ENDSEC; DATA; #1=IFCPROJECT('2t0OftVsP8UBH3rtAB$yJv',#2,'Basic Creation',$,$,$,$,(#20,#23),#8); #2=IFCOWNERHISTORY(#5,#6,$,.ADDED.,$,$,$,0); #3=IFCPERSON($,'Santini Aichel','Johann Blasius',$,$,$,$,$); #4=IFCORGANIZATION($,'Independent Architecture',$,$,$); #5=IFCPERSONANDORGANIZATION(#3,#4,$); #7=IFCORGANIZATION($,'xBIM Team',$,$,$); #6=IFCAPPLICATION(#7,$,'xBIM Toolkit','xBIM'); #8=IFCUNITASSIGNMENT((#9,#10,#11,#12,#13,#14,#15,#16,#17)); #9=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); #10=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); #11=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); #12=IFCSIUNIT(*,.SOLIDANGLEUNIT.,$,.STERADIAN.); #13=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); #14=IFCSIUNIT(*,.MASSUNIT.,$,.GRAM.); #15=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); #16=IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.DEGREE_CELSIUS.); #17=IFCSIUNIT(*,.LUMINOUSINTENSITYUNIT.,$,.LUMEN.); #18=IFCCARTESIANPOINT((0.,0.,0.)); #19=IFCAXIS2PLACEMENT3D(#18,$,$); #20=IFCGEOMETRICREPRESENTATIONCONTEXT('Building Model','Model',3,1.E-05,#19,$); #21=IFCCARTESIANPOINT((0.,0.)); #22=IFCAXIS2PLACEMENT2D(#21,$); #23=IFCGEOMETRICREPRESENTATIONCONTEXT('Building Plan View','Plan',2,1.E-05,#22,$); #24=IFCWALL('1YTVCro6L0$OJQL2X7wICY',#2,'The very first wall',$,$,$,$,$,$); #27=IFCPROPERTYSINGLEVALUE('Text property',$,IFCTEXT('Any arbitrary text you like'),$); #28=IFCPROPERTYSINGLEVALUE('Length property',$,IFCLENGTHMEASURE(56.),$); #29=IFCPROPERTYSINGLEVALUE('Number property',$,IFCNUMERICMEASURE(789.2),$); #30=IFCPROPERTYSINGLEVALUE('Logical property',$,IFCLOGICAL(.T.),$); #26=IFCPROPERTYSET('2u_olyjv13oRt0GvSVSxHS',#2,'Basic set of properties',$,(#27,#28,#29,#30)); #25=IFCRELDEFINESBYPROPERTIES('3I5GuvWn95PRXcxoFGfJAL',#2,$,$,(#24),#26); ENDSEC; END-ISO-10303-21;
IModel.Instances
再次用于访问我们需要的所有实体。 1 var firstWall = mode.Instances.FirtsOrDefault<IfcWall>(); 2 var allWalls = model.Instances.OfType<IfcWall>(); 3 var specificWall = model.Instances.Where<IfcWall>(w => w.Name == "Brick wall");
您可以看到,所有这些函数都是模板化的,所以它们使用对象的类型作为第一级过滤器。如果你知道你想要的类型,你应该总是指定它来提高性能。对于所有的搜索查询,您也可以使用接口来检索实体。我们在IFC2x3实体上实现了IFC4接口,这意味着您可以用一个代码库查询IFC2x3和IFC4 。
以下示例只需要这些使用:
using System; using System.Linq; using Xbim.Ifc; using Xbim.Ifc4.Interfaces;
如果您对实体的结构感兴趣,建议浏览 buildingSMART ,它的前身是国际数据互用联盟(IAI-International Alliance of Interoperability) 教程网站。
1 const string fileName = "SampleHouse.ifc"; 2 using (var model = IfcStore.Open(fileName)) 3 { 4 // 获得IFC 文件中的所有门(使用IfcDoor的IFC4接口,这将对IFC2x3和IFC4都有效) 5 var allDoors = model.Instances.OfType<IIfcDoor>(); 6 // 只获得具有定义的IIfcTypeObject的门 7 var someDoors = model.Instances.Where<IIfcDoor>(d => d.IsTypedBy.Any()); 8 // 获取单个门 以Id 查询 9 var id = "2AswZfru1AdAiKfEdrNPnu"; 10 var theDoor = model.Instances.FirstOrDefault<IIfcDoor>(d => d.GlobalId == id); 11 Console.WriteLine($"Door ID: {theDoor.GlobalId}, Name: {theDoor.Name}"); 12 // 获取这个门的所有属性 13 var properties = theDoor.IsDefinedBy 14 .Where(r => r.RelatingPropertyDefinition is IIfcPropertySet) 15 .SelectMany(r => ((IIfcPropertySet)r.RelatingPropertyDefinition).HasProperties) 16 .OfType<IIfcPropertySingleValue>(); 17 foreach (var property in properties) 18 Console.WriteLine($"Property: {property.Name}, Value: {property.NominalValue}"); 19 }
控制台输出属性信息
Door ID: 3cUkl32yn9qRSPvBJVyWYp, Name: Doors_ExtDbl_Flush:1810x2110mm:285860 Property: IsExternal, Value: true Property: Reference, Value: 1810x2110mm Property: Level, Value: Level: Ground Floor Property: Sill Height, Value: 0 Property: Area, Value: 4.9462127188431 Property: Volume, Value: 0.193819981582386 Property: Mark, Value: 1 Property: Category, Value: Doors Property: Family, Value: Doors_ExtDbl_Flush: 1810x2110mm Property: Family and Type, Value: Doors_ExtDbl_Flush: 1810x2110mm Property: Head Height, Value: 2110 Property: Host Id, Value: Basic Wall: Wall-Ext_102Bwk-75Ins-100LBlk-12P Property: Type, Value: Doors_ExtDbl_Flush: 1810x2110mm Property: Type Id, Value: Doors_ExtDbl_Flush: 1810x2110mm Property: Phase Created, Value: New Construction
using
语句中,否则模型将在您创建或更改任何对象时抛出异常。const string fileName = "SampleHouse.ifc"; var editor = new XbimEditorCredentials { ApplicationDevelopersName = "xBIM Team", ApplicationFullName = "xBIM Toolkit", ApplicationIdentifier = "xBIM", ApplicationVersion = "4.0", EditorsFamilyName = "Santini Aichel", EditorsGivenName = "Johann Blasius", EditorsOrganisationName = "Independent Architecture" }; using (var model = IfcStore.Open(fileName, editor, true)) { // 根据ID 在模型中查询对应的门 var id = "3cUkl32yn9qRSPvBJVyWYp"; var theDoor = model.Instances.FirstOrDefault<IfcDoor>(d => d.GlobalId == id); // 修改事务 using (var txn = model.BeginTransaction("Doors modification")) { // 创建具有两个属性的新属性集 var pSetRel = model.Instances.New<IfcRelDefinesByProperties>(r => { r.GlobalId = Guid.NewGuid(); r.RelatingPropertyDefinition = model.Instances.New<IfcPropertySet>(pSet => { pSet.Name = "New property set"; // 所有的集合被初始化 pSet.HasProperties.Add(model.Instances.New<IfcPropertySingleValue>(p => { p.Name = "First property"; p.NominalValue = new IfcLabel("First value"); })); pSet.HasProperties.Add(model.Instances.New<IfcPropertySingleValue>(p => { p.Name = "Second property"; p.NominalValue = new IfcLengthMeasure(156.5); })); }); });
// 修改门的名称 theDoor.Name += "_checked";
// 添加属性 pSetRel.RelatedObjects.Add(theDoor);
// 提交修改事务 txn.Commit(); } }
1 using (var model = IfcStore.Open(fileName)) 2 { 3 // 获取模型中得一个门 4 var id = "3cUkl32yn9qRSPvBJVyWYp"; // 使用模型ID 5 var theDoor = model.Instances.FirstOrDefault<IIfcDoor>(d => d.GlobalId == id); 6 // 打开事务 7 using (var txn = model.BeginTransaction("Delete the door")) 8 { 9 //删除门 10 model.Delete(theDoor); 11 //提交修改 12 txn.Commit(); 13 } 14 }
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
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联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!