Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#开发BIMFACE系列41 服务端API之模型对比

C#开发BIMFACE系列41 服务端API之模型对比

作者头像
张传宁IT讲堂
发布于 2021-10-13 03:25:56
发布于 2021-10-13 03:25:56
38200
代码可运行
举报
运行总次数:0
代码可运行

BIMFACE二次开发系列目录 【已更新最新开发文章,点击查看详细】

  在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸。审查过程中如果发现不符合规范的地方,则流程退回到设计单位,设计单位人员根据审查意见重新调整设计,调整完成后再次提交到审查专家。此时为了便于专家审查,需要知道当前轮次的模型/图纸与上一轮次的模型/图纸发生了哪些异动,针对异动情况进行审查即可。

先看效果

效果如上图。左侧是当前审查轮次的模型,中间是上一轮次的模型,右侧是2个模型的对比产生的异动列表。

(1)点击“新增构建”中的构件,自动定位到当前轮次中新增的目标构件。异动构件以浅绿色表示。2个模型视角同步移动。

(2)点击“删除构建”中的构件,自动定位到上一轮次中的目标构件,本轮次中的构件被删除,所以不显示。异动构件以浅绿色表示。2个模型视角同步移动。

(3)点击“修改构建”中的构件,自动定位到当前轮次中修改的构件以及上一轮次对应的构件。异动构件以浅绿色表示。2个模型视角同步移动。

BIMFACE之前是没有三维模型联动对比的功能,在我和BIMFACE的技术支持团队的美丽小姐姐沟通后,他们把我的要求纳入了他们产品的需求,经过工程师们加班加点的辛苦付出,很快就实现了该功能。特此感谢BIMFACE团队的所有小伙伴,感谢你们对开发者的信任与接受,感谢你们的辛苦付出。 滴水之恩,当涌泉相报,奉献上BIMFace C#版SDK开源项目。 开源地址:https://gitee.com/NAlps/BIMFace.SDK 作者:张传宁(系统架构师、技术总监 南京群耀 http://www.sparkcn.com) QQ:905442693 微信:savionzhang 欢迎下载使用,交流、分享。

下面介绍BIMFACE模型对比功能的原理与实现。

  模型对比可以对两个文件/模型进行差异性分析,确定两个文件/模型之间构件的几何和属性差异,包括增加的构件、删除的构件和修改的构件。 模型对应可以用于进行文件/模型的版本对比。

特别说明:模型对比是在BIMFACE云端进行的,通常需要5~10分钟。当模型对比完成后,BIMFACE能通知对比结果。

前置条件

  • 您需要将修改前和修改后的模型上传到云端并转换成功以后才能发起模型对比;
  • 目前仅支持.rvt单文件的模型对比。

基本步骤

  1. 通过服务端API发起模型对比(对比前后模型文件的fileId);
  2. 等待云端对比任务执行;
  3. 对比完成后,在网页端通过调用JavaScript API实现差异模型的显示;
  4. 除了显示差异模型,还需要调用服务端API获取对比结果(包括新增、删除、修改的构件列表)。

对比流程

  模型文件经过云端转换后,生成了BIMFACE定义的数据包。因此,要对比两个模型文件,实际上需要对比两个文件的数据包。如下图所示,文件B是文件A修改后的版本,对比完成之后,其结果包括两个部分:

  • 几何差异;
  • 变更构件及属性。

BIMFACE提供了服务端API,用于发起对比,获取对比状态、获取对比结果。请参考我的博客:

C#开发BIMFACE系列30 服务端API之模型对比1:发起模型对比

C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态

C#开发BIMFACE系列32 服务端API之模型对比3:批量获取模型对比状态

C#开发BIMFACE系列33 服务端API之模型对比4:获取模型对比结果

C#开发BIMFACE系列34 服务端API之模型对比5:获取模型构建对比差异

测试程序

发起模型对比

调用服务器端的API获取对比结果

对比差异分为三类:新增、修改、删除。返回结果对应的实体类如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1     /// <summary>
 2     /// 模型对比差异类
 3     /// </summary>
 4     public class ModelCompareDiff
 5     {
 6         /// <summary>
 7         ///  对比差异构件所属类别ID。样例 : "-2001320"
 8         /// </summary>
 9         [JsonProperty("categoryId", NullValueHandling = NullValueHandling.Ignore)]
10         public string CategoryId { get; set; }
11 
12         /// <summary>
13         ///  对比差异构件所属类别名称。样例 : "framework"
14         /// </summary>
15         [JsonProperty("categoryName", NullValueHandling = NullValueHandling.Ignore)]
16         public string CategoryName { get; set; }
17 
18         /// <summary>
19         ///  对比构件差异类型:NEW、DELETE、CHANGE
20         /// </summary>
21         [JsonProperty("diffType", NullValueHandling = NullValueHandling.Ignore)]
22         public string DiffType { get; set; }
23 
24         /// <summary>
25         ///   对比差异构件ID。样例 : "296524"
26         /// </summary>
27         [JsonProperty("elementId", NullValueHandling = NullValueHandling.Ignore)]
28         public string ElementId { get; set; }
29 
30         /// <summary>
31         ///  对比差异构件名称
32         /// </summary>
33         [JsonProperty("elementName", NullValueHandling = NullValueHandling.Ignore)]
34         public string ElementName { get; set; }
35 
36         /// <summary>
37         ///  对比差异构件的族名称。样例 : "framework 1"
38         /// </summary>
39         [JsonProperty("family", NullValueHandling = NullValueHandling.Ignore)]
40         public string Family { get; set; }
41 
42         /// <summary>
43         ///  对比差异构件来源构件ID。样例 : "0213154515478"
44         /// </summary>
45         [JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
46         public string Id { get; set; }
47 
48         /// <summary>
49         ///  对比差异构件变更文件ID,即(当前)变更后的文件ID。样例 : "1136893002033344"
50         /// </summary>
51         [JsonProperty("followingFileId", NullValueHandling = NullValueHandling.Ignore)]
52         public string FollowingFileId { get; set; }
53 
54         /// <summary>
55         /// 对比差异构件来源文件ID,即 (历史)变更前的文件ID。样例 : "0213154515478"
56         /// </summary>
57         [JsonProperty("previousFileId", NullValueHandling = NullValueHandling.Ignore)]
58         public string PreviousFileId { get; set; }
59 
60         /// <summary>
61         ///  对比差异构件所属专业。样例 : "civil"
62         /// </summary>
63         [JsonProperty("specialty", NullValueHandling = NullValueHandling.Ignore)]
64         public string Specialty { get; set; }
65     }

返回的差异结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 {
 2     "code": "success",
 3     "message": null,
 4     "data": {
 5         "data": [{
 6                 "diffType": "NEW",
 7                 "id": "1946876"
 8             }, {
 9                 "diffType": "NEW",
10                 "id": "1946877"
11             }, {
12                 "diffType": "NEW",
13                 "id": "1946878"
14             }, {
15                 "diffType": "CHANGE",
16                 "id": "40539"
17             }, {
18                 "diffType": "CHANGE",
19                 "id": "40541"
20             }, {
21                 "diffType": "CHANGE",
22                 "id": "40542"
23             }, {
24                 "diffType": "DELETE",
25                 "id": "22243"
26             }
27         ],
28         "page": 1,
29         "total": 7
30     }
31 }

前端使用JS来实现同步联动效果,以及点击异动构件后自动定位到构件所在的视角。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 // 同步新旧模型的平移和旋转操作
 2 function correspond() {
 3     latestViewer = latest.getViewer();
 4     var state, focus;
 5 
 6     prevViewer = prev.getViewer();
 7     view1Bind = function (data) {
 8         //用新模型的状态更新旧模型状态
 9         var latestState = latestViewer.getCurrentState();
10         prev.setState(latestState);
11         prev.getViewer().camera.up.copy(latestViewer.getViewer().camera.up);
12     }
13 
14     view2Bind = function (data) {
15         //用旧模型的状态更新新模型状态
16         var prevState = prev.getCurrentState();
17         latestViewer.setState(prevState);
18         latestViewer.getViewer().camera.up.copy(prev.getViewer().camera.up);
19     }
20 
21     //考虑到死循环的影响,不能同时监听render事件,因此以鼠标所在位置模型的监听为主
22     document.querySelector('#container').addEventListener('mousemove',
23         function (e) {
24             if (focus == undefined) {
25                 var width = document.querySelector('.latest').offsetWidth;
26                 if (e.clientX > width) {
27                     focus = 1;
28                     latestViewer.removeEventListener('Rendered', view1Bind);
29                     prev.addEventListener('Rendered', view2Bind);
30                 } else {
31                     focus = 0;
32                     prev.removeEventListener('Rendered', view2Bind);
33                     latestViewer.addEventListener('Rendered', view1Bind);
34                 }
35             }
36         });
37 
38     view1.addEventListener('mouseover',
39         function (e) {
40             if (focus == 0) {
41                 return;
42             }
43             focus = 0;
44             // 解绑与重新绑定事件,同步新旧模型的Rendered
45             prev.removeEventListener('Rendered', view2Bind);
46             latestViewer.addEventListener('Rendered', view1Bind);
47         });
48 
49     view2.addEventListener('mouseover',
50         function () {
51             if (focus == 1) {
52                 return;
53             }
54             focus = 1;
55             // 解绑与重新绑定事件,同步新旧模型的Rendered
56             latestViewer.removeEventListener('Rendered', view1Bind);
57             prev.addEventListener('Rendered', view2Bind);
58         });
59 
60     // 同步新旧模型的Hover事件
61     prev.addEventListener('ComponentsHoverChanged',
62         function (e) {
63             latestViewer.getViewer().modelManager.sceneState.setHoverId(e.objectId);
64         });
65 
66     latestViewer.addEventListener('ComponentsHoverChanged',
67         function (e) {
68             prev.getViewer().modelManager.sceneState.setHoverId(e.objectId);
69         });
70 
71     var ViewerEvent = Glodon.Bimface.Viewer.Viewer3D;
72     latestViewer.setCameraAnimation(false);
73     prev.setCameraAnimation(false);
74 }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 //创建异动列表与构件的click事件
 2 function createDom(result) {
 3         // 设置构件差异构件树的UI
 4         var newItems = result.newItems,
 5             deleteItems = result.deleteItems,
 6             changeItems = result.changeItems;
 7         var typeBoxs = document.querySelectorAll('.type-box');
 8         typeBoxs[0].innerHTML =
 9             `<div class="title"><i class="icon arrow"></i><i class="icon-type new"></i>新增构件(${newItems.length})</div>
10                                       <ul id="addElement" class="type-ul">${createDomNode(newItems)}</ul>`;
11 
12         // 删除构件列表
13         typeBoxs[1].innerHTML =
14             `<div class="title"><i class="icon arrow"></i><i class="icon-type remove"></i>删除构件(${deleteItems.length})</div>
15                                       <ul id="removeElement" class="type-ul">${createDomNode(deleteItems)}</ul>`;
16 
17         // 修改构件列表
18         typeBoxs[2].innerHTML =
19             `<div class="title"><i class="icon arrow"></i><i class="icon-type revise"></i>修改构件(${changeItems.length})</div>
20                                       <ul id="reviseElement" class="type-ul">${createDomNode(changeItems)}</ul>`;
21 
22         // 差异构件树列表
23         document.querySelector('.compare-content').addEventListener('click',
24             function (e) {
25                 var element = e.target;
26                 if (element.tagName == 'I' && element.hasClass('arrow')) {
27                     if (element.hasClass('close')) {
28                         element.removeClass('close');
29                         element.parentElement.nextElementSibling.removeClass('close');
30                     } else {
31                         element.addClass('close');
32                         element.parentElement.nextElementSibling.addClass('close');
33                     }
34                 } else if (element.tagName == 'SPAN' && element.getAttribute('type')) {
35                     var type = element.getAttribute('type'),
36                         id = element.parentElement.getAttribute('data-oid');
37                     if (type == 'NEW') {
38                         latestViewer.setSelectedComponentsById([id]);// 高亮选中构件
39                         latestViewer.zoomToSelectedComponents();  // 定位
40                         view1Bind();
41                     } else if (type == 'DELETE') {
42                         prev.setSelectedComponentsById([id]);// 高亮选中构件
43                         prev.zoomToSelectedComponents(); // 定位
44                         view2Bind();
45                     } else {
46                         latestViewer.setSelectedComponentsById([id]); // 高亮选中构件
47                         latestViewer.zoomToSelectedComponents();// 定位;
48                         view1Bind();
49                         prev.setSelectedComponentsById([id]);
50                     }
51                 }
52             });
53     }

上述测试程序使用了 《BIMFace.SDK.CSharp》开源SDK。欢迎大家下载使用。

BIMFACE二次开发系列目录 【已更新最新开发文章,点击查看详细】

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Spring + CXF框架的Web Service
1、用CXF编写基于Spring的Web service,也是需要分为Server服务器端、Client客户端的。
别先生
2020/12/01
1.3K0
基于Spring + CXF框架的Web Service
web项目使用cxf+spring搭建WebService,并部署到远程
说明服务发布成功,访问该项目http://localhost:8080/CXFWebservice/webservice
故久
2020/06/04
6570
常用webservice方法_太极拳初学入门的基本要领
先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点
全栈程序员站长
2022/11/08
1.6K0
常用webservice方法_太极拳初学入门的基本要领
CXF集成Spring实现webservice的发布与请求
CXF集成Spring实现webservice的发布(服务端) 目录结构: 主要代码: package com.cxf.spring.pojo; public class User { int id ; String name = null; String address = null; String email = null; public int getId() { return id
JQ实验室
2022/02/09
5880
CXF集成Spring实现webservice的发布与请求
java调用WebService(一)
因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录
matinal
2023/10/13
1.1K0
远程调用服务框架-CXF(WebServic)
本文介绍了如何利用阿里巴巴的开源项目Dubbo,实现高性能的服务化架构。首先介绍了Dubbo的基本概念和架构设计,然后详细讲解了如何使用Dubbo搭建服务化架构,并总结了在实践过程中需要注意的要点。本文对于实际项目中使用Dubbo搭建服务化架构具有一定的参考价值。
李家酒馆酒保
2017/12/27
1.8K0
远程调用服务框架-CXF(WebServic)
springMvc项目集成cxf实现webService通信方式的详细步骤
 添加webService服务接口的bean文件 applicationContext-cxf.xml
跟着飞哥学编程
2022/11/30
1.9K0
springMvc项目集成cxf实现webService通信方式的详细步骤
WebService就是这么简单
WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧…. 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做????? 天气预报这么一个功能并不是简单的JS组件就能够实现的,它的数据是依赖数据库分析出来的,甚至需要卫星探测..我们个人建站是不可能搞这么一个数据库的吧。 那么既然我们自己干不了,我们可以去找别人吗???我们从搜索引擎搜索,可以发现很多提供天气预报的网站,但是它返回的是一个网页,而我们仅仅需要的是对应的数据! 我们可能就在想,我们能
Java3y
2018/04/02
12.6K0
WebService就是这么简单
面试题-web service接口如何测试?
接口相关的测试,http 协议的接口大家平常基础的很多,基本上问题不大。webservice 接口如何测试呢?需先了解什么是 webservice 接口,和 http 协议的接口有什么不一样?
上海-悠悠
2021/03/03
2.6K0
面试题-web service接口如何测试?
WebService使用介绍(三)
exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法
HUC思梦
2020/09/03
2.8K0
WebService使用介绍(三)
cxf框架调用webservice_webservice json
Ant做为一种工具已经广泛被使用,并且历史悠久。 使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear), 也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。 由于ant是用xml语言写成的文件,并取默认名为build.xml文件。 所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。
全栈程序员站长
2022/09/29
2.1K0
cxf框架调用webservice_webservice json
Web Service简单入门示例
我们一般实现Web Service的方法有非常多种。当中我主要使用了CXF Apache插件和Axis 2两种。
全栈程序员站长
2022/07/05
4220
WebService客户端调用的5种常见方式
到此一个简单的webservice服务端项目就搭建完成了,这里我在application.properties文件中把端口改成8081:
科技新语
2024/11/21
9070
WebService客户端调用的5种常见方式
day46_Webservice学习笔记_02
开发步骤:   第一步:导入jar包   第二步:创建SEI接口,要在接口上加入注解:@WebService
黑泽君
2018/10/11
3K0
day46_Webservice学习笔记_02
cxf webservice整合spring 原
     前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。     工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。     RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)     对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。     对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。     code first 或者 xml first  : 支持使用code first 或者 xml first 的方式来创建web服务。  一  借助 annotation 创建独立启动的web 服务。         准备: 新建工程 导入需要的jar 包:                      依赖的包:                             commons-logging-1.1.jar                             geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)                             geronimo-annotation_1.0_spec-1.1.jar (JSR 250)                             geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)                             geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)                             geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)                             jaxb-api-2.1.jar                             jaxb-impl-2.1.6.jar                             jaxws-api-2.1.jar                             jetty-6.1.5.jar                             jetty-util-6.1.5.jar                             neethi-2.0.jar                             saaj-api-1.3.jar                             saaj-impl-1.3.jar                             stax-api-1.0.1.jar                             wsdl4j-1.6.1.jar                             wstx-asl-3.2.1.jar                             XmlSchema-1.2.jar                             xml-resolver-1.2.jar                         spring jar 包, 用来支持xml配置:                             aopalliance-1.0.jar          
