zoukankan      html  css  js  c++  java
  • 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");
                }
            }
        }
    }
  • 相关阅读:
    创建线程的方式三:实现Callable接口 --- JDK 5.0新增
    线程的通信
    多线程的实例练习:银行账户双储户问题
    解决线程安全问题的方式三:Lock锁 --- JDK5.0新增
    演示线程的死锁问题
    Synchronized的各场景使用方法(多窗口售票例子接上篇)
    线程的【生命周期】和【线程的同步】(下面有多窗口售票例子)
    多线程:继承方式和实现方式的联系与区别
    创建多线程的方式二:实现Runnable接口
    Java项目生成可执行jar包、exe文件以及在Windows下的安装文件
  • 原文地址:https://www.cnblogs.com/w2011/p/8387862.html
Copyright © 2011-2022 走看看