BIMFACE二次開發
BIMFACE二次開發系列目錄 【已更新最新開發文章,點選檢視詳細】

特别說明:模型對比是在BIMFACE雲端進行的,通常需要5~10分鐘。當模型對比完成後,BIMFACE能通知對比結果。
前置條件
- 您需要将修改前和修改後的模型上傳到雲端并轉換成功以後才能發起模型對比;
- 目前僅支援.rvt單檔案的模型對比。
基本步驟
- 通過服務端API發起模型對比(對比前後模型檔案的fileId);
- 等待雲端對比任務執行;
- 對比完成後,在網頁端通過調用JavaScript API實作差異模型的顯示;
- 除了顯示差異模型,還需要調用服務端API擷取對比結果(包括新增、删除、修改的構件清單)。
對比流程
模型檔案經過雲端轉換後,生成了BIMFACE定義的資料包。是以,要對比兩個模型檔案,實際上需要對比兩個檔案的資料包。如下圖所示,檔案B是檔案A修改後的版本,對比完成之後,其結果包括兩個部分:
- 幾何差異;
- 變更構件及屬性。
發起模型對比
對比操作的第一步是調用服務端API發起模型對比。
請求位址:POST https://api.bimface.com/v2/compare
說明:不同版本的模型檔案上傳并轉換成功後,即可發起模型對比。由于對比不能立即完成,BIMFace支援在模型對比完成以後,通過Callback機制通知應用;另外,應用也可以通過接口查詢對比狀态。
參數:
請求 path(示例):https://api.bimface.com/v2/compare
請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
請求 body(示例):
{
"callback" : "https://api.glodon.com/viewing/callback?authCode=BJ90Jk0affae&signature=2ef131395fb6442eb99abd83d45c2412",
"comparedEntityType" : "file",
"config" : "object",
"followingId" : 22145522,
"name" : "compare0001",
"previousId" : 12311221,
"priority" : 2,
"sourceId" : "123223223212"
}
HTTP響應示例(200):
{
"code" : "success",
"data" : {
"compareId" : 1248756572307264,
"createTime" : "2017-12-25 16:17:27",
"name" : "compare0001",
"priority" : 2,
"reason" : "reason",
"sourceId" : "123223223212",
"status" : "succcess",
"thumbnail" : [ "https://m.bimface.com/9b711803a43b92d871cde346b63e5019/thumbnail/96.png" ]
},
"message" : ""
}
C#實作方法:
1 /// <summary>
2 /// 不同版本的模型檔案上傳并轉換成功後,即可發起模型對比。由于對比不能立即完成,BIMFace支援在模型對比完成以後,通過Callback機制通知應用;另外,應用也可以通過接口查詢對比狀态
3 /// </summary>
4 /// <param name="accessToken">【必填】令牌</param>
5 /// <param name="followingId">修改後圖紙(目前本班,本輪)模型檔案ID</param>
6 /// <param name="previousId">修改前圖紙(曆史版本,上一輪次)模型檔案ID</param>
7 /// <returns></returns>
8 public virtual ModelCompareResponse Compare(string accessToken, long followingId, long previousId)
9 {
10 CompareRequest request = new CompareRequest(followingId, previousId);
11
12 return Compare(accessToken, request);
13 }
其中12行的Compare方法調用了重載方法,實作如下:
1 /// <summary>
2 /// 不同版本的模型檔案上傳并轉換成功後,即可發起模型對比。由于對比不能立即完成,BIMFace支援在模型對比完成以後,通過Callback機制通知應用;另外,應用也可以通過接口查詢對比狀态
3 /// </summary>
4 /// <param name="accessToken">【必填】令牌</param>
5 /// <param name="request">對比時的請求參數</param>
6 /// <returns></returns>
7 public virtual ModelCompareResponse Compare(string accessToken, CompareRequest request)
8 {
9 //POST https://api.bimface.com/v2/compare
10 string url = BimfaceConstants.API_HOST + "/v2/compare";
11 string data = request.SerializeToJson();
12
13 BimFaceHttpHeaders headers = new BimFaceHttpHeaders();
14 headers.AddOAuth2Header(accessToken);
15
16 try
17 {
18 ModelCompareResponse response;
19
20 HttpManager httpManager = new HttpManager(headers);
21 HttpResult httpResult = httpManager.Post(url, data);
22 if (httpResult.Status == HttpResult.STATUS_SUCCESS)
23 {
24 response = httpResult.Text.DeserializeJsonToObject<ModelCompareResponse>();
25 }
26 else
27 {
28 response = new ModelCompareResponse
29 {
30 Message = httpResult.RefText
31 };
32 }
33
34 return response;
35 }
36 catch (Exception ex)
37 {
38 throw new Exception("[發起模型對比]發生異常!", ex);
39 }
40 }
代碼中使用的 HttpManager 類請參考我的部落格文章《C# HTTP系列 HttpWebRequest 與 HttpWebResponse》。
CompareRequest 請求類如下:
1 /// <summary>
2 /// 模型對比請求參數類
3 /// </summary>
4 [Serializable]
5 public class CompareRequest
6 {
7 /// <summary>
8 ///
9 /// </summary>
10 /// <param name="followingId">變更後檔案ID,如果為删除檔案,則為null</param>
11 /// <param name="previousId">變更前檔案ID,如果為新增檔案,則為null</param>
12 /// <param name="name">自定義對比的名稱</param>
13 public CompareRequest(long? followingId, long? previousId, string name = "")
14 {
15 ComparedEntityType = "file"; //要麼指派,必須是正确的值。如果指派null,則報錯
16 Config = null;
17 SourceId = null;
18 Priority = 2;
19 CallBack = "http://www.app.com/receive";
20
21 FollowingId = followingId;
22 PreviousId = previousId;
23 if (name.IsNullOrWhiteSpace())
24 {
25 Name = DateTime.Now.ToString("yyyyMMddHHmmss") + "對比:" + followingId.ToString2() + "-" + previousId.ToString2();
26 }
27 }
28
29 /// <summary>
30 /// 對比的模型類型:file
31 /// </summary>
32 [JsonProperty("comparedEntityType", NullValueHandling = NullValueHandling.Ignore)]
33 public string ComparedEntityType { get; set; }
34
35 [JsonProperty("config", NullValueHandling = NullValueHandling.Ignore)]
36 public object Config { get; set; }
37
38 /// <summary>
39 /// 變更後檔案ID,如果為删除檔案,則為null
40 /// </summary>
41 [JsonProperty("followingId")]
42 public long? FollowingId { get; set; }
43
44 /// <summary>
45 /// 變更前檔案ID,如果為新增檔案,則為null
46 /// </summary>
47 [JsonProperty("previousId")]
48 public long? PreviousId { get; set; }
49
50 /// <summary>
51 /// 使用者指定對比後的模型的名字
52 /// </summary>
53 [JsonProperty("name")]
54 public string Name { get; set; }
55
56 /// <summary>
57 /// 第三方應用自己的ID
58 /// </summary>
59 [JsonProperty("sourceId", NullValueHandling = NullValueHandling.Ignore)]
60 public string SourceId { get; set; }
61
62 /// <summary>
63 /// 對比優先級。取值 1、2、3。數字越大,優先級越低。預設為2
64 /// </summary>
65 [JsonProperty("priority")]
66 public int Priority { get; set; }
67
68 /// <summary>
69 /// Callback位址,待轉換完畢以後,BIMFace會回調該位址
70 /// </summary>
71 [JsonProperty("callback")]
72 public string CallBack { get; set; }
73 }
View Code
其中 Name 屬性,在構造函數中預設設定為目前時間 + "對比" + 修改後檔案ID + 修改前檔案ID。這裡是為了友善使用不需要每次調用該類都給Name指派,也可以自定義任何有意義的名稱。
ModelCompareResponse 響應類如下:
1 /// <summary>
2 /// 模型對比傳回的結果類
3 /// </summary>
4 public class ModelCompareResponse : GeneralResponse<ModelCompareBean>
5 {
6
7 }
8
9 public class ModelCompareBean
10 {
11 /// <summary>
12 /// 對比後傳回的ID,用于擷取對比狀态或者結果等資訊
13 /// </summary>
14 [JsonProperty("compareId", NullValueHandling = NullValueHandling.Ignore)]
15 public long? CompareId { get; set; }
16
17 /// <summary>
18 /// 對比完成的消耗時間,機關是秒
19 /// </summary>
20 [JsonProperty("cost", NullValueHandling = NullValueHandling.Ignore)]
21 public int? Cost { get; set; }
22
23 /// <summary>
24 /// 對比開始時間,格式:yyyy-MM-dd hh:mm:ss
25 /// </summary>
26 [JsonProperty("createTime", NullValueHandling = NullValueHandling.Ignore)]
27 public string CreateTime { get; set; }
28
29 /// <summary>
30 /// 使用者指定對比後的模型的名字
31 /// </summary>
32 [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
33 public string Name { get; set; }
34
35 /// <summary>
36 /// 離線資料包生成狀态。prepare(未生成); processing(生成中); success(生成成功); failed(生成失敗)
37 /// </summary>
38 [JsonProperty("offlineDatabagStatus", NullValueHandling = NullValueHandling.Ignore)]
39 public string OfflineDatabagStatus { get; set; }
40
41 /// <summary>
42 /// 對比優先級。取值 1、2、3。數字越大,優先級越低。預設為2
43 /// </summary>
44 [JsonProperty("priority", NullValueHandling = NullValueHandling.Ignore)]
45 public int? Priority { get; set; }
46
47 /// <summary>
48 /// 若對比失敗,傳回失敗原因
49 /// </summary>
50 [JsonProperty("reason", NullValueHandling = NullValueHandling.Ignore)]
51 public string Reason { get; set; }
52
53 /// <summary>
54 /// 第三方應用自己的ID
55 /// </summary>
56 [JsonProperty("sourceId", NullValueHandling = NullValueHandling.Ignore)]
57 public string SourceId { get; set; }
58
59 /// <summary>
60 /// 對比狀态:prepare(待對比)、processing(對比中)、success(對比成功)、failed(對比失敗)
61 /// </summary>
62 [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)]
63 public string Status { get; set; }
64
65 /// <summary>
66 /// 對比幾個縮略圖
67 /// </summary>
68 [JsonProperty("thumbnail", NullValueHandling = NullValueHandling.Ignore)]
69 public string[] Thumbnails { get; set; }
70
71 /// <summary>
72 /// 模型對比的類型 rvt(或者igms…)
73 /// </summary>
74 [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
75 public string Type { get; set; }
76
77 /// <summary>
78 /// 處理對比任務的worker類型。model-compare(或者drawing-compare…)
79 /// </summary>
80 [JsonProperty("workerType", NullValueHandling = NullValueHandling.Ignore)]
81 public string WorkerType { get; set; }
82
83 /// <summary>傳回表示目前對象的字元串。</summary>
84 /// <returns>表示目前對象的字元串。</returns>
85 public override string ToString()
86 {
87 return this.SerializeToJson();
88 }
測試
22在BIMFACE控制台中可以看到我們上傳的檔案清單,模型狀态均為轉換成功。
這裡選擇 bimface_2018_mdv_room.rvt 與 Revit案例項目改.0001.rvt 為例來進行對比。
1 /// <summary>
2 /// 開始比對
3 /// </summary>
4 protected void btnStartCompare_Click(object sender, EventArgs e)
5 {
6 txtResult.Text = string.Empty;
7
8 long followingId = lbl1RVT.Text.ToLong();
9 long previousId = lbl2RVT.Text.ToLong();
10
11 CompareRequest request = new CompareRequest(followingId, previousId);
12
13 ModelCompareApi api = new ModelCompareApi();
14 ModelCompareResponse response = api.Compare(txtAccessToken.Text, request);
15
16 txtResult.Text = response.SerializeToJson();
17 txtCompareID.Text = response.Data.CompareId.ToString();
18 }
調用對比接口發起對比
傳回結果中,code:success表示發起對比成功。到控制台中檢視如下,新增了一筆對比記錄。
在下一篇《C#開發BIMFACE系列31 服務端API之模型對比2:擷取模型對比狀态》中詳細介紹如何擷取模型對比狀态。
成在管理,敗在經驗;嬴在選擇,輸在不學! 貴在堅持!
歡迎關注作者頭條号 張傳甯IT講堂,擷取更多IT文章、視訊等優質内容。
個人作品
1、BIMFace.Community.SDK.NET開源位址:https://gitee.com/NAlps/BIMFace.SDK
系列部落格:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列視訊:https://www.cnblogs.com/SavionZhang/p/14258393.html
2、ZCN.NET.Common開源位址:https://gitee.com/NAlps/zcn.net.common
技術棧
1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python
2、jQuery、Vue.js、Bootstrap
3、資料庫:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、達夢DM、人大金倉、 神通、南大通用 GBase、華為 GaussDB 、騰訊 TDSQL 、阿裡 PolarDB、螞蟻金服 OceanBase、東軟 OpenBASE、浪潮雲溪資料庫 ZNBase
4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分庫分表、讀寫分離
5、架構:領域驅動設計 DDD、ABP
6、環境:跨平台、Windows、Linux(CentOS、麒麟、統信UOS、深度Linux)、maxOS、IIS、Nginx、Apach
7、移動App:Android、IOS、HarmonyOS、微信、小程式、快應用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler
雲原生、微服務、Docker、CI/CD、DevOps、K8S;
Dapr、RabbitMQ、Kafka、分布式、大資料、高并發、負載均衡、中間件、RPC、ELK;
.NET + Docker + jenkins + Github + Harbor + K8S;
出處:www.cnblogs.com/SavionZhang
作者:張傳甯 微軟MCP、系統架構設計師、系統內建項目管理工程師、科技部創新工程師。
專注于微軟.NET技術(.NET Core、Web、MVC、WinForm、WPF)、通用權限管理系統、工作流引擎、自動化項目(代碼)生成器、SOA 、DDD、 雲原生(Docker、微服務、DevOps、CI/CD);PDF、CAD、BIM 審圖等研究與應用。
多次參與電子政務、圖書教育、生産制造等企業級大型項目研發與管理工作。
熟悉中小企業軟體開發過程:需求分析、架構設計、編碼測試、實施部署、項目管理。通過技術與管理幫助中小企業快速化實作網際網路技術全流程解決方案。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
如有問題,可以通過郵件[email protected]聯系。共同交流、互相學習。
如果您覺得文章對您有幫助,請點選文章右下角【推薦】。您的鼓勵是作者持續創作的最大動力!