• C#开发BIMFACE系列45 服务端API之创建离线数据包


    BIMFACE二次开发系列目录     【已更新最新开发文章,点击查看详细】

    BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToken 有效期为12小时,过期后需要调用接口重新生成。该过程稍微有点麻烦且性能可能受到网络等环境的影响。本文介绍第三种更加便捷高效的方式。

    由于用户所在环境以及应用开发自身的需求,BIMFACE的用户可能想在如下两个场景下还能浏览上传的BIMFACE的模型:

    • 由于内容保护等原因,有些BIMFACE的用户所在的网络环境不一定允许访问公网的BIMFACE服务。
    • 用户自己的应用服务不想依赖于BIMFACE的服务来浏览已经在BIMFACE转换过的模型。尤其适用于运维场景,模型数量不多,且内容不会变更。

    离线数据包功能就是为这种需求量身设计的,每一个用户上传的模型在转换后都可以生成对应的离线数据包, 该离线数据包可以下载到本地,独立部署到用户的环境内,具体操作流程以及部署细节可以参考服务器端部署离线数据包JS端调用离线数据包

    生成方式

    BIMFACE提供了两种方式生成离线数据包:

    • 在控制台中手动生成

    • 调用API自动生成

    企业级集成应用开发一般都使用第二种方式,灵活方便。

    BIMFACE支持三种类型的文件生成离线数据包,文件转换、模型集成、图对比成功后,即可创建该文件的离线数据包。 在创建离线数据包完成以后,通过Callback机制通知调用方(请参考这里);另外,调用方也可以通过接口查询离线数据包状态。 

    通过文件ID创建离线数据包

    请求地址:PUT https://api.bimface.com/files/{fileId}/offlineDatabag

    参数:

    其中DatabagDerivativeRequest.cs 类如下

     1 namespace BIMFace.SDK.CSharp.Entity.Request
     2 {
     3     /// <summary>
     4     ///  为文件创建bake数据包或者离线数据包的请求类
     5     /// </summary>
     6     [Serializable]
     7     public class DatabagDerivativeRequest
     8     {
     9         /// <summary>
    10         /// 设置参数,请参考官方具体API需要配置的相关参数
    11         /// </summary>
    12         [JsonProperty("config", NullValueHandling = NullValueHandling.Ignore)]
    13         public Config Config { get; set; }
    14     }
    15 
    16     [Serializable]
    17     public class Config
    18     {
    19         public Config()
    20         {
    21             KeepModel = true;
    22             KeepDB = true;
    23         }
    24 
    25         /// <summary>
    26         /// 默认值为 true
    27         /// </summary>
    28         [JsonProperty("keepModel", NullValueHandling = NullValueHandling.Ignore)]
    29         public bool KeepModel { get; set; }
    30 
    31         /// <summary>
    32         /// 默认值为 true
    33         /// </summary>
    34         [JsonProperty("keepDB", NullValueHandling = NullValueHandling.Ignore)]
    35         public bool KeepDB { get; set; }
    36     }
    37 
    38 }

    请求 path(示例):https://api.bimface.com/files/1199714943746080/offlineDatabag

    请求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"

    请求 body(示例):

    {
      "config": {
        "keepModel": true,
        "keepDB": true
      }
    }

    添加上述参数后,生成的数据包中包含一个名为 modeldrive.db 的 SQLite 文件,数据库文件中包含了模型转换后的所有属性数据,方便保存到业务系统数据库中并使用。

    测试程序

    (1)创建文件离线数据包

    调用接口的实现代码:

     1 private DatabagDerivativeCreateResponse CreateDatabag(string accessToken, long objectId, ModelType modelType, string callback = null, DatabagDerivativeRequest request = null)
     2 {
     3     /* 通过传入相应的ID创建对应离线数据包:
     4        文件转换ID:PUT  https://api.bimface.com/files/{fileId}/offlineDatabag
     5        集成模型ID:PUT  https://api.bimface.com/integrations/{integrateId}/offlineDatabag
     6        模型对比ID:PUT  https://api.bimface.com/comparisions/{compareId}/offlineDatabag
     7      */
     8 
     9     string actionType = string.Empty;
    10     if (modelType == ModelType.fileId)
    11     {
    12         actionType = "files";
    13     }
    14     else if (modelType == ModelType.integrateId)
    15     {
    16         actionType = "integrations";
    17     }
    18     else if (modelType == ModelType.compareId)
    19     {
    20         actionType = "comparisions";
    21     }
    22 
    23     string url = BIMFaceConstants.API_HOST + string.Format("/{0}/{1}/offlineDatabag", actionType, objectId);
    24     if (callback.IsNotNullAndWhiteSpace())
    25     {
    26         url += "?callback=" + callback;
    27     }
    28 
    29     if (request == null)
    30     {
    31         request = new DatabagDerivativeRequest();
    32         request.Config = new Config();
    33     }
    34 
    35     string data = request.SerializeToJson();
    36 
    37     BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders();
    38     headers.AddOAuth2Header(accessToken);
    39 
    40     try
    41     {
    42         DatabagDerivativeCreateResponse response;
    43         HttpManager httpManager = new HttpManager(headers);
    44         HttpResult httpResult = httpManager.Put(url, data);
    45         if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    46         {
    47             response = httpResult.Text.DeserializeJsonToObject<DatabagDerivativeCreateResponse>();
    48         }
    49         else
    50         {
    51             response = new DatabagDerivativeCreateResponse
    52             {
    53                 Message = httpResult.RefText
    54             };
    55         }
    56 
    57         return response;
    58     }
    59     catch (Exception ex)
    60     {
    61         throw new BIMFaceException("[创建离线数据包]发生异常!", ex);
    62     }
    63 }

    (2)查询文件离线数据包状态

    调用接口的实现代码

     1 private DatabagDerivativeQueryResponse QueryDatabag(string accessToken, long objectId, ModelType modelType)
     2 {
     3     /* 通过传入相应的ID创建对应离线数据包:
     4        文件转换ID:GET https://api.bimface.com/files/{fileId}/offlineDatabag
     5        集成模型ID:GET https://api.bimface.com/comparisions/{compareId}/offlineDatabag
     6        模型对比ID:GET https://api.bimface.com/integrations/{integrateId}/offlineDatabag
     7      */
     8 
     9     string actionType = string.Empty;
    10     if (modelType == ModelType.fileId)
    11     {
    12         actionType = "files";
    13     }
    14     else if (modelType == ModelType.integrateId)
    15     {
    16         actionType = "integrations";
    17     }
    18     else if (modelType == ModelType.compareId)
    19     {
    20         actionType = "comparisions";
    21     }
    22 
    23     string url = BIMFaceConstants.API_HOST + string.Format("/{0}/{1}/offlineDatabag", actionType, objectId);
    24 
    25     BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders();
    26     headers.AddOAuth2Header(accessToken);
    27 
    28     try
    29     {
    30         DatabagDerivativeQueryResponse response;
    31         HttpManager httpManager = new HttpManager(headers);
    32         HttpResult httpResult = httpManager.Get(url);
    33         if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    34         {
    35             response = httpResult.Text.DeserializeJsonToObject<DatabagDerivativeQueryResponse>();
    36         }
    37         else
    38         {
    39             response = new DatabagDerivativeQueryResponse
    40             {
    41                 Message = httpResult.RefText
    42             };
    43         }
    44 
    45         return response;
    46     }
    47     catch (Exception ex)
    48     {
    49         throw new BIMFaceException("[查询离线数据包]发生异常!", ex);
    50     }
    51 }

    查看控制台

    (3)获取数据包下载地址

    调用接口的实现代码

     1 /// <summary>
     2 ///  获取数据包下载地址
     3 /// </summary>
     4 /// <param name="accessToken">【必填】令牌</param>
     5 /// <param name="objectId">【必填】模型Id 或 模型集成Id 或 模型对比Id</param>
     6 /// <param name="modelType">【必填】模型类别</param>
     7 /// <param name="databagVersion">数据包版本;对于offline、vr数据包,如果只有一个,则下载唯一的数据包,如果多个,则必须指定数据包版本</param>
     8 /// <param name="type">数据包类型,如offline、vr、igms</param>
     9 /// <returns></returns>
    10 private GetUrlSwaggerDisplay GetDatabagDownloadUrl(string accessToken, long objectId, ModelType modelType, string databagVersion = "", string type = "offline")
    11 {
    12     //GET https://api.bimface.com/data/databag/downloadUrl
    13     string url = BIMFaceConstants.API_HOST + "/data/databag/downloadUrl?" + modelType.ToString() + "=" + objectId;
    14     if (databagVersion.IsNotNullAndWhiteSpace())
    15     {
    16         url += "&databagVersion=" + databagVersion;
    17     }
    18     if (type.IsNotNullAndWhiteSpace())
    19     {
    20         url += "&type=" + type;
    21     }
    22 
    23     BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders();
    24     headers.AddOAuth2Header(accessToken);
    25 
    26     try
    27     {
    28         GetUrlSwaggerDisplay response;
    29         HttpManager httpManager = new HttpManager(headers);
    30         HttpResult httpResult = httpManager.Get(url);
    31         if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    32         {
    33             response = httpResult.Text.DeserializeJsonToObject<GetUrlSwaggerDisplay>();
    34         }
    35         else
    36         {
    37             response = new GetUrlSwaggerDisplay
    38             {
    39                 Message = httpResult.RefText
    40             };
    41         }
    42 
    43         return response;
    44     }
    45     catch (Exception ex)
    46     {
    47         throw new BIMFaceException("[获取数据包下载地址]发生异常!", ex);
    48     }
    49 }
    通过文件集成ID创建离线数据包

    请求地址:PUT https://api.bimface.com/integrations/{integrateId}/offlineDatabag。

    其他操作与【通过文件ID创建离线数据包】的操作方式完全相同。

    通过模型对比ID创建离线数据包

    请求地址:PUT https://api.bimface.com/comparisions/{compareId}/offlineDatabag。

    其他操作与【通过文件ID创建离线数据包】的操作方式完全相同。

    上述测试程序使用了 《BIMFace.SDK.CSharp》开源SDK。欢迎大家下载使用。
    BIMFACE二次开发系列目录     【已更新最新开发文章,点击查看详细】

    成在管理,败在经验;嬴在选择,输在不学!  贵在坚持!

    欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。

       

     个人作品

       

        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

     技术栈

       

     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 审图等研究与应用。

              多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

              熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

             


             

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。

    如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!

  • 相关阅读:
    git 文件回退
    git reset
    开源
    android json js 算法 面试
    Android* 2.3.7
    Sqoop HBase Hadoop
    行业案例、技术



  • 原文地址:https://www.cnblogs.com/SavionZhang/p/15402550.html
Copyright © 2020-2023  润新知