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

  在实际项目中,因为需求变动常常须要对模型文件进行修改。为了便于用户了解模型在修改先后发生的变化,BIMFACE提供了模型在线对比功能,能够利用在线的模型对比接口,经过简单的四个步骤实现模型在线对比。模型对比能够对两个文件/模型进行差别性分析,肯定两个文件/模型之间构件的几何和属性差别,包括增长的构件、删除的构件和修改的构件。 模型对应能够用于进行文件/模型的版本对比。html

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

前置条件
  • 您须要将修改前和修改后的模型上传到云端并转换成功之后才能发起模型对比;
  • 目前仅支持.rvt单文件的模型对比。
基本步骤
  1. 经过服务端API发起模型对比(对比先后模型文件的fileId);
  2. 等待云端对比任务执行;
  3. 对比完成后,在网页端经过调用JavaScript API实现差别模型的显示;
  4. 除了显示差别模型,还须要调用服务端API获取对比结果(包括新增、删除、修改的构件列表)。
对比流程

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

  • 几何差别;
  • 变动构件及属性。

 

发起模型对比

对比操做的第一步是调用服务端API发起模型对比。ide

请求地址:POST https://api.bimface.com/v2/compare函数

说明:不一样版本的模型文件上传并转换成功后,便可发起模型对比。因为对比不能当即完成,BIMFace支持在模型对比完成之后,经过Callback机制通知应用;另外,应用也能够经过接口查询对比状态。测试

参数:
this

请求 path(示例):https://api.bimface.com/v2/compareurl

请求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"spa

请求 body(示例):3d

{ "callback" : "https://api.glodon.com/viewing/callback?authCode=BJ90Jk0affae&signature=2ef131395fb6442eb99abd83d45c2412", "comparedEntityType" : "file", "config" : "object", "followingId" : 22145522, "name" : "compare0001", "previousId" : 12311221, "priority" : 2, "sourceId" : "123223223212" }

HTTP响应示例(200):

{ "code" : "success", "data" : { "compareId" : 1248756572307264, "createTime" : "2017-12-25 16:17:27", "name" : "compare0001", "priority" : 2, "reason" : "reason", "sourceId" : "123223223212", "status" : "succcess", "thumbnail" : [ "https://m.bimface.com/9b711803a43b92d871cde346b63e5019/thumbnail/96.png" ] }, "message" : "" }

C#实现方法:

 1 /// <summary>
 2 /// 不一样版本的模型文件上传并转换成功后,便可发起模型对比。因为对比不能当即完成,BIMFace支持在模型对比完成之后,经过Callback机制通知应用;另外,应用也能够经过接口查询对比状态  3 /// </summary>
 4 /// <param name="accessToken">【必填】令牌</param>
 5 /// <param name="followingId">修改后图纸(当前本班,本轮)模型文件ID</param>
 6 /// <param name="previousId">修改前图纸(历史版本,上一轮次)模型文件ID</param>
 7 /// <returns></returns>
 8 public virtual ModelCompareResponse Compare(string accessToken, long followingId, long previousId)  9 { 10     CompareRequest request = new CompareRequest(followingId, previousId); 11 
12     return Compare(accessToken, request); 13 }

其中12行的Compare方法调用了重载方法,实现以下:

 1 /// <summary>
 2 /// 不一样版本的模型文件上传并转换成功后,便可发起模型对比。因为对比不能当即完成,BIMFace支持在模型对比完成之后,经过Callback机制通知应用;另外,应用也能够经过接口查询对比状态  3 /// </summary>
 4 /// <param name="accessToken">【必填】令牌</param>
 5 /// <param name="request">对比时的请求参数</param>
 6 /// <returns></returns>
 7 public virtual ModelCompareResponse Compare(string accessToken, CompareRequest request)  8 {  9     //POST https://api.bimface.com/v2/compare
10     string url = BimfaceConstants.API_HOST + "/v2/compare"; 11     string data = request.SerializeToJson(); 12 
13     BimFaceHttpHeaders headers = new BimFaceHttpHeaders(); 14  headers.AddOAuth2Header(accessToken); 15 
16     try
17  { 18  ModelCompareResponse response; 19 
20         HttpManager httpManager = new HttpManager(headers); 21         HttpResult httpResult = httpManager.Post(url, data); 22         if (httpResult.Status == HttpResult.STATUS_SUCCESS) 23  { 24             response = httpResult.Text.DeserializeJsonToObject<ModelCompareResponse>(); 25  } 26         else
27  { 28             response = new ModelCompareResponse 29  { 30                 Message = httpResult.RefText 31  }; 32  } 33 
34         return response; 35  } 36     catch (Exception ex) 37  { 38         throw new Exception("[发起模型对比]发生异常!", ex); 39  } 40 }

