• C#开发BIMFACE系列44 服务端API之计算图纸对比差异项来源自哪个图框


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

    在前两篇博客《C#开发BIMFACE系列42 服务端API之图纸对比》《C#开发BIMFACE系列43 服务端API之图纸拆分》中介绍了单文件多图框的拆分与对比

    本文将详细讲解如何计算图纸对比差异项来源自哪个图框。

    以控制台中的2张图纸【建筑图纸1-已拆分.dwg】 与 【建筑图纸2-已拆分-已变更.dwg】为例

    对比结果参考上面第2个动态图。

    获取图纸对比结果API

    调用BIMFACE服务端接口

     1     /// <summary>
     2     ///  分页获取二维图纸对比结果。结果中包含 Type 为 Model 与 Layer 的两种结果对比,所以可能有重复的构建ID,需要手动过滤。
     3     /// </summary>
     4     /// <param name="accessToken">【必填】令牌</param>
     5     /// <param name="compareId">【必填】对比ID</param>
     6     /// <param name="page">页码(提示:私有云部署不支持分页查询)。如果不传参数,则默认为1</param>
     7     /// <param name="pageSize">每页记录数(提示:私有云部署不支持分页查询)。如果不传参数,则默认为50</param>
     8     /// <returns></returns>
     9     public virtual DrawingCompareDiffResponse GetDrawingCompareDiff(string accessToken, long compareId, int? page = null, int? pageSize = null)
    10     {
    11         // GET https://api.bimface.com/data/v2/comparisons/{comparisonId}/diff
    12         string url = string.Format(BIMFaceConstants.API_HOST + "/data/v2/comparisons/{0}/drawingdiff?v=1", compareId);
    13         if (page.HasValue)
    14         {
    15             if (page.Value <= 1)
    16             {
    17                 page = 1;
    18             }
    19 
    20             url += "&page=" + page;
    21         }
    22 
    23         if (pageSize.HasValue)
    24         {
    25             if (pageSize.Value <= 0)
    26             {
    27                 pageSize = 50;
    28             }
    29 
    30             url += "&pageSize=" + pageSize;
    31         }
    32 
    33         BIMFaceHttpHeaders headers = new BIMFaceHttpHeaders();
    34         headers.AddOAuth2Header(accessToken);
    35 
    36         try
    37         {
    38             DrawingCompareDiffResponse response;
    39 
    40             HttpManager httpManager = new HttpManager(headers);
    41             HttpResult httpResult = httpManager.Get(url);
    42             if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    43             {
    44                 response = httpResult.Text.DeserializeJsonToObject<DrawingCompareDiffResponse>();
    45             }
    46             else
    47             {
    48                 response = new DrawingCompareDiffResponse
    49                 {
    50                     Message = httpResult.RefText
    51                 };
    52             }
    53 
    54             return response;
    55         }
    56         catch (Exception ex)
    57         {
    58             throw new BIMFaceException("[分页获取图纸对比结果]发生异常!", ex);
    59         }
    60     }

    完整的对比差异项纪录信息如下:

      1 {
      2   "code": "success",
      3   "message": null,
      4   "data": {
      5     "data": [
      6       {
      7         "diffType": "NEW",
      8         "id": "1946877",
      9         "layer": "D1",
     10         "sheetId": "0",
     11         "sheetName": "Model",
     12         "type": "Model"
     13       },
     14       {
     15         "diffType": "NEW",
     16         "id": "1946878",
     17         "layer": "D1",
     18         "sheetId": "0",
     19         "sheetName": "Model",
     20         "type": "Model"
     21       },
     22       {
     23         "diffType": "DELETE",
     24         "id": "122566",
     25         "layer": "D1",
     26         "sheetId": "0",
     27         "sheetName": "Model",
     28         "type": "Model"
     29       },
     30       {
     31         "diffType": "CHANGE",
     32         "id": "104778",
     33         "layer": "0",
     34         "sheetId": "0",
     35         "sheetName": "Model",
     36         "type": "Model"
     37       },
     38       {
     39         "diffType": "CHANGE",
     40         "id": "104779",
     41         "layer": "0",
     42         "sheetId": "0",
     43         "sheetName": "Model",
     44         "type": "Model"
     45       },
     46       {
     47         "diffType": "CHANGE",
     48         "id": "104780",
     49         "layer": "0",
     50         "sheetId": "0",
     51         "sheetName": "Model",
     52         "type": "Model"
     53       },
     54       {
     55         "diffType": "CHANGE",
     56         "id": "104781",
     57         "layer": "0",
     58         "sheetId": "0",
     59         "sheetName": "Model",
     60         "type": "Model"
     61       },
     62       {
     63         "diffType": "CHANGE",
     64         "id": "104782",
     65         "layer": "0",
     66         "sheetId": "0",
     67         "sheetName": "Model",
     68         "type": "Model"
     69       },
     70       {
     71         "diffType": "CHANGE",
     72         "id": "104783",
     73         "layer": "0",
     74         "sheetId": "0",
     75         "sheetName": "Model",
     76         "type": "Model"
     77       },
     78       {
     79         "diffType": "CHANGE",
     80         "id": "104784",
     81         "layer": "0",
     82         "sheetId": "0",
     83         "sheetName": "Model",
     84         "type": "Model"
     85       },
     86       {
     87         "diffType": "CHANGE",
     88         "id": "104785",
     89         "layer": "0",
     90         "sheetId": "0",
     91         "sheetName": "Model",
     92         "type": "Model"
     93       },
     94       {
     95         "diffType": "CHANGE",
     96         "id": "104786",
     97         "layer": "0",
     98         "sheetId": "0",
     99         "sheetName": "Model",
    100         "type": "Model"
    101       },
    102       {
    103         "diffType": "CHANGE",
    104         "id": "104787",
    105         "layer": "0",
    106         "sheetId": "0",
    107         "sheetName": "Model",
    108         "type": "Model"
    109       },
    110       {
    111         "diffType": "CHANGE",
    112         "id": "96095",
    113         "layer": "0",
    114         "sheetId": "0",
    115         "sheetName": "Model",
    116         "type": "Model"
    117       },
    118       {
    119         "diffType": "CHANGE",
    120         "id": "96096",
    121         "layer": "0",
    122         "sheetId": "0",
    123         "sheetName": "Model",
    124         "type": "Model"
    125       },
    126       {
    127         "diffType": "CHANGE",
    128         "id": "96097",
    129         "layer": "0",
    130         "sheetId": "0",
    131         "sheetName": "Model",
    132         "type": "Model"
    133       },
    134       {
    135         "diffType": "CHANGE",
    136         "id": "96098",
    137         "layer": "0",
    138         "sheetId": "0",
    139         "sheetName": "Model",
    140         "type": "Model"
    141       },
    142       {
    143         "diffType": "CHANGE",
    144         "id": "96099",
    145         "layer": "0",
    146         "sheetId": "0",
    147         "sheetName": "Model",
    148         "type": "Model"
    149       },
    150       {
    151         "diffType": "CHANGE",
    152         "id": "96100",
    153         "layer": "0",
    154         "sheetId": "0",
    155         "sheetName": "Model",
    156         "type": "Model"
    157       },
    158       {
    159         "diffType": "CHANGE",
    160         "id": "96101",
    161         "layer": "0",
    162         "sheetId": "0",
    163         "sheetName": "Model",
    164         "type": "Model"
    165       },
    166       {
    167         "diffType": "CHANGE",
    168         "id": "96102",
    169         "layer": "0",
    170         "sheetId": "0",
    171         "sheetName": "Model",
    172         "type": "Model"
    173       },
    174       {
    175         "diffType": "CHANGE",
    176         "id": "96103",
    177         "layer": "0",
    178         "sheetId": "0",
    179         "sheetName": "Model",
    180         "type": "Model"
    181       },
    182       {
    183         "diffType": "CHANGE",
    184         "id": "96104",
    185         "layer": "0",
    186         "sheetId": "0",
    187         "sheetName": "Model",
    188         "type": "Model"
    189       },
    190       {
    191         "diffType": "CHANGE",
    192         "id": "22307",
    193         "layer": "AXIS",
    194         "sheetId": "0",
    195         "sheetName": "Model",
    196         "type": "Model"
    197       },
    198       {
    199         "diffType": "CHANGE",
    200         "id": "22314",
    201         "layer": "AXIS",
    202         "sheetId": "0",
    203         "sheetName": "Model",
    204         "type": "Model"
    205       },
    206       {
    207         "diffType": "CHANGE",
    208         "id": "22315",
    209         "layer": "AXIS",
    210         "sheetId": "0",
    211         "sheetName": "Model",
    212         "type": "Model"
    213       },
    214       {
    215         "diffType": "CHANGE",
    216         "id": "53351",
    217         "layer": "D1",
    218         "sheetId": "0",
    219         "sheetName": "Model",
    220         "type": "Model"
    221       },
    222       {
    223         "diffType": "CHANGE",
    224         "id": "53352",
    225         "layer": "D1",
    226         "sheetId": "0",
    227         "sheetName": "Model",
    228         "type": "Model"
    229       },
    230       {
    231         "diffType": "CHANGE",
    232         "id": "53355",
    233         "layer": "D1",
    234         "sheetId": "0",
    235         "sheetName": "Model",
    236         "type": "Model"
    237       },
    238       {
    239         "diffType": "CHANGE",
    240         "id": "53356",
    241         "layer": "D1",
    242         "sheetId": "0",
    243         "sheetName": "Model",
    244         "type": "Model"
    245       },
    246       {
    247         "diffType": "CHANGE",
    248         "id": "53357",
    249         "layer": "D1",
    250         "sheetId": "0",
    251         "sheetName": "Model",
    252         "type": "Model"
    253       },
    254       {
    255         "diffType": "CHANGE",
    256         "id": "53358",
    257         "layer": "D1",
    258         "sheetId": "0",
    259         "sheetName": "Model",
    260         "type": "Model"
    261       },
    262       {
    263         "diffType": "CHANGE",
    264         "id": "53359",
    265         "layer": "D1",
    266         "sheetId": "0",
    267         "sheetName": "Model",
    268         "type": "Model"
    269       },
    270       {
    271         "diffType": "CHANGE",
    272         "id": "53361",
    273         "layer": "D1",
    274         "sheetId": "0",
    275         "sheetName": "Model",
    276         "type": "Model"
    277       },
    278       {
    279         "diffType": "CHANGE",
    280         "id": "53362",
    281         "layer": "D1",
    282         "sheetId": "0",
    283         "sheetName": "Model",
    284         "type": "Model"
    285       },
    286       {
    287         "diffType": "CHANGE",
    288         "id": "53363",
    289         "layer": "D1",
    290         "sheetId": "0",
    291         "sheetName": "Model",
    292         "type": "Model"
    293       },
    294       {
    295         "diffType": "CHANGE",
    296         "id": "53364",
    297         "layer": "D1",
    298         "sheetId": "0",
    299         "sheetName": "Model",
    300         "type": "Model"
    301       },
    302       {
    303         "diffType": "CHANGE",
    304         "id": "53365",
    305         "layer": "D1",
    306         "sheetId": "0",
    307         "sheetName": "Model",
    308         "type": "Model"
    309       },
    310       {
    311         "diffType": "CHANGE",
    312         "id": "53366",
    313         "layer": "D1",
    314         "sheetId": "0",
    315         "sheetName": "Model",
    316         "type": "Model"
    317       },
    318       {
    319         "diffType": "CHANGE",
    320         "id": "53367",
    321         "layer": "D1",
    322         "sheetId": "0",
    323         "sheetName": "Model",
    324         "type": "Model"
    325       },
    326       {
    327         "diffType": "CHANGE",
    328         "id": "53368",
    329         "layer": "D1",
    330         "sheetId": "0",
    331         "sheetName": "Model",
    332         "type": "Model"
    333       },
    334       {
    335         "diffType": "CHANGE",
    336         "id": "53369",
    337         "layer": "D1",
    338         "sheetId": "0",
    339         "sheetName": "Model",
    340         "type": "Model"
    341       },
    342       {
    343         "diffType": "CHANGE",
    344         "id": "53370",
    345         "layer": "D1",
    346         "sheetId": "0",
    347         "sheetName": "Model",
    348         "type": "Model"
    349       },
    350       {
    351         "diffType": "CHANGE",
    352         "id": "53371",
    353         "layer": "D1",
    354         "sheetId": "0",
    355         "sheetName": "Model",
    356         "type": "Model"
    357       },
    358       {
    359         "diffType": "CHANGE",
    360         "id": "53372",
    361         "layer": "D1",
    362         "sheetId": "0",
    363         "sheetName": "Model",
    364         "type": "Model"
    365       },
    366       {
    367         "diffType": "CHANGE",
    368         "id": "53373",
    369         "layer": "D1",
    370         "sheetId": "0",
    371         "sheetName": "Model",
    372         "type": "Model"
    373       },
    374       {
    375         "diffType": "CHANGE",
    376         "id": "53374",
    377         "layer": "D1",
    378         "sheetId": "0",
    379         "sheetName": "Model",
    380         "type": "Model"
    381       },
    382       {
    383         "diffType": "CHANGE",
    384         "id": "53375",
    385         "layer": "D1",
    386         "sheetId": "0",
    387         "sheetName": "Model",
    388         "type": "Model"
    389       },
    390       {
    391         "diffType": "CHANGE",
    392         "id": "53376",
    393         "layer": "D1",
    394         "sheetId": "0",
    395         "sheetName": "Model",
    396         "type": "Model"
    397       },
    398       {
    399         "diffType": "CHANGE",
    400         "id": "53377",
    401         "layer": "D1",
    402         "sheetId": "0",
    403         "sheetName": "Model",
    404         "type": "Model"
    405       },
    406       {
    407         "diffType": "CHANGE",
    408         "id": "53378",
    409         "layer": "D1",
    410         "sheetId": "0",
    411         "sheetName": "Model",
    412         "type": "Model"
    413       },
    414       {
    415         "diffType": "CHANGE",
    416         "id": "53381",
    417         "layer": "D1",
    418         "sheetId": "0",
    419         "sheetName": "Model",
    420         "type": "Model"
    421       },
    422       {
    423         "diffType": "CHANGE",
    424         "id": "53383",
    425         "layer": "D1",
    426         "sheetId": "0",
    427         "sheetName": "Model",
    428         "type": "Model"
    429       },
    430       {
    431         "diffType": "CHANGE",
    432         "id": "53384",
    433         "layer": "D1",
    434         "sheetId": "0",
    435         "sheetName": "Model",
    436         "type": "Model"
    437       },
    438       {
    439         "diffType": "CHANGE",
    440         "id": "53385",
    441         "layer": "D1",
    442         "sheetId": "0",
    443         "sheetName": "Model",
    444         "type": "Model"
    445       },
    446       {
    447         "diffType": "CHANGE",
    448         "id": "53386",
    449         "layer": "D1",
    450         "sheetId": "0",
    451         "sheetName": "Model",
    452         "type": "Model"
    453       },
    454       {
    455         "diffType": "CHANGE",
    456         "id": "53387",
    457         "layer": "D1",
    458         "sheetId": "0",
    459         "sheetName": "Model",
    460         "type": "Model"
    461       },
    462       {
    463         "diffType": "CHANGE",
    464         "id": "53389",
    465         "layer": "D1",
    466         "sheetId": "0",
    467         "sheetName": "Model",
    468         "type": "Model"
    469       },
    470       {
    471         "diffType": "CHANGE",
    472         "id": "53390",
    473         "layer": "D1",
    474         "sheetId": "0",
    475         "sheetName": "Model",
    476         "type": "Model"
    477       },
    478       {
    479         "diffType": "CHANGE",
    480         "id": "53391",
    481         "layer": "D1",
    482         "sheetId": "0",
    483         "sheetName": "Model",
    484         "type": "Model"
    485       },
    486       {
    487         "diffType": "CHANGE",
    488         "id": "53392",
    489         "layer": "D1",
    490         "sheetId": "0",
    491         "sheetName": "Model",
    492         "type": "Model"
    493       },
    494       {
    495         "diffType": "CHANGE",
    496         "id": "53395",
    497         "layer": "D1",
    498         "sheetId": "0",
    499         "sheetName": "Model",
    500         "type": "Model"
    501       },
    502       {
    503         "diffType": "CHANGE",
    504         "id": "53396",
    505         "layer": "D1",
    506         "sheetId": "0",
    507         "sheetName": "Model",
    508         "type": "Model"
    509       },
    510       {
    511         "diffType": "CHANGE",
    512         "id": "53397",
    513         "layer": "D1",
    514         "sheetId": "0",
    515         "sheetName": "Model",
    516         "type": "Model"
    517       },
    518       {
    519         "diffType": "CHANGE",
    520         "id": "53400",
    521         "layer": "D1",
    522         "sheetId": "0",
    523         "sheetName": "Model",
    524         "type": "Model"
    525       },
    526       {
    527         "diffType": "CHANGE",
    528         "id": "53401",
    529         "layer": "D1",
    530         "sheetId": "0",
    531         "sheetName": "Model",
    532         "type": "Model"
    533       },
    534       {
    535         "diffType": "CHANGE",
    536         "id": "53403",
    537         "layer": "D1",
    538         "sheetId": "0",
    539         "sheetName": "Model",
    540         "type": "Model"
    541       },
    542       {
    543         "diffType": "CHANGE",
    544         "id": "53404",
    545         "layer": "D1",
    546         "sheetId": "0",
    547         "sheetName": "Model",
    548         "type": "Model"
    549       },
    550       {
    551         "diffType": "CHANGE",
    552         "id": "53405",
    553         "layer": "D1",
    554         "sheetId": "0",
    555         "sheetName": "Model",
    556         "type": "Model"
    557       },
    558       {
    559         "diffType": "CHANGE",
    560         "id": "53406",
    561         "layer": "D1",
    562         "sheetId": "0",
    563         "sheetName": "Model",
    564         "type": "Model"
    565       },
    566       {
    567         "diffType": "CHANGE",
    568         "id": "53407",
    569         "layer": "D1",
    570         "sheetId": "0",
    571         "sheetName": "Model",
    572         "type": "Model"
    573       },
    574       {
    575         "diffType": "CHANGE",
    576         "id": "53408",
    577         "layer": "D1",
    578         "sheetId": "0",
    579         "sheetName": "Model",
    580         "type": "Model"
    581       },
    582       {
    583         "diffType": "CHANGE",
    584         "id": "53409",
    585         "layer": "D1",
    586         "sheetId": "0",
    587         "sheetName": "Model",
    588         "type": "Model"
    589       },
    590       {
    591         "diffType": "CHANGE",
    592         "id": "53410",
    593         "layer": "D1",
    594         "sheetId": "0",
    595         "sheetName": "Model",
    596         "type": "Model"
    597       },
    598       {
    599         "diffType": "CHANGE",
    600         "id": "53411",
    601         "layer": "D1",
    602         "sheetId": "0",
    603         "sheetName": "Model",
    604         "type": "Model"
    605       }
    606     ],
    607     "page": 1,
    608     "total": 75
    609   }
    610 }
    View Code

    参数说明

    (1)diffType:图元变更类型。NEW 表示新增的图元、DELETE 表示删除的图元、CHANGE 表示修改的图元。

    (2)id:变更的图元的唯一编号。

    (3)layer:变更的图元所在的图层名称。

    (4)sheetId:未知

    (5)sheetName:未知

    (6)type:变更的图元所在的图纸展示类型(Model 与Layer )

    从上述Json结果中只能看出图元的变更类型与编号,并不知道其所属的图框,需要通过解析图纸对比的数据包信息才能计算出来。

    获取图纸对比数据包信息API
    测试程序如下:

     调用BIMFACE服务端接口如下:

     1     /// <summary>
     2     /// 【官方非正式接口】根据 CompareId 获取图纸对比的数据包信息
     3     /// </summary>
     4     /// <param name="compareId">对比记录的ID</param>
     5     /// <returns></returns>
     6     public DrawingCompareDatabagResponse GetDrawingCompareDatabage(string accessToken, long compareId)
     7     {
     8         IBasicApi api = new BasicApi();
     9 
    10         ViewTokenResponse viewTokenResponse = api.GetViewTokenByCompareId(accessToken, compareId);
    11         if (viewTokenResponse != null && viewTokenResponse.Code == "success" && viewTokenResponse.Data != null)
    12         {
    13             return GetDrawingCompareDatabageByCompareViewToken(viewTokenResponse.Data);
    14         }
    15 
    16         return null;
    17     }
    18     
    19     
    20     /// <summary>
    21     /// 【官方非正式接口】根据对比记录的 ViewToken 获取图纸对比的数据包信息
    22     /// </summary>
    23     /// <param name="compareViewToken">对比记录的ViewToken</param>
    24     /// <returns></returns>
    25     public DrawingCompareDatabagResponse GetDrawingCompareDatabageByCompareViewToken(string compareViewToken)
    26     {
    27         //GET https://api.bimface.com/inside/databag?viewToken=b80412dcba2a47b0860eeff8f2c578a9
    28 
    29         string url = string.Format(BIMFaceConstants.API_HOST + "/inside/databag?viewToken={0}", compareViewToken);
    30         try
    31         {
    32             DrawingCompareDatabagResponse response;
    33 
    34             HttpManager httpManager = new HttpManager();
    35             HttpResult httpResult = httpManager.Get(url);
    36             if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    37             {
    38                 response = httpResult.Text.DeserializeJsonToObject<DrawingCompareDatabagResponse>();
    39             }
    40             else
    41             {
    42                 response = new DrawingCompareDatabagResponse
    43                 {
    44                     Message = httpResult.RefText
    45                 };
    46             }
    47 
    48             return response;
    49         }
    50         catch (Exception ex)
    51         {
    52             throw new BIMFaceException("[获取图纸对比的数据包信息]发生异常!", ex);
    53         }
    54     }
    55     

    接口返回的完整信息如下:

     1 {
     2   "code": "success",
     3   "message": null,
     4   "data": {
     5     "databagId": "76d256b09416830a8079914ab7d40fdf",
     6     "isSupportComponentProperty": false,
     7     "isSupportDrawing": false,
     8     "isSupportFamilyTypeList": false,
     9     "isSupportMaterialProperty": false,
    10     "isSupportMiniMap": false,
    11     "isSupportModelTree": false,
    12     "isSupportRoomArea": false,
    13     "isSupportWalk": true,
    14     "jsSDKVersion": "3.6.159",
    15     "modelId": 2230429779838240,
    16     "modelType": "compareModel",
    17     "name": "202110121516-对比",
    18     "renderType": "drawingView",
    19     "renderVersion": "3.0",
    20     "subRenders": [
    21       {
    22         "isSupportComponentProperty": false,
    23         "isSupportFamilyTypeList": false,
    24         "isSupportMiniMap": false,
    25         "isSupportModelTree": false,
    26         "jsSDKVersion": "3.6.159",
    27         "renderType": "bimView",
    28         "renderVersion": "3.0"
    29       },
    30       {
    31         "isSupportComponentProperty": false,
    32         "isSupportFamilyTypeList": false,
    33         "isSupportMiniMap": false,
    34         "isSupportModelTree": false,
    35         "jsSDKVersion": "Drawing@1.6.95",
    36         "renderType": "drawingView",
    37         "renderVersion": "1.0"
    38       }
    39     ],
    40     "type": 3,
    41     "workerType": "drawing-compare"
    42   }
    43 }

    该接口主要获取 databagId,供下面的接口使用。

    获取图纸对比数据包差异结果API

    测试程序如下:

    调用BIMFACE服务端接口如下:

     1     /// <summary>
     2     ///  【官方非正式接口】根据图纸对比的数据包Id,获取图纸对比差异数据包结果
     3     /// </summary>
     4     /// <param name="databagId">图纸对比的数据包Id,</param>
     5     /// <returns></returns>
     6     public DrawingCompareDatabagDiffResult GetDrawingCompareDatabageDiffResult(string databagId)
     7     {
     8         //GET  https://m.bimface.com/{databagId}/result.json
     9 
    10         string url = string.Format("https://m.bimface.com/{0}/result.json", databagId);
    11         try
    12         {
    13             DrawingCompareDatabagDiffResult response = null;
    14 
    15             HttpManager httpManager = new HttpManager();
    16             HttpResult httpResult = httpManager.Get(url);
    17             if (httpResult.Status == HttpResult.STATUS_SUCCESS)
    18             {
    19                 response = httpResult.Text.DeserializeJsonToObject<DrawingCompareDatabagDiffResult>();
    20             }
    21 
    22             return response;
    23         }
    24         catch (Exception ex)
    25         {
    26             throw new BIMFaceException("[获取图纸对比的数据包信息]发生异常!", ex);
    27         }
    28     }

    接口返回的完整信息如下:

       1 {
       2   "ver": "4.0",
       3   "model": {
       4     "id": "0",
       5     "name": "Model",
       6     "additions": [
       7       {
       8         "layer": "D1",
       9         "id": "1946878",
      10         "frame": {
      11           "id": "6",
      12           "name": "基础接地平面",
      13           "number": "电施05"
      14         }
      15       },
      16       {
      17         "layer": "D1",
      18         "id": "1946877",
      19         "frame": {
      20           "id": "5",
      21           "name": "屋顶防雷平面",
      22           "number": "电施04"
      23         }
      24       }
      25     ],
      26     "deletions": [
      27       {
      28         "layer": "D1",
      29         "id": "122566",
      30         "frame": {
      31           "id": "3",
      32           "name": "一层电气平面(一)",
      33           "number": "电施02"
      34         }
      35       }
      36     ],
      37     "modifications": [
      38       {
      39         "previousLayer": "0",
      40         "currentLayer": "0",
      41         "id": "96103",
      42         "previousFrame": {
      43           "id": "2",
      44           "name": "电气抗震设计专篇",
      45           "number": "电施01"
      46         },
      47         "currentFrame": {
      48           "id": "2",
      49           "name": "电气抗震设计专篇",
      50           "number": "电施01"
      51         }
      52       },
      53       {
      54         "previousLayer": "D1",
      55         "currentLayer": "D1",
      56         "id": "53383",
      57         "previousFrame": {
      58           "id": "3",
      59           "name": "一层电气平面(一)",
      60           "number": "电施02"
      61         },
      62         "currentFrame": {
      63           "id": "3",
      64           "name": "一层电气平面(一)",
      65           "number": "电施02"
      66         }
      67       },
      68       {
      69         "previousLayer": "D1",
      70         "currentLayer": "D1",
      71         "id": "53351",
      72         "previousFrame": {
      73           "id": "3",
      74           "name": "一层电气平面(一)",
      75           "number": "电施02"
      76         },
      77         "currentFrame": {
      78           "id": "3",
      79           "name": "一层电气平面(一)",
      80           "number": "电施02"
      81         }
      82       },
      83       {
      84         "previousLayer": "0",
      85         "currentLayer": "0",
      86         "id": "96099",
      87         "previousFrame": {
      88           "id": "2",
      89           "name": "电气抗震设计专篇",
      90           "number": "电施01"
      91         },
      92         "currentFrame": {
      93           "id": "2",
      94           "name": "电气抗震设计专篇",
      95           "number": "电施01"
      96         }
      97       },
      98       {
      99         "previousLayer": "0",
     100         "currentLayer": "0",
     101         "id": "104785",
     102         "previousFrame": {
     103           "id": "2",
     104           "name": "电气抗震设计专篇",
     105           "number": "电施01"
     106         },
     107         "currentFrame": {
     108           "id": "2",
     109           "name": "电气抗震设计专篇",
     110           "number": "电施01"
     111         }
     112       },
     113       {
     114         "previousLayer": "D1",
     115         "currentLayer": "D1",
     116         "id": "53403",
     117         "previousFrame": {
     118           "id": "3",
     119           "name": "一层电气平面(一)",
     120           "number": "电施02"
     121         },
     122         "currentFrame": {
     123           "id": "3",
     124           "name": "一层电气平面(一)",
     125           "number": "电施02"
     126         }
     127       },
     128       {
     129         "previousLayer": "D1",
     130         "currentLayer": "D1",
     131         "id": "53395",
     132         "previousFrame": {
     133           "id": "3",
     134           "name": "一层电气平面(一)",
     135           "number": "电施02"
     136         },
     137         "currentFrame": {
     138           "id": "3",
     139           "name": "一层电气平面(一)",
     140           "number": "电施02"
     141         }
     142       },
     143       {
     144         "previousLayer": "AXIS",
     145         "currentLayer": "AXIS",
     146         "id": "22315",
     147         "previousFrame": {
     148           "id": "5",
     149           "name": "屋顶防雷平面",
     150           "number": "电施04"
     151         },
     152         "currentFrame": {
     153           "id": "5",
     154           "name": "屋顶防雷平面",
     155           "number": "电施04"
     156         }
     157       },
     158       {
     159         "previousLayer": "0",
     160         "currentLayer": "0",
     161         "id": "104786",
     162         "previousFrame": {
     163           "id": "2",
     164           "name": "电气抗震设计专篇",
     165           "number": "电施01"
     166         },
     167         "currentFrame": {
     168           "id": "2",
     169           "name": "电气抗震设计专篇",
     170           "number": "电施01"
     171         }
     172       },
     173       {
     174         "previousLayer": "D1",
     175         "currentLayer": "D1",
     176         "id": "53384",
     177         "previousFrame": {
     178           "id": "3",
     179           "name": "一层电气平面(一)",
     180           "number": "电施02"
     181         },
     182         "currentFrame": {
     183           "id": "3",
     184           "name": "一层电气平面(一)",
     185           "number": "电施02"
     186         }
     187       },
     188       {
     189         "previousLayer": "D1",
     190         "currentLayer": "D1",
     191         "id": "53352",
     192         "previousFrame": {
     193           "id": "3",
     194           "name": "一层电气平面(一)",
     195           "number": "电施02"
     196         },
     197         "currentFrame": {
     198           "id": "3",
     199           "name": "一层电气平面(一)",
     200           "number": "电施02"
     201         }
     202       },
     203       {
     204         "previousLayer": "D1",
     205         "currentLayer": "D1",
     206         "id": "53400",
     207         "previousFrame": {
     208           "id": "3",
     209           "name": "一层电气平面(一)",
     210           "number": "电施02"
     211         },
     212         "currentFrame": {
     213           "id": "3",
     214           "name": "一层电气平面(一)",
     215           "number": "电施02"
     216         }
     217       },
     218       {
     219         "previousLayer": "D1",
     220         "currentLayer": "D1",
     221         "id": "53368",
     222         "previousFrame": {
     223           "id": "3",
     224           "name": "一层电气平面(一)",
     225           "number": "电施02"
     226         },
     227         "currentFrame": {
     228           "id": "3",
     229           "name": "一层电气平面(一)",
     230           "number": "电施02"
     231         }
     232       },
     233       {
     234         "previousLayer": "AXIS",
     235         "currentLayer": "AXIS",
     236         "id": "22307",
     237         "previousFrame": {
     238           "id": "5",
     239           "name": "屋顶防雷平面",
     240           "number": "电施04"
     241         },
     242         "currentFrame": {
     243           "id": "5",
     244           "name": "屋顶防雷平面",
     245           "number": "电施04"
     246         }
     247       },
     248       {
     249         "previousLayer": "D1",
     250         "currentLayer": "D1",
     251         "id": "53371",
     252         "previousFrame": {
     253           "id": "3",
     254           "name": "一层电气平面(一)",
     255           "number": "电施02"
     256         },
     257         "currentFrame": {
     258           "id": "3",
     259           "name": "一层电气平面(一)",
     260           "number": "电施02"
     261         }
     262       },
     263       {
     264         "previousLayer": "AXIS",
     265         "currentLayer": "AXIS",
     266         "id": "22314",
     267         "previousFrame": {
     268           "id": "5",
     269           "name": "屋顶防雷平面",
     270           "number": "电施04"
     271         },
     272         "currentFrame": {
     273           "id": "5",
     274           "name": "屋顶防雷平面",
     275           "number": "电施04"
     276         }
     277       },
     278       {
     279         "previousLayer": "0",
     280         "currentLayer": "0",
     281         "id": "96098",
     282         "previousFrame": {
     283           "id": "2",
     284           "name": "电气抗震设计专篇",
     285           "number": "电施01"
     286         },
     287         "currentFrame": {
     288           "id": "2",
     289           "name": "电气抗震设计专篇",
     290           "number": "电施01"
     291         }
     292       },
     293       {
     294         "previousLayer": "D1",
     295         "currentLayer": "D1",
     296         "id": "53386",
     297         "previousFrame": {
     298           "id": "3",
     299           "name": "一层电气平面(一)",
     300           "number": "电施02"
     301         },
     302         "currentFrame": {
     303           "id": "3",
     304           "name": "一层电气平面(一)",
     305           "number": "电施02"
     306         }
     307       },
     308       {
     309         "previousLayer": "0",
     310         "currentLayer": "0",
     311         "id": "96097",
     312         "previousFrame": {
     313           "id": "2",
     314           "name": "电气抗震设计专篇",
     315           "number": "电施01"
     316         },
     317         "currentFrame": {
     318           "id": "2",
     319           "name": "电气抗震设计专篇",
     320           "number": "电施01"
     321         }
     322       },
     323       {
     324         "previousLayer": "D1",
     325         "currentLayer": "D1",
     326         "id": "53397",
     327         "previousFrame": {
     328           "id": "3",
     329           "name": "一层电气平面(一)",
     330           "number": "电施02"
     331         },
     332         "currentFrame": {
     333           "id": "3",
     334           "name": "一层电气平面(一)",
     335           "number": "电施02"
     336         }
     337       },
     338       {
     339         "previousLayer": "0",
     340         "currentLayer": "0",
     341         "id": "104783",
     342         "previousFrame": {
     343           "id": "2",
     344           "name": "电气抗震设计专篇",
     345           "number": "电施01"
     346         },
     347         "currentFrame": {
     348           "id": "2",
     349           "name": "电气抗震设计专篇",
     350           "number": "电施01"
     351         }
     352       },
     353       {
     354         "previousLayer": "D1",
     355         "currentLayer": "D1",
     356         "id": "53405",
     357         "previousFrame": {
     358           "id": "3",
     359           "name": "一层电气平面(一)",
     360           "number": "电施02"
     361         },
     362         "currentFrame": {
     363           "id": "3",
     364           "name": "一层电气平面(一)",
     365           "number": "电施02"
     366         }
     367       },
     368       {
     369         "previousLayer": "0",
     370         "currentLayer": "0",
     371         "id": "104779",
     372         "previousFrame": {
     373           "id": "2",
     374           "name": "电气抗震设计专篇",
     375           "number": "电施01"
     376         },
     377         "currentFrame": {
     378           "id": "2",
     379           "name": "电气抗震设计专篇",
     380           "number": "电施01"
     381         }
     382       },
     383       {
     384         "previousLayer": "0",
     385         "currentLayer": "0",
     386         "id": "96095",
     387         "previousFrame": {
     388           "id": "2",
     389           "name": "电气抗震设计专篇",
     390           "number": "电施01"
     391         },
     392         "currentFrame": {
     393           "id": "2",
     394           "name": "电气抗震设计专篇",
     395           "number": "电施01"
     396         }
     397       },
     398       {
     399         "previousLayer": "D1",
     400         "currentLayer": "D1",
     401         "id": "53375",
     402         "previousFrame": {
     403           "id": "3",
     404           "name": "一层电气平面(一)",
     405           "number": "电施02"
     406         },
     407         "currentFrame": {
     408           "id": "3",
     409           "name": "一层电气平面(一)",
     410           "number": "电施02"
     411         }
     412       },
     413       {
     414         "previousLayer": "D1",
     415         "currentLayer": "D1",
     416         "id": "53355",
     417         "previousFrame": {
     418           "id": "3",
     419           "name": "一层电气平面(一)",
     420           "number": "电施02"
     421         },
     422         "currentFrame": {
     423           "id": "3",
     424           "name": "一层电气平面(一)",
     425           "number": "电施02"
     426         }
     427       },
     428       {
     429         "previousLayer": "0",
     430         "currentLayer": "0",
     431         "id": "96104",
     432         "previousFrame": {
     433           "id": "2",
     434           "name": "电气抗震设计专篇",
     435           "number": "电施01"
     436         },
     437         "currentFrame": {
     438           "id": "2",
     439           "name": "电气抗震设计专篇",
     440           "number": "电施01"
     441         }
     442       },
     443       {
     444         "previousLayer": "D1",
     445         "currentLayer": "D1",
     446         "id": "53356",
     447         "previousFrame": {
     448           "id": "3",
     449           "name": "一层电气平面(一)",
     450           "number": "电施02"
     451         },
     452         "currentFrame": {
     453           "id": "3",
     454           "name": "一层电气平面(一)",
     455           "number": "电施02"
     456         }
     457       },
     458       {
     459         "previousLayer": "D1",
     460         "currentLayer": "D1",
     461         "id": "53357",
     462         "previousFrame": {
     463           "id": "3",
     464           "name": "一层电气平面(一)",
     465           "number": "电施02"
     466         },
     467         "currentFrame": {
     468           "id": "3",
     469           "name": "一层电气平面(一)",
     470           "number": "电施02"
     471         }
     472       },
     473       {
     474         "previousLayer": "D1",
     475         "currentLayer": "D1",
     476         "id": "53358",
     477         "previousFrame": {
     478           "id": "3",
     479           "name": "一层电气平面(一)",
     480           "number": "电施02"
     481         },
     482         "currentFrame": {
     483           "id": "3",
     484           "name": "一层电气平面(一)",
     485           "number": "电施02"
     486         }
     487       },
     488       {
     489         "previousLayer": "D1",
     490         "currentLayer": "D1",
     491         "id": "53359",
     492         "previousFrame": {
     493           "id": "3",
     494           "name": "一层电气平面(一)",
     495           "number": "电施02"
     496         },
     497         "currentFrame": {
     498           "id": "3",
     499           "name": "一层电气平面(一)",
     500           "number": "电施02"
     501         }
     502       },
     503       {
     504         "previousLayer": "D1",
     505         "currentLayer": "D1",
     506         "id": "53361",
     507         "previousFrame": {
     508           "id": "3",
     509           "name": "一层电气平面(一)",
     510           "number": "电施02"
     511         },
     512         "currentFrame": {
     513           "id": "3",
     514           "name": "一层电气平面(一)",
     515           "number": "电施02"
     516         }
     517       },
     518       {
     519         "previousLayer": "D1",
     520         "currentLayer": "D1",
     521         "id": "53362",
     522         "previousFrame": {
     523           "id": "3",
     524           "name": "一层电气平面(一)",
     525           "number": "电施02"
     526         },
     527         "currentFrame": {
     528           "id": "3",
     529           "name": "一层电气平面(一)",
     530           "number": "电施02"
     531         }
     532       },
     533       {
     534         "previousLayer": "D1",
     535         "currentLayer": "D1",
     536         "id": "53363",
     537         "previousFrame": {
     538           "id": "3",
     539           "name": "一层电气平面(一)",
     540           "number": "电施02"
     541         },
     542         "currentFrame": {
     543           "id": "3",
     544           "name": "一层电气平面(一)",
     545           "number": "电施02"
     546         }
     547       },
     548       {
     549         "previousLayer": "D1",
     550         "currentLayer": "D1",
     551         "id": "53364",
     552         "previousFrame": {
     553           "id": "3",
     554           "name": "一层电气平面(一)",
     555           "number": "电施02"
     556         },
     557         "currentFrame": {
     558           "id": "3",
     559           "name": "一层电气平面(一)",
     560           "number": "电施02"
     561         }
     562       },
     563       {
     564         "previousLayer": "D1",
     565         "currentLayer": "D1",
     566         "id": "53365",
     567         "previousFrame": {
     568           "id": "3",
     569           "name": "一层电气平面(一)",
     570           "number": "电施02"
     571         },
     572         "currentFrame": {
     573           "id": "3",
     574           "name": "一层电气平面(一)",
     575           "number": "电施02"
     576         }
     577       },
     578       {
     579         "previousLayer": "D1",
     580         "currentLayer": "D1",
     581         "id": "53366",
     582         "previousFrame": {
     583           "id": "3",
     584           "name": "一层电气平面(一)",
     585           "number": "电施02"
     586         },
     587         "currentFrame": {
     588           "id": "3",
     589           "name": "一层电气平面(一)",
     590           "number": "电施02"
     591         }
     592       },
     593       {
     594         "previousLayer": "D1",
     595         "currentLayer": "D1",
     596         "id": "53367",
     597         "previousFrame": {
     598           "id": "3",
     599           "name": "一层电气平面(一)",
     600           "number": "电施02"
     601         },
     602         "currentFrame": {
     603           "id": "3",
     604           "name": "一层电气平面(一)",
     605           "number": "电施02"
     606         }
     607       },
     608       {
     609         "previousLayer": "D1",
     610         "currentLayer": "D1",
     611         "id": "53369",
     612         "previousFrame": {
     613           "id": "3",
     614           "name": "一层电气平面(一)",
     615           "number": "电施02"
     616         },
     617         "currentFrame": {
     618           "id": "3",
     619           "name": "一层电气平面(一)",
     620           "number": "电施02"
     621         }
     622       },
     623       {
     624         "previousLayer": "D1",
     625         "currentLayer": "D1",
     626         "id": "53370",
     627         "previousFrame": {
     628           "id": "3",
     629           "name": "一层电气平面(一)",
     630           "number": "电施02"
     631         },
     632         "currentFrame": {
     633           "id": "3",
     634           "name": "一层电气平面(一)",
     635           "number": "电施02"
     636         }
     637       },
     638       {
     639         "previousLayer": "D1",
     640         "currentLayer": "D1",
     641         "id": "53372",
     642         "previousFrame": {
     643           "id": "3",
     644           "name": "一层电气平面(一)",
     645           "number": "电施02"
     646         },
     647         "currentFrame": {
     648           "id": "3",
     649           "name": "一层电气平面(一)",
     650           "number": "电施02"
     651         }
     652       },
     653       {
     654         "previousLayer": "D1",
     655         "currentLayer": "D1",
     656         "id": "53373",
     657         "previousFrame": {
     658           "id": "3",
     659           "name": "一层电气平面(一)",
     660           "number": "电施02"
     661         },
     662         "currentFrame": {
     663           "id": "3",
     664           "name": "一层电气平面(一)",
     665           "number": "电施02"
     666         }
     667       },
     668       {
     669         "previousLayer": "D1",
     670         "currentLayer": "D1",
     671         "id": "53374",
     672         "previousFrame": {
     673           "id": "3",
     674           "name": "一层电气平面(一)",
     675           "number": "电施02"
     676         },
     677         "currentFrame": {
     678           "id": "3",
     679           "name": "一层电气平面(一)",
     680           "number": "电施02"
     681         }
     682       },
     683       {
     684         "previousLayer": "D1",
     685         "currentLayer": "D1",
     686         "id": "53376",
     687         "previousFrame": {
     688           "id": "3",
     689           "name": "一层电气平面(一)",
     690           "number": "电施02"
     691         },
     692         "currentFrame": {
     693           "id": "3",
     694           "name": "一层电气平面(一)",
     695           "number": "电施02"
     696         }
     697       },
     698       {
     699         "previousLayer": "0",
     700         "currentLayer": "0",
     701         "id": "96101",
     702         "previousFrame": {
     703           "id": "2",
     704           "name": "电气抗震设计专篇",
     705           "number": "电施01"
     706         },
     707         "currentFrame": {
     708           "id": "2",
     709           "name": "电气抗震设计专篇",
     710           "number": "电施01"
     711         }
     712       },
     713       {
     714         "previousLayer": "D1",
     715         "currentLayer": "D1",
     716         "id": "53377",
     717         "previousFrame": {
     718           "id": "3",
     719           "name": "一层电气平面(一)",
     720           "number": "电施02"
     721         },
     722         "currentFrame": {
     723           "id": "3",
     724           "name": "一层电气平面(一)",
     725           "number": "电施02"
     726         }
     727       },
     728       {
     729         "previousLayer": "D1",
     730         "currentLayer": "D1",
     731         "id": "53378",
     732         "previousFrame": {
     733           "id": "3",
     734           "name": "一层电气平面(一)",
     735           "number": "电施02"
     736         },
     737         "currentFrame": {
     738           "id": "3",
     739           "name": "一层电气平面(一)",
     740           "number": "电施02"
     741         }
     742       },
     743       {
     744         "previousLayer": "D1",
     745         "currentLayer": "D1",
     746         "id": "53381",
     747         "previousFrame": {
     748           "id": "3",
     749           "name": "一层电气平面(一)",
     750           "number": "电施02"
     751         },
     752         "currentFrame": {
     753           "id": "3",
     754           "name": "一层电气平面(一)",
     755           "number": "电施02"
     756         }
     757       },
     758       {
     759         "previousLayer": "D1",
     760         "currentLayer": "D1",
     761         "id": "53385",
     762         "previousFrame": {
     763           "id": "3",
     764           "name": "一层电气平面(一)",
     765           "number": "电施02"
     766         },
     767         "currentFrame": {
     768           "id": "3",
     769           "name": "一层电气平面(一)",
     770           "number": "电施02"
     771         }
     772       },
     773       {
     774         "previousLayer": "D1",
     775         "currentLayer": "D1",
     776         "id": "53387",
     777         "previousFrame": {
     778           "id": "3",
     779           "name": "一层电气平面(一)",
     780           "number": "电施02"
     781         },
     782         "currentFrame": {
     783           "id": "3",
     784           "name": "一层电气平面(一)",
     785           "number": "电施02"
     786         }
     787       },
     788       {
     789         "previousLayer": "D1",
     790         "currentLayer": "D1",
     791         "id": "53389",
     792         "previousFrame": {
     793           "id": "3",
     794           "name": "一层电气平面(一)",
     795           "number": "电施02"
     796         },
     797         "currentFrame": {
     798           "id": "3",
     799           "name": "一层电气平面(一)",
     800           "number": "电施02"
     801         }
     802       },
     803       {
     804         "previousLayer": "D1",
     805         "currentLayer": "D1",
     806         "id": "53390",
     807         "previousFrame": {
     808           "id": "3",
     809           "name": "一层电气平面(一)",
     810           "number": "电施02"
     811         },
     812         "currentFrame": {
     813           "id": "3",
     814           "name": "一层电气平面(一)",
     815           "number": "电施02"
     816         }
     817       },
     818       {
     819         "previousLayer": "D1",
     820         "currentLayer": "D1",
     821         "id": "53392",
     822         "previousFrame": {
     823           "id": "3",
     824           "name": "一层电气平面(一)",
     825           "number": "电施02"
     826         },
     827         "currentFrame": {
     828           "id": "3",
     829           "name": "一层电气平面(一)",
     830           "number": "电施02"
     831         }
     832       },
     833       {
     834         "previousLayer": "D1",
     835         "currentLayer": "D1",
     836         "id": "53391",
     837         "previousFrame": {
     838           "id": "3",
     839           "name": "一层电气平面(一)",
     840           "number": "电施02"
     841         },
     842         "currentFrame": {
     843           "id": "3",
     844           "name": "一层电气平面(一)",
     845           "number": "电施02"
     846         }
     847       },
     848       {
     849         "previousLayer": "D1",
     850         "currentLayer": "D1",
     851         "id": "53396",
     852         "previousFrame": {
     853           "id": "3",
     854           "name": "一层电气平面(一)",
     855           "number": "电施02"
     856         },
     857         "currentFrame": {
     858           "id": "3",
     859           "name": "一层电气平面(一)",
     860           "number": "电施02"
     861         }
     862       },
     863       {
     864         "previousLayer": "D1",
     865         "currentLayer": "D1",
     866         "id": "53401",
     867         "previousFrame": {
     868           "id": "3",
     869           "name": "一层电气平面(一)",
     870           "number": "电施02"
     871         },
     872         "currentFrame": {
     873           "id": "3",
     874           "name": "一层电气平面(一)",
     875           "number": "电施02"
     876         }
     877       },
     878       {
     879         "previousLayer": "D1",
     880         "currentLayer": "D1",
     881         "id": "53404",
     882         "previousFrame": {
     883           "id": "3",
     884           "name": "一层电气平面(一)",
     885           "number": "电施02"
     886         },
     887         "currentFrame": {
     888           "id": "3",
     889           "name": "一层电气平面(一)",
     890           "number": "电施02"
     891         }
     892       },
     893       {
     894         "previousLayer": "D1",
     895         "currentLayer": "D1",
     896         "id": "53406",
     897         "previousFrame": {
     898           "id": "3",
     899           "name": "一层电气平面(一)",
     900           "number": "电施02"
     901         },
     902         "currentFrame": {
     903           "id": "3",
     904           "name": "一层电气平面(一)",
     905           "number": "电施02"
     906         }
     907       },
     908       {
     909         "previousLayer": "D1",
     910         "currentLayer": "D1",
     911         "id": "53407",
     912         "previousFrame": {
     913           "id": "3",
     914           "name": "一层电气平面(一)",
     915           "number": "电施02"
     916         },
     917         "currentFrame": {
     918           "id": "3",
     919           "name": "一层电气平面(一)",
     920           "number": "电施02"
     921         }
     922       },
     923       {
     924         "previousLayer": "D1",
     925         "currentLayer": "D1",
     926         "id": "53408",
     927         "previousFrame": {
     928           "id": "3",
     929           "name": "一层电气平面(一)",
     930           "number": "电施02"
     931         },
     932         "currentFrame": {
     933           "id": "3",
     934           "name": "一层电气平面(一)",
     935           "number": "电施02"
     936         }
     937       },
     938       {
     939         "previousLayer": "D1",
     940         "currentLayer": "D1",
     941         "id": "53409",
     942         "previousFrame": {
     943           "id": "3",
     944           "name": "一层电气平面(一)",
     945           "number": "电施02"
     946         },
     947         "currentFrame": {
     948           "id": "3",
     949           "name": "一层电气平面(一)",
     950           "number": "电施02"
     951         }
     952       },
     953       {
     954         "previousLayer": "D1",
     955         "currentLayer": "D1",
     956         "id": "53410",
     957         "previousFrame": {
     958           "id": "3",
     959           "name": "一层电气平面(一)",
     960           "number": "电施02"
     961         },
     962         "currentFrame": {
     963           "id": "3",
     964           "name": "一层电气平面(一)",
     965           "number": "电施02"
     966         }
     967       },
     968       {
     969         "previousLayer": "D1",
     970         "currentLayer": "D1",
     971         "id": "53411",
     972         "previousFrame": {
     973           "id": "3",
     974           "name": "一层电气平面(一)",
     975           "number": "电施02"
     976         },
     977         "currentFrame": {
     978           "id": "3",
     979           "name": "一层电气平面(一)",
     980           "number": "电施02"
     981         }
     982       },
     983       {
     984         "previousLayer": "0",
     985         "currentLayer": "0",
     986         "id": "104782",
     987         "previousFrame": {
     988           "id": "2",
     989           "name": "电气抗震设计专篇",
     990           "number": "电施01"
     991         },
     992         "currentFrame": {
     993           "id": "2",
     994           "name": "电气抗震设计专篇",
     995           "number": "电施01"
     996         }
     997       },
     998       {
     999         "previousLayer": "0",
    1000         "currentLayer": "0",
    1001         "id": "96096",
    1002         "previousFrame": {
    1003           "id": "2",
    1004           "name": "电气抗震设计专篇",
    1005           "number": "电施01"
    1006         },
    1007         "currentFrame": {
    1008           "id": "2",
    1009           "name": "电气抗震设计专篇",
    1010           "number": "电施01"
    1011         }
    1012       },
    1013       {
    1014         "previousLayer": "0",
    1015         "currentLayer": "0",
    1016         "id": "104778",
    1017         "previousFrame": {
    1018           "id": "2",
    1019           "name": "电气抗震设计专篇",
    1020           "number": "电施01"
    1021         },
    1022         "currentFrame": {
    1023           "id": "2",
    1024           "name": "电气抗震设计专篇",
    1025           "number": "电施01"
    1026         }
    1027       },
    1028       {
    1029         "previousLayer": "0",
    1030         "currentLayer": "0",
    1031         "id": "96100",
    1032         "previousFrame": {
    1033           "id": "2",
    1034           "name": "电气抗震设计专篇",
    1035           "number": "电施01"
    1036         },
    1037         "currentFrame": {
    1038           "id": "2",
    1039           "name": "电气抗震设计专篇",
    1040           "number": "电施01"
    1041         }
    1042       },
    1043       {
    1044         "previousLayer": "0",
    1045         "currentLayer": "0",
    1046         "id": "96102",
    1047         "previousFrame": {
    1048           "id": "2",
    1049           "name": "电气抗震设计专篇",
    1050           "number": "电施01"
    1051         },
    1052         "currentFrame": {
    1053           "id": "2",
    1054           "name": "电气抗震设计专篇",
    1055           "number": "电施01"
    1056         }
    1057       },
    1058       {
    1059         "previousLayer": "0",
    1060         "currentLayer": "0",
    1061         "id": "104780",
    1062         "previousFrame": {
    1063           "id": "2",
    1064           "name": "电气抗震设计专篇",
    1065           "number": "电施01"
    1066         },
    1067         "currentFrame": {
    1068           "id": "2",
    1069           "name": "电气抗震设计专篇",
    1070           "number": "电施01"
    1071         }
    1072       },
    1073       {
    1074         "previousLayer": "0",
    1075         "currentLayer": "0",
    1076         "id": "104781",
    1077         "previousFrame": {
    1078           "id": "2",
    1079           "name": "电气抗震设计专篇",
    1080           "number": "电施01"
    1081         },
    1082         "currentFrame": {
    1083           "id": "2",
    1084           "name": "电气抗震设计专篇",
    1085           "number": "电施01"
    1086         }
    1087       },
    1088       {
    1089         "previousLayer": "0",
    1090         "currentLayer": "0",
    1091         "id": "104784",
    1092         "previousFrame": {
    1093           "id": "2",
    1094           "name": "电气抗震设计专篇",
    1095           "number": "电施01"
    1096         },
    1097         "currentFrame": {
    1098           "id": "2",
    1099           "name": "电气抗震设计专篇",
    1100           "number": "电施01"
    1101         }
    1102       },
    1103       {
    1104         "previousLayer": "0",
    1105         "currentLayer": "0",
    1106         "id": "104787",
    1107         "previousFrame": {
    1108           "id": "2",
    1109           "name": "电气抗震设计专篇",
    1110           "number": "电施01"
    1111         },
    1112         "currentFrame": {
    1113           "id": "2",
    1114           "name": "电气抗震设计专篇",
    1115           "number": "电施01"
    1116         }
    1117       }
    1118     ]
    1119   }
    1120 }
    View Code

    参数说明

    特别说明:上图中 model 对象中的差异项中包含了 frame、previousFrame、currentFrame 对象,是因为对比之前两张图纸已经拆分成功。

    如果未拆分或者拆分失败,则上述结果中 additions 与 deletions 对象中仅包含 layer 与 id 属性;modifications 对象中仅包含 previousLayer、currentLayer 与 id 属性。

    计算差异来自哪个图框

    通过 GetDrawingCompareDiff() 接口获取的结果中包含的差异类型 diffType 、id 与 GetDrawingCompareDatabageDiffResult()接口获取的结果中的 additions、deletions、modifications 对象以及对象属性ID 对比,即可知道变更项来自哪个图框。关联关系如下图:

    参考下面的计算逻辑

      1     /// <summary>
      2     /// 计算对比结果中差异项来自的图框信息
      3     /// </summary>
      4     /// <param name="node_Child">图纸节点</param>
      5     /// <param name="compareId">对比ID</param>
      6     /// <param name="diffResult">对比差异结果</param>
      7     private void CalcaDiffTK(Node node_Child, long compareId, string diffResult)
      8     {
      9         DrawingCompareDiffResponse diffResponse =
     10                                        BIMFace.SDK.CSharp.Common.Extensions.CommonExtension.DeserializeJsonToObject<DrawingCompareDiffResponse>(diffResult);//arrCompare[0]["DiffResult"].ToString2()
     11         if (diffResponse != null)
     12         {
     13             if (diffResponse.Code == "success" && diffResponse.Data != null)
     14             {
     15                 List<BIMCompareDiffDetail> diffNews = new List<BIMCompareDiffDetail>();
     16                 List<BIMCompareDiffDetail> diffChanges = new List<BIMCompareDiffDetail>();
     17                 List<BIMCompareDiffDetail> diffDeletes = new List<BIMCompareDiffDetail>();
     18                 DrawingCompareDiff[] diffData = diffResponse.Data.Data;
     19                 if (diffData != null && diffData.Length > 0)
     20                 {
     21                     // diffData 中有重复的数据(包含模型、布局),需要 DistinctBy() 去重
     22                     diffNews =
     23                         diffData.Where(x => x.DiffType == ModelCompareDiffType.NEW.ToString())
     24                                 .Select(x => new BIMCompareDiffDetail
     25                                 {
     26                                     categoryName = "",
     27                                     elementId = x.Id,
     28                                     elementName = ""
     29                                 }).DistinctBy(x => x.elementId).ToList();
     30 
     31                     diffChanges =
     32                         diffData.Where(x => x.DiffType == ModelCompareDiffType.CHANGE.ToString())
     33                                 .Select(x => new BIMCompareDiffDetail
     34                                 {
     35                                     categoryName = "",
     36                                     elementId = x.Id,
     37                                     elementName = ""
     38                                 }).DistinctBy(x => x.elementId).ToList();
     39 
     40                     diffDeletes =
     41                         diffData.Where(x => x.DiffType == ModelCompareDiffType.DELETE.ToString())
     42                                 .Select(x => new BIMCompareDiffDetail
     43                                 {
     44                                     categoryName = "",
     45                                     elementId = x.Id,
     46                                     elementName = ""
     47                                 }).DistinctBy(x => x.elementId).ToList();
     48 
     49                     SimpleResult<string> compareDatabagDiffResult = new WebServiceDAL().GetDrawingCompareDatabagDiffResult(compareId);//  arrCompare[0]["CompareId"].ToInt64()
     50                     if (compareDatabagDiffResult.ResultCode)
     51                     {
     52                         if (string.IsNullOrWhiteSpace(compareDatabagDiffResult.ResultObject) == false)
     53                         {
     54                             DrawingCompareDatabagDiffResult objCompareDatabagDiffResult =
     55                                 BIMFace.SDK.CSharp.Common.Extensions.CommonExtension.DeserializeJsonToObject<DrawingCompareDatabagDiffResult>(compareDatabagDiffResult.ResultObject);
     56                             if (objCompareDatabagDiffResult.Model != null)
     57                             {
     58                                 if (objCompareDatabagDiffResult.Model.Additions != null &&
     59                                     objCompareDatabagDiffResult.Model.Additions.Count > 0)
     60                                 {
     61                                     foreach (var item in diffNews)
     62                                     {
     63                                         var addition = objCompareDatabagDiffResult.Model.Additions.Where(x => x.Id == item.elementId).FirstOrDefault();
     64                                         if (addition != null)
     65                                         {
     66                                             string diffItemFromTK = "【新增构建】" + addition.Frame ?? string.Empty;//图框名称
     67                                             
     68                                             // 其他业务逻辑
     69                                         }
     70                                     }
     71                                 }
     72 
     73                                 if (objCompareDatabagDiffResult.Model.Modifications != null &&
     74                                    objCompareDatabagDiffResult.Model.Modifications.Count > 0)
     75                                 {
     76                                     foreach (var item in diffChanges)
     77                                     {
     78                                         var modifications = objCompareDatabagDiffResult.Model.Modifications.Where(x => x.Id == item.elementId).FirstOrDefault();
     79                                         if (modifications != null)
     80                                         {
     81                                             string diffItemFromTK = "【修改构建】" + addition.Frame ?? string.Empty;//图框名称
     82                                             
     83                                             // 其他业务逻辑
     84                                         }
     85                                     }
     86                                 }
     87 
     88 
     89                                 if (objCompareDatabagDiffResult.Model.Deletions != null &&
     90                                     objCompareDatabagDiffResult.Model.Deletions.Count > 0)
     91                                 {
     92                                     foreach (var item in diffDeletes)
     93                                     {
     94                                         var deletions = objCompareDatabagDiffResult.Model.Deletions.Where(x => x.Id == item.elementId).FirstOrDefault();
     95                                         if (deletions != null)
     96                                         {
     97                                             string diffItemFromTK = "【删除构建】" + addition.Frame ?? string.Empty;//图框名称
     98                                             
     99                                             // 其他业务逻辑
    100                                         }
    101                                     }
    102                                 }
    103                             }
    104                         }
    105                     }
    106                 }
    107             }
    108         }
    109     }
     1     public class BIMCompareDiffDetail
     2     {
     3         /// <summary>
     4         ///  对比差异构件所属类别名称。样例 : "framework"
     5         /// </summary>
     6         public string categoryName { get; set; }
     7 
     8         /// <summary>
     9         ///   对比差异构件ID。样例 : "296524"
    10         /// </summary>
    11         public string elementId { get; set; }
    12 
    13         /// <summary>
    14         ///  对比差异构件名称
    15         /// </summary>
    16         public string elementName { get; set; }
    17     }

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

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

    成在管理,败在经验;嬴在选择,输在不学!  贵在坚持!

    欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。

       

     个人作品

       

        1、BIMFace.Community.SDK.NET

         开源地址:https://gitee.com/NAlps/BIMFace.SDK

         系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html

         系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html

       

        2、ZCN.NET.Common

         开源地址:https://gitee.com/NAlps/zcn.net.common

     技术栈

       

     1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

     2、jQuery、Vue.js、Bootstrap

     3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

     4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表、读写分离

     5、架构:领域驱动设计 DDD、ABP

     6、环境:跨平台、Windows、Linux(CentOS、麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

     7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

       

     云原生、微服务、Docker、CI/CD、DevOps、K8S;

     Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

     .NET + Docker + jenkins + Github + Harbor + K8S;

    出处:www.cnblogs.com/SavionZhang

    作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

              专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

              多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

              熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

             


             

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。

    如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!

  • 相关阅读:
    tf-idf 解释
    maven 下载依赖失败
    eclipse 快捷键
    线程数 QPS
    resin conf
    静态成员 生命周期
    SuperMap 9D 实时数据服务学习笔记
    SuperMap iServer 在Linux 部署中问题总结
    在SuperMap iDesktop中如何快速追加记录行?
    Landsat8 卫星数据下载
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/15400580.html
Copyright © 2020-2023  润新知