Visual Studio 新建項目、項目建立完成後 Nuget ,項目添加 Xbim.Essentials,那麼若是項目須要幾何引擎還須要集成 Xbim.Geometry。xBIM背後有多年的發展,這兩個包都很成熟,很是穩定。html
因爲選擇了Xbim.Essentials 5.0.213版本,其依賴性較多git
安裝該dll後,引用了不少dll數據庫
首先,您應該建立憑據,用於 在IFC世界中保留全部實體的全部者歷史記錄。架構
1 /// <summary> 2 /// 建立憑證 3 /// </summary> 4 /// <returns></returns> 5 public static XbimEditorCredentials CreateCredentials() 6 { 7 XbimEditorCredentials editor = new XbimEditorCredentials 8 { 9 ApplicationDevelopersName = "NJQY", //應用開發商名稱 10 ApplicationFullName = "SparkDigitalReview", //應用程序名稱 11 ApplicationIdentifier = "NJQYf43a-faa7-4a49-b06d-4cb21f81d220", //應用程序標示符,經過Guid來表示 12 ApplicationVersion = "4.0", 13 14 //我的信息 15 EditorsFamilyName = "Zhang", 16 EditorsGivenName = "ChuanNing", 17 EditorsOrganisationName = "bim" 18 }; 19 20 return editor; 21 }
xBIM中全部對IModel接口的全部實現都是可釋放的(IDisposable),因此老是應該在using語句中使用它們,以下所示:函數
1 using (var model = IfcStore.Open(fileName, editor, true)) 2 { 3 //...do something with the model 4 }
IfcStore.Open()足夠智能識別文件格式( .ifc,.ifczip,*。xml)和IFC版本(IFC2x3,IFC4)。使用此靜態函數,它還決定是否應使用內存模型或Esent數據庫來存儲數據。您可使用其餘參數來明確說出您想要的內容。您還能夠傳入將報告進度的委託。性能
若是要從頭開始建立新模型,也可使用如下功能。在這種狀況下,您必須指定應該使用哪一個架構和存儲,由於咱們不知道您須要什麼,而且模型須要從一開始就知道這兩件事。還要確保爲您建立的模型使用正確的模式名稱空間,由於您沒法在單個模型中混合來自多個模式的數據。ui
IfcSchemaVersion.Ifc4 是枚舉,表明IFC的版本,當前最新的版本是IFC 4this
1 using (var model = IfcStore.Create(editor, IfcSchemaVersion.Ifc4, XbimStoreType.InMemoryModel)) 2 { 3 //...do something with the model 4 }
若是要在模型中建立或修改任何內容,則必須使用事務。這些也應該在using語句中使用,所以它們具備適當的範圍,以便在發生某些狀況時進行最終回滾操做。您必須明確提交事務以保留更改。事務不能嵌套,所以當時老是隻有一個事務。spa
using (var txn = model.BeginTransaction("Hello Wall")) { //....do something in the scope of this transaction txn.Commit() }
全部與實體相關的操做均可經過IModel.Instances建立。這是您在模型中獲取,更改和建立新實體的訪問入口。要建立任何新對象,請使用此模板化函數。code
【您始終必須指定要建立的非抽象類型。這是在xBIM中構建的,若是不這樣,就會出現編譯時錯誤。每一個模型都是特定於模式的,所以它是IFC2x3或IFC4或其餘特定模式。IfcStore使它更容易,由於它能夠打開兩個IFC版本,並會告訴你它是什麼,可是當你想要建立數據時,請確保你不要搞砸你的using陳述。若是您嘗試使用初始化爲IFC2x3的模型建立IFC4實體,則會拋出運行時異常。】
var newWall = mode.Instances.New<IfcWall>();
除了使用此功能以外,沒法以任何其餘方式建立新實體。您將在上面的代碼中看到,此函數使用可選的類型化對象初始值設定項來設置對象的值。沒有必要使用它們,但我我的喜歡它,由於我能夠看到結果實體的結構。要查找所需的實體,您將使用如下功能:除了使用此功能以外,沒法以任何其餘方式建立新實體。您將在上面的代碼中看到,此函數使用可選的類型化對象初始值設定項來設置對象的值。沒有必要使用它們,但我我的喜歡它,由於我能夠看到結果實體的結構。要查找所需的實體,您將使用如下功能:
1 var firstWall = model.Instances.FirstOrDefault<IfcWall>(); 2 var allWalls = model.Instances.OfType<IfcWall>(); 3 var specificWall = model.Instances.Where<IfcWall>(w => w.Name == "Brick wall");
您能夠看到全部這些函數都是模板化的,所以它們使用對象的類型做爲第一級過濾器。若是您知道所需的類型,則應始終指定它以提升性能。對於全部搜索查詢,您還可使用接口來檢索實體。咱們在IFC2x3實體上實現了IFC4接口,這意味着您可使用單個代碼庫查詢IFC2x3和IFC4 。
使用全部這些基本的東西,您的第一個簡單代碼可能以下所示。由於它使用Xbim.Ifc4.Interfaces,此代碼將同時適用於IFC2x3和IFC4。
1 public class QuickStart 2 { 3 public static void Start() 4 { 5 const string fileName = "SampleHouse.ifc"; //能夠是 IFC2x3 或者 IFC4 格式的文件 6 var credentials = XBIMUtility.CreateCredentials(); 7 8 using (var model = IfcStore.Open(fileName, credentials)) 9 { 10 using (var txn = model.BeginTransaction("Quick start transaction")) 11 { 12 // 獲取模型中全部的牆 13 var walls = model.Instances.OfType<IIfcWall>(); 14 15 // 遍歷全部的牆 而且改變他們的名稱 16 foreach (var wall in walls) 17 { 18 wall.Name = "Iterated wall: " + wall.Name; 19 } 20 21 // 提交事務 22 txn.Commit(); 23 } 24 25 // 保存更改後的模型。 IfcStore 可使用的擴展名爲 *.ifc, *.ifczip or *.ifcxml. 26 model.SaveAs("SampleHouse_Modified.ifc"); 27 } 28 } 29 }