C#开发BIMFACE系列40 服务端API之模型集成
随着建筑信息化模型技术的发展,越来越多的人选择在云端浏览建筑模型。现阶段的云端模型浏览大多是基于文件级别,一次只可以浏览一个模型文件中的内容。而在工程项目模型设计的过程中,通常由多个设计师协同设计,不同的设计师负责不同的专业领域(例如建筑、结构、水电等)。如果想要在云端浏览整个项目工程,就需要把这些组成部分集成起来一起展示。更近一步,如果要在集成的模型之上进行业务集成的话,就要求在集成过程中对构件按单体,楼层,专业,构件分类,系统类型等进行分类或映射。
目前在实际项目中,不同专业的团队成员可能会采用不同软件进行建模,然后再将不同格式的模型导入如Navisworks等软件中,但这样的方法有如下的缺点:
- 即使仅为了满足浏览模型的需求,也需要安装用来集成不同格式模型的桌面端软件;
- 桌面端软件支持的模型文件格式有限,无法满足多种文件格式的模型集成需求;
- 在诸如Navisworks等软件中进行的模型导入只做了几何的导入集成,不支持上面提到的建筑领域各种分类信息;
- 只支持桌面端浏览模型,同时软件也对操作系统有明确要求,普遍无法支持移动端的iOS和安卓操作系统;
针对上述的限制,BIMFACE的模型集成,能完美解决上述的所有问题。
在业务方面,BIMFACE的模型集成能:
- 集成不同专业的模型,包括建筑、结构、装修、幕墙、钢构,以及机电中给排水、采暖燃气、通风空调、消防、强弱电等各专业。
- 自定义楼层映射
- 支持单体,系统类型,构件类型等其他分类维度
- 支持模型链接集成,如带标准层的集成模型
- 支持自定义文件转换矩阵(transform)
在技术方法,BIMFACE的模型集成充分运用了云端无穷的计算资源,在模型集成过程中:
- 运用图形几何算法进行了如下优化,大大提升在浏览器里能展示模型的规模以及渲染的性能:构件属性在云端进行入库索引,提供任意的属性查询能力。
- 识别基本体
- 实例绘制优化
- 同材质全场景动态合并
- 外围壳光线追踪识别
- 构件属性在云端进行入库索引,提供任意的属性查询能力
当单个模型文件转换成功以后,可以将多个单文件集成,生成一个全专业/楼层模型。由于集成不能立即完成,BIMFACE支持在模型集成完成以后,通过Callback机制通知调用方(请参考作者的博客《C#开发BIMFACE系列36 服务端API回调机制》);另外,调用方也可以通过接口查询集成状态。目前BIMFACE支持集成的模型文件格式包括:rvt、dgn、ifc、nwd、skp、3dm、3ds、fbx、stp。
下面的截图分别是建筑模型、结构模型、集成后的模型效果图,可以直观的看出建筑与结构集成后的效果。
特别提醒
(1)单模型浏览时,构件的 objectId 与 elementId 的值相等。
(2)模型集成后,构件的objectId发生变化,objectId = fileId + elementId。
多个模型的不同构件的 elementId 可能会相同,集成后必须解决唯一性的问题,所以 BIMFACE底层设置 objectId= fileId + elementId 是非常优秀的解决方法。既做到了唯一标识的效果,又能直观的知道该构件来自哪个源模型及源构件ID。
在对BIMFACE二次开发过程中建议使用 objectId。
BIMFACE官方提供了非常丰富的模型集成接口
下面详细讲解模型集成接口如何实现上述的集成效果。
接口地址:PUT https://api.bimface.com/integrate
接口参数:
请求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
请求 body:
1 { 2 "callback" : "https://api.glodon.com/viewing/callback?authCode=6kj0Jk0affae&signature=2ef131395fb6442eb99abd83d45c6016", 3 "config" : {}, 4 "name" : "integrate", 5 "sourceId" : "hduf2w3ho21nowr23rqwjrn2o3", 6 "sources" : [ { 7 "fileId" : 1656504297006400 8 }, 9 { 10 "fileId" : 1552501367034816 11 }] 12 }
HTTP响应示例(200):
1 { 2 "code" : "success", 3 "data" : { 4 "createTime" : "2017-12-25 17:25:25", 5 "integrateId" : 1248789977538784, 6 "name" : "integrate-x", 7 "reason" : "reason", 8 "sourceId" : "123156522123", 9 "status" : "success", 10 "thumbnail" : [ "https://m.bimface.com/dc6aa5e35b6a269972b005b4b2aac8ce/thumbnail/96.png", "https://m.bimface.com/dc6aa5e35b6a269972b005b4b2aac8ce/thumbnail/256.png" ] 11 }, 12 "message" : "" 13 }
C#实现方法:
1 /// <summary> 2 /// 发起2个模型集成。 3 /// 由于集成不能立即完成,BIMFACE支持在模型集成完成以后,通过Callback机制通知调用方;另外,调用方也可以通过接口查询集成状态。 4 /// </summary> 5 /// <param name="accessToken">【必填】令牌</param> 6 /// <param name="fileId1">集成时的请求参数</param> 7 /// <param name="fileId2">集成时的请求参数</param> 8 /// <param name="callBack">集成时的请求参数</param> 9 /// <returns></returns> 10 public virtual ModelIntegrateResponse Integrate(string accessToken, long fileId1, long fileId2, string callBack = "") 11 { 12 //PUT https://api.bimface.com/integrate 13 string url = BIMFaceConstants.API_HOST + "/integrate"; 14 15 FileIntegrateRequest request = new FileIntegrateRequest(); 16 17 IntegrateSource source1 = new IntegrateSource(fileId1); 18 IntegrateSource source2 = new IntegrateSource(fileId2); 19 request.Sources = new IntegrateSource[] { source1, source2 }; 20 request.CallBack = callBack; 21 22 string data = request.SerializeToJson(); 23 24 BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders(); 25 headers.AddOAuth2Header(accessToken); 26 27 try 28 { 29 ModelIntegrateResponse response; 30 31 HttpManager httpManager = new HttpManager(headers); 32 HttpResult httpResult = httpManager.Put(url, data); 33 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 34 { 35 response = httpResult.Text.DeserializeJsonToObject<ModelIntegrateResponse>(); 36 } 37 else 38 { 39 response = new ModelIntegrateResponse 40 { 41 Message = httpResult.RefText 42 }; 43 } 44 45 return response; 46 } 47 catch (Exception ex) 48 { 49 throw new BIMFaceException("[发起模型集成]发生异常!", ex); 50 } 51 }
代码中使用的 HttpManager 类请参考我的博客文章《C# HTTP系列 HttpWebRequest 与 HttpWebResponse》。
返回类型 ModelIntegrateResponse 类如下:
1 public class ModelIntegrateResponse : GeneralResponse<FileIntegrateBean> 2 { 3 4 }
1 public class FileIntegrateBean 2 { 3 /// <summary> 4 /// 对比开始时间,格式:yyyy-MM-dd hh:mm:ss 5 /// </summary> 6 [JsonProperty("createTime", NullValueHandling = NullValueHandling.Ignore)] 7 public string CreateTime { get; set; } 8 9 /// <summary> 10 /// 集成成功后返回的ID,用于获取对比状态或者结果等信息 11 /// </summary> 12 [JsonProperty("integrateId", NullValueHandling = NullValueHandling.Ignore)] 13 public long? IntegrateId { get; set; } 14 15 /// <summary> 16 /// 用户指定集成后的模型的名字 17 /// </summary> 18 [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] 19 public string Name { get; set; } 20 21 /// <summary> 22 /// 对比优先级。取值 1、2、3。数字越大,优先级越低。默认为2 23 /// </summary> 24 [JsonProperty("priority", NullValueHandling = NullValueHandling.Ignore)] 25 public int? Priority { get; set; } 26 27 /// <summary> 28 /// 若对比失败,返回失败原因 29 /// </summary> 30 [JsonProperty("reason", NullValueHandling = NullValueHandling.Ignore)] 31 public string Reason { get; set; } 32 33 /// <summary> 34 /// 第三方应用自己的ID 35 /// </summary> 36 [JsonProperty("sourceId", NullValueHandling = NullValueHandling.Ignore)] 37 public string SourceId { get; set; } 38 39 /// <summary> 40 /// 对比状态:prepare(待对比)、processing(对比中)、success(对比成功)、failed(对比失败) 41 /// </summary> 42 [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] 43 public string Status { get; set; } 44 45 [JsonProperty("thumbnail", NullValueHandling = NullValueHandling.Ignore)] 46 public string[] Thumbnails { get; set; } 47 48 /// <summary> 49 /// 模型集成的类型 rvt(或者igms…) 50 /// </summary> 51 [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] 52 public string Type { get; set; } 53 }
测试程序:
BIMFACE控制台中查询到的集成结果如下:
集成成功后,等待一段时间,查看集成结果如下图:
上述测试程序使用了 《BIMFace.SDK.CSharp》开源SDK。欢迎大家下载使用。
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!