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,用于发起对比,获取对比状态、获取对比结果。请参考我的博客:

测试程序

调用服务器端的API获取对比结果后,前端需要使用JS来实现同步联动效果,以及点击异动构件后自动定位到构件所在的视角。

 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 }
 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二次开发系列目录     【已更新最新开发文章,点击查看详细】

C#开发BIMFACE系列41 服务端API之模型对比的更多相关文章

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

    系列目录     [已更新最新开发文章,点击查看详细] 在实际项目中,由于需求变更经常需要对模型文件进行修改.为了便于用户了解模型在修改前后发生的变化,BIMFACE提供了模型在线对比功能,可以利用在 ...

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

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列30 服务端API之模型对比1:发起模型对比>中发起了2个模型对比,由于模型对比是在BIMFAC ...

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

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态>中介绍了根据对比ID,获取一笔记录的对比状态.由于模 ...

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

    系列目录     [已更新最新开发文章,点击查看详细] 模型对比可以对两个文件/模型进行差异性分析,确定两个文件/模型之间构件的几何和属性差异,包括增加的构件.删除的构件和修改的构件. 模型对应可以用 ...

  5. C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE平台提供了服务端"获取模型对比构件分类树"API.目录树返回结果以树状层级关系显示了增删改的构件信息,里面无法 ...

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

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE平台提供了服务端“获取修改构件属性差异”API,其返回的结果也是一个列表,仅针对修改的构件(不包含新增.删除的构件),是指对于一个 ...

  7. C#开发BIMFACE系列42 服务端API之图纸对比

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在我的前一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>中详细介绍了BIMFACE服务端接口 ...

  8. C#开发BIMFACE系列40 服务端API之模型集成

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 随着建筑信息化模型技术的发展,越来越多的人选择在云端浏览建筑模型.现阶段的云端模型浏览大多是基于文件级别,一次只可以浏览一 ...

  9. C#开发BIMFACE系列43 服务端API之图纸拆分

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在上一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>的最后留了一个问题,在常规业务场景下,一 ...

随机推荐

  1. struts2思想学习(一)

    OOP 面向对象编程 AOP 面向切面编程 而在struts2 处处体现了面向切面编程的思想(动态代理最典型)! 拦截器其实也是面向切面编程!拦截器切断了所有请求到action的操作 并做了很多的前提 ...

  2. 五分钟搞定Docker安装ElasticSearch

    前言 项目准备上ElasticSearch,为了后期开发不卡壳只能笨鸟先飞,在整个安装过程中遇到以下三个问题. Docker安装非常慢 ElasticSearch-Head连接出现跨域 Elastic ...

  3. Go初始化二维数组

    初始化二维数组 var a = make([][]int, n) for i := 0; i < n; i++ { a[i] = make([]int, n) }

  4. SpringBoot笔记(1)

    一.Spring能做什么 微服务 响应式开发 分布式云开发 web开发 无服务开发(云) 批处理业务等 二.SpringBoot作用 能快速创建出生产级别的Spring应用 SpringBoot是整合 ...

  5. (五)羽夏看C语言——结构体与类

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  6. (一)羽夏看C语言——简述

    "羽夏看C语言"介绍什么   本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...

  7. Blazor 组件库开发指南

    翻译自 Waqas Anwar 2021年5月21日的文章 <A Developer's Guide To Blazor Component Libraries> [1] Blazor 的 ...

  8. Dockerfile优化——supervisor服务

    一.理解supervisor(supervisor服务不仅在容器中可用,在宿主机中也适用) 1.Dockerfile中的CMD可以指定启动容器后执行的第一个命令,但是当有多个服务进程需要启动的时候,就 ...

  9. SpringBoot-Web-初见

    目录 怎么开发一个网站? 静态资源 找到静态资源的存放目录 扩展自定义路径 首页定制 模板引擎Thymeleaf 员工管理系统-初见 国际化 国际化实现 编写国际化配置类 登陆功能 编写index.h ...

  10. k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)

    目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...