BIMFACE官方示例中,加載三維模型後,模型瀏覽器中左上角默認提供了「目錄樹」的功能,清晰地展現了模型的完整構成及上下級關係。html
本篇介紹如何獲取單個模型的構件分類樹信息。api
請求地址:POST https://api.bimface.com/data/v2/files/{fileId}/tree瀏覽器
說明:單模型構件分類樹, treeType 接受兩個值:default 和 customized,默認爲 default。 ide
v參數用來區別 treeType 爲 default 時返回樹的格式, customized老是返回格式2.0的構件樹。post
參數:
測試
v參數用來區別 treeType 爲 default 時返回樹的格式, customized老是返回格式2.0的構件樹。 ui
當 treeType 爲"customized"時,desiredHierarchy 表示了篩選樹的層次,可選值有building,systemType,specialty,floor,category,family,familyType,如:desiredHierarchy=specialty,systemtype。url
customizedNodeKeys:用來指定篩選樹每一個維度用id或者是name做爲惟一標識, 如"floor":"id"。spa
請求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/tree?v=2.03d
請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
請求 body(示例):能夠爲空,不傳遞。
HTTP響應示例(200):
{ "code": "success", "message": null, "data": [ { "actualName": "1F", "data": null, "elementCount": 18, "id": "694", "items": [ { "actualName": "欄杆扶手", "data": null, "elementCount": 18, "id": "-2000126", "items": [ { "actualName": "欄杆扶手", "data": null, "elementCount": 18, "id": "", "items": [ { "actualName": "欄杆", "data": null, "elementCount": 1, "id": null, "items": [], "name": "欄杆", "type": "familyType" } ], "name": "欄杆扶手", "type": "family" } ], "name": "欄杆扶手", "type": "category" } ], "name": "1F", "type": "floor" } ] }
返回的結果結構比較複雜,封裝成對應的C#類以下:
/// <summary> /// 獲取單個模型的構件分類樹(2.0的默認分類樹 floor, category, family, familyType)返回的結果類(默認模式) /// </summary> [Serializable] public class SingleModelTree : GeneralResponse<List<TreeItem>> { }
調用的 TreeItem 類
[Serializable] public class TreeItem { /// <summary> /// 項的名稱 /// </summary> [JsonProperty("actualName")] public string ActualName { get; set; } [JsonProperty("data")] public string Data { get; set; } [JsonProperty("elementCount")] public int? ElementCount { get; set; } [JsonProperty("id")] public string Id { get; set; } [JsonProperty("items")] public TreeItem[] Items { get; set; } [JsonProperty("name")] public string Name { get; set; } /// <summary> /// 例如:familyType、family、category /// </summary> [JsonProperty("type")] public string Type { get; set; } /// <summary>返回表示當前對象的字符串。</summary> /// <returns>表示當前對象的字符串。</returns> public override string ToString() { return String.Format("[actualName={0}, data={1}, elementCount={2}, id={3}, items={4}, name={5}, type={6}]", ActualName, Data, ElementCount, Id, Items.ToStringLine(), Name, Type); } }
請注意 TreeItem 類中的 public TreeItem[] Items { get; set; } 屬性,類型是該類自己。屬於遞歸引用。
Newtonsoft.Json.dll 默認支持遞歸引用類的序列化與反序列化。
C#實現方法:
1 /// <summary> 2 /// 獲取單個模型中構件的默認分類樹 3 /// </summary> 4 /// <param name="accessToken">【必填】令牌</param> 5 /// <param name="fileId">【必填】表明該單模型的文件ID</param> 6 /// <param name="v">【非必填】用來區別treeType爲default時返回樹的格式</param> 7 /// <param name="request">【非必填】其餘過濾參數類對象</param> 8 /// <returns></returns> 9 public virtual SingleModelTree GetSingleModelTreeByDefault(string accessToken, long fileId, string v = "2.0", FileTreeRequestBody request = null) 10 { 11 //return GetSingleModelTree(accessToken, fileId, TreeType.Default, v, request); 12 /* 單模型構件分類樹, 13 (1)treeType 接受兩個值:default 和 customized,默認爲 default。 14 (2)v 參數用來區別 treeType 爲 default 時返回樹的格式, customized 老是返回格式2.0的構件樹。 15 (3)當 treeType 爲"customized"時,FileTreeRequestBody 類的 desiredHierarchy 屬性 表示了篩選樹的層次,可選值有building,systemType,specialty,floor,category,family,familyType, 16 如:desiredHierarchy=specialty,systemtype。 17 customizedNodeKeys: 用來指定篩選樹每一個維度用id或者是name做爲惟一標識, 如"floor":"id" 18 */ 19 20 // POST https://api.bimface.com/data/v2/files/{fileId}/tree 21 string url = string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/tree?treeType=default", fileId); 22 23 if (!string.IsNullOrWhiteSpace(v)) 24 { 25 url = url + "&v=" + v; 26 } 27 28 string data = string.Empty; 29 if (request != null) 30 { 31 data = request.SerializeToJson(); 32 } 33 34 BimFaceHttpHeaders headers = new BimFaceHttpHeaders(); 35 headers.AddOAuth2Header(accessToken); 36 37 try 38 { 39 SingleModelTree response; 40 41 HttpManager httpManager = new HttpManager(headers); 42 HttpResult httpResult = httpManager.Post(url, data); 43 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 44 { 45 response = httpResult.Text.DeserializeJsonToObject<SingleModelTree>(); 46 } 47 else 48 { 49 response = new SingleModelTree 50 { 51 Message = httpResult.RefText 52 }; 53 } 54 55 return response; 56 } 57 catch (Exception ex) 58 { 59 throw new Exception("[獲取單個模型中構件的默認分類樹]發生異常!", ex); 60 } 61 }
其中調用到的 httpManager.Post() 方法,請參考《C# HTTP系列》
在BIMFACE的控制檯中能夠看到咱們上傳的文件列表,模型狀態均爲轉換成功。
使用「A4.rvt」爲例測試上述方法。
完整的分類樹爲
success [ { "actualName": "標高 1", "data": null, "elementCount": 4, "id": "311", "items": [ { "actualName": "牆", "data": null, "elementCount": 4, "id": "-2000011", "items": [ { "actualName": "基本牆", "data": null, "elementCount": 4, "id": "", "items": [ { "actualName": "常規 - 200mm", "data": null, "elementCount": 4, "id": "398", "items": [], "name": "常規 - 200mm", "type": "familyType" } ], "name": "基本牆", "type": "family" } ], "name": "牆", "type": "category" } ], "name": "標高 1", "type": "floor" } ]
測試代碼以下:
// 獲取構件分類樹(默認) protected void btnGetSingleModelTreeByDefault_Click(object sender, EventArgs e) { long fileId = txtFileID.Text.Trim().ToLong(); FileConvertApi api = new FileConvertApi(); SingleModelTree response = api.GetSingleModelTreeByDefault(txtAccessToken.Text, fileId); txtResult.Text = response.Code.ToString2() + Environment.NewLine + response.Message.ToString2() + Environment.NewLine + response.Data.ToStringLine(); }
請求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/tree?v=2.0&treeType=customized
請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
請求 body(示例):
{ "desiredHierarchy": [ "category", "family" ], "customizedNodeKeys": { "category": "name" } }
請求體不能爲 NULL ,必須傳遞值。 不然請求失敗,提示 system.error. customized tree request body is null
HTTP響應示例(200):
{ "code": "success", "message": null, "data": { "items": [ { "actualName": "專用設備", "data": null, "elementCount": 6, "id": "-2001350", "items": [ { "actualName": "投影儀-基於天花板 3D", "data": null, "elementCount": 3, "id": "", "items": [ ], "name": "投影儀-基於天花板 3D", "type": "family" }, { "actualName": "投影屏幕-基於天花板 3D", "data": null, "elementCount": 3, "id": "", "items": [ ], "name": "投影屏幕-基於天花板 3D", "type": "family" } ], "name": "衛浴裝置", "type": "category" } ], "root": "category" } }
返回的結果結構比較複雜,封裝成對應的C#類以下:
/// <summary> /// 獲取單個模型的構件分類樹(自定義樹floor, category, family, familyType)返回的結果類 /// </summary> [Serializable] public class SingleModelTreeByCustomized : GeneralResponse<SingleModelTreeByCustomized> { [JsonProperty("root")] public string Root { get; set; } [JsonProperty("items")] public TreeItem[] Items { get; set; } /// <summary>返回表示當前對象的字符串。</summary> /// <returns>表示當前對象的字符串。</returns> public override string ToString() { return String.Format("[root={0}, items={1}]", Root, Items.ToStringLine()); } }
C#實現方法:
1 /// <summary> 2 /// 獲取單個模型中構件的自定義分類樹 3 /// </summary> 4 /// <param name="accessToken">【必填】令牌</param> 5 /// <param name="fileId">【必填】表明該單模型的文件ID</param> 6 /// <param name="v">【非必填】用來區別treeType爲default時返回樹的格式</param> 7 /// <param name="request">【非必填】其餘過濾參數類對象</param> 8 /// <returns></returns> 9 public virtual SingleModelTreeByCustomized GetSingleModelTreeByCustomized(string accessToken, long fileId, string v = "2.0", FileTreeRequestBody request = null) 10 { 11 //return GetSingleModelTree(accessToken, fileId, TreeType.Default, v, request); 12 /* 單模型構件分類樹, 13 (1)treeType 接受兩個值:default 和 customized,默認爲 default。 14 (2)v 參數用來區別 treeType 爲 default 時返回樹的格式, customized 老是返回格式2.0的構件樹。 15 (3)當 treeType 爲"customized"時,FileTreeRequestBody 類的 desiredHierarchy 屬性 表示了篩選樹的層次,可選值有building,systemType,specialty,floor,category,family,familyType, 16 如:desiredHierarchy=specialty,systemtype。 17 customizedNodeKeys: 用來指定篩選樹每一個維度用id或者是name做爲惟一標識, 如"floor":"id" 18 */ 19 20 // POST https://api.bimface.com/data/v2/files/{fileId}/tree 21 string url = string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/tree?treeType=customized", fileId); 22 23 if (!string.IsNullOrWhiteSpace(v)) 24 { 25 url = url + "&v=" + v; 26 } 27 28 string data = string.Empty; 29 if (request != null) 30 { 31 data = request.SerializeToJson(); 32 } 33 34 BimFaceHttpHeaders headers = new BimFaceHttpHeaders(); 35 headers.AddOAuth2Header(accessToken); 36 37 try 38 { 39 SingleModelTreeByCustomized response; 40 41 HttpManager httpManager = new HttpManager(headers); 42 HttpResult httpResult = httpManager.Post(url, data); 43 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 44 { 45 response = httpResult.Text.DeserializeJsonToObject<SingleModelTreeByCustomized>(); 46 } 47 else 48 { 49 response = new SingleModelTreeByCustomized 50 { 51 Message = httpResult.RefText 52 }; 53 } 54 55 return response; 56 } 57 catch (Exception ex) 58 { 59 throw new Exception("[獲取單個模型中構件的自定義分類樹]發生異常!", ex); 60 } 61 }
測試:
一樣使用「A4.rvt」爲例測試上述方法。
完整的分類樹爲
success [root=單體, items=[actualName=, data=, elementCount=4, id=0, items=[actualName=, data=, elementCount=4, id=0, items=[actualName=, data=, elementCount=4, id=0, items=[actualName=標高 1, data=, elementCount=4, id=311, items=[actualName=牆, data=, elementCount=4, id=-2000011, items=[actualName=基本牆, data=, elementCount=4, id=, items=[actualName=常規 - 200mm, data=, elementCount=4, id=398, items=, name=常規 - 200mm, type=familyType ], name=基本牆, type=family ], name=牆, type=category ], name=標高 1, type=floor ], name=未設專業, type=specialty ], name=未設系統類型, type=systemType ], name=未設單體, type=building ] ]
界面上的篩選樹的層次是過濾條件,主要用於篩選 type 屬性。
測試代碼以下:
// 獲取構件分類樹(自定義) protected void btnGetSingleModelTreeByCustomized_Click(object sender, EventArgs e) { long fileId = txtFileID.Text.Trim().ToLong(); List<string> lstDesiredHierarchy = new List<string>(); if (chkTreeBuilding.Checked) { lstDesiredHierarchy.Add("building"); } if (chkTreeSystemType.Checked) { lstDesiredHierarchy.Add("systemType"); } if (chkTreeSpecialty.Checked) { lstDesiredHierarchy.Add("specialty"); } if (chkTreeFloor.Checked) { lstDesiredHierarchy.Add("floor"); } if (chkTreeCategory.Checked) { lstDesiredHierarchy.Add("category"); } if (chkTreeFamily.Checked) { lstDesiredHierarchy.Add("family"); } if (chkTreeFamilyType.Checked) { lstDesiredHierarchy.Add("familyType"); } FileTreeRequestBody request = new FileTreeRequestBody(); request.DesiredHierarchy = lstDesiredHierarchy.ToArray();// new[] { "building", "systemType", "specialty", "floor", "category", "family", "familyType" }; request.CustomizedNodeKeys = new Dictionary<string, string> { { "category", "name" } }; FileConvertApi api = new FileConvertApi(); SingleModelTreeByCustomized response = api.GetSingleModelTreeByCustomized(txtAccessToken.Text, fileId, "2.0", request); txtResult.Text = response.Code.ToString2() + Environment.NewLine + response.Message.ToString2() + Environment.NewLine + response.Data; }