This repository has been archived by the owner on Apr 18, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Documentation_v3.html
612 lines (573 loc) · 77.7 KB
/
Documentation_v3.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Documentation_v3.html</title>
<meta name="generator" content="Haroopad 0.13.1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>div.oembedall-githubrepos{border:1px solid #DDD;border-radius:4px;list-style-type:none;margin:0 0 10px;padding:8px 10px 0;font:13.34px/1.4 helvetica,arial,freesans,clean,sans-serif;width:452px;background-color:#fff}div.oembedall-githubrepos .oembedall-body{background:-moz-linear-gradient(center top,#FAFAFA,#EFEFEF);background:-webkit-gradient(linear,left top,left bottom,from(#FAFAFA),to(#EFEFEF));border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #EEE;margin-left:-10px;margin-top:8px;padding:5px 10px;width:100%}div.oembedall-githubrepos h3{font-size:14px;margin:0;padding-left:18px;white-space:nowrap}div.oembedall-githubrepos p.oembedall-description{color:#444;font-size:12px;margin:0 0 3px}div.oembedall-githubrepos p.oembedall-updated-at{color:#888;font-size:11px;margin:0}div.oembedall-githubrepos ul.oembedall-repo-stats{border:none;float:right;font-size:11px;font-weight:700;padding-left:15px;position:relative;z-index:5;margin:0}div.oembedall-githubrepos ul.oembedall-repo-stats li{border:none;color:#666;display:inline-block;list-style-type:none;margin:0!important}div.oembedall-githubrepos ul.oembedall-repo-stats li a{background-color:transparent;border:none;color:#666!important;background-position:5px -2px;background-repeat:no-repeat;border-left:1px solid #DDD;display:inline-block;height:21px;line-height:21px;padding:0 5px 0 23px}div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a{border-left:medium none;margin-right:-3px}div.oembedall-githubrepos ul.oembedall-repo-stats li a:hover{background:5px -27px no-repeat #4183C4;color:#FFF!important;text-decoration:none}div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a:hover{border-bottom-left-radius:3px;border-top-left-radius:3px}ul.oembedall-repo-stats li:last-child a:hover{border-bottom-right-radius:3px;border-top-right-radius:3px}span.oembedall-closehide{background-color:#aaa;border-radius:2px;cursor:pointer;margin-right:3px}div.oembedall-container{margin-top:5px;text-align:left}.oembedall-ljuser{font-weight:700}.oembedall-ljuser img{vertical-align:bottom;border:0;padding-right:1px}.oembedall-stoqembed{border-bottom:1px dotted #999;float:left;overflow:hidden;width:730px;line-height:1;background:#FFF;color:#000;font-family:Arial,Liberation Sans,DejaVu Sans,sans-serif;font-size:80%;text-align:left;margin:0;padding:0}.oembedall-stoqembed a{color:#07C;text-decoration:none;margin:0;padding:0}.oembedall-stoqembed a:hover{text-decoration:underline}.oembedall-stoqembed a:visited{color:#4A6B82}.oembedall-stoqembed h3{font-family:Trebuchet MS,Liberation Sans,DejaVu Sans,sans-serif;font-size:130%;font-weight:700;margin:0;padding:0}.oembedall-stoqembed .oembedall-reputation-score{color:#444;font-size:120%;font-weight:700;margin-right:2px}.oembedall-stoqembed .oembedall-user-info{height:35px;width:185px}.oembedall-stoqembed .oembedall-user-info .oembedall-user-gravatar32{float:left;height:32px;width:32px}.oembedall-stoqembed .oembedall-user-info .oembedall-user-details{float:left;margin-left:5px;overflow:hidden;white-space:nowrap;width:145px}.oembedall-stoqembed .oembedall-question-hyperlink{font-weight:700}.oembedall-stoqembed .oembedall-stats{background:#EEE;margin:0 0 0 7px;padding:4px 7px 6px;width:58px}.oembedall-stoqembed .oembedall-statscontainer{float:left;margin-right:8px;width:86px}.oembedall-stoqembed .oembedall-votes{color:#555;padding:0 0 7px;text-align:center}.oembedall-stoqembed .oembedall-vote-count-post{font-size:240%;color:#808185;display:block;font-weight:700}.oembedall-stoqembed .oembedall-views{color:#999;padding-top:4px;text-align:center}.oembedall-stoqembed .oembedall-status{margin-top:-3px;padding:4px 0;text-align:center;background:#75845C;color:#FFF}.oembedall-stoqembed .oembedall-status strong{color:#FFF;display:block;font-size:140%}.oembedall-stoqembed .oembedall-summary{float:left;width:635px}.oembedall-stoqembed .oembedall-excerpt{line-height:1.2;margin:0;padding:0 0 5px}.oembedall-stoqembed .oembedall-tags{float:left;line-height:18px}.oembedall-stoqembed .oembedall-tags a:hover{text-decoration:none}.oembedall-stoqembed .oembedall-post-tag{background-color:#E0EAF1;border-bottom:1px solid #3E6D8E;border-right:1px solid #7F9FB6;color:#3E6D8E;font-size:90%;line-height:2.4;margin:2px 2px 2px 0;padding:3px 4px;text-decoration:none;white-space:nowrap}.oembedall-stoqembed .oembedall-post-tag:hover{background-color:#3E6D8E;border-bottom:1px solid #37607D;border-right:1px solid #37607D;color:#E0EAF1}.oembedall-stoqembed .oembedall-fr{float:right}.oembedall-stoqembed .oembedall-statsarrow{background-image:url(http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=3);background-repeat:no-repeat;overflow:hidden;background-position:0 -435px;float:right;height:13px;margin-top:12px;width:7px}.oembedall-facebook1{border:1px solid #1A3C6C;padding:0;font:13.34px/1.4 verdana;width:500px}.oembedall-facebook2{background-color:#627add}.oembedall-facebook2 a{color:#e8e8e8;text-decoration:none}.oembedall-facebookBody{background-color:#fff;vertical-align:top;padding:5px}.oembedall-facebookBody .contents{display:inline-block;width:100%}.oembedall-facebookBody div img{float:left;margin-right:5px}div.oembedall-lanyard{-webkit-box-shadow:none;-webkit-transition-delay:0s;-webkit-transition-duration:.4000000059604645s;-webkit-transition-property:width;-webkit-transition-timing-function:cubic-bezier(0.42,0,.58,1);background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:none;background-origin:padding-box;border-width:0;box-shadow:none;color:#112644;display:block;float:left;font-family:'Trebuchet MS',Trebuchet,sans-serif;font-size:16px;height:253px;line-height:19px;margin:0;max-width:none;min-height:0;outline:#112644 0;overflow-x:visible;overflow-y:visible;padding:0;position:relative;text-align:left;vertical-align:baseline;width:804px}div.oembedall-lanyard .tagline{font-size:1.5em}div.oembedall-lanyard .wrapper{overflow:hidden;clear:both}div.oembedall-lanyard .split{float:left;display:inline}div.oembedall-lanyard .prominent-place .flag:active,div.oembedall-lanyard .prominent-place .flag:focus,div.oembedall-lanyard .prominent-place .flag:hover,div.oembedall-lanyard .prominent-place .flag:link,div.oembedall-lanyard .prominent-place .flag:visited{float:left;display:block;width:48px;height:48px;position:relative;top:-5px;margin-right:10px}div.oembedall-lanyard .place-context{font-size:.889em}div.oembedall-lanyard .prominent-place .sub-place{display:block}div.oembedall-lanyard .prominent-place{font-size:1.125em;line-height:1.1em;font-weight:400}div.oembedall-lanyard .main-date{color:#8CB4E0;font-weight:700;line-height:1.1}div.oembedall-lanyard .first{width:48.57%;margin:0 0 0 2.857%}.mermaid .label{color:#333}.node circle,.node polygon,.node rect{fill:#cde498;stroke:#13540c;stroke-width:1px}.edgePath .path{stroke:green;stroke-width:1.5px}.cluster rect{fill:#cdffb2;rx:40;stroke:#6eaa49;stroke-width:1px}.cluster text{fill:#333}.actor{stroke:#13540c;fill:#cde498}text.actor{fill:#000;stroke:none}.actor-line{stroke:grey}.messageLine0{stroke-width:1.5;stroke-dasharray:"2 2";marker-end:"url(#arrowhead)";stroke:#333}.messageLine1{stroke-width:1.5;stroke-dasharray:"2 2";stroke:#333}#arrowhead{fill:#333}#crosshead path{fill:#333!important;stroke:#333!important}.messageText{fill:#333;stroke:none}.labelBox{stroke:#326932;fill:#cde498}.labelText,.loopText{fill:#000;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:"2 2";marker-end:"url(#arrowhead)";stroke:#326932}.note{stroke:#6eaa49;fill:#fff5ad}.noteText{fill:#000;stroke:none;font-family:'trebuchet ms',verdana,arial;font-size:14px}.section{stroke:none;opacity:.2}.section0,.section2{fill:#6eaa49}.section1,.section3{fill:#fff;opacity:.2}.sectionTitle0,.sectionTitle1,.sectionTitle2,.sectionTitle3{fill:#333}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:lightgrey;opacity:.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:red;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#fff}.task0,.task1,.task2,.task3{fill:#487e3a;stroke:#13540c}.taskTextOutside0,.taskTextOutside1,.taskTextOutside2,.taskTextOutside3{fill:#000}.active0,.active1,.active2,.active3{fill:#cde498;stroke:#13540c}.activeText0,.activeText1,.activeText2,.activeText3{fill:#000!important}.done0,.done1,.done2,.done3{stroke:grey;fill:lightgrey;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#000!important}.crit0,.crit1,.crit2,.crit3{stroke:#f88;fill:red;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#f88;fill:#cde498;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#f88;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3,.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#000!important}.titleText{text-anchor:middle;font-size:18px;fill:#000}text{font-family:'trebuchet ms',verdana,arial;font-size:14px}html{height:100%}body{margin:0!important;padding:5px 20px 26px!important;background-color:#fff;font-family:"Lucida Grande","Segoe UI","Apple SD Gothic Neo","Malgun Gothic","Lucida Sans Unicode",Helvetica,Arial,sans-serif;font-size:.9em;overflow-x:hidden;overflow-y:auto}br,h1,h2,h3,h4,h5,h6{clear:both}hr.page{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x;border:0;height:3px;padding:0}hr.underscore{border-top-style:dashed!important}body >:first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px}iframe{border:0}figure{-webkit-margin-before:0;-webkit-margin-after:0;-webkit-margin-start:0;-webkit-margin-end:0}kbd{border:1px solid #aaa;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:1px 2px 2px #ddd;-webkit-box-shadow:1px 2px 2px #ddd;box-shadow:1px 2px 2px #ddd;background-color:#f9f9f9;background-image:-moz-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:-o-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:-webkit-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:linear-gradient(top,#eee,#f9f9f9,#eee);padding:1px 3px;font-family:inherit;font-size:.85em}.oembeded .oembed_photo{display:inline-block}img[data-echo]{margin:25px 0;width:100px;height:100px;background:url(../img/ajax.gif) center center no-repeat #fff}.spinner{display:inline-block;width:10px;height:10px;margin-bottom:-.1em;border:2px solid rgba(0,0,0,.5);border-top-color:transparent;border-radius:100%;-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}.spinner:after{content:'';display:block;width:0;height:0;position:absolute;top:-6px;left:0;border:4px solid transparent;border-bottom-color:rgba(0,0,0,.5);-webkit-transform:rotate(45deg);transform:rotate(45deg)}@-webkit-keyframes spin{to{-webkit-transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}p.toc{margin:0!important}p.toc ul{padding-left:10px}p.toc>ul{padding:10px;margin:0 10px;display:inline-block;border:1px solid #ededed;border-radius:5px}p.toc li,p.toc ul{list-style-type:none}p.toc li{width:100%;padding:0;overflow:hidden}p.toc li a::after{content:"."}p.toc li a:before{content:"• "}p.toc h5{text-transform:uppercase}p.toc .title{float:left;padding-right:3px}p.toc .number{margin:0;float:right;padding-left:3px;background:#fff;display:none}input.task-list-item{margin-left:-1.62em}.markdown{font-family:"Hiragino Sans GB","Microsoft YaHei",STHeiti,SimSun,"Lucida Grande","Lucida Sans Unicode","Lucida Sans",'Segoe UI',AppleSDGothicNeo-Medium,'Malgun Gothic',Verdana,Tahoma,sans-serif;padding:20px}.markdown a{text-decoration:none;vertical-align:baseline}.markdown a:hover{text-decoration:underline}.markdown h1{font-size:2.2em;font-weight:700;margin:1.5em 0 1em}.markdown h2{font-size:1.8em;font-weight:700;margin:1.275em 0 .85em}.markdown h3{font-size:1.6em;font-weight:700;margin:1.125em 0 .75em}.markdown h4{font-size:1.4em;font-weight:700;margin:.99em 0 .66em}.markdown h5{font-size:1.2em;font-weight:700;margin:.855em 0 .57em}.markdown h6{font-size:1em;font-weight:700;margin:.75em 0 .5em}.markdown h1+p,.markdown h1:first-child,.markdown h2+p,.markdown h2:first-child,.markdown h3+p,.markdown h3:first-child,.markdown h4+p,.markdown h4:first-child,.markdown h5+p,.markdown h5:first-child,.markdown h6+p,.markdown h6:first-child{margin-top:0}.markdown hr{border:1px solid #ccc}.markdown p{margin:1em 0;word-wrap:break-word}.markdown ol{list-style-type:decimal}.markdown li{display:list-item;line-height:1.4em}.markdown blockquote{margin:1em 20px}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown blockquote cite:before{content:'\2014 \00A0'}.markdown .code{border-radius:3px;word-wrap:break-word}.markdown pre{border-radius:3px;word-wrap:break-word;border:1px solid #ccc;overflow:auto;padding:.5em}.markdown pre code{border:0;display:block}.markdown pre>code{font-family:Consolas,Inconsolata,Courier,monospace;font-weight:700;white-space:pre;margin:0}.markdown code{border-radius:3px;word-wrap:break-word;border:1px solid #ccc;padding:0 5px;margin:0 2px}.markdown img{max-width:100%}.markdown mark{color:#000;background-color:#fcf8e3}.markdown table{padding:0;border-collapse:collapse;border-spacing:0;margin-bottom:16px}.markdown table tr td,.markdown table tr th{border:1px solid #ccc;margin:0;padding:6px 13px}.markdown table tr th{font-weight:700}.markdown table tr th>:first-child{margin-top:0}.markdown table tr th>:last-child{margin-bottom:0}.markdown table tr td>:first-child{margin-top:0}.markdown table tr td>:last-child{margin-bottom:0}@import url(http://fonts.googleapis.com/css?family=Roboto+Condensed:300italic,400italic,700italic,400,300,700);.haroopad{padding:20px;color:#222;font-size:15px;font-family:"Roboto Condensed",Tauri,"Hiragino Sans GB","Microsoft YaHei",STHeiti,SimSun,"Lucida Grande","Lucida Sans Unicode","Lucida Sans",'Segoe UI',AppleSDGothicNeo-Medium,'Malgun Gothic',Verdana,Tahoma,sans-serif;background:#fff;line-height:1.6;-webkit-font-smoothing:antialiased}.haroopad a{color:#3269a0}.haroopad a:hover{color:#4183c4}.haroopad h2{border-bottom:1px solid #e6e6e6}.haroopad h6{color:#777}.haroopad hr{border:1px solid #e6e6e6}.haroopad blockquote>code,.haroopad h1>code,.haroopad h2>code,.haroopad h3>code,.haroopad h4>code,.haroopad h5>code,.haroopad h6>code,.haroopad li>code,.haroopad p>code,.haroopad td>code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:85%;background-color:rgba(0,0,0,.02);padding:.2em .5em;border:1px solid #efefef}.haroopad pre>code{font-size:1em;letter-spacing:-1px;font-weight:700}.haroopad blockquote{border-left:4px solid #e6e6e6;padding:0 15px;color:#777}.haroopad table{background-color:#fafafa}.haroopad table tr td,.haroopad table tr th{border:1px solid #e6e6e6}.haroopad table tr:nth-child(2n){background-color:#f2f2f2}.hljs{display:block;overflow-x:auto;padding:.5em;background:#fdf6e3;color:#657b83;-webkit-text-size-adjust:none}.diff .hljs-header,.hljs-comment,.hljs-doctype,.hljs-javadoc,.hljs-pi,.lisp .hljs-string{color:#93a1a1}.css .hljs-tag,.hljs-addition,.hljs-keyword,.hljs-request,.hljs-status,.hljs-winutils,.method,.nginx .hljs-title{color:#859900}.hljs-command,.hljs-dartdoc,.hljs-hexcolor,.hljs-link_url,.hljs-number,.hljs-phpdoc,.hljs-regexp,.hljs-rules .hljs-value,.hljs-string,.hljs-tag .hljs-value,.tex .hljs-formula{color:#2aa198}.css .hljs-function,.hljs-built_in,.hljs-chunk,.hljs-decorator,.hljs-id,.hljs-identifier,.hljs-localvars,.hljs-title,.vhdl .hljs-literal{color:#268bd2}.hljs-attribute,.hljs-class .hljs-title,.hljs-constant,.hljs-link_reference,.hljs-parent,.hljs-type,.hljs-variable,.lisp .hljs-body,.smalltalk .hljs-number{color:#b58900}.css .hljs-pseudo,.diff .hljs-change,.hljs-attr_selector,.hljs-cdata,.hljs-header,.hljs-pragma,.hljs-preprocessor,.hljs-preprocessor .hljs-keyword,.hljs-shebang,.hljs-special,.hljs-subst,.hljs-symbol,.hljs-symbol .hljs-string{color:#cb4b16}.hljs-deletion,.hljs-important{color:#dc322f}.hljs-link_label{color:#6c71c4}.tex .hljs-formula{background:#eee8d5}.MathJax_Hover_Frame{border-radius:.25em;-webkit-border-radius:.25em;-moz-border-radius:.25em;-khtml-border-radius:.25em;box-shadow:0 0 15px #83A;-webkit-box-shadow:0 0 15px #83A;-moz-box-shadow:0 0 15px #83A;-khtml-box-shadow:0 0 15px #83A;border:1px solid #A6D!important;display:inline-block;position:absolute}.MathJax_Hover_Arrow{position:absolute;width:15px;height:11px;cursor:pointer}#MathJax_About{position:fixed;left:50%;width:auto;text-align:center;border:3px outset;padding:1em 2em;background-color:#DDD;color:#000;cursor:default;font-family:message-box;font-size:120%;font-style:normal;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;-khtml-border-radius:15px;box-shadow:0 10px 20px gray;-webkit-box-shadow:0 10px 20px gray;-moz-box-shadow:0 10px 20px gray;-khtml-box-shadow:0 10px 20px gray;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}.MathJax_Menu{position:absolute;background-color:#fff;color:#000;width:auto;padding:2px;border:1px solid #CCC;margin:0;cursor:default;font:menu;text-align:left;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;box-shadow:0 10px 20px gray;-webkit-box-shadow:0 10px 20px gray;-moz-box-shadow:0 10px 20px gray;-khtml-box-shadow:0 10px 20px gray;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}.MathJax_MenuItem{padding:2px 2em;background:0 0}.MathJax_MenuArrow{position:absolute;right:.5em;color:#666}.MathJax_MenuActive .MathJax_MenuArrow{color:#fff}.MathJax_MenuArrow.RTL{left:.5em;right:auto}.MathJax_MenuCheck{position:absolute;left:.7em}.MathJax_MenuCheck.RTL{right:.7em;left:auto}.MathJax_MenuRadioCheck{position:absolute;left:1em}.MathJax_MenuRadioCheck.RTL{right:1em;left:auto}.MathJax_MenuLabel{padding:2px 2em 4px 1.33em;font-style:italic}.MathJax_MenuRule{border-top:1px solid #CCC;margin:4px 1px 0}.MathJax_MenuDisabled{color:GrayText}.MathJax_MenuActive{background-color:Highlight;color:HighlightText}.MathJax_Menu_Close{position:absolute;width:31px;height:31px;top:-15px;left:-15px}#MathJax_Zoom{position:absolute;background-color:#F0F0F0;overflow:auto;display:block;z-index:301;padding:.5em;border:1px solid #000;margin:0;font-weight:400;font-style:normal;text-align:left;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;box-shadow:5px 5px 15px #AAA;-webkit-box-shadow:5px 5px 15px #AAA;-moz-box-shadow:5px 5px 15px #AAA;-khtml-box-shadow:5px 5px 15px #AAA;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}#MathJax_ZoomOverlay{position:absolute;left:0;top:0;z-index:300;display:inline-block;width:100%;height:100%;border:0;padding:0;margin:0;background-color:#fff;opacity:0;filter:alpha(opacity=0)}#MathJax_ZoomFrame{position:relative;display:inline-block;height:0;width:0}#MathJax_ZoomEventTrap{position:absolute;left:0;top:0;z-index:302;display:inline-block;border:0;padding:0;margin:0;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.MathJax_Preview{color:#888}#MathJax_Message{position:fixed;left:1px;bottom:2px;background-color:#E6E6E6;border:1px solid #959595;margin:0;padding:2px 8px;z-index:102;color:#000;font-size:80%;width:auto;white-space:nowrap}#MathJax_MSIE_Frame{position:absolute;top:0;left:0;width:0;z-index:101;border:0;margin:0;padding:0}.MathJax_Error{color:#C00;font-style:italic}footer{position:fixed;font-size:.8em;text-align:right;bottom:0;margin-left:-25px;height:20px;width:100%}</style>
</head>
<body class="markdown haroopad">
<h1 id="![icon-logeoref](pic/icon_img.png)-ifcgeorefchecker-documentation"><a name="![icon-logeoref](pic/icon_img.png)-ifcgeorefchecker-documentation" href="#![icon-logeoref](pic/icon_img.png)-ifcgeorefchecker-documentation"></a><img src="pic/icon_img.png" alt="Icon LoGeoRef"> IFCGeoRefChecker-Documentation</h1><p>This document introduces a new concept for the evaluation of stored georeferencing attributes in IFC files. It also provides description of the functionality of the introduced IFCGeoRefChecker tool in this document.</p><p class="toc" style="undefined"></p><ul>
<li><ul>
<li><span class="title">
<a href="#the--level-of-georeferencing--concept" title="The -Level of Georeferencing- concept">The -Level of Georeferencing- concept</a>
</span>
<!--span class="number">
0
</span-->
<ul>
<li><span class="title">
<a href="#![icon-loggoref10](pic/icon_georef10.png)-logeoref-10" title=" LoGeoRef 10"> LoGeoRef 10</a>
</span>
<!--span class="number">
1
</span-->
</li>
<li><span class="title">
<a href="#![icon-logeoref20](pic/icon_georef20.png)-logeoref-20" title=" LoGeoRef 20"> LoGeoRef 20</a>
</span>
<!--span class="number">
2
</span-->
</li>
<li><span class="title">
<a href="#![icon-logeoref30](pic/icon_georef30.png)-logeoref-30" title=" LoGeoRef 30"> LoGeoRef 30</a>
</span>
<!--span class="number">
3
</span-->
</li>
<li><span class="title">
<a href="#![icon-logeoref40](pic/icon_georef40.png)-logeoref-40" title=" LoGeoRef 40"> LoGeoRef 40</a>
</span>
<!--span class="number">
4
</span-->
</li>
<li><span class="title">
<a href="#![icon-logeoref50](pic/icon_georef50.png)-logeoref-50" title=" LoGeoRef 50"> LoGeoRef 50</a>
</span>
<!--span class="number">
5
</span-->
</li>
</ul>
</li>
<li><span class="title">
<a href="#the--ifcgeorefchecker--tool-(version:-0.3.0.0)" title="The -IFCGeoRefChecker- tool (Version: 0.3.0.0)">The -IFCGeoRefChecker- tool (Version: 0.3.0.0)</a>
</span>
<!--span class="number">
6
</span-->
<ul>
<li><span class="title">
<a href="#history-/changelog" title="History /Changelog">History /Changelog</a>
</span>
<!--span class="number">
7
</span-->
</li>
<li><span class="title">
<a href="#structure-of-the-resulting-log-file" title="Structure of the resulting log file">Structure of the resulting log file</a>
</span>
<!--span class="number">
8
</span-->
<ul>
<li><ul>
<li><span class="title">
<a href="#logeoref10-results" title="LoGeoRef10 results">LoGeoRef10 results</a>
</span>
<!--span class="number">
9
</span-->
</li>
<li><span class="title">
<a href="#logeoref20-results" title="LoGeoRef20 results">LoGeoRef20 results</a>
</span>
<!--span class="number">
10
</span-->
</li>
<li><span class="title">
<a href="#logeoref30-results" title="LoGeoRef30 results">LoGeoRef30 results</a>
</span>
<!--span class="number">
11
</span-->
</li>
<li><span class="title">
<a href="#logeoref-40-results" title="LoGeoRef 40 results">LoGeoRef 40 results</a>
</span>
<!--span class="number">
12
</span-->
</li>
<li><span class="title">
<a href="#logeoref-50-results" title="LoGeoRef 50 results">LoGeoRef 50 results</a>
</span>
<!--span class="number">
13
</span-->
</li>
</ul>
</li>
</ul>
</li>
<li><span class="title">
<a href="#structure-of-the-resulting-json-file" title="Structure of the resulting JSON file">Structure of the resulting JSON file</a>
</span>
<!--span class="number">
14
</span-->
</li>
<li><span class="title">
<a href="#georefupdate-functionality" title="GeoRefUpdate functionality">GeoRefUpdate functionality</a>
</span>
<!--span class="number">
15
</span-->
<ul>
<li><span class="title">
<a href="#first-option:-edit-manually" title="First option: edit manually">First option: edit manually</a>
</span>
<!--span class="number">
16
</span-->
</li>
<li><span class="title">
<a href="#second-option:-edit-via-map" title="Second option: edit via map">Second option: edit via map</a>
</span>
<!--span class="number">
17
</span-->
</li>
</ul>
</li>
<li><span class="title">
<a href="#export-changes-to-ifc" title="Export changes to IFC">Export changes to IFC</a>
</span>
<!--span class="number">
18
</span-->
</li>
<li><span class="title">
<a href="#extended-export-to-ifc-(only-for-ifc-experts-recommended)" title="Extended export to IFC (only for IFC experts recommended)">Extended export to IFC (only for IFC experts recommended)</a>
</span>
<!--span class="number">
19
</span-->
<ul>
<li><span class="title">
<a href="#further-remarks" title="Further remarks">Further remarks</a>
</span>
<!--span class="number">
20
</span-->
</li>
<li><span class="title">
<a href="#best-practice" title="Best practice">Best practice</a>
</span>
<!--span class="number">
21
</span-->
<ul>
<li><span class="title">
<a href="#revit:" title="Revit:">Revit:</a>
</span>
<!--span class="number">
22
</span-->
</li>
<li><span class="title">
<a href="#solibri:" title="Solibri:">Solibri:</a>
</span>
<!--span class="number">
23
</span-->
</li>
</ul>
</li>
</ul>
</li>
<li><span class="title">
<a href="#georefcomparer" title="GeoRefComparer">GeoRefComparer</a>
</span>
<!--span class="number">
24
</span-->
<ul>
<li><span class="title">
<a href="#proposed-way-to-compare-georeferencing" title="Proposed way to compare georeferencing">Proposed way to compare georeferencing</a>
</span>
<!--span class="number">
25
</span-->
</li>
<li><span class="title">
<a href="#current-restrictions" title="Current restrictions">Current restrictions</a>
</span>
<!--span class="number">
26
</span-->
</li>
<li><span class="title">
<a href="#outcome" title="Outcome">Outcome</a>
</span>
<!--span class="number">
27
</span-->
</li>
</ul>
</li>
<li><span class="title">
<a href="#checking-ifc-files-using-command-line-arguments" title="Checking IFC-files using command-line arguments">Checking IFC-files using command-line arguments</a>
</span>
<!--span class="number">
28
</span-->
</li>
<li><span class="title">
<a href="#errors-that-may-occur" title="Errors that may occur">Errors that may occur</a>
</span>
<!--span class="number">
29
</span-->
</li>
</ul>
</li>
<li><span class="title">
<a href="#built-with" title="Built with">Built with</a>
</span>
<!--span class="number">
30
</span-->
</li>
<li><span class="title">
<a href="#contributors" title="Contributors">Contributors</a>
</span>
<!--span class="number">
31
</span-->
</li>
<li><span class="title">
<a href="#contact" title="Contact">Contact</a>
</span>
<!--span class="number">
32
</span-->
</li>
<li><span class="title">
<a href="#license" title="License">License</a>
</span>
<!--span class="number">
33
</span-->
</li>
</ul>
</li>
</ul>
<p></p><h2 id="the--level-of-georeferencing--concept"><a name="the--level-of-georeferencing--concept" href="#the--level-of-georeferencing--concept"></a>The -Level of Georeferencing- concept</h2><p>Making geodata available in a BIM project is an important task for all kind of personnel involved in BIM processes. Attributes for location and rotation towards the north direction should be stored in a correct manner for further project steps. The common open data exchange format in the field of BIM are the Industry Foundation Classes (IFC). There are some ways described by the official IFC documentation to store georeferencing attributes in an IFC-file. The official IFC documentation and standard allow multiple ways to store georeferencing attributes in an IFC-File.</p><p>Our concept classifies the different ways of georeferencing in so called Levels of Georeferencing (LoGeoRef). </p><p>Alltogether five level (10, 20, 30, 40 and 50) are available describing how the georeferencing of an object can be applied. The higher the LoGeoRef is the more quality of georeferencing can be expected by the designated file. It should be noted that information from higher levels do not automatically include information out of lower levels and vice versa. Each level comprises their own IFC-schema attributes and is standing on its own.</p><p>Consequently, an IFC-file can fulfill conditions of more than one “Level of GeoRef”.</p><p>The following subsections contain an explanation for every level of georef and provide the particular extract of the IFC schema that has to be fulfilled for the classification into the respective level.</p><h3 id="![icon-loggoref10](pic/icon_georef10.png)-logeoref-10"><a name="![icon-loggoref10](pic/icon_georef10.png)-logeoref-10" href="#![icon-loggoref10](pic/icon_georef10.png)-logeoref-10"></a><img src="pic/icon_georef10.png" alt="Icon LogGoRef10"> LoGeoRef 10</h3><p>The simplest way to describe where a site or a building is located is to add an address to the BIM project. Advantages are the easy human readability and the simple understanding of such an address. For georeferencing purposes, it is only a rough approximation for setting the location of the site or the building. Nevertheless, it can be helpful for integrating GIS data like adding data of surrounding city models.</p><p>The IFC schema provides an entity for storing address data in an IFC-file. The entity IfcPostalAddress contains multiple attributes including address lines, postal code, town, region and country. For a correct assignment to a spatial structure element, the IfcPostalAddress object has to be referenced by either IfcSite or IfcBuilding. Both entities include a certain attribute for address referencing.</p><p>For better understanding, please refer to the following class diagram:</p><p><img src="pic/logeoref10.png" alt="UML class diagramm LoGeoRef 10"></p><p>A corresponding IFC-file with fulfilment of the “LoGeoRef10” conditions would contain the following instances:</p><p><img src="pic/ifc_georef10.png" alt="IFC file fulfilling LoGeoRef 10"></p><p>The file contains an instance of IfcPostalAddress with information for georeferencing highlighted in the green frame. In this case the address is referenced by an instance of IfcSite and an instance of IfcBuilding (red frames). Please note that for fulfilling LoGeoRef 10 the IfcPostalAdress does not has to be referenced in both entities. </p><h3 id="![icon-logeoref20](pic/icon_georef20.png)-logeoref-20"><a name="![icon-logeoref20](pic/icon_georef20.png)-logeoref-20" href="#![icon-logeoref20](pic/icon_georef20.png)-logeoref-20"></a><img src="pic/icon_georef20.png" alt="Icon LoGeoRef20"> LoGeoRef 20</h3><p>There is another relative simple way for georeferencing IFC-files. For compliance with LoGeoref 20, instances of IfcSite must contain values for their attributes RefLatitude and RefLongitude. As their names suggest an IFC model is able to store one single point coordinate with longitude and latitude directly in IfcSite. According to the IFC schema definition its values are geographic coordinates with respect to the World Geodetic System (WGS84 with EPSG:4326). Besides of that, it is also possible to store a value for the elevation in the corresponding attribute RefElevation. By definition, RefElevation should have a metric value related to a locally used datum relative to the sea level. However, there is no default possibility given to write the datum´s name explicit in the file. This also applies to latitude and longitude with its usage of WGS84.</p><p>For better understanding, please refer to the following class diagram:</p><p><img src="pic/logeoref20.png" alt="UML class diagramm LoGeoRef 20"></p><p>The corresponding IFC-file only needs to contain an instance of IfcSite with the attributes RefLatitude / RefLongitude and RefElevation.</p><p><img src="pic/ifc_georef20.png" alt="IFC file fulfilling LoGeoRef 20"></p><p>Latitude and longitude are stored as comma-separated integers fulfilling the conditions of the IFC-type IfcCompoundPlaneAngleMeasure. There can be three or four integers describing the required angle. The first value stands for the degree, the second for the minutes, the third for the seconds and the optional fourth for the millionth-seconds part of the angle. This shows that it is possible to set a point coordinate for IfcSite in a very accurate way. LoGeoRef20 does not include possibilities to store any rotation parameters, though.</p><h3 id="![icon-logeoref30](pic/icon_georef30.png)-logeoref-30"><a name="![icon-logeoref30](pic/icon_georef30.png)-logeoref-30" href="#![icon-logeoref30](pic/icon_georef30.png)-logeoref-30"></a><img src="pic/icon_georef30.png" alt="Icon LoGeoRef30"> LoGeoRef 30</h3><p>This level describes the possibility to store the location of any IfcSpatialStructureElement directly in its LocalPlacement-object. Subclasses that can be instantiated in an IFC-file are IfcSite, IfcBuilding, IfcBuildingStorey or IfcSpace. As an important constraint, this level applies only to those spatial structure elements that do not have a relative placement to another spatial structure element. Therefore, the attribute PlacmentRelTo of the IfcLocalPlacement-object belonging to the IfcSpatialStructureElement should be empty. Usually this is the same spatial element which is also the uppermost element in the spatial hierarchy. According to the IFC schema definition this should always be an IfcSite-object.</p><p>Since the attribute RelativePlacement is of type IfcAxis2Placement3D, there are possibilities to store X, Y and Z coordinates for the location and vector components for an angle specification for a rotation of the X-axis and the Z-axis.</p><p>This makes it possible to store both georeferenced coordinates in the attribute Location indicating metric values in an arbitrary coordinate reference system and to store any rotation values via setting the vector components of the specific Axis respectively RefDirection attribute.</p><p>For better understanding, please refer to the following class diagram:</p><p><img src="pic/logeoref30.png" alt="UML class diagramm LoGeoRef 30"></p><p>A corresponding IFC-file contains the following instances for satisfying this level:</p><p><img src="pic/ifc_georef30.png" alt="IFC file fulfilling LoGeoRef 30"></p><p>The example above contains the definitions for an IfcSite-object which is georeferenced by an Location stored in IfcCartesianPoint. The file also applies values for a rotation of the X-axis (#69184). There is no rotation of the Z-axis but nevertheless the default direction must be stored in an IfcDirection instance (#69183). Please keep in mind that this level also contains no information whether the stored location and rotation is local or referred to a global coordinate reference system.</p><h3 id="![icon-logeoref40](pic/icon_georef40.png)-logeoref-40"><a name="![icon-logeoref40](pic/icon_georef40.png)-logeoref-40" href="#![icon-logeoref40](pic/icon_georef40.png)-logeoref-40"></a><img src="pic/icon_georef40.png" alt="Icon LoGeoRef40"> LoGeoRef 40</h3><p>This level provides two main attributes to store georeferencing attributes in an IFC-file. Both WolrdCoordinateSystem and TrueNorth are part of the IfcGeometricRepresentationContext of an instantiated IfcProject. According to the IFC schema defintion every IFC-file contains an IfcProject and also a referenced IfcGeometricRepresentationContext with the attribute ContextType given as “Model”. </p><p>It is also possible to set up a coordinate system for the 3D-model context of the project via the attribute WorldCoordinateSystem. </p><p>The other attributes follow the same rule as mentioned in previous LoGeoRef 30. A location stored in an instance of IfcCartesianPoint and optional directions for X- and Z-axis, stored in instances of IfcDirection.</p><p>As a second main attribute there is the TrueNorth attribute. This attribute is used in case that the Y-axis of the given WorldCoordinateSystem does not point to the global northing. That means that this is another way to set a rotation for the XY-plane. In consequence, the corresponding IfcDirection can only store two vector components.</p><p>For better understanding, please refer to the following class diagram:</p><p><img src="pic/logeoref40.png" alt="UML class diagramm LoGeoRef 40"></p><p>IFC-files with instances from above could look like the following:</p><p><img src="pic/ifc_georef40.png" alt="IFC file fulfilling LoGeoRef 40"></p><p>In the example the IfcGeometricRepresentationContext contains a georeferenced location in IfcCartesianPoint. Its directions are optional and not explicitly given. That means they use their default directions for X-axis (1/0/0) and Z-axis (0/0/1). In addition, there is a rotation towards the XY-plane given in IfcDirection (#91).</p><p> The example shows the possibility to store georeferenced coordinates and rotations for the whole project context and not only for a certain (spatial) element. Furthermore the TrueNorth attribute provides the option to set a distortion directly relative to the north direction.</p><p>However, those options could be confusing and redundant when direction attributes are set at WorldCoordinateSystem and TrueNorth.</p><h3 id="![icon-logeoref50](pic/icon_georef50.png)-logeoref-50"><a name="![icon-logeoref50](pic/icon_georef50.png)-logeoref-50" href="#![icon-logeoref50](pic/icon_georef50.png)-logeoref-50"></a><img src="pic/icon_georef50.png" alt="Icon LoGeoRef50"> LoGeoRef 50</h3><p>This level provides the highest quality regarding the georeferencing of an IFC-file. It is only available in IFC-files since IFC schema version 4. So it is important to note that no IFC-file previous to IFC4 can fulfill this level.</p><p>With IFC schema version 4 buildingSMART introduced some entities especially for georeferencing purposes. In particular, there is a class named IfcMapConversion where the offset between project coordinate system and the global origin of a coordinate reference system should be stored within the attributes Eastings, Northings and OrthogonalHeight for global elevation. The rotation for the XY-plane will be stored using the attributes XAxisAbscissa and XAxisOrdinate. Each attribute stores one vector component of the resulting angle (unlike the TrueNorth attribute with both vector components, see LoGeoRef 40). With the attribute Scale a distortion of distances can be introduced.</p><p>The connection to the project is made by the attribute SourceCRS that inherited from IfcCoordinateOperation. As a constraint of this level SourceCRS must be of type IfcGeomtricRepresentationContext. TargetCRS is consequently the Coordinate Reference System that should apply to the project. For describing these systems, IFC4 is able to store data regarding the CRS via an instance of IfcProjectedCRS. By schema definition it is recommended to specify the CRS with an EPSG-code. However, it can also be specified via the other attributes of this entity.</p><p>For better understanding, please refer to the following class diagram:</p><p><img src="pic/logeoref50.png" alt="UML class diagramm LoGeoRef 50"></p><p>A corresponding IFC-file of schema version 4 contains the following instances for satisfying LoGeoRef50:</p><p><img src="pic/ifc_georef50.png" alt="IFC file fulfilling LoGeoRef 50"></p><p>The sample file shows that this level does not need any Placement-entities but uses extra entities for georeferencing. So it is possible to handle conversions between a local enginering system and a coordinate reference system.</p><h2 id="the--ifcgeorefchecker--tool-(version:-0.3.0.0)"><a name="the--ifcgeorefchecker--tool-(version:-0.3.0.0)" href="#the--ifcgeorefchecker--tool-(version:-0.3.0.0)"></a>The -IFCGeoRefChecker- tool (Version: 0.3.0.0)</h2><p>This application serves as lightweight checking tool for the LoGeoRef concept outlined above. It is written in C# using the .NET Framework 4.6.</p><h3 id="history-/changelog"><a name="history-/changelog" href="#history-/changelog"></a>History /Changelog</h3><ul>
<li>revision of IfcGeoRefUpdater functionality<br>— easier handling (no deeper IFC knowledge required anymore)<br>— possibility to position building perimiter in map context (alpha status)</li><li>minor changes (set working directory, structure of Json-file)</li></ul><p><img src="pic/GeoRefChecker_GUI_1_v3.png" alt="GUI before import an IFC-file"></p><p>The tool is able to read and check all attributes with georeferencing content in the choosen IFC-file.<br>At first, it is recommended to set the working directory to a directory where you have the permission to write and delete files. The checker tool will need these permissions for full functionality.</p><p>The application is able to check more than one IFC file in one action. Via click on “Check IFC-files…” you need to select the file(s) in the file dialog that should be checked against the LoGeoRef. If you want to export a protocol file to your working directory just tick the checkbox for “Export Log file” before starting the import/check process.</p><p>Depending on the size of the file(s), the import process could take some time. If the files are successfully loaded the names of the input files will appear in the listbox under the “Status report” group box. There is also a status label for import which will show the number of imported IfcModels.</p><p><strong>Checking results are visible like follows:</strong></p><ul>
<li>“Check Overview” area: short resuts as true or false decision regarding LoGeoRef concept (see above)</li><li>if checked (default): detailed results in protocol file (in file system and also reachable via click on “See log file” button)</li><li>if checked: detailed results in JSON file (in file system and also reachable via click on “See JSON file” button)</li></ul><p>If the application is not able to import a certain file it will show a error message with the reason why it can not be imported. In this case you should check the syntax of the file with an appropriate IFC file checker.</p><p>The program window after the check could look like this:</p><p><img src="pic/GeoRefChecker_GUI_2_v3.png" alt="GUI after checking an IFC-file"></p><h3 id="structure-of-the-resulting-log-file"><a name="structure-of-the-resulting-log-file" href="#structure-of-the-resulting-log-file"></a>Structure of the resulting log file</h3><p>Every log file begins with a title with the naming of the checked IFC-file and date / time in brackets.</p><pre><code data-origin="<pre><code>
Examination of "Projekt.ifc" regarding georeferencing content (04/16/2018, 14:19:40)
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
</code></pre>">
Examination of "Projekt.ifc" regarding georeferencing content (04/16/2018, 14:19:40)
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
</code></pre><p>In the next sections, the results of each LoGeoRef check are presented sequentially.</p><h5 id="logeoref10-results"><a name="logeoref10-results" href="#logeoref10-results"></a>LoGeoRef10 results</h5><p>The logfile contains the check results for all possible adresses reference by IfcSite or IfcBuilding. Therefore it is possible to evaluate all Site- and Building-objects regarding their address-attribute. Some positive results for LoGeoRef 10 check will look like this:</p><pre><code data-origin="<pre><code>
Existing addresses referenced by IfcSite or IfcBuilding
----------------------------------------------------------
Found address referenced by #110=IfcBuilding:
#106= IfcPostalAddress
Address: Reichenbachstrasse 1
Postal code: 01069
Town: Dresden
Region: Saxony
Country: Germany
LoGeoRef 10 = True
</code></pre>">
Existing addresses referenced by IfcSite or IfcBuilding
----------------------------------------------------------
Found address referenced by #110=IfcBuilding:
#106= IfcPostalAddress
Address: Reichenbachstrasse 1
Postal code: 01069
Town: Dresden
Region: Saxony
Country: Germany
LoGeoRef 10 = True
</code></pre><p>The example above shows a well-filled IfcPostalAddress instance (German example) of the examined file. Please notice that this tool will not check the content for its plausibility. It is also possible that the address information will be incomplete caused by the exporting software or incomplete data given by the user of the exporting BIM software.</p><p>The result of the check will be true if there is an IfcPostalAddress referenced by IfcSite or IfcBuilding. This could be comprehensive like the example but can be also very vague for instance if only the country is given.</p><h5 id="logeoref20-results"><a name="logeoref20-results" href="#logeoref20-results"></a>LoGeoRef20 results</h5><p>Some positive results for LoGeoRef 20 will look like this:</p><pre><code data-origin="<pre><code>
Geographic coordinates referenced by IfcSite (Latitude / Longitude / Elevation)
--------------------------------------------------------------------------------
Referenced in #445= IfcSite
Latitude: 51.0339851377778
Longitude: 13.7339153288889
Elevation: 115.1
LoGeoRef 20 = True
</code></pre>">
Geographic coordinates referenced by IfcSite (Latitude / Longitude / Elevation)
--------------------------------------------------------------------------------
Referenced in #445= IfcSite
Latitude: 51.0339851377778
Longitude: 13.7339153288889
Elevation: 115.1
LoGeoRef 20 = True
</code></pre><p>The result of the check will be true if there is an IfcSite-object in the IFC-file that includes attribute values for RefLatitude and RefLongitude. In consequence, the elevation must not be given for a true check result but will be read by the checking tool.</p><p>There is no statement regarding units of the written values because IFC schema does only implicit regulate this units in its documentation. Usually the Latitude and Longitude should be geographic coordinates towards WGS84 with units degree. The elevation should have a metric value related to a locally used datum relative to the sea level.</p><p>The validity of those regulations for the certain IFC-file can not be guaranteed by this checker, so the units are not mentioned here.</p><h5 id="logeoref30-results"><a name="logeoref30-results" href="#logeoref30-results"></a>LoGeoRef30 results</h5><p>A result of checking for LoGeoRef 30 could look like the following example:</p><pre><code data-origin="<pre><code>
Local placement for the uppermost IfcSpatialStructureElement (usually an instance of IfcSite)
The placement of those elements is only relative to the WorldCoordinateSystem (see LoGeoRef 40) but not to other IFC-Elements
-------------------------------------------------------------------------------------------------------------------------
Referencing Element: #9094= IfcSite
Placement referenced in #83= IfcAxis2Placement3D
X = 0
Y = 0
Z = 0
Rotation X-axis = (1/0/0)
Rotation Z-axis = (0/0/1)
LoGeoRef 30 = False
Referencing Element:#77324=IfcVirtualElement
Placement referenced in #77322=IfcAxis2Placement3D
X = 71.29499998465
Y = 4.01
Z = 0
Rotation X-axis = (-8/-50/0)
Rotation Z-axis = (0/0/1)
LoGeoRef 30 = True
</code></pre>">
Local placement for the uppermost IfcSpatialStructureElement (usually an instance of IfcSite)
The placement of those elements is only relative to the WorldCoordinateSystem (see LoGeoRef 40) but not to other IFC-Elements
-------------------------------------------------------------------------------------------------------------------------
Referencing Element: #9094= IfcSite
Placement referenced in #83= IfcAxis2Placement3D
X = 0
Y = 0
Z = 0
Rotation X-axis = (1/0/0)
Rotation Z-axis = (0/0/1)
LoGeoRef 30 = False
Referencing Element:#77324=IfcVirtualElement
Placement referenced in #77322=IfcAxis2Placement3D
X = 71.29499998465
Y = 4.01
Z = 0
Rotation X-axis = (-8/-50/0)
Rotation Z-axis = (0/0/1)
LoGeoRef 30 = True
</code></pre><p>This example shows a possible result of LoGeoRef 30 check. At first, the check will determine all elements in the IFC-file that have no placement relative to another element´s placement.</p><p>If there are other elements than spatial structure elements which were found at the first step then they will appear in the log file as well (e.g. #177012= IfcVirtualElement). It is important to consider those elements if the absolute placement, e.g. for IfcSite will be changed afterwards. To guarantee the relative positioning of the named elements to each other it is therefore necessary to add the same value to the other elements which forfill LoGeoref30.</p><p>As you can see, the LoGeoRef-result for IfcSite in the example gets False. By definition, the result will only be true if one of the components of the stored coordinates in IfcAxis2Placement3D is greater than zero. Obviously a component greater than zero does not make the file automatically to a georeferenced one but this is a first indicator that there could be a georeferencing for this level. Clear statements could only be made by users through a critical reflection of the stored values.</p><h5 id="logeoref-40-results"><a name="logeoref-40-results" href="#logeoref-40-results"></a>LoGeoRef 40 results</h5><p>Example for the result of LoGeoRef 40 check:</p><pre><code data-origin="<pre><code>Project context attributes for georeferencing (Location: WorldCoordinateSystem / Rotation: TrueNorth)
-------------------------------------------------------------------------------------------------------
Project Context element: #62= IfcGeometricRepresentationContext
Placement referenced in #59= IfcAxis2Placement3D
X = 0
Y = 0
Z = 0
Rotation X-axis = (1/0/0)
Rotation Z-axis = (0/0/1)
TrueNorth referenced in #60 = IfcDirection
X-component = -0.537299608347
Y-component = -0.843391445813
LoGeoRef 40 = False
</code></pre>">Project context attributes for georeferencing (Location: WorldCoordinateSystem / Rotation: TrueNorth)
-------------------------------------------------------------------------------------------------------
Project Context element: #62= IfcGeometricRepresentationContext
Placement referenced in #59= IfcAxis2Placement3D
X = 0
Y = 0
Z = 0
Rotation X-axis = (1/0/0)
Rotation Z-axis = (0/0/1)
TrueNorth referenced in #60 = IfcDirection
X-component = -0.537299608347
Y-component = -0.843391445813
LoGeoRef 40 = False
</code></pre><p>This check dedicates itself the examination of the WordlCoordinateSystem and the TrueNorth attributes of the project model context in an IFC-file. At first, the tool will pick out the mandatory IfcGeometricRepresentationContext object with type “Model” in the file. This context sets the coordinate system of the model view of a project. Its location is stored in the WorldCoordinateSystem´s placement object. Similarly to the previous level this coordinate system will be set up via X,Y and Z as location and optional with rotation of X- and Z-axis.</p><p>In addition the tool will analyse the values in the TrueNorth attribute for checking of an applied rotation of the XY-plane towards TrueNorth.</p><p>If the logfile contains a second object for LoGeoRef40, that will be an optionally written Context for the plan view of the project. If values will be changed both of them should get the same values.</p><p>Please consider that the result value only will be true if one of the locations coordinate components will be greater than zero again. Reasons for that are similar to the statements at the previous level. </p><h5 id="logeoref-50-results"><a name="logeoref-50-results" href="#logeoref-50-results"></a>LoGeoRef 50 results</h5><p>The positive results for LoGeoRef 50 check will look like this:</p><pre><code data-origin="<pre><code>Specific entities for georeferencing (only in scope of IFC4; IfcMapConversion references IfcGeometricRepresenationContext)
-------------------------------------------------------------------------------------------------------------------------
Project Context element which is referenced by IfcMapConversion: #100011= IfcGeometricRepresentationContext
MapConversion element: #79141=IfcMapConversion
Translation:
Translation Eastings: 3458715.92
Translation Northings: 5439966.65
Translation Height: 113.7
Rotation X-axis (Abscissa): 0.270600445976
Rotation X-axis (Ordinate): 0.962691746426
Scale: 1
CRS element: #79139=IfcProjectedCRS
Name: EPSG:31467
Description: DHDN / 3-Degree Gauss-Krueger Zone 3
Geodetic Datum: ETRS89
Vertical Datum:
Projection Name: Gaus-Krueger
Projection Zone: 3
LoGeoRef 50 = True
</code></pre>">Specific entities for georeferencing (only in scope of IFC4; IfcMapConversion references IfcGeometricRepresenationContext)
-------------------------------------------------------------------------------------------------------------------------
Project Context element which is referenced by IfcMapConversion: #100011= IfcGeometricRepresentationContext
MapConversion element: #79141=IfcMapConversion
Translation:
Translation Eastings: 3458715.92
Translation Northings: 5439966.65
Translation Height: 113.7
Rotation X-axis (Abscissa): 0.270600445976
Rotation X-axis (Ordinate): 0.962691746426
Scale: 1
CRS element: #79139=IfcProjectedCRS
Name: EPSG:31467
Description: DHDN / 3-Degree Gauss-Krueger Zone 3
Geodetic Datum: ETRS89
Vertical Datum:
Projection Name: Gaus-Krueger
Projection Zone: 3
LoGeoRef 50 = True
</code></pre><p>The example shows the output if an IfcMapConversion applied to the examined IFC-file. Please consider that this level could only be true if you check an IFC-file written in respect to IFC schema version 4 or later. The checking tool will look for an element of IfcMapConversion in the file. As a second constraint for a true result its source and target attributes must forfill the conditions of LoGeoref 50 (see the UML diagram in the concept section).</p><p>Please consider that the validity of the written data is in the mission of the user or rather of the exporting BIM software that is used for exporting IFC-files.</p><h3 id="structure-of-the-resulting-json-file"><a name="structure-of-the-resulting-json-file" href="#structure-of-the-resulting-json-file"></a>Structure of the resulting JSON file</h3><p>As a possibility to store the GeoRef data in a machine readable way outside the specific IFC-file the application provides an export in JSON format. The style of an resulting JSON file is pretty much similar to the described log file above.</p><p>Every JSON GeoRef export contains one overall object with initial attributes for the assignment to the specific project in the IFC-file which was the source of the GeoRef data. So there are attributes with values for the GlobalID of the IfcProject instance and Date/Time values which shows the creation date of the assigned IFC-file and when the IFC-file was checked by this application. For better interpretation of the GeoRef data the JSON file also stores the IfcSchemaVersion.</p><p>Below that part there are attributes for each Level of GeoRef. The data of the certain GeoRef-object is stored in an array. There can be more than one values for each level, e.g. if more than one referenced address was found. </p><pre class="json hljs"><code class="Json" data-origin="<pre><code class="Json">{
"GlobalID": "344O7vICcwH8qAEnwJDjSU",
"IFCSchema": "Ifc4",
"TimeCreation": "2018-02-12T12:36:08",
"TimeCheck": "2018-08-28T12:02:03",
"LengthUnit": "m",
"LoGeoRef10": [ {} ],
"LoGeoRef20": [
{
"GeoRef20": true,
"Instance_Object": [
"#101",
"IfcSite"
],
"Latitude": 52.15,
"Longitude": 5.3833333333333337,
"Elevation": 20.0
}
],
</code></pre>">{
"<span class="hljs-attribute">GlobalID</span>": <span class="hljs-value"><span class="hljs-string">"344O7vICcwH8qAEnwJDjSU"</span></span>,
"<span class="hljs-attribute">IFCSchema</span>": <span class="hljs-value"><span class="hljs-string">"Ifc4"</span></span>,
"<span class="hljs-attribute">TimeCreation</span>": <span class="hljs-value"><span class="hljs-string">"2018-02-12T12:36:08"</span></span>,
"<span class="hljs-attribute">TimeCheck</span>": <span class="hljs-value"><span class="hljs-string">"2018-08-28T12:02:03"</span></span>,
"<span class="hljs-attribute">LengthUnit</span>": <span class="hljs-value"><span class="hljs-string">"m"</span></span>,
"<span class="hljs-attribute">LoGeoRef10</span>": <span class="hljs-value">[ {} ]</span>,
"<span class="hljs-attribute">LoGeoRef20</span>": <span class="hljs-value">[
{
"<span class="hljs-attribute">GeoRef20</span>": <span class="hljs-value"><span class="hljs-literal">true</span></span>,
"<span class="hljs-attribute">Instance_Object</span>": <span class="hljs-value">[
<span class="hljs-string">"#101"</span>,
<span class="hljs-string">"IfcSite"</span>
]</span>,
"<span class="hljs-attribute">Latitude</span>": <span class="hljs-value"><span class="hljs-number">52.15</span></span>,
"<span class="hljs-attribute">Longitude</span>": <span class="hljs-value"><span class="hljs-number">5.3833333333333337</span></span>,
"<span class="hljs-attribute">Elevation</span>": <span class="hljs-value"><span class="hljs-number">20.0</span>
</span>}
]</span>,
</code></pre><p>Each level value contains the data provided by the IfcGeoRefChecker. One can access the data while looping through the arrays of the certain level at first. Given the fact that there could be more than one value per level each level object also stores data for reference and instance object. Those values contain data for identification of the entities in the related IFC-file. They are the number of each IFC instance together with the hash symbol like it is stored in the IFC-file, e.g “#114”. As a second value reference and instance object also contain the type of the IfcObject, e.g. “IfcSite”. Reference objects are always objects with a own IfcGloballyID. Certain GeoRef values applies to this object. Instance objects are Ifc instances which either contain the stored data directly or reference them at a deeper level in the file. Please consider that an exported JSON file also contains GeoRef objects which has no data. In this case there exists an reference object but no instance object with IFC hashnumber. Often Georef data is not completely stored in an IFC file. The resulting JSON file contains for this elements either “n/a” for string objects or the phantastic value “-999999” for double values.</p><h3 id="georefupdate-functionality"><a name="georefupdate-functionality" href="#georefupdate-functionality"></a>GeoRefUpdate functionality</h3><p>As an main extension to the IfcGeoRefChecker functionality this application offers the possibility to change GeoRef data in the IFC file.<br>There are two main ways to update georeferencing for your IFC file. You can reach them in the “Update/change GeoRef” area.</p><h4 id="first-option:-edit-manually"><a name="first-option:-edit-manually" href="#first-option:-edit-manually"></a>First option: edit manually</h4><p>You can update your file manually. That means to set the required attributes via textbox input.<br>Via click on “..via manual setup” a window for the input data wil appear:</p><p><img src="pic/manualUpdate_1.png" alt="GeoRefUpdater"></p><p>There is no IFC knowledge required. You have the options to update simply the “Postal address”, to set a rough georeferencing via “Geograpic site coordinates” or to define a “Projected transformation” with translation and rotation as well as defining the CRS via EPSG-Code.<br>Depending on the export settings later on the transformation parameters will normally define the transformation between your local BIM/CAD coordinate system and the geodetic (or engineering) CRS at the project base point.</p><p>Via click on “Save and Close” the input will be saved internally for the later IFC export.<br>Clicking on “Calculate” will calculate the “Projected transformation”, if the position and rotation in “Geographic site coordinates” is given and checked, or vice versa. Keep in mind that this automated calculation only supports UTM projection in its projected transformation.</p><h4 id="second-option:-edit-via-map"><a name="second-option:-edit-via-map" href="#second-option:-edit-via-map"></a>Second option: edit via map</h4><p>The process will be started vie click on “…via browser map” button.</p><p>At first IfcGeorefChecker will calculate the building perimeter out of the wall geometry of your IFC model. Please note that storing of geometry in IFC has a wide range of possibilities. Therefore it could be possible that the calculation will be failed. Please contact us if this will happen!</p><p>After calculation the building perimeter will be written to a json file which you should store at a known location in yout file system.</p><p>The next step will take place externally in your local setted browser. The browser application “Building Locator” will be loaded automatically. Please make sure that you are connected to the Internet.</p><p><img src="pic/GeoRefChecker_Locator.png" alt="Building Locator"></p><p>The Building Locator allows us to change the georef of your building. You are now able to translate and rotate the building in the browser window. In addition you could determine the postal address at the chosen position automatically or via text input.<br>Please follow the steps which are displayed.</p><p>As result there will be a new json file with the updated georeferencing attributes. This file is the base for the next step in the IfcGeoRefChecker.</p><h3 id="export-changes-to-ifc"><a name="export-changes-to-ifc" href="#export-changes-to-ifc"></a>Export changes to IFC</h3><p>After updating georeferencing attributes via map or manually you need to export this to a new IFC file.</p><p>Via click on “Export Updates to IFC” you need to import the updated georef json file which you have stored in the step before.</p><p>After that a window will be opened with some options for IFC export. Because of the various understanding of georeferencing and also the different IFC schema versions it is indispensable to choose some export settings for your export.</p><p>The export window looks like this:</p><p><img src="pic/exportUpdate.png" alt="GeoRefUpdater"></p><p>Using the default settings, the application exports georeferencing attributes such as the latest IFC standard it requests. Unfortunetaly not all BIM software is able to read this attributes from the IFC file.<br>We recommend to test the different options and import the resulting files in your BIM environment to find out which option suits your needs as best. </p><p>Beside the export type it is also possible to make adjustments to address export (only building or site/building) and to type in a height reference (if not specified before).</p><p>If finished you can export the data to IFC via “Export to IFC” button.</p><h3 id="extended-export-to-ifc-(only-for-ifc-experts-recommended)"><a name="extended-export-to-ifc-(only-for-ifc-experts-recommended)" href="#extended-export-to-ifc-(only-for-ifc-experts-recommended)"></a>Extended export to IFC (only for IFC experts recommended)</h3><p>At last there is another functionality to influence the georeferencing export to IFC in a more direct way.<br>Via click on “edit IFC” a window will appear where you can change the georeferencing attributes regarding their IFC entities. The window is similar to the update functionality in the last IfcGeoRefChecker-version and should only be used if you are familiar with the IFC schema.</p><p><img src="pic/GeoRefUpdater_GUI4_v3.png" alt="GeoRefUpdater"></p><p>The GUI contains tabs for each GeoRef. Each tab is built up in a similar way. There are always groupboxes for “Georeferencing applied to…” and “Content”. The first groupbox contains the instance to which entity the specific georeferencing attributes in the Content groupbox apply.</p><p>If finished you can export the data to IFC via “Export to IFC” button. </p><h4 id="further-remarks"><a name="further-remarks" href="#further-remarks"></a>Further remarks</h4><ul>
<li>In the resulting IFC old instance entites will not be deleted but their reference will be set to the new instance. The reason for that is that it cannot be ruled out if, e.g. an CartesianPoint, is referenced by another entity with no georeferencing pupose, e.g. for geometry entities.</li></ul><h4 id="best-practice"><a name="best-practice" href="#best-practice"></a>Best practice</h4><p>In practice there could be misunderstandings of the certain attributes which are possible for georeferencing. The Level of Georeferencing concept describes those possible ways. An correct use according to the IFC schema with Level 40 or Level 50 attributes does unfortunately not automatically mean that each BIM-software interpretes that data correctly.</p><p>Consequently the IfcGeoRefUpdater can not guarantee correct interpretation in various software products. Some tests have shown that georeferencing of IFC-files is handled in different ways by software. In building construction software often the site placement according to Level 30 is used for the purpose of global metric coordinates. However it is not possible to derive an overall statement for that. Each user is responsible her/himself to use the update tool in a correct manner.</p><p>Nevertheless, here are some hints:</p><ol>
<li>Export an IFC-file from your BIM-software, where you know, that the project is correctly georeferenced for your purpose.</li><li>Check georeferencing of the resulting IFC-file with IfcGeoRefChecker. Now you can see which GeoRef attributes will be used by your exporting software.</li><li>For future projects you should fill or update only those attributes if you will use the certain IFC model in your BIM-software.</li></ol><p>This could be also helpful if you get an IFC-file which is exported by an other BIM-software which then again uses other georeferencing attributes. The IfcGeoRefUpdater helps you to change the attributes for your software.</p><p>Some remarks on different software:</p><h5 id="revit:"><a name="revit:" href="#revit:"></a>Revit:</h5><p>If you want to use the ifc data with correct coordinates in Revit it is important to place the “project base point” at the desired location (same as LoGeoRef30 position of IfcSite) before importing the generated Ifc file in Revit. Revit currently doesn’t interpret the IfcMapConversion property (LoGeoRef50).</p><h5 id="solibri:"><a name="solibri:" href="#solibri:"></a>Solibri:</h5><p>Free Solibri software solutions (Solibri Model Viewer / Solibri Anywhere) generally import almost all IFC information according to LoGeoRef 10 to LoGeoRef30 correctly in it’s site information.</p><h3 id="georefcomparer"><a name="georefcomparer" href="#georefcomparer"></a>GeoRefComparer</h3><p>The compare tool is another extension to the IfcGeoRefChecker. It offers functionality to compare a bundle of IFC-files with one main/ reference IFC-file regarding their georeferencing content.</p><p><img src="pic/GeoRefComparer_GUI1.png" alt="GeoRefComparer"></p><p>Please note that the comparer requires at least two imported Ifc-files in the listbox at the main window (IfcGeoRefChecker).</p><h4 id="proposed-way-to-compare-georeferencing"><a name="proposed-way-to-compare-georeferencing" href="#proposed-way-to-compare-georeferencing"></a>Proposed way to compare georeferencing</h4><ol>
<li>(Import at least 2 IFC-files at Main Window)</li><li>Start IfcGeoRefComparer via Click on related button in IfcGeorefChecker Window</li><li>Choose reference model in combobox</li><li>Select the models which should be compared to the reference model</li><li>Click on “StartComparison” </li></ol><h4 id="current-restrictions"><a name="current-restrictions" href="#current-restrictions"></a>Current restrictions</h4><p>The comparer does currently not support multidimensional data at Level of GeoRef tier. That means that only one IfcSite object will be examined at Level 10, 20 and 30. Buildings will only be compared regarding their address. At Level 40 and 50 only the IfcGeometricRepresentationContext of the model view (3D view) will be compared.<br>The named restrictions should not influence most IFC-files in a negative way.</p><h4 id="outcome"><a name="outcome" href="#outcome"></a>Outcome</h4><p>As the result of the comparison the application writes automatically an logfile to the directory of the reference model. This logfile contains short statements regarding the result of the comparison between the reference model and each selected other model. If the georeferencing is not equal, there will be a hint at which level a difference was detected.</p><p>See example:</p><pre><code data-origin="<pre><code>Results of Comparison regarding Georeferencing for reference model: Haus_1.ifc
Comparison to SampleHouse.ifc_edit.ifc:
The georeferencing of the files is NOT equal.
A difference was detected at GeoRef20 (IfcSite Lat/Lon/Elevation)
A difference was detected at GeoRef30 (IfcSite Placement)
A difference was detected at GeoRef40 (IfcProject WCS/True North)
Comparison to Haus_1_TGA.ifc:
The georeferencing of the files is exactly equal.
</code></pre>">Results of Comparison regarding Georeferencing for reference model: Haus_1.ifc
Comparison to SampleHouse.ifc_edit.ifc:
The georeferencing of the files is NOT equal.
A difference was detected at GeoRef20 (IfcSite Lat/Lon/Elevation)
A difference was detected at GeoRef30 (IfcSite Placement)
A difference was detected at GeoRef40 (IfcProject WCS/True North)
Comparison to Haus_1_TGA.ifc:
The georeferencing of the files is exactly equal.
</code></pre><h3 id="checking-ifc-files-using-command-line-arguments"><a name="checking-ifc-files-using-command-line-arguments" href="#checking-ifc-files-using-command-line-arguments"></a>Checking IFC-files using command-line arguments</h3><p>As an alternative to the graphical user interface, it is possible to use the IFCGeoRefCheckerCommand.exe for checking the level of georeferencing of multiple IFC-files at once (and creating log- or json files that display the results).<br>For that, a *.json file is required, that contains the filepath and -name of the IFC-files to be checked, an output path and information wether log and/or json result files shall be created.<br>Such an input json file could look like this:</p><pre><code data-origin="<pre><code>{
"InputObjects":
[
{
"fileName": "D:\\Data\\IFCfiles\\TestObject1.ifc"
},
{
"fileName": "D:\\Data\\IFCfiles\\TestObject2.ifc"
},
{
"fileName": "D:\\Data\\IFCfiles\\TestObject3.ifc"
}
],
"outputDirectory": "D:\\Data\\Output",
"outLog": true,
"outJson": false
}
</code></pre>">{
"InputObjects":
[
{
"fileName": "D:\\Data\\IFCfiles\\TestObject1.ifc"
},
{
"fileName": "D:\\Data\\IFCfiles\\TestObject2.ifc"
},
{
"fileName": "D:\\Data\\IFCfiles\\TestObject3.ifc"
}
],
"outputDirectory": "D:\\Data\\Output",
"outLog": true,
"outJson": false
}
</code></pre><ul>
<li>“InputObjects” is a list object, that can contain any number of “fileName” string-objects. They contain paths and filenames of the IFC-files to be checked.</li><li>“outputdirectory” is also a string-object, that contains the path where the log- and json-files shall be created.</li><li>“outLog” and “outJson” contain boolean values that determine wether a logfile (*.txt) and/or a json file shall be created.</li></ul><p>Once the input.json file is ready you can use the console (cmd) to run the IFCGeoRefCheckerCommand.exe with the filepath of the input.json as a command line argument. For example:</p><pre><code data-origin="<pre><code>IFCGeoRefCheckerCommand.exe "D:\Data\input\Sample.json"
</code></pre>">IFCGeoRefCheckerCommand.exe "D:\Data\input\Sample.json"
</code></pre><h3 id="errors-that-may-occur"><a name="errors-that-may-occur" href="#errors-that-may-occur"></a>Errors that may occur</h3><p><strong>While File Import (1):</strong></p><ul>
<li>Possible reason: bad syntax errors in IFC-file </li><li>Proposed solution: check IFC-file for valid syntax with an appropriate tool (e.g. FZKViewer from KIT)</li></ul><p><strong>While File Import (2):</strong></p><ul>
<li>Possible reason: IfcSchemaVersion outside XBIM functionality (not IFC2X3, IFC4 or IFC4x1)</li><li>Proposed solution: not in scope, but maybe dirty hack in IFC-file helps: change FILE SCHEMA in Header Section to IFC2X3, IFC4 or IFC4X1</li></ul><p><strong>While GeoRef Check:</strong></p><ul>
<li>Description: no error, but fields in tab are empty</li><li>Possible reason: IFC-file does not contain reference objects -> if it occurs syntax is not valid against IFC schema </li><li>Proposed solution: ignore or new export in originating software</li></ul><p><strong>While GeoRef Compare:</strong></p><ul>
<li>Description: “Index out of range” exception occurs </li><li>Possible reason: IFC-file does not contain reference objects -> if it occurs syntax is not valid against IFC schema </li><li>Proposed solution: ignore or new export in originating software (nevertheless Comparison-file will be written)</li></ul><p><strong>While Opening Log and/or JSON files:</strong></p><ul>
<li>Possible reason: no standard program for .txt and/or .json files is set in your system</li><li>Proposed solution: set a standard program for opening of .txt and/or .json files, e. g. editor</li></ul><h2 id="built-with"><a name="built-with" href="#built-with"></a>Built with</h2><ul>
<li><a href="http://docs.xbim.net/">xBIM Toolkit</a> - Main functionality used to read IFC-files</li><li><a href="https://www.newtonsoft.com/json">Json.NET</a> - Functionality for exporting JSON-files</li><li><a href="https://pixabay.com/">Pixabay</a> - Graphics used to design LoGeoRef-Icons</li></ul><h2 id="contributors"><a name="contributors" href="#contributors"></a>Contributors</h2><p>The concept together with the tool was developed within the scope of the following sponsorship projects:</p><table>
<thead>
<tr>
<th>3D-Punktwolke - CityBIM</th>
<th>Digitalisierung des Bauwesens - DD BIM</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="pic/BMWi_4C_Gef_en.jpg" align="center" style="width: 200px;"></td>
<td>Supported by: <br> <img src="pic/DD-BIM-LOGO.png" style="width: 250px;"> <br> Landeshauptstadt Dresden <br>Amt für Wirtschaftsförderung</td>
</tr>
</tbody>
</table><h2 id="contact"><a name="contact" href="#contact"></a>Contact</h2><p> <img src="pic/logo_htwdd.jpg" align="center" style="width: 300px;"> </p><p><strong>HTW Dresden</strong><br><strong>Fakultät Geoinformation</strong><br>Friedrich-List-Platz 1<br>01069 Dresden</p><p>Project head:</p><ul>
<li>Prof. Dr.-Ing. Christian Clemen (<a href="mailto:[email protected]">[email protected]</a>)</li></ul><p>Project staff:</p><ul>
<li>Hendrik Görne, M.Eng. (<a href="mailto:[email protected]">[email protected]</a>)</li><li>Tim Kaiser, M.Eng.</li><li>Enrico Romanschek, M.Eng.</li></ul><h2 id="license"><a name="license" href="#license"></a>License</h2><p>This project is licensed under the MIT License:</p><pre><code data-origin="<pre><code>Copyright (c) 2018 HTW Dresden
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</code></pre>">Copyright (c) 2018 HTW Dresden
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</code></pre>
<footer style="position:fixed; font-size:.8em; text-align:right; bottom:0px; margin-left:-25px; height:20px; width:100%;">generated by <a href="http://pad.haroopress.com" target="_blank">haroopad</a></footer>
</body>
</html>