代码中使用的 HttpManager 类请参考个人博客文章《C# HTTP系列 HttpWebRequest 与 HttpWebResponse》。

CompareRequest 请求类以下:

 1 /// <summary>
 2 /// 模型对比请求参数类  3 /// </summary>
 4 [Serializable]  5 public class CompareRequest  6 {  7     /// <summary>
 8     /// 
 9     /// </summary>
10     /// <param name="followingId">变动后文件ID,若是为删除文件,则为null</param>
11     /// <param name="previousId">变动前文件ID,若是为新增文件,则为null</param>
12     /// <param name="name">自定义对比的名称</param>
13     public CompareRequest(long? followingId, long? previousId, string name = "") 14  { 15         ComparedEntityType = "file"; //要么赋值,必须是正确的值。若是赋值null,则报错
16         Config = null; 17         SourceId = null; 18         Priority = 2; 19         CallBack = "http://www.app.com/receive"; 20 
21         FollowingId = followingId; 22         PreviousId = previousId; 23         if (name.IsNullOrWhiteSpace()) 24  { 25             Name = DateTime.Now.ToString("yyyyMMddHHmmss") + "对比:" + followingId.ToString2() + "-" + previousId.ToString2(); 26  } 27  } 28 
29     /// <summary>
30     /// 对比的模型类型:file 31     /// </summary>
32     [JsonProperty("comparedEntityType", NullValueHandling = NullValueHandling.Ignore)] 33     public string ComparedEntityType { get; set; } 34 
35     [JsonProperty("config", NullValueHandling = NullValueHandling.Ignore)] 36     public object Config { get; set; } 37 
38     /// <summary>
39     /// 变动后文件ID,若是为删除文件,则为null 40     /// </summary>
41     [JsonProperty("followingId")] 42     public long? FollowingId { get; set; } 43 
44     /// <summary>
45     /// 变动前文件ID,若是为新增文件,则为null 46     /// </summary>
47     [JsonProperty("previousId")] 48     public long? PreviousId { get; set; } 49 
50     /// <summary>
51     /// 用户指定对比后的模型的名字 52     /// </summary>
53     [JsonProperty("name")] 54     public string Name { get; set; } 55 
56     /// <summary>
57     /// 第三方应用本身的ID 58     /// </summary>
59     [JsonProperty("sourceId", NullValueHandling = NullValueHandling.Ignore)] 60     public string SourceId { get; set; } 61 
62     /// <summary>
63     /// 对比优先级。取值 一、二、3。数字越大,优先级越低。默认为2 64     /// </summary>
65     [JsonProperty("priority")] 66     public int Priority { get; set; } 67 
68     /// <summary>
69     /// Callback地址,待转换完毕之后,BIMFace会回调该地址 70     /// </summary>
71     [JsonProperty("callback")] 72     public string CallBack { get; set; } 73 }
View Code

其中 Name 属性,在构造函数中默认设置为当前时间 + "对比" + 修改后文件ID + 修改前文件ID。这里是为了方便使用不须要每次调用该类都给Name赋值,也能够自定义任何有意义的名称。

