在上一篇部落格《C#開發BIMFACE系列42 服務端API之圖紙對比》的最後留了一個問題,在常規業務場景下,一個.dwg檔案中包含多個圖框,如下圖
那麼當前版本與歷史版本對比完成後,在Web網頁中點選差異項可以自動定位到圖元變化所在位置。是否可以知道差異項來自哪個圖框呢?
這篇部落格針對該問題進行詳細的講解。
1、應用場景
一個.dwg檔案中包含多個圖框,在BIMFACE中瀏覽時,可以根據圖框編號與名稱定位到具體的圖框,使用更加便捷。
2、效果
(1)未拆分
(2)已拆分
拆分後的圖紙,工具條上多了一個“圖紙”按鈕,點選後彈出圖紙列表層,每一項裡面包含“圖紙名稱”與“圖號”,點選圖紙項,自動定位到對應的圖紙。
1、圖框識別,按照以下條件綜合判斷
(1)圖框符合國標的標準尺寸,如A0,A0(1+1/4)等。標準的尺寸識別準確率更高,但也考慮了一定的容差,若圖幅與規範有一定的出入仍可被識別。
(2)圖框中包含圖籤資訊,如圖紙名稱、圖紙編號等資訊。
2、圖籤識別,可以識別以下欄位
(1)圖紙名稱(圖名、標題、圖紙內容)
(2)圖紙序號(圖號、圖紙編號、張次、竣工圖號、頁碼)
(3)圖紙專業(專業、圖別、設計專業、專業名稱、圖紙類別)
(4)工程名稱(工程專案、專案、設計專案、工程總稱)
(5)圖紙日期(日期、升版日期、出圖日期、修改日期、編制日期)
3、注意事項
(1)相鄰的圖框不要相連,不要重疊。
(2)圖框外不要有額外的矩形框。
(3)圖框需要有明確的圖簽欄位。
1、發起拆分
呼叫介面
1 /// <summary> 2 /// 通過圖紙檔案ID,按圖框拆分圖紙。 3 /// (提示:圖紙拆分必須在【圖紙轉換】介面完成且轉換狀態為 success 之後才能發起,拆分是在轉換成功的基礎之上進行的) 4 /// </summary> 5 /// <param name="accessToken">【必填】令牌</param> 6 /// <param name="fileId">【必填】代表該單圖紙的檔案ID</param> 7 /// <param name="callbak">【選填】回撥url。圖紙拆分是一個耗時的操作,並不能立刻完成。可以通過回撥地址通知拆分結果</param> 8 /// <returns></returns> 9 public SplitDrawingResponse SplitDrawing(string accessToken, long fileId, string callbak = "") 10 { 11 // PUT https://api.bimface.com/files/{fileId}/split 12 string url = string.Format(BIMFaceConstants.API_HOST + "/files/{0}/split", fileId); 13 if (callbak.IsNotNullAndWhiteSpace()) 14 { 15 url += "?callback=" + callbak.UriEscapeDataString(); 16 } 17 BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders(); 18 headers.AddOAuth2Header(accessToken); 19 20 try 21 { 22 SplitDrawingResponse response; 23 24 HttpManager httpManager = new HttpManager(headers); 25 HttpResult httpResult = httpManager.Put(url); 26 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 27 { 28 response = httpResult.Text.DeserializeJsonToObject<SplitDrawingResponse>(); 29 } 30 else 31 { 32 response = new SplitDrawingResponse 33 { 34 Message = httpResult.RefText 35 }; 36 } 37 38 return response; 39 } 40 catch (Exception ex) 41 { 42 throw new BIMFaceException("[通過圖紙檔案ID,按圖框拆分圖紙]發生異常!", ex); 43 } 44 }
2、獲取圖紙拆分狀態
圖紙拆分不能立刻完成,需要等待一段時間。可以通過 callback 方式獲取拆分的資訊(不推薦),也可以通過 BIMFACE 提供的介面進行查詢。
呼叫介面
1 /// <summary> 2 /// 獲取圖紙拆分狀態 3 /// </summary> 4 /// <param name="accessToken">【必填】令牌</param> 5 /// <param name="fileId">【必填】代表該單圖紙的檔案ID</param> 6 /// <returns></returns> 7 public SplitDrawingResponse GetSplitDrawingStatus(string accessToken, long fileId) 8 { 9 // GET https://api.bimface.com/files/{fileId}/split 10 string url = string.Format(BIMFaceConstants.API_HOST + "/files/{0}/split", fileId); 11 12 BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders(); 13 headers.AddOAuth2Header(accessToken); 14 15 try 16 { 17 SplitDrawingResponse response; 18 19 HttpManager httpManager = new HttpManager(headers); 20 HttpResult httpResult = httpManager.Get(url); 21 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 22 { 23 response = httpResult.Text.DeserializeJsonToObject<SplitDrawingResponse>(); 24 } 25 else 26 { 27 response = new SplitDrawingResponse 28 { 29 Message = httpResult.RefText 30 }; 31 } 32 33 return response; 34 } 35 catch (Exception ex) 36 { 37 throw new BIMFaceException("[獲取圖紙拆分狀態]發生異常!", ex); 38 } 39 }
3、獲取圖紙拆分結果
完整的拆分結果如下
{ "code": "success", "message": null, "data": [ { "frames": [ { "boundingBox": { "min": { "x": 686680.0, "y": 1066999.0 }, "max": { "x": 770782.0, "y": 1126401.0 } }, "id": 1, "name": "unknown-name", "number": "unknown-no-1" }, { "boundingBox": { "min": { "x": 752146.0, "y": 1010435.0 }, "max": { "x": 836248.0, "y": 1069837.0 } }, "id": 2, "name": "電氣抗震設計專篇", "number": "電施01" }, { "boundingBox": { "min": { "x": 875778.0, "y": 1006559.0 }, "max": { "x": 1054130.0, "y": 1132711.0 } }, "id": 3, "name": "一層電氣平面(一)", "number": "電施02" }, { "boundingBox": { "min": { "x": 1070846.0, "y": 1006559.0 }, "max": { "x": 1249198.0, "y": 1132711.0 } }, "id": 4, "name": "一層電氣平面(二)", "number": "電施03" }, { "boundingBox": { "min": { "x": 1261883.0, "y": 1006559.0 }, "max": { "x": 1440235.0, "y": 1132711.0 } }, "id": 5, "name": "屋頂防雷平面", "number": "電施04" }, { "boundingBox": { "min": { "x": 1460840.0, "y": 1006559.0 }, "max": { "x": 1639192.0, "y": 1132711.0 } }, "id": 6, "name": "基礎接地平面", "number": "電施05" } ], "id": 0, "name": "Model" } ] }
說明:
(1)frames:一個dwg檔案中的圖框物件集合
(2)boundingBox:圖框外的矩形框物件
(3)min、max:矩形框的左上角、右下角在圖紙中的XY座標
(4)id:圖紙序號
(5)name:圖紙名稱
(6)number:圖號
呼叫介面
1 /// <summary> 2 /// 獲取圖紙拆分結果 3 /// </summary> 4 /// <param name="accessToken"></param> 5 /// <param name="fileId"></param> 6 /// <returns></returns> 7 public SplitDrawingResultResponse GetSplitDrawingResult(string accessToken, long fileId) 8 { 9 // GET https://api.bimface.com/data/v2/files/{fileId}/frames 10 string url = string.Format(BIMFaceConstants.API_HOST + "/data/v2/files/{0}/frames", fileId); 11 12 BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders(); 13 headers.AddOAuth2Header(accessToken); 14 15 try 16 { 17 SplitDrawingResultResponse response; 18 19 HttpManager httpManager = new HttpManager(headers); 20 HttpResult httpResult = httpManager.Get(url); 21 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 22 { 23 response = httpResult.Text.DeserializeJsonToObject<SplitDrawingResultResponse>(); 24 } 25 else 26 { 27 response = new SplitDrawingResultResponse 28 { 29 Message = httpResult.RefText 30 }; 31 } 32 33 return response; 34 } 35 catch (Exception ex) 36 { 37 throw new BIMFaceException("[獲取圖紙拆分結果]發生異常!", ex); 38 } 39 }
上述測試程式使用了 《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用。