zoukankan      html  css  js  c++  java
  • C#开发BIMFACE系列20 服务端API之获取模型数据5:批量获取构件属性

    在《C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性》中介绍了获取单个文件/模型的单个构建的属性,本篇介绍如何一次性获取多个构建的属性。

    请求地址:POST https://api.bimface.com/data/v2/files/{fileId}/elements

    说明:支持查询模型属性重写后多个构件的属性,需要设置请求参数includeOverrides的值为true

    参数:

     其中 ElementPropertyFilterRequest 类如下:

    /// <summary>
    ///   批量获取构件属性的请求参数
    /// </summary>
    [Serializable]
    public class ElementPropertyFilterRequest
    {
        /// <summary>
        ///  【必填】构建ID数组。例如: [ "313154", "313047" ]
        /// </summary>
        [JsonProperty("elementIds")]
        public string[] ElementIds { get; set; }
    
        /// <summary>
        /// 【非必填】过来条件
        /// </summary>
        [JsonProperty("filter", NullValueHandling = NullValueHandling.Ignore)]
        public GroupAndKeysPair[] Filters { get; set; }
    }
    [Serializable]
    public class GroupAndKeysPair
    {
        /// <summary>
        ///  分组名称。例如:default、shape、size
        /// </summary>
        [JsonProperty("group")]
        public string Group { get; set; }
    
        /// <summary>
        ///  关键字数组。例如: [ "length", "width", "a" ]
        /// </summary>
        [JsonProperty("keys", NullValueHandling = NullValueHandling.Ignore)]
        public string[] Keys { get; set; }
    }

    请求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/elements

    若需查询重写后的构件属性,请求示例为

    https://api.bimface.com/data/v2/files/1211223382064960/elements?includeOverrides=true

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

    请求 body(示例):

    {
      "elementIds" : [ "313154", "313047" ],
      "filter" : [ {
        "group" : "default"
      }, {
        "group" : "shape"
      }, {
        "group" : "size",
        "keys" : [ "length", "width", "a" ]
      } ]
    }

    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" : ""
    }

    该返回结果中的data部分是一个数组,对应多个构建的属性。与《C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性》中返回的结果相同。

    C#实现方法:

     1 /// <summary>
     2 ///  批量获取单个模型的多个构件属性
     3 /// </summary>
     4 /// <param name="accessToken">令牌</param>
     5 /// <param name="fileId">【必填】代表该单模型的文件ID</param>
     6 /// <param name="request">【必填】请求过滤参数</param>
     7 /// <param name="includeOverrides">【非必填】是否查询修改的属性</param>
     8 /// <returns></returns>
     9 public virtual SingleModelMultipleElementsProperties GetSingleModelMultipleElementsProperties(string accessToken, long fileId, ElementPropertyFilterRequest request, bool? includeOverrides = null)
    10 {
    11     if (request == null)
    12     {
    13         throw new ArgumentException("参数 request 不能为null !");
    14     }
    15 
    16     // POST https://api.bimface.com/data/v2/files/{fileId}/elements
    17     string url = string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/elements", fileId);
    18     if (includeOverrides != null)
    19     {
    20         url = url + "?includeOverrides=" + includeOverrides;
    21     }
    22 
    23     string data = request.SerializeToJson();
    24 
    25     BimFaceHttpHeaders headers = new BimFaceHttpHeaders();
    26     headers.AddOAuth2Header(accessToken);
    27 
    28     try
    29     {
    30         SingleModelMultipleElementsProperties response;
    31 
    32         HttpManager httpManager = new HttpManager(headers);
    33         HttpResult httpResult = httpManager.Post(url, data);
    34         if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    35         {
    36             response = httpResult.Text.DeserializeJsonToObject<SingleModelMultipleElementsProperties>();
    37         }
    38         else
    39         {
    40             response = new SingleModelMultipleElementsProperties
    41             {
    42                 Message = httpResult.RefText
    43             };
    44         }
    45 
    46         return response;
    47     }
    48     catch (Exception ex)
    49     {
    50         throw new Exception("[批量获取构件属性]发生异常!", ex);
    51     }
    52 }

    其中调用到的 httpManager.Post() 方法,请参考《C# HTTP系列》

     其中返回结果类  SingleModelMultipleElementsProperties 定义如下:

    /// <summary>
    /// 批量获取单个模型的多个构件属性返回的结果类
    /// </summary>
    [Serializable]
    public class SingleModelMultipleElementsProperties : GeneralResponse<List<SingleModelSingleElementEntity>>
    {
    
    }
    测试

    在BIMFACE的控制台中可以看到我们上传的文件列表,共计2个文件。模型状态均为转换成功。

    以“01_BIMFACE示例文件-Revit模型.rvt”为例来测试。

    其中使用了 300067,282979 这2个构建ID。查询的构建属性完整结果如下:

    success
    elementId:300067,282979
    
    SingleModelSingleElementEntity: 
    [boundingBox=[max=[x=5838.783, y=4387.716, z=6000], 
                  min=[x=5788.783, y=4237.716, z=5475]
                 ], 
     elementId=300067, 
     familyGuid=2d99307a-66cd-4439-b173-5c88d252416e-00002122, 
     Guid=89c90034-40ae-423a-8935-8f5624db86c1-00049423, 
     name=50 x 150 mm, 
     Properties=[group=基本属性, 
                 items= [code=, extension=, key=specialty, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=floor, orderNumber=,unit=,value=F2,valueType=]
                        [code=, extension=, key=categoryId, orderNumber=,unit=,value=-2000171,valueType=]
                        [code=, extension=, key=categoryName, orderNumber=,unit=,value=幕墙竖梃,valueType=]
                        [code=, extension=, key=family, orderNumber=,unit=,value=矩形竖梃,valueType=]
                        [code=, extension=, key=familyId, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=familyType, orderNumber=,unit=,value=50 x 150 mm,valueType=]
                        [code=, extension=, key=familyTypeId, orderNumber=,unit=,value=8486,valueType=]
                        [code=, extension=, key=systemType, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=building, orderNumber=,unit=,value=,valueType=]
                ]
                [group=尺寸标注, 
                 items=[code=, extension=, key=边 1 上的宽度, orderNumber=,unit=mm,value=25,valueType=2]
                       [code=, extension=, key=边 2 上的宽度, orderNumber=,unit=mm,value=25,valueType=2]
                       [code=, extension=, key=长度, orderNumber=,unit=mm,value=525,valueType=2]
                ]
                [group=材质和装饰, 
                 items=[code=, extension=, key=材质, orderNumber=,unit=,value=金属 - 铝,valueType=4]
                ]
                [group=构造, 
                 items=[code=, extension=, key=位置, orderNumber=,unit=,value=垂直于面,valueType=4]
                       [code=, extension=, key=厚度, orderNumber=,unit=mm,value=150,valueType=2]
                       [code=, extension=, key=角竖梃, orderNumber=,unit=,value=False,valueType=1]
                       [code=, extension=, key=轮廓, orderNumber=,unit=,value=默认,valueType=4]
                ]
                [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]
                       [code=, extension=, key=角度, orderNumber=,unit=°,value=0.00,valueType=2]
                ]
    ]
    
    SingleModelSingleElementEntity: 
    [boundingBox=[max=[x=-2066.217, y=-7714.284, z=3175], 
                  min=[x=-2116.217, y=-7864.284, z=2750]
                 ], 
     elementId=282979, 
     familyGuid=2d99307a-66cd-4439-b173-5c88d252416e-00002122, 
     Guid=0438595c-b6fe-4e10-9b43-4c629826282c-00045163, 
     name=50 x 150 mm, 
     Properties=[group=基本属性, 
                 items=[code=, extension=, key=specialty, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=floor, orderNumber=,unit=,value=地坪,valueType=]
                        [code=, extension=, key=categoryId, orderNumber=,unit=,value=-2000171,valueType=]
                        [code=, extension=, key=categoryName, orderNumber=,unit=,value=幕墙竖梃,valueType=]
                        [code=, extension=, key=family, orderNumber=,unit=,value=矩形竖梃,valueType=]
                        [code=, extension=, key=familyId, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=familyType, orderNumber=,unit=,value=50 x 150 mm,valueType=]
                        [code=, extension=, key=familyTypeId, orderNumber=,unit=,value=8486,valueType=]
                        [code=, extension=, key=systemType, orderNumber=,unit=,value=,valueType=]
                        [code=, extension=, key=building, orderNumber=,unit=,value=,valueType=]
                ]
                [group=尺寸标注, 
                 items=[code=, extension=, key=边 1 上的宽度, orderNumber=,unit=mm,value=25,valueType=2]
                        [code=, extension=, key=边 2 上的宽度, orderNumber=,unit=mm,value=25,valueType=2]
                        [code=, extension=, key=长度, orderNumber=,unit=mm,value=425,valueType=2]
                ]
                [group=材质和装饰, 
                 items=[code=, extension=, key=材质, orderNumber=,unit=,value=金属 - 铝,valueType=4]
                ]
                [group=构造, 
                 items=[code=, extension=, key=位置, orderNumber=,unit=,value=垂直于面,valueType=4]
                        [code=, extension=, key=厚度, orderNumber=,unit=mm,value=150,valueType=2]
                        [code=, extension=, key=角竖梃, orderNumber=,unit=,value=False,valueType=1]
                        [code=, extension=, key=轮廓, orderNumber=,unit=,value=默认,valueType=4]
                ]
                [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]
                       [code=, extension=, key=角度, orderNumber=,unit=°,value=0.00,valueType=2]
                ]
    ]

    测试代码如下:

     1 // 批量获取构件属性
     2 protected void btnGetSingleModelMultipleElementsProperties_Click(object sender, EventArgs e)
     3 {
     4     string[] elementIds = txtMultipleElementIds.Text.Split(",");
     5 
     6     ElementPropertyFilterRequest request = new ElementPropertyFilterRequest();
     7     request.ElementIds = elementIds;
     8 
     9     FileConvertApi api = new FileConvertApi();
    10     var response = api.GetSingleModelMultipleElementsProperties(txtAccessToken.Text, txtFileID.Text.ToLong(), request, chkIncludeOverrides.Checked);
    11 
    12     StringBuilder sb = new StringBuilder();
    13     List<SingleModelSingleElementEntity> lstProperties = response.Data;
    14     foreach (var property in lstProperties)
    15     {
    16         sb.AppendLine(property.ToString());
    17     }
    18     txtResult.Text = response.Code.ToString2()
    19                    + Environment.NewLine
    20                    + "elementId:" + txtMultipleElementIds.Text
    21                    + Environment.NewLine
    22                    + response.Message.ToString2()
    23                    + Environment.NewLine
    24                    + sb;
    25 }
     
  • 相关阅读:
    python对打印出中文乱码问题的解决方案
    git常用操作
    如何创建git开发环境
    对自然界的三种花进行分类
    创建第一个简单的AI分类器
    使用TensorFlow创建第变量定义和运行方式
    MySQL的left,substr,instr截取字符串函数使用实例
    构建之法阅读笔记05
    找水王2
    第十二周学习进度
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/11475284.html
Copyright © 2011-2022 走看看