xBIM 應用與學習 (二)


     目錄 

一、新建項目

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

  • Package Manager 
     Install-Package Xbim.Essentials -Version 4.0.29  /  Install-Package Xbim.Geometry -Version 4.0.11
  • .NET CLI
      dotnet add package Xbim.Essentials --version 4.0.29  /dotnet add package Xbim.Geometry --version 4.0.1            

二、創建憑證,打開文件

用於IFC 文件保留所有實體的所有者歷史信息; IfcOwnerHistory :定義所有的歷史信息和識別相關。為了提供快速訪問,它直接連接到所有獨立的對象、關系和屬性。

var editor = new XbimEditorCredentials
{
    ApplicationDevelopersName = "You", //應用開發商名稱
    ApplicationFullName = "Your app",  //應用程序名稱
    ApplicationIdentifier = "Your app ID", //應用程序標示符
    ApplicationVersion = "4.0", 
    //您的個人信息
    EditorsFamilyName = "lu",
    EditorsGivenName = "yongqiang",
    EditorsOrganisationName = "bim" 
};

IModel 在xBIM中的所有實現都是IDisposable這樣的,建議在開發時應用 using

using (var model = IfcStore.Open(fileName, editor, true))
{
    //...do something with the model
}

IfcStore.Open()能識別別文件格式 .ifc,.ifczip,* .xml)和IFC版本(IFC2x3,IFC4)使用這個靜態函數,它也決定是否應該使用內存模型或Esent數據庫來存儲數據。你可以使用額外的參數來明確你想要的。你也可以通過一個代表,報告進度。

三、創建文件

      如果要從頭開始創建新模型,也可以使用以下功能。在這種情況下,您必須指定應該使用哪個模式和存儲,因為我們不知道您需要什么,模型需要從一開始就知道這兩件事情。另外,請確保您為所創建的模型使用正確的模式名稱空間,因為您無法在單個模型中混合來自多個模式的數據。

IfcSchemaVersion.Ifc4 是枚舉,代表IFC的版本,當前最新的版本是IFC 4
using (var model = IfcStore.Create(editor, IfcSchemaVersion.Ifc4, XbimStoreType.InMemoryModel))
{
    //...do something with the model
}

如果要在模型中創建或修改任何內容,則必須使用事務。這些也應該在using語句中使用,以便在事件發生的時候有適當的回滾操作范圍。您必須明確提交事務以保持更改。事務不能嵌套,所以當時總是只有一個事務。

using (var txn = model.BeginTransaction("Hello Wall"))
{
    //....do something in the scope of this transaction
    txn.Commit()
}

所有的相關實體都可以通過model.Instances來創建。這個是你在模型中獲取、更改和常見新的實體的入口點。創建任何新的對象,你需要用到這個模板函數。

var newWall = mode.Instances.New<IfcWall>();

除了使用這個函數之外,不可能以任何其他方式創建新的實體。你會在上面的代碼中看到,這個函數使用可選的類型化對象初始化器來設置對象的值。沒有必要使用它們,但我個人喜歡它,因為我可以看到結果實體的結構。要找到您想要的實體,您將使用以下功能:

var firstWall = model.Instances.FirstOrDefault<IfcWall>();  //獲取默認的第一個
var allWalls = model.Instances.OfType<IfcWall>(); //獲取所有
var specificWall = model.Instances.Where<IfcWall>(w => w.Name == "Brick wall");  //檢索 牆的名稱為 Brick wall 

您可以看到,所有這些函數都是模板化的,所以它們使用對象的類型作為第一級過濾器。如果你知道你想要的類型,你應該總是指定它來提高性能。對於所有的搜索查詢,您也可以使用接口來檢索實體。我們在IFC2x3實體上實現了IFC4接口,這意味着您可以用一個代碼庫查詢IFC2x3和IFC4 使用所有這些基本的東西,你的第一個簡單的代碼可能看起來像這樣。因為它使用Xbim.Ifc4.Interfaces這個代碼將同時適用於IFC2x3和IFC4。

using Xbim.Ifc;
using Xbim.Ifc4.Interfaces; //IFC4 接口 同樣也適用於 IFC2x3 架構實現

namespace BasicExamples
{
    class QuickStart
    {
        public static void Start()
        {
            const string fileName = "SampleHouse.ifc"; //這是不帶任何IFC3 x 3 或 IFC4 版本
            var editor = new XbimEditorCredentials
            {
                ApplicationDevelopersName = "You",  // 應用開發商名稱
                ApplicationFullName = "Your app",   //應用程序名稱
                ApplicationIdentifier = "Your app ID",  //應用程序標識符
                ApplicationVersion = "4.0",     //版本
                //您的個人信息
                EditorsFamilyName = "lu,
                EditorsGivenName = "yongqiang",
                EditorsOrganisationName = "個人、企業"  //組織機構
            };
            using (var model = IfcStore.Open(fileName, editor, true))
            {
               //創建一個是事務
                using (var txn = model.BeginTransaction("Quick start transaction"))
                {
                    //獲取模型中所有的牆
                    var walls = model.Instances.OfType<IIfcWall>();

                    //遍歷所有的牆 並且改變他們的名稱
                    foreach (var wall in walls)
                    {
                        wall.Name = "Iterated wall: " + wall.Name;
                    }

                    //提交事務 
                    txn.Commit();
                }

                //保存更改后的模型 IfcStore 可以使用的擴展名為 *.ifc, *.ifczip or *.ifcxml.
                model.SaveAs("SampleHouse_Modified.ifc");
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM