天天看點

xBIM 基礎03 基本模型操作

xBIM

系列目錄    【已更新最新開發文章,點選檢視詳細】 

  本篇将使用基本的代碼示例來表示如何使用xBIM。我們将介紹持久存儲的四個基本功能,即 CRUD(建立,檢索,更新和删除)。以下示例通常适用于IFC4,但您也可以使用IFC2x3。實際上大多數代碼都是IFC版本不可知的,因為它使用的IFC4接口也适用于IFC2x3。用于開發這些示例的示例資料可以在此處下載下傳 。

一、建立

  以下示例将建立沒有任何幾何體的簡單IFC模型。如您所見,

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();
    }
}      

四、删除

  删除是模型中最複雜的操作,首先要知道的是,它隻能在MemoryModel (記憶體模式)(2016年10月)中完全實作。之是以這麼複雜,是因為IFC 格式的資料模型非常複雜,并不是層次結構或方向圖。是以我們的delete實作隻能確定模型中沒有對象引用你删除的對象,是以模型保持一緻。但它不會自動删除任何引用它的對象或引用它。有程式員或使用者可以選擇。但是,用于删除的底層基礎設施可以非常簡單地使用: 

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 }      

成在管理,敗在經驗;嬴在選擇,輸在不學!  貴在堅持!

歡迎關注作者頭條号 張傳甯IT講堂,擷取更多IT文章、視訊等優質内容。

xBIM 基礎03 基本模型操作

個人作品

1、BIMFace.Community.SDK.NET

     開源位址:https://gitee.com/NAlps/BIMFace.SDK

     系列部落格:https://www.cnblogs.com/SavionZhang/p/11424431.html

     系列視訊:https://www.cnblogs.com/SavionZhang/p/14258393.html

2、ZCN.NET.Common

     開源位址:https://gitee.com/NAlps/zcn.net.common

xBIM 基礎03 基本模型操作

技術棧

 1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

 2、jQuery、Vue.js、Bootstrap

 3、資料庫:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、達夢DM、人大金倉、 神通、南大通用 GBase、華為 GaussDB 、騰訊 TDSQL 、阿裡 PolarDB、螞蟻金服 OceanBase、東軟 OpenBASE、浪潮雲溪資料庫 ZNBase

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分庫分表、讀寫分離

 5、架構:領域驅動設計 DDD、ABP

 6、環境:跨平台、Windows、Linux(CentOS、麒麟、統信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

 7、移動App:Android、IOS、HarmonyOS、微信、小程式、快應用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

 雲原生、微服務、Docker、CI/CD、DevOps、K8S;

 Dapr、RabbitMQ、Kafka、分布式、大資料、高并發、負載均衡、中間件、RPC、ELK;

 .NET + Docker + jenkins + Github + Harbor + K8S;

出處:www.cnblogs.com/SavionZhang

作者:張傳甯   微軟MCP、系統架構設計師、系統內建項目管理工程師、科技部創新工程師。

          專注于微軟.NET技術(.NET Core、Web、MVC、WinForm、WPF)、通用權限管理系統、工作流引擎、自動化項目(代碼)生成器、SOA 、DDD、 雲原生(Docker、微服務、DevOps、CI/CD);PDF、CAD、BIM 審圖等研究與應用。

          多次參與電子政務、圖書教育、生産制造等企業級大型項目研發與管理工作。

          熟悉中小企業軟體開發過程:需求分析、架構設計、編碼測試、實施部署、項目管理。通過技術與管理幫助中小企業快速化實作網際網路技術全流程解決方案。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如有問題,可以通過郵件[email protected]聯系。共同交流、互相學習。

如果您覺得文章對您有幫助,請點選文章右下角【推薦】。您的鼓勵是作者持續創作的最大動力!