C#开发BIMFACE系列42 服务端API之图纸对比
阅读原文时间:2021年10月12日阅读:1

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

在我的前一篇博客C#开发BIMFACE系列42 服务端API之图纸对比中详细介绍了BIMFACE服务端接口模型对比的功能。 BIMFACE官方文档提供的三维模型对比接口同样也适用于二维CAD图纸对比。下图中是官方提供的对比示例程序。

其中新增的图元使用绿色标记、修改的图元使用黄色标记、删除的图元使用红色标记。

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

图纸对比可以对两个图纸文件进行差异性分析,确定两个图纸文件之间构件的几何和属性差异,包括增加的图元构件、删除的图元和修改的图元。

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

前置条件

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

基本步骤

  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获取对比结果

对比差异分为三类:新增、修改、删除。由于CAD图纸的展示类型包含 Model 与 Layer 两种形式,

差异结果中也是包含两种展示类型的对比信息,所以可能有重复的图元ID,需要手动过滤。

返回结果对应的实体类如下

1 ///

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

对比结果如下

1 {
2 "code": "success",
3 "message": null,
4 "data": {
5 "data": [{
6 "diffType": "NEW",
7 "id": "1946876",
8 "layer": "D1",
9 "sheetId": "0",
10 "sheetName": "Model",
11 "type": "Model"
12 }, {
13 "diffType": "NEW",
14 "id": "1946877",
15 "layer": "D1",
16 "sheetId": "0",
17 "sheetName": "Model",
18 "type": "Model"
19 }, {
20 "diffType": "NEW",
21 "id": "1946878",
22 "layer": "D1",
23 "sheetId": "0",
24 "sheetName": "Model",
25 "type": "Model"
26 }, {
27 "diffType": "CHANGE",
28 "id": "40539",
29 "layer": "0",
30 "sheetId": "0",
31 "sheetName": "Model",
32 "type": "Model"
33 }, {
34 "diffType": "CHANGE",
35 "id": "40541",
36 "layer": "0",
37 "sheetId": "0",
38 "sheetName": "Model",
39 "type": "Model"
40 }, {
41 "diffType": "CHANGE",
42 "id": "40542",
43 "layer": "0",
44 "sheetId": "0",
45 "sheetName": "Model",
46 "type": "Model"
47 }, {
48 "diffType": "CHANGE",
49 "id": "22243",
50 "layer": "AXIS",
51 "sheetId": "0",
52 "sheetName": "Model",
53 "type": "Model"
54 }
55 ],
56 "page": 1,
57 "total": 7
58 }
59 }

网页中使用JS来实现图纸展示与差异对比效果,以及点击异动图元后自动定位到构件所在的视角。官网示例请参考 https://bimface.com/developer-jsdemo#988

官网的对比展示效果是将2张图纸进行叠加对比显示的,下面介绍另一种对比展示方式,2张图纸分别展示,左侧展示当前版本图纸,右侧展示历史版本图纸。

点击新增图元项,自动定位(绿色标记)

点击修改图元项,自动定位(黄色标记)

点击删除图元项,自动定位(红色标记)

布局如下