1. 程式人生 > >C#開發BIMFACE系列19 服務端API之獲取模型資料4:獲取多個構件的共同屬性

C#開發BIMFACE系列19 服務端API之獲取模型資料4:獲取多個構件的共同屬性

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

在前幾篇部落格中介紹了一個三維檔案/模型包含多個構建,每個構建又是由多種材質組成,每個構建都有很多屬性。不同的構建也有可能包含相同的屬性。

上圖中可以看到構建1與構建2擁有相同的屬性2,構建2與構建n擁有相同的屬性1。

本文主要介紹如何獲取多個構建的共同屬性。

請求地址:GET https://api.bimface.com/data/v2/files/{fileId}/commonElementProperties

說明:若傳入的elementId不止一個,則返回這些elementId共同的屬性,共同的定義為:屬性key與value都相等。

          支援查詢模型屬性重寫後多個構件的共同屬性,需要設定請求引數includeOverrides的值為true。

引數:

請求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/commonElementProperties?elementIds=string

  若需查詢重寫後的構件的共同屬性,請求示例為
  https://api.bimface.com/data/v2/files/1211223382064960/commonElementProperties?elementIds=string&includeOverrides=true 

elementIds 後面的 string 是多個構建Id,多個elementId之間用英文狀態下的半形逗號分隔。

例如:elementId1,elementId2,elementId3,elementId4

請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"

HTTP響應示例(200):

{
  "code" : "success",
  "data" : {
    "boundingBox" : {
      "max" : {
        "x" : -4938.068482562385,
        "y" : -3201.59397858169,
        "z" : 0.0
      },
      "min" : {
        "x" : -4938.068482562385,
        "y" : -3201.59397858169,
        "z" : 0.0
      }
    },
    "elementId" : "313052",
    "familyGuid" : "000222",
    "guid" : "79d547c1-5dbf-4e6a-811d-951cf37b29da-0004c6dc",
    "name" : "norm - 150mm",
    "properties" : [ {
      "group" : "dimension",
      "items" : [ {
        "code" : "perimeter",
        "extension" : "object",
        "key" : "perimeter",
        "orderNumber" : 0,
        "unit" : "mm",
        "value" : 17200,
        "valueType" : 2
      } ]
    } ]
  },
  "message" : ""
}

C#實現方法:

 1 /// <summary>
 2 ///  獲取單個模型的多個構件的共同屬性
 3 /// </summary>
 4 /// <param name="accessToken">令牌</param>
 5 /// <param name="fileId">【必填】代表該單模型的檔案ID</param>
 6 /// <param name="elementIds">【必填】代表該單模型的構件ID列表</param>
 7 /// <param name="includeOverrides">【非必填】是否查詢修改的屬性</param>
 8 /// <returns></returns>
 9 public virtual SingleModelMultipleElementsCommonProperties GetSingleModelMultipleElementsCommonProperties(string accessToken, long fileId, string[] elementIds, bool? includeOverrides = null)
10 {
11     if (elementIds == null && elementIds.Length == 0)
12     {
13         throw new ArgumentException("引數 elementIds 不能為null 且必須包含元素!");
14     }
15 
16     // GET https://api.bimface.com/data/v2/files/{fileId}/commonElementProperties?elementIds={string}
17     string url = string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/commonElementProperties?elementIds={1}", fileId, elementIds.ToStringWith(","));
18     if (includeOverrides != null)
19     {
20         url = url + "&includeOverrides=" + includeOverrides;
21     }
22 
23     BimFaceHttpHeaders headers = new BimFaceHttpHeaders();
24     headers.AddOAuth2Header(accessToken);
25 
26     try
27     {
28         SingleModelMultipleElementsCommonProperties response;
29 
30         HttpManager httpManager = new HttpManager(headers);
31         HttpResult httpResult = httpManager.Get(url);
32         if (httpResult.Status == HttpResult.STATUS_SUCCESS)
33         {
34             response = httpResult.Text.DeserializeJsonToObject<SingleModelMultipleElementsCommonProperties>();
35         }
36         else
37         {
38             response = new SingleModelMultipleElementsCommonProperties
39             {
40                 Message = httpResult.RefText
41             };
42         }
43 
44         return response;
45     }
46     catch (Exception ex)
47     {
48         throw new Exception("[獲取多個構件的共同屬性]發生異常!", ex);
49     }
50 }

