C#開發BIMFACE系列45 服務端API之創建離線數據包
- 2021 年 10 月 14 日
- 筆記
- BIM BIMFACE, BIM 之 BIMFace

BIMFACE的常規應用方式有公有雲與私有化部署兩種方式,並且瀏覽模型或者圖紙需要使用ViewToken,ViewToken 有效期為12小時,過期後需要調用介面重新生成。該過程稍微有點麻煩且性能可能受到網路等環境的影響。本文介紹第三種更加便捷高效的方式。
由於用戶所在環境以及應用開發自身的需求,BIMFACE的用戶可能想在如下兩個場景下還能瀏覽上傳的BIMFACE的模型:
- 由於內容保護等原因,有些BIMFACE的用戶所在的網路環境不一定允許訪問公網的BIMFACE服務。
- 用戶自己的應用服務不想依賴於BIMFACE的服務來瀏覽已經在BIMFACE轉換過的模型。尤其適用於運維場景,模型數量不多,且內容不會變更。
離線數據包功能就是為這種需求量身設計的,每一個用戶上傳的模型在轉換後都可以生成對應的離線數據包, 該離線數據包可以下載到本地,獨立部署到用戶的環境內,具體操作流程以及部署細節可以參考伺服器端部署離線數據包、JS端調用離線數據包。
BIMFACE提供了兩種方式生成離線數據包:
- 在控制台中手動生成
- 調用API自動生成
企業級集成應用開發一般都使用第二種方式,靈活方便。
BIMFACE支援三種類型的文件生成離線數據包,文件轉換、模型集成、圖對比成功後,即可創建該文件的離線數據包。 在創建離線數據包完成以後,通過Callback機制通知調用方(請參考這裡);另外,調用方也可以通過介面查詢離線數據包狀態。
請求地址:PUT //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(示例)://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 //api.bimface.com/files/{fileId}/offlineDatabag 5 集成模型ID:PUT //api.bimface.com/integrations/{integrateId}/offlineDatabag 6 模型對比ID:PUT //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 //api.bimface.com/files/{fileId}/offlineDatabag 5 集成模型ID:GET //api.bimface.com/comparisions/{compareId}/offlineDatabag 6 模型對比ID:GET //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 //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 //api.bimface.com/integrations/{integrateId}/offlineDatabag。
其他操作與【通過文件ID創建離線數據包】的操作方式完全相同。
請求地址:PUT //api.bimface.com/comparisions/{compareId}/offlineDatabag。
其他操作與【通過文件ID創建離線數據包】的操作方式完全相同。
