C#開發BIMFACE系列45 服務端API之創建離線數據包

BIMFACE二次開發系列目錄     【已更新最新開發文章,點擊查看詳細】

BIMFACE的常規應用方式有公有雲與私有化部署兩種方式,並且瀏覽模型或者圖紙需要使用ViewToken,ViewToken 有效期為12小時,過期後需要調用介面重新生成。該過程稍微有點麻煩且性能可能受到網路等環境的影響。本文介紹第三種更加便捷高效的方式。

由於用戶所在環境以及應用開發自身的需求,BIMFACE的用戶可能想在如下兩個場景下還能瀏覽上傳的BIMFACE的模型:

  • 由於內容保護等原因,有些BIMFACE的用戶所在的網路環境不一定允許訪問公網的BIMFACE服務。
  • 用戶自己的應用服務不想依賴於BIMFACE的服務來瀏覽已經在BIMFACE轉換過的模型。尤其適用於運維場景,模型數量不多,且內容不會變更。

離線數據包功能就是為這種需求量身設計的,每一個用戶上傳的模型在轉換後都可以生成對應的離線數據包, 該離線數據包可以下載到本地,獨立部署到用戶的環境內,具體操作流程以及部署細節可以參考伺服器端部署離線數據包JS端調用離線數據包

生成方式

BIMFACE提供了兩種方式生成離線數據包:

  • 在控制台中手動生成

  • 調用API自動生成

企業級集成應用開發一般都使用第二種方式,靈活方便。

BIMFACE支援三種類型的文件生成離線數據包,文件轉換、模型集成、圖對比成功後,即可創建該文件的離線數據包。 在創建離線數據包完成以後,通過Callback機制通知調用方(請參考這裡);另外,調用方也可以通過介面查詢離線數據包狀態。 

通過文件ID創建離線數據包

請求地址: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 }
通過文件集成ID創建離線數據包

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

其他操作與【通過文件ID創建離線數據包】的操作方式完全相同。

通過模型對比ID創建離線數據包

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

其他操作與【通過文件ID創建離線數據包】的操作方式完全相同。

 

上述測試程式使用了 《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用。
BIMFACE二次開發系列目錄     【已更新最新開發文章,點擊查看詳細】