系列目录 【已更新最新开发文章,点击查看详细】 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助。本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法。 请求地址:GET https://api.bimface.com/data/v2/files/{fileId}/floors 说明:获取单个模型的所有楼层信息 参数: 请求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/floors 请求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b" HTTP响应示例(200): 复制代码 { "code" : "success", "data" : [ { "archElev" : 0.0, "areas" : [ { "boundary" : "", "id" : "313137", "levelId" : "11", "maxPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "minPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "name" : "dining room 4" } ], "elevation" : 0.0, "height" : 4000.0, "id" : "311", "miniMap" : "787e5907b0ca5cb35f5d10ba091a085b/resource/model/maps/elevation 1.png", "name" : "elevation 1", "rooms" : [ { "boundary" : "", "id" : "313137", "levelId" : "11", "maxPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "minPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "name" : "dining room 4" } ], "structElev" : 0.0 } ], "message" : "" } 复制代码 返回的数据结构比较复杂,封装成对应的C#类如下: 复制代码 /// /// 获取单个模型的楼层信息返回的结果类 /// [Serializable] public class SingleModelFloors : GeneralResponse> { } 复制代码 其中Floor类的结构如下: 复制代码 /// /// 楼层信息 /// [Serializable] public class Floor { /// /// 例如: 0.0 /// [JsonProperty("archElev")] public double? ArchElev { get; set; } /// /// 例如: 0.0 /// [JsonProperty("areas")] public ObjectOnFloor[] Areas { get; set; } /// /// 例如: 0.0 /// [JsonProperty("elevation")] public double? Elevation { get; set; } /// /// 例如:4000.0 /// [JsonProperty("height")] public double? Height { get; set; } /// /// 编号。例如:"311" /// [JsonProperty("id")] public string Id { get; set; } /// /// 样例 : "787e5907b0ca5cb35f5d10ba091a085b/resource/model/maps/elevation 1.png" /// [JsonProperty("miniMap")] public string MiniMap { get; set; } /// /// 名称。例如:"elevation 1" /// [JsonProperty("name")] public string Name { get; set; } /// /// 房间信息 /// [JsonProperty("rooms")] public ObjectOnFloor[] Rooms { get; set; } /// /// 例如:0.0 /// [JsonProperty("structElev")] public double? StructElev { get; set; } /// 返回表示当前对象的字符串。 /// 表示当前对象的字符串。 public override string ToString() { StringBuilder sbAreas = new StringBuilder(); if (Areas != null && Areas.Length > 0) { foreach(var area in Areas) { sbAreas.AppendLine(area.ToString()); } } StringBuilder sbRooms = new StringBuilder(); if (Rooms != null && Rooms.Length > 0) { foreach (var room in Rooms) { sbAreas.AppendLine(room.ToString()); } } return string.Format("[archElev={0}, Areas={1}, elevation={2}, height={3}, id={4}, miniMap={5}, name={6}, rooms={7}, structElev={8}]", ArchElev, sbAreas, Elevation, Height, Id, MiniMap, Name, sbRooms, StructElev); } } 复制代码 复制代码 /// /// 楼层上包含的对象 /// [Serializable] public class ObjectOnFloor { /// /// 边界 /// [JsonProperty("boundary")] public string Boundary { get; set; } /// /// 编号 /// [JsonProperty("id")] public string Id { get; set; } /// /// 水平线编号 /// [JsonProperty("levelId")] public string LevelId { get; set; } [JsonProperty("maxPt")] public Coordinate MaxPt { get; set; } [JsonProperty("minPt")] public Coordinate MinPt { get; set; } /// /// 对象名称。例如:"dining room 4" /// [JsonProperty("name")] public string Name { get; set; } /// 返回表示当前对象的字符串。 /// 表示当前对象的字符串。 public override string ToString() { return string.Format("[boundary={0}, id={1}, levelId={2}, maxPt={3}, minPt={4}, name={5}]", Boundary, Id, LevelId, MaxPt, MinPt, Name); } } 复制代码 复制代码 [Serializable] public class Coordinate : ThreeDimensionalCoordinates { } 复制代码 其中 ThreeDimensionalCoordinates 类在 《C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性》 中有使用过,请查看其详细定义。 C#实现方法: 复制代码 1 /// 2 /// 获取单个模型的楼层信息 3 /// 4 /// 【必填】令牌 5 /// 【必填】代表该单模型的文件ID 6 /// 【非必填】是否将楼层中的面积分区ID、名称一起返回 7 /// 【非必填】是否将楼层中的房间ID、名称一起返回 8 /// 9 public virtual SingleModelFloors GetSingleModelFloors(string accessToken, long fileId, bool? includeArea = null, bool? includeRoom = null) 10 { 11 // GET https://api.bimface.com/data/v2/files/{fileId}/floors 12 string url = string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/floors", fileId); 13 if (includeArea != null && includeRoom == null) 14 { 15 url = url + "?includeArea=" + includeArea; 16 } 17 else if (includeArea == null && includeRoom != null) 18 { 19 url = url + "?includeRoom=" + includeRoom; 20 } 21 else if (includeArea != null && includeRoom != null) 22 { 23 url = url + "?includeArea=" + includeArea + "&includeRoom=" + includeRoom; 24 } 25 26 BimFaceHttpHeaders headers = new BimFaceHttpHeaders(); 27 headers.AddOAuth2Header(accessToken); 28 29 try 30 { 31 SingleModelFloors response; 32 33 HttpManager httpManager = new HttpManager(headers); 34 HttpResult httpResult = httpManager.Get(url); 35 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 36 { 37 response = httpResult.Text.DeserializeJsonToObject(); 38 } 39 else 40 { 41 response = new SingleModelFloors 42 { 43 Message = httpResult.RefText 44 }; 45 } 46 47 return response; 48 } 49 catch (Exception ex) 50 { 51 throw new Exception("[获取单模型的楼层信息]发生异常!", ex); 52 } 53 } 复制代码 其中调用到的 httpManager.Get() 方法,请参考《C# HTTP系列》 测试 在BIMFACE的控制台中可以看到我们上传的文件列表,共计2个文件。模型状态均为转换成功。 以“01_BIMFACE示例文件-Revit模型.rvt”为例来测试。 完整的楼层信息为: 复制代码 success [archElev=0, Areas=, elevation=0, height=, id=311, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/311.png, name=F1, rooms=, structElev=0] [archElev=3500, Areas=, elevation=3500, height=, id=694, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/694.png, name=F2, rooms=, structElev=3500] [archElev=7000, Areas=, elevation=7000, height=, id=259581, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259581.png, name=F3, rooms=, structElev=7000] [archElev=10500, Areas=, elevation=10500, height=, id=259628, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259628.png, name=ROOF, rooms=, structElev=10500] [archElev=-450, Areas=, elevation=-450, height=, id=259664, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259664.png, name=地坪, rooms=, structElev=-450] 复制代码 如果选择了【是否将楼层中的面积分区ID、名称一起返回】选项,则返回如下结果 复制代码 success [archElev=-450, Areas=, elevation=-450, height=450, id=259664, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259664.png, name=地坪, rooms=, structElev=-450] [archElev=0, Areas=, elevation=0, height=3500, id=311, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/311.png, name=F1, rooms=, structElev=0] [archElev=3500, Areas=, elevation=3500, height=3500, id=694, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/694.png, name=F2, rooms=, structElev=3500] [archElev=7000, Areas=, elevation=7000, height=3500, id=259581, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259581.png, name=F3, rooms=, structElev=7000] [archElev=10500, Areas=, elevation=10500, height=4000, id=259628, miniMap=f59e14129a8dd342eee5a606342dc862/resource/model/maps/259628.png, name=ROOF, rooms=, structElev=10500] 复制代码 如果选择了【是否将楼层中的房间ID、名称一起返回】选项,则返回如下结果 View Code 如果【是否将楼层中的面积分区ID、名称一起返回、【是否将楼层中的房间ID、名称一起返回】】2个选项都选择,则返回如下结果 View Code 测试代码如下: 复制代码 1 // 获取单模型的楼层信息 2 protected void btnGetSingleModelFloors_Click(object sender, EventArgs e) 3 { 4 long fileId = txtFileID.Text.Trim().ToLong(); 5 FileConvertApi api = new FileConvertApi(); 6 SingleModelFloors response = api.GetSingleModelFloors(txtAccessToken.Text, fileId, chkIncludeArea.Checked, chkIncludeRoom.Checked); 7 8 StringBuilder sb = new StringBuilder(); 9 List lstFloor = response.Data; 10 foreach (var floor in lstFloor) 11 { 12 sb.AppendLine(floor.ToString()); 13 } 14 15 txtResult.Text = response.Code.ToString2() 16 + Environment.NewLine 17 + response.Message.ToString2() 18 + Environment.NewLine 19 + sb; 20 } 复制代码 系列目录 【已更新最新开发文章,点击查看详细】 出处:http://www.cnblogs.com/SavionZhang 作者:张传宁 微软MCP、科技部创新工程师 专注于微软.NET技术开发框架(WinForm、Web、Mvc、.NET Core)、通用权限管理系统、工作流引擎、IT自动化项目(代码)生成器、SOA 、DDD等技术;PDF、CAD、BIM 审图等研究与应用。 多次参与电子政务、国家电网、图书、教育、医疗、家装、生产制造、零售等企业级大型项目研发与管理工作。 熟悉中小软件企业软件开发过程:需求分析、应用架构、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如有问题,可以通过邮件savionzhang@qq.com联系。欢迎加入QQ群:427789286 共同交流讨论。系列目录 【已更新最新开发文章,点击查看详细】 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助。本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法。 请求地址:GET https://api.bimface.com/data/v2/files/{fileId}/floors 说明:获取单个模型的所有楼层信息 参数: 请求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/floors 请求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b" HTTP响应示例(200): 复制代码 { "code" : "success", "data" : [ { "archElev" : 0.0, "areas" : [ { "boundary" : "", "id" : "313137", "levelId" : "11", "maxPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "minPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "name" : "dining room 4" } ], "elevation" : 0.0, "height" : 4000.0, "id" : "311", "miniMap" : "787e5907b0ca5cb35f5d10ba091a085b/resource/model/maps/elevation 1.png", "name" : "elevation 1", "rooms" : [ { "boundary" : "", "id" : "313137", "levelId" : "11", "maxPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "minPt" : { "x" : -4938.068482562385, "y" : -3201.59397858169, "z" : 0.0 }, "name" : "dining room 4" } ], "structElev" : 0.0 } ], "message" : "" } 复制代码 返回的数据结构比较复杂,封装成对应的C#类如下: 复制代码 /// /// 获取单个模型的楼层信息返回的结果类 /// [Serializable] public class SingleModelFloors : GeneralResponse> { } 复制代码 其中Floor类的结构如下: 复制代码 /// /// 楼层信息 /// [Serializable] public class Floor { /// /// 例如: 0.0 /// [JsonProperty("archElev")] public double? ArchElev { get; set; } /// /// 例如: 0.0 /// [JsonProperty("areas")] public ObjectOnFloor[] Areas { get; set; } /// /// 例如: 0.0 /// [JsonProperty("elevation")] public double? Elevation { get; set; } /// /// 例如:4000.0 /// [JsonProperty("height")] public double? Height { get; set; } /// /// 编号。例如:"311" /// [JsonProperty("id")] public string Id { get; set; } /// /// 样例 : "787e5907b0ca5cb35f5d10ba091a085b/resource/model/maps/elevation 1.png" /// [JsonProperty("miniMap")] public string MiniMap { get; set; } /// /// 名称。例如:"elevation 1" /// [JsonProperty("name")] public string Name { get; set; } /// /// 房间信息 /// [JsonProperty("rooms")] public ObjectOnFloor[] Rooms { get; set; } /// /// 例如:0.0 /// [JsonProperty("structElev")] public double? StructElev { get; set; } /// 返回表示当前对象的字符串。 /// 表示当前对象的字符串。 public override string ToString() { StringBuilder sbAreas = new StringBuilder(); if (Areas != null && Areas.Length > 0) { foreach(var area in Areas) { sbAreas.AppendLine(area