尚浩宇
2018/08/17
8510
WebService入门之CXF教程
Apache CXF是一个开源的Service框架,可以用于简化用户的service开发,基于CXF开发的应用可提供SOAP、XML/HTTP、RESTFUL HTTP或CORBA等服务。CXF底层页可以使用不同的传输协议,包括HTTP、JMS或JBI等。
星哥玩云
2022/07/03
2.6K0
WebService入门之CXF教程
Web Service进阶(一)运行原理[通俗易懂]
利用清明小假期,温习了一遍Web Service的相关内容,对其工作原理进行了简要总结。以供有需求的朋友和自己日后参考。文章若有不当之处,敬请朋友们提出宝贵建议,以求共勉。
全栈程序员站长
2022/09/15
6410
Web Service进阶(一)运行原理[通俗易懂]
老司机带你玩转web service
当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙
xiangzhihong
2018/02/05
1.3K0
老司机带你玩转web service
Java webservice详解「建议收藏」
  webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;
全栈程序员站长
2022/09/14
4K0
Java webservice详解「建议收藏」
使用JQuery、Ajax来调用WebService服务 基于Spring + CXF框架的Web Service
1、在之前的基础上修改的,如果想使用JQuery、Ajax来调用WebService服务,必须需要先获取到请求的参数值,我的参数值是下面的这部分,如何获取到这参数值呢,只需要在客户端配置出拦截器即可,后台打印的参数,然后配置到自己需要的地方即可。
别先生
2020/12/01
2.3K0
使用JQuery、Ajax来调用WebService服务
    


基于Spring + CXF框架的Web Service
相关推荐
基于Spring + CXF框架的Web Service
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验