C#開發BIMFACE系列45 服務端API之建立離線資料包

張傳寧 發表於 2021-10-14
C#
BIMFACE二次開發系列目錄     【已更新最新開發文章,點選檢視詳細】
C#開發BIMFACE系列45 服務端API之建立離線資料包

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

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

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

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

生成方式

BIMFACE提供了兩種方式生成離線資料包:

  • 在控制檯中手動生成

C#開發BIMFACE系列45 服務端API之建立離線資料包

  • 呼叫API自動生成

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

BIMFACE支援三種型別的檔案生成離線資料包,檔案轉換、模型整合、圖對比成功後,即可建立該檔案的離線資料包。 在建立離線資料包完成以後,通過Callback機制通知呼叫方(請參考這裡);另外,呼叫方也可以通過介面查詢離線資料包狀態。 

通過檔案ID建立離線資料包

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

引數:

C#開發BIMFACE系列45 服務端API之建立離線資料包

其中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 檔案,資料庫檔案中包含了模型轉換後的所有屬性資料,方便儲存到業務系統資料庫中並使用。

C#開發BIMFACE系列45 服務端API之建立離線資料包

測試程式

(1)建立檔案離線資料包

C#開發BIMFACE系列45 服務端API之建立離線資料包

呼叫介面的實現程式碼:

 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)查詢檔案離線資料包狀態

C#開發BIMFACE系列45 服務端API之建立離線資料包

呼叫介面的實現程式碼

 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 }

檢視控制檯

C#開發BIMFACE系列45 服務端API之建立離線資料包

(3)獲取資料包下載地址

C#開發BIMFACE系列45 服務端API之建立離線資料包

呼叫介面的實現程式碼

 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 }
通過檔案整合ID建立離線資料包

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

其他操作與【通過檔案ID建立離線資料包】的操作方式完全相同。

通過模型對比ID建立離線資料包

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

其他操作與【通過檔案ID建立離線資料包】的操作方式完全相同。

 

上述測試程式使用了 《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用。
C#開發BIMFACE系列45 服務端API之建立離線資料包
BIMFACE二次開發系列目錄     【已更新最新開發文章,點選檢視詳細】