ModelCompareResponse 响应类以下:

 1 /// <summary>
 2     /// 模型对比返回的结果类  3     /// </summary>
 4     public class ModelCompareResponse : GeneralResponse<ModelCompareBean>
 5  {  6 
 7  }  8 
 9     public class ModelCompareBean 10  { 11         /// <summary>
12         /// 对比后返回的ID,用于获取对比状态或者结果等信息 13         /// </summary>
14         [JsonProperty("compareId", NullValueHandling = NullValueHandling.Ignore)] 15         public long? CompareId { get; set; } 16 
17         /// <summary>
18         /// 对比完成的消耗时间,单位是秒 19         /// </summary>
20         [JsonProperty("cost", NullValueHandling = NullValueHandling.Ignore)] 21         public int? Cost { get; set; } 22 
23         /// <summary>
24         /// 对比开始时间,格式:yyyy-MM-dd hh:mm:ss 25         /// </summary>
26         [JsonProperty("createTime", NullValueHandling = NullValueHandling.Ignore)] 27         public string CreateTime { get; set; } 28 
29         /// <summary>
30         /// 用户指定对比后的模型的名字 31         /// </summary>
32         [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] 33         public string Name { get; set; } 34 
35         /// <summary>
36         /// 离线数据包生成状态。prepare(未生成); processing(生成中); success(生成成功); failed(生成失败) 37         /// </summary>
38         [JsonProperty("offlineDatabagStatus", NullValueHandling = NullValueHandling.Ignore)] 39         public string OfflineDatabagStatus { get; set; } 40 
41         /// <summary>
42         /// 对比优先级。取值 一、二、3。数字越大,优先级越低。默认为2 43         /// </summary>
44         [JsonProperty("priority", NullValueHandling = NullValueHandling.Ignore)] 45         public int? Priority { get; set; } 46 
47         /// <summary>
48         /// 若对比失败,返回失败缘由 49         /// </summary>
50         [JsonProperty("reason", NullValueHandling = NullValueHandling.Ignore)] 51         public string Reason { get; set; } 52 
53         /// <summary>
54         /// 第三方应用本身的ID 55         /// </summary>
56         [JsonProperty("sourceId", NullValueHandling = NullValueHandling.Ignore)] 57         public string SourceId { get; set; } 58 
59         /// <summary>
60         /// 对比状态:prepare(待对比)、processing(对比中)、success(对比成功)、failed(对比失败) 61         /// </summary>
62         [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] 63         public string Status { get; set; } 64 
65         /// <summary>
66         /// 对比几个缩略图 67         /// </summary>
68         [JsonProperty("thumbnail", NullValueHandling = NullValueHandling.Ignore)] 69         public string[] Thumbnails { get; set; } 70 
71         /// <summary>
72         /// 模型对比的类型 rvt(或者igms…​) 73         /// </summary>
74         [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] 75         public string Type { get; set; } 76 
77         /// <summary>
78         /// 处理对比任务的worker类型。model-compare(或者drawing-compare…​) 79         /// </summary>
80         [JsonProperty("workerType", NullValueHandling = NullValueHandling.Ignore)] 81         public string WorkerType { get; set; } 82 
83         /// <summary>返回表示当前对象的字符串。</summary>
84         /// <returns>表示当前对象的字符串。</returns>
85         public override string ToString() 86  { 87             return this.SerializeToJson(); 88         }
View Code
测试

22在BIMFACE控制台中能够看到咱们上传的文件列表,模型状态均为转换成功。

这里选择 bimface_2018_mdv_room.rvt 与 Revit案例项目改.0001.rvt 为例来进行对比。

 1 /// <summary>
 2 /// 开始比对  3 /// </summary>
 4 protected void btnStartCompare_Click(object sender, EventArgs e)  5 {  6     txtResult.Text = string.Empty;  7 
 8     long followingId = lbl1RVT.Text.ToLong();  9     long previousId = lbl2RVT.Text.ToLong(); 10 
11     CompareRequest request = new CompareRequest(followingId, previousId); 12 
13     ModelCompareApi api = new ModelCompareApi(); 14     ModelCompareResponse response = api.Compare(txtAccessToken.Text, request); 15 
16     txtResult.Text = response.SerializeToJson(); 17     txtCompareID.Text = response.Data.CompareId.ToString(); 18 }

调用对比接口发起对比

 返回结果中,code:success表示发起对比成功。到控制台中查看以下,新增了一笔对比记录。

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

在下一篇《C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态》中详细介绍如何获取模型对比状态。

原文出处:https://www.cnblogs.com/SavionZhang/p/12395986.html

相关文章
相关标签/搜索