Newer
Older
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
// jshint esversion: 6
export function label(blm, params, camera, THREE) {
const widthHalf = window.innerWidth / 2, heightHalf = window.innerHeight / 2;
if (blm[params.blm].obj.length) $('.blm.'+params.blm).each(function(i, obj) {
const id = $(this)[0].id;
if (typeof blm[params.blm].tag[id] != 'undefined' && typeof blm[params.blm].obj[i] != 'undefined') {
const pos = blm[params.blm].obj[i].position.clone();
pos.project(camera);
const frustum = new THREE.Frustum();
const matrix = new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
frustum.setFromProjectionMatrix(matrix);
const dist = Math.abs(camera.position.x-blm[params.blm].tag[id].position.x)+Math.abs(camera.position.y-blm[params.blm].tag[id].position.y)+Math.abs(camera.position.z-blm[params.blm].tag[$(this)[0].id].position.z);
document.getElementById(id).style.display = (frustum.containsPoint(blm[params.blm].tag[id].position) && dist>140 && dist<25000*params.highlightScale)? 'block': 'none';
document.getElementById(id).style.top = (-(pos.y * heightHalf) + heightHalf - 20)+'px';
const val = typeof blm[params.blm].val[blm[params.blm].map[i]] == 'undefined'? '???': blm[params.blm].val[blm[params.blm].map[i]].toPrecision(3);
document.getElementById(id).innerHTML = id+': <span class="blmVal">'+val+'</span>';
if (blm[params.blm].dir[i]>0) document.getElementById(id).style.left = ((pos.x * widthHalf ) + widthHalf + 35)+'px'; else document.getElementById(id).style.right = (widthHalf - (pos.x * widthHalf ) + 35)+'px';
}
});
}
export function menu(lattice, facilities, params, gui, blm, componentCreator) {
params.blm = '';
if (document.location.search.indexOf('blm')>-1) {params.blm = document.location.search.indexOf('blm'); myswitch(blm, params, componentCreator);}
gui.add(params, 'blm', facilities).onChange(function() {myswitch(blm, params, componentCreator);});
for (let f in facilities) {
const b = facilities[f];
if (b=='') continue;
console.log('blmMenu() - ',b);
blm[b] = {map: [], dir: [], tag: {}, val: [], obj: [], confsrc: lattice[b].blm.confsrc, datasrc: lattice[b].blm.datasrc, skip: lattice[b].blm.skip};
fetch(lattice[b].blm.confsrc)
.then((response) => {return response.json();})
.then((blmData) => {
let blmCounter = 0;
let photoCounter = 0;
for (let i in blmData) {
if (!blmData[i] || blmData[i].indexOf('/')==-1) continue;
const name = blmData[i].split('/')[2].toUpperCase();
if (name.indexOf(blm[b].skip)>-1) continue;
for (let bl in blm[b].obj) {
if (name==blm[b].obj[bl].name.replace('BPM','BLM') || name=='BLM_'+blm[b].obj[bl].name) {blm[b].map[bl] = blmCounter; blmCounter++; break;}
}
}
});
}
}
export function myswitch(blm, params, componentCreator) {
if (blm.reader !== false) clearInterval(blm.reader);
blm.reader = false;
$('.blm').css('display', 'none');
if (typeof blm[blm.oldIndex] != 'undefined') for (let i=0; i<blm[blm.oldIndex].obj.length; i++) componentCreator.blmUpdate(blm[blm.oldIndex].obj[i], 0);
if (params.blm=='') {
$('#application').hide();
$('#applicationFrame').removeAttr("src");
}
else {
blm.oldIndex = params.blm;
read(blm, params);
blm.reader = setInterval(read, 1000, blm, params);
$('#application').show();
$('.blm.'+params.blm).css('display', 'block');
$('#applicationFrame').attr("src", "/spa/index.html?s=blm&src="+params.blm+(document.location.search.indexOf('demo')>-1? '&demo': ''));
$("#applicationFrame").height(window.innerHeight);
}
}
export function render(blm, params, componentCreator, camera, THREE) {
if (params.blm!='' && typeof blm[params.blm] !== 'undefined' && blm[params.blm].val != [] && blm[params.blm].map != [] && window.blmTime != blm.acqTime) {
console.log('blmRender()', params.blm, blm[params.blm].val, blm[params.blm].map, window.blmTime, blm.acqTime);
blm.acqTime = window.blmTime;
const blmMax = Math.max.apply(null, blm[params.blm].val.map(Math.abs)); // https://stackoverflow.com/questions/29515761/find-absolute-max-value-in-javascript-array
let blmPeak = (Math.log10(blmMax) + 2) * 5000;
blmPeak = blmPeak>20000? 20000: (blmPeak<2000? 2000: blmPeak);
const blmFactor = blmPeak/blmMax;
for (let i=0; i<blm[params.blm].obj.length; i++) {
componentCreator.blmUpdate(blm[params.blm].obj[i], blm[params.blm].val[blm[params.blm].map[i]], blm[params.blm].dir[i], 100, blmFactor);
}
}
if (params.blm) {label(blm, params, camera, THREE);}
}
export function read(blm, params) {
fetch(blm[params.blm].datasrc)
.then((response) => {return response.json();})
.then((eventData) => {
blm[params.blm].val = eventData;
window.blmTime = +new Date();
});
}
export function append(blm, facility, mycomp, direction) {
if (!blm[facility]) return;
if (mycomp.name.indexOf('PHOTO')==-1) {
blm[facility].obj.push(mycomp);
blm[facility].tag[mycomp.name] = mycomp;
blm[facility].dir.push(direction*(mycomp.name.indexOf('_R')==-1? 1: -1));
const div = document.createElement('div');
div.id = mycomp.name;
div.className = 'blm '+facility;
//div.style.cssText = 'position: absolute; color: white; display: none;';
div.style.cssText = 'position: absolute; color: white;';
div.innerHTML = mycomp.name;
document.body.appendChild(div);
}
}