當(dāng)前位置:首頁 > IT技術(shù) > Windows編程 > 正文

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包
2021-10-18 17:48:31


BIMFACE二次開發(fā)系列目錄???? ??【已更新最新開發(fā)文章,點(diǎn)擊查看詳細(xì)】??


?


BIMFACE的常規(guī)應(yīng)用方式有公有云與私有化部署兩種方式,并且瀏覽模型或者圖紙需要使用ViewToken,ViewToken 有效期為12小時(shí),過期后需要調(diào)用接口重新生成。該過程稍微有點(diǎn)麻煩且性能可能受到網(wǎng)絡(luò)等環(huán)境的影響。本文介紹第三種更加便捷高效的方式。

由于用戶所在環(huán)境以及應(yīng)用開發(fā)自身的需求,BIMFACE的用戶可能想在如下兩個場景下還能瀏覽上傳的BIMFACE的模型:


  • 由于內(nèi)容保護(hù)等原因,有些BIMFACE的用戶所在的網(wǎng)絡(luò)環(huán)境不一定允許訪問公網(wǎng)的BIMFACE服務(wù)。
  • 用戶自己的應(yīng)用服務(wù)不想依賴于BIMFACE的服務(wù)來瀏覽已經(jīng)在BIMFACE轉(zhuǎn)換過的模型。尤其適用于運(yùn)維場景,模型數(shù)量不多,且內(nèi)容不會變更。

離線數(shù)據(jù)包功能就是為這種需求量身設(shè)計(jì)的,每一個用戶上傳的模型在轉(zhuǎn)換后都可以生成對應(yīng)的離線數(shù)據(jù)包, 該離線數(shù)據(jù)包可以下載到本地,獨(dú)立部署到用戶的環(huán)境內(nèi),具體操作流程以及部署細(xì)節(jié)可以參考服務(wù)器端部署離線數(shù)據(jù)包、JS端調(diào)用離線數(shù)據(jù)包。


生成方式


BIMFACE提供了兩種方式生成離線數(shù)據(jù)包:


  • 在控制臺中手動生成

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_sql


  • 調(diào)用API自動生成

企業(yè)級集成應(yīng)用開發(fā)一般都使用第二種方式,靈活方便。

BIMFACE支持三種類型的文件生成離線數(shù)據(jù)包,文件轉(zhuǎn)換、模型集成、圖對比成功后,即可創(chuàng)建該文件的離線數(shù)據(jù)包。 在創(chuàng)建離線數(shù)據(jù)包完成以后,通過Callback機(jī)制通知調(diào)用方(請參考這里);另外,調(diào)用方也可以通過接口查詢離線數(shù)據(jù)包狀態(tài)。?


通過文件ID創(chuàng)建離線數(shù)據(jù)包


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

參數(shù):

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_BIM  BIMFACE_02

其中DatabagDerivativeRequest.cs 類如下



1 namespace BIMFace.SDK.CSharp.Entity.Request
2 {
3 /// <summary>
4 /// 為文件創(chuàng)建bake數(shù)據(jù)包或者離線數(shù)據(jù)包的請求類
5 /// </summary>
6 [Serializable]
7 public class DatabagDerivativeRequest
8 {
9 /// <summary>
10 /// 設(shè)置參數(shù),請參考官方具體API需要配置的相關(guān)參數(shù)
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 /// 默認(rèn)值為 true
27 /// </summary>
28 [JsonProperty("keepModel", NullValueHandling = NullValueHandling.Ignore)]
29 public bool KeepModel { get; set; }
30
31 /// <summary>
32 /// 默認(rèn)值為 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
}
}


添加上述參數(shù)后,生成的數(shù)據(jù)包中包含一個名為 modeldrive.db 的 SQLite 文件,數(shù)據(jù)庫文件中包含了模型轉(zhuǎn)換后的所有屬性數(shù)據(jù),方便保存到業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫中并使用。

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_sql_03


測試程序


(1)創(chuàng)建文件離線數(shù)據(jù)包

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_BIM  BIMFACE_04

調(diào)用接口的實(shí)現(xiàn)代碼:



1 private DatabagDerivativeCreateResponse CreateDatabag(string accessToken, long objectId, ModelType modelType, string callback = null, DatabagDerivativeRequest request = null)
2 {
3 /* 通過傳入相應(yīng)的ID創(chuàng)建對應(yīng)離線數(shù)據(jù)包:
4 文件轉(zhuǎn)換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("[創(chuàng)建離線數(shù)據(jù)包]發(fā)生異常!", ex);
62 }
63 }


(2)查詢文件離線數(shù)據(jù)包狀態(tài)

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_.net_05

調(diào)用接口的實(shí)現(xiàn)代碼



1 private DatabagDerivativeQueryResponse QueryDatabag(string accessToken, long objectId, ModelType modelType)
2 {
3 /* 通過傳入相應(yīng)的ID創(chuàng)建對應(yīng)離線數(shù)據(jù)包:
4 文件轉(zhuǎn)換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("[查詢離線數(shù)據(jù)包]發(fā)生異常!", ex);
50 }
51 }


查看控制臺

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_離線_06

(3)獲取數(shù)據(jù)包下載地址

C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_json_07

調(diào)用接口的實(shí)現(xiàn)代碼



1 /// <summary>
2 /// 獲取數(shù)據(jù)包下載地址
3 /// </summary>
4 /// <param name="accessToken">【必填】令牌</param>
5 /// <param name="objectId">【必填】模型Id 或 模型集成Id 或 模型對比Id</param>
6 /// <param name="modelType">【必填】模型類別</param>
7 /// <param name="databagVersion">數(shù)據(jù)包版本;對于offline、vr數(shù)據(jù)包,如果只有一個,則下載唯一的數(shù)據(jù)包,如果多個,則必須指定數(shù)據(jù)包版本</param>
8 /// <param name="type">數(shù)據(jù)包類型,如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("[獲取數(shù)據(jù)包下載地址]發(fā)生異常!", ex);
48 }
49 }


通過文件集成ID創(chuàng)建離線數(shù)據(jù)包


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

其他操作與【通過文件ID創(chuàng)建離線數(shù)據(jù)包】的操作方式完全相同。


通過模型對比ID創(chuàng)建離線數(shù)據(jù)包


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

其他操作與【通過文件ID創(chuàng)建離線數(shù)據(jù)包】的操作方式完全相同。

?


上述測試程序使用了 《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用。


?


BIMFACE二次開發(fā)系列目錄???? ??【已更新最新開發(fā)文章,點(diǎn)擊查看詳細(xì)】??



成在管理,敗在經(jīng)驗(yàn);嬴在選擇,輸在不學(xué)!? 貴在堅(jiān)持!

?


?C#開發(fā)BIMFACE系列45 服務(wù)端API之創(chuàng)建離線數(shù)據(jù)包_.net_08技術(shù)棧

? ?

?1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

?2、jQuery、Vue.js、Bootstrap

?3、數(shù)據(jù)庫:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、達(dá)夢DM、人大金倉、 神通、南大通用 GBase、華為 GaussDB 、騰訊 TDSQL 、阿里 PolarDB、螞蟻金服 OceanBase、東軟 OpenBASE、浪潮云溪數(shù)據(jù)庫 ZNBase

?4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分庫分表、讀寫分離

?5、架構(gòu):領(lǐng)域驅(qū)動設(shè)計(jì) DDD、ABP

?6、環(huán)境:跨平臺、Windows、Linux(CentOS、麒麟、統(tǒng)信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

?7、移動App:Android、IOS、HarmonyOS、微信、小程序、快應(yīng)用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

? ?

?云原生、微服務(wù)、Docker、CI/CD、DevOps、K8S;

?Dapr、RabbitMQ、Kafka、分布式、大數(shù)據(jù)、高并發(fā)、負(fù)載均衡、中間件、RPC、ELK;

?.NET + Docker + jenkins + Github + Harbor + K8S;


?

作者:張傳寧 ??微軟MCP、系統(tǒng)架構(gòu)設(shè)計(jì)師、系統(tǒng)集成項(xiàng)目管理工程師、科技部創(chuàng)新工程師。

??????????專注于微軟.NET技術(shù)(.NET Core、Web、MVC、WinForm、WPF)、通用權(quán)限管理系統(tǒng)、工作流引擎、自動化項(xiàng)目(代碼)生成器、SOA 、DDD、 云原生(Docker、微服務(wù)、DevOps、CI/CD);PDF、CAD、BIM 審圖等研究與應(yīng)用。

??????????多次參與電子政務(wù)、圖書教育、生產(chǎn)制造等企業(yè)級大型項(xiàng)目研發(fā)與管理工作。

??????????熟悉中小企業(yè)軟件開發(fā)過程:需求分析、架構(gòu)設(shè)計(jì)、編碼測試、實(shí)施部署、項(xiàng)目管理。通過技術(shù)與管理幫助中小企業(yè)快速化實(shí)現(xiàn)互聯(lián)網(wǎng)技術(shù)全流程解決方案。

?????????



?????????

?

本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務(wù)立即開通 >