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二次开发系列目录     【已更新最新开发文章,点击查看详细】

C#开发BIMFACE系列45 服务端API之创建离线数据包的更多相关文章

  1. C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...

  2. C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性

    系列目录     [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取单文件/模型下单个构建的属性信息. 请求地址:GET https://api.bimface.com/data/v2/fil ...

  3. C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性

    系列目录     [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...

  4. C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息

    系列目录     [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...

  5. C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息

    系列目录     [已更新最新开发文章,点击查看详细] 大厦建筑模型中,基本上包含多个楼层,每个楼层包含多个房间等信息.在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模 ...

  6. C#开发BIMFACE系列25 服务端API之获取模型数据10:获取楼层对应面积分区列表

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息>中,返回的楼层信息结果中包含了楼层的具体信 ...

  7. C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息>中介绍获取单个模型的所有楼层信息.某些场景下 ...

  8. C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列25 服务端API之获取模型数据9:获取楼层对应面积分区列表>一文中介绍了如何获取单个模型中单个楼层包 ...

  9. C#开发BIMFACE系列20 服务端API之获取模型数据5:批量获取构件属性

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性>中介绍了获取单个文件/模型的单个构建的属性,本篇介绍 ...

随机推荐

  1. 从新建文件夹开始构建ShadowPlay Engine(5)

    本篇序言 从本篇开始,我们要开始构建引擎核心中的系统组件部分,广义上讲其实我们从开始到现在一直都是在构建引擎核心中的系统部分,但严格的定义中系统组件大概有这么几个:内存管理,线程管理,文件管理,时间系 ...

  2. Dynamics CRM实体系列之1:N、N:1以及N:N关系

    Dynamics CRM在实施过程中会遇到很多多个实体关联的问题,这样可以实现多个实体的记录通过关联的字段实现数据的综合展示,在Sql Server里面叫做外键,在Dynamics CRM叫做关系.D ...

  3. 单片机学习(九)定时器扫描按钮和数码管与PWM的使用

    目录 一.使用定时器扫描按钮和数码管 1. 使用定时器进行扫描的缘由 2. 定时器扫描独立按钮 3. 定时器扫描数码管 二.PWM的使用 1. PWM简介 2. LED呼吸灯 实现一 实现二 3. 按 ...

  4. 24点游戏(24 game)的C++编程求解实现

    什么是24点游戏 24点游戏,英文叫做24 game,是对给定的4个非负整数进行加减乘除运算,要求每个数都要被用到且仅用到一次,并得到最终的运算结果为24.比如3.8.3.8这四个数,可以找出唯一的一 ...

  5. TypeScript 中枚举类型的理解?应用场景?

    一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表 ...

  6. 【SpringMVC】视图

    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有转发视图和重定向视图 当工程引入jstl的依赖,转发视图会自动 ...

  7. 洛谷P2424 约数和 题解

    题目 约数和 题解 此题可以说完全就是一道数学题,不难看出这道题所求的是 \(\sum\limits_{i=x}^{y}{\sum\limits_{d|i}{d}}\) 的值. 很显然,用暴力枚举肯定 ...

  8. Merchant

      \(get\)二分新用法.   每道题都有答案范围提示,以前只是以为是用来提示用什么类型输出的.   从来没想过直接用它来二分.   这道题真的刷新了我的认知啊......   整道题的复杂度是\ ...

  9. Cython 模块扩展 - 编程语言 替代实现 应用领域 汇总一览

    Python 本身只是一种编程语言规范,可以使用其它编程语言实现它或扩展它:譬如:采有 Python C Java .Net 等重实现 Python,而采用 Python C/C++ C# Java ...

  10. 安装 Ubuntu 21.04 后必备的绝佳应用大合集(持续更新中)

    @ 目录 一.Google Chrome 浏览器 1.下载 2.安装 3.设置搜索引擎 二.火焰截图(替代QQ截图) 1.简介: 2.安装: 3.设置快捷键: 三.VLC视频播放器(替代Potplay ...