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创建离线数据包】的操作方式完全相同。
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!