Visual Studio 新建項目、項目創建完成后 Nuget ,項目添加 Xbim.Essentials,那么如果項目需要幾何引擎還需要集成 Xbim.Geometry。xBIM背后有多年的發展,這兩個包都很成熟,非常穩定。

由於選擇了Xbim.Essentials 5.0.213版本,其依賴性較多


安裝該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數據庫來存儲數據。您可以使用其他參數來明確說出您想要的內容。您還可以傳入將報告進度的委托。
如果要從頭開始創建新模型,也可以使用以下功能。在這種情況下,您必須指定應該使用哪個架構和存儲,因為我們不知道您需要什么,並且模型需要從一開始就知道這兩件事。還要確保為您創建的模型使用正確的模式名稱空間,因為您無法在單個模型中混合來自多個模式的數據。
IfcSchemaVersion.Ifc4 是枚舉,代表IFC的版本,當前最新的版本是IFC 4
1 using (var model = IfcStore.Create(editor, IfcSchemaVersion.Ifc4, XbimStoreType.InMemoryModel)) 2 { 3 //...do something with the model 4 }
如果要在模型中創建或修改任何內容,則必須使用事務。這些也應該在using語句中使用,因此它們具有適當的范圍,以便在發生某些情況時進行最終回滾操作。您必須明確提交事務以保留更改。事務不能嵌套,因此當時總是只有一個事務。
using (var txn = model.BeginTransaction("Hello Wall")) { //....do something in the scope of this transaction txn.Commit() }
所有與實體相關的操作都可通過IModel.Instances創建。這是您在模型中獲取,更改和創建新實體的訪問入口。要創建任何新對象,請使用此模板化函數。
【您始終必須指定要創建的非抽象類型。這是在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 }