其中呼叫到的 httpManager.Get() 方法,請參考《C# HTTP系列》

響應結果對應的實體類 SingleModelMultipleElementsCommonProperties ,封裝如下:

/// <summary>
///  獲取多個構件的共同屬性返回的結果類
/// </summary>
public class SingleModelMultipleElementsCommonProperties : SingleModelSingleElementProperty
{

}

SingleModelMultipleElementsCommonProperties 類與 《C#開發BIMFACE系列18 服務端API之獲取模型資料3:獲取構件屬性》  返回的結構類 SingleModelSingleElementProperty 完全相同。

衍生出的一個過載方法:

/// <summary>
///  獲取單個模型的多個構件的共同屬性
/// </summary>
/// <param name="accessToken">令牌</param>
/// <param name="fileId">【必填】代表該單模型的檔案ID</param>
/// <param name="elementIds">【必填】代表該單模型的構件ID列表</param>
/// <param name="includeOverrides">【非必填】是否查詢修改的屬性</param>
/// <returns></returns>
public virtual SingleModelMultipleElementsCommonProperties GetSingleModelMultipleElementsCommonProperties(string accessToken, long fileId, List<string> elementIds, bool? includeOverrides = null)
{
    return GetSingleModelMultipleElementsCommonProperties(accessToken, fileId, elementIds.ToArray(), includeOverrides);
} 
測試

在BIMFACE的控制檯中可以看到我們上傳的檔案列表,共計2個檔案。模型狀態均為轉換成功。

以“01_BIMFACE示例檔案-Revit模型.rvt”為例來測試。

 

測試中查詢了 300067,282979,283330 這3個構建的共同屬性。完整的屬性列表如下:

success
elementId:300067,282979,283330

SingleModelSingleElementEntity: 
[boundingBox=, 
 elementId=, 
 familyGuid=, 
 Guid=, 
 name=, 
 Properties=[group=基本屬性, 
             items=[code=, extension=, key=specialty, orderNumber=,unit=,value=,valueType=]
                   [code=, extension=, key=familyId, orderNumber=,unit=,value=,valueType=]
                   [code=, extension=, key=systemType, orderNumber=,unit=,value=,valueType=]
                   [code=, extension=, key=building, orderNumber=,unit=,value=,valueType=]
            ]
            [group=標識資料, 
             items=[code=, extension=, key=OmniClass 標題, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=OmniClass 編號, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=URL, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=程式碼名稱, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=製造商, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=影象, orderNumber=,unit=,value=,valueType=4]
                   [code=, extension=, key=型號, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=成本, orderNumber=,unit=,value=,valueType=2]
                   [code=, extension=, key=標記, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=註釋, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=註釋記號, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=型別影象, orderNumber=,unit=,value=,valueType=4]
                   [code=, extension=, key=型別標記, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=型別註釋, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=說明, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=部件程式碼, orderNumber=,unit=,value=,valueType=3]
                   [code=, extension=, key=部件說明, orderNumber=,unit=,value=,valueType=3]
            ]
            [group=階段化, 
             items=[code=, extension=, key=建立的階段, orderNumber=,unit=,value=新構造,valueType=4]
                   [code=, extension=, key=拆除的階段, orderNumber=,unit=,value=無,valueType=4]
            ]
            [group=限制條件, 
             items=[code=, extension=, key=偏移量, orderNumber=,unit=mm,value=0,valueType=2]
            ]
]

測試程式碼如下:

// 獲取多個構件的共同屬性
protected void btnGetSingleModelMultipleElementsCommonProperties_Click(object sender, EventArgs e)
{
    FileConvertApi api = new FileConvertApi();

    string[] elementIds = txtMultipleElementIds.Text.Split(",");

    var response = api.GetSingleModelMultipleElementsCommonProperties(txtAccessToken.Text, txtFileID.Text.ToLong(), elementIds, chkIncludeOverrides.Checked);

    txtResult.Text = response.Code.ToString2()
                   + Environment.NewLine
                   + "elementId:" + txtMultipleElementIds.Text
                   + Environment.NewLine
                   + response.Message.ToString2()
                   + Environment.NewLine
                   + response.Data.ToString();
}

 

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