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

BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToken 有效期为12小时,过期后需要调用接口重新生成。该过程稍微有点麻烦且性能可能受到网络等环境的影响。本文介绍第三种更加便捷高效的方式。
由于用户所在环境以及应用开发自身的需求,BIMFACE的用户可能想在如下两个场景下还能浏览上传的BIMFACE的模型:
- 由于内容保护等原因,有些BIMFACE的用户所在的网络环境不一定允许访问公网的BIMFACE服务。
- 用户自己的应用服务不想依赖于BIMFACE的服务来浏览已经在BIMFACE转换过的模型。尤其适用于运维场景,模型数量不多,且内容不会变更。
离线数据包功能就是为这种需求量身设计的,每一个用户上传的模型在转换后都可以生成对应的离线数据包, 该离线数据包可以下载到本地,独立部署到用户的环境内,具体操作流程以及部署细节可以参考服务器端部署离线数据包、JS端调用离线数据包。
BIMFACE提供了两种方式生成离线数据包:
- 在控制台中手动生成

- 调用API自动生成
企业级集成应用开发一般都使用第二种方式,灵活方便。
BIMFACE支持三种类型的文件生成离线数据包,文件转换、模型集成、图对比成功后,即可创建该文件的离线数据包。 在创建离线数据包完成以后,通过Callback机制通知调用方(请参考这里);另外,调用方也可以通过接口查询离线数据包状态。
请求地址: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 }
请求地址:PUT https://api.bimface.com/integrations/{integrateId}/offlineDatabag。
其他操作与【通过文件ID创建离线数据包】的操作方式完全相同。
请求地址:PUT https://api.bimface.com/comparisions/{compareId}/offlineDatabag。
其他操作与【通过文件ID创建离线数据包】的操作方式完全相同。

C#开发BIMFACE系列45 服务端API之创建离线数据包的更多相关文章
- C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...
- C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性
系列目录 [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取单文件/模型下单个构建的属性信息. 请求地址:GET https://api.bimface.com/data/v2/fil ...
- C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性
系列目录 [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...
- C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息
系列目录 [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...
- C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息
系列目录 [已更新最新开发文章,点击查看详细] 大厦建筑模型中,基本上包含多个楼层,每个楼层包含多个房间等信息.在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模 ...
- C#开发BIMFACE系列25 服务端API之获取模型数据10:获取楼层对应面积分区列表
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息>中,返回的楼层信息结果中包含了楼层的具体信 ...
- C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息>中介绍获取单个模型的所有楼层信息.某些场景下 ...
- C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列25 服务端API之获取模型数据9:获取楼层对应面积分区列表>一文中介绍了如何获取单个模型中单个楼层包 ...
- C#开发BIMFACE系列20 服务端API之获取模型数据5:批量获取构件属性
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性>中介绍了获取单个文件/模型的单个构建的属性,本篇介绍 ...
随机推荐
- 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力
音频编辑服务(Audio Editor Kit)是华为为开发者开放的各类场景音频处理能力的集合,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务提供基础编辑.伴奏提取.空间渲染.变声降噪等 ...
- Linux nginx 负载的几种方式
2021-08-191. 轮询 (这是默认的方式)就是在 nginx 映射的几个服务器按请求的时间顺序逐一分配,几率是随机的.如果后端服务器 down 掉,能自动忽略不用.这种情况一般是每台服务器配置 ...
- Python语法之选择和循环(if、while)
前言:在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码 分支:根据条件判断,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作) 1.判断的定义: 如果条件满足,才能做某 ...
- Shell 脚本如何输出帮助信息?
作者展示了一个技巧,将帮助信息写在 Bash 脚本脚本的头部,然后只要执行"脚本名 + help",就能输出这段帮助信息 https://samizdat.dev/help-mes ...
- Python - 面向对象编程 - __repr__()
为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print ...
- Java中使用jxl.jar将数据导出为excel文件
Java对Excel文件的读写操作可由jxl.jar或poi.jar实现,这里使用jxl.jar完成对Excel文件的导出. 一.将Excel文件导出在本地 步骤: 创建文件 -> 创建 ...
- .Net core 的热插拔机制的深入探索,以及卸载问题求救指南.
.Net core 的热插拔机制的深入探索,以及卸载问题求救指南. 一.依赖文件*.deps.json的读取. 依赖文件内容如下.一般位于编译生成目录中 { "runtimeTarget&q ...
- CVPR顶会论文爬取存入MySQL数据库(标题、摘要、作者、PDF链接和原地址)
main.py import pymysql import re import requests # 连接数据库函数 from bs4 import BeautifulSoup def insertC ...
- 异步servlet的原理探究
异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...
- 学习PHP中的信息格式化操作
在国际化组件的学习过程中,我们已经接触过了 NumberFormatter 这种数字的格式化操作,它可以让我们将数字转换成标准格式.货币.本地语言等形式.今天我们来学习的是另一种专门用于信息格式化的类 ...