diff --git a/panther.js b/panther.js index 105ba7a74010954b3010eb368cc97c2647376809..bb6957623e38d58934e8afcf08d522de475120a0 100644 --- a/panther.js +++ b/panther.js @@ -134,11 +134,12 @@ } window.bpmreference = bpm_reference; function updateBpm(data, facility) { - // console.log('updateBpm(), data:', data, ', facility:', facility, ', bpmMesh', bpmMesh); + console.log('updateBpm(), data:', data, ', facility:', facility, ', bpmMesh', bpmMesh); bpmData[facility] = data; bpmMesh[facility].geometry.dispose(); bpmIndex[facility] = lattice[facility].bpm.offset; const path = bpmPath(data, facility); + console.log('updateBpm(), data:', data, ', facility:', facility, ', bpmMesh', bpmMesh, 'path', path); const len = lattice[facility].bpm.length-1-(typeof lattice[facility].bpm.skip=='undefined'? 0: lattice[facility].bpm.skip.length); const bpmGeometry = new THREE.TubeGeometry(path, len, bpm.radius, 16, (typeof lattice[facility].sections[0].chamber)!='undefined'); bpmMesh[facility].geometry = bpmGeometry.clone(); @@ -164,7 +165,7 @@ // console.log(bpmfreq); } }) - .catch(error => {console.log("Fetch error", error);}); + .catch(error => {console.log("Fetch error", error, conf.bpmUrl);}); } function bpmPath(data, facility) { let len = lattice[facility].bpm.length - bpmSkip[facility].length; @@ -174,16 +175,16 @@ const bpmFactor = conf.bpmFactor[facility]; for (let i=0; i<len; i++) { const j = (i + 1) % len; - const tx = bpmPoints[facility][i][0].x * (1+(data.Hor? data.Hor[j]*0.02*bpmFactor*params.bpmZoomX: 0)); - const ty = Ydefault + bpmPoints[facility][i][0].y + (data.Ver? data.Ver[j]*1000*bpmFactor*params.bpmZoomY: 0); - const tz = bpmPoints[facility][i][0].z * (1+(data.Hor? data.Hor[j]*0.02*bpmFactor*params.bpmZoomX: 0)); - bpmCurve.push(new THREE.Vector3(tx, ty, tz)); + const tx = bpmPoints[facility][i][0].x * (1+(data.Hor? data.Hor[j]*0.02*bpmFactor*params.bpmZoomH: 0)); + const ty = Ydefault + bpmPoints[facility][i][0].y + (data.Ver? data.Ver[j]*1000*bpmFactor*params.bpmZoomV: 0); + const tz = bpmPoints[facility][i][0].z * (1+(data.Hor? data.Hor[j]*0.02*bpmFactor*params.bpmZoomH: 0)); + if (!isNaN(tx) && !isNaN(ty) && !isNaN(tz)) bpmCurve.push(new THREE.Vector3(tx, ty, tz)); } - // console.log(facility, bpmCurve); + console.log(facility, bpmCurve); return new THREE.CatmullRomCurve3(bpmCurve); } let bpmInited = false; - const bpmTimeLen = 100; + const bpmTimeLen = 3; let bpmTimeIndex = 0; const bpmTimes = new Array(bpmTimeLen).fill(0); const bpmWait = document.location.search.indexOf('bpmWait=')>-1? document.location.search.split('bpmWait=')[1].split('&')[0]-0: 0; @@ -247,10 +248,10 @@ params.bpm = document.location.search.indexOf('&bpm')>-1 || document.location.search.indexOf('?bpm')>-1; gui.add(params, 'bpm').onChange(function() {toggleParam('bpm');}); if (params.bpm) { $('.controller.boolean:last').append('<input id="bpmfreq" type="text" spellcheck="false" aria-labelledby="lil-gui-name-6">'); - params.bpmZoomX = 1; - gui.add(params, 'bpmZoomX', 0.1, 10); - params.bpmZoomY = 1; - gui.add(params, 'bpmZoomY', 0.1, 10); + params.bpmZoomH = 1; + gui.add(params, 'bpmZoomH', 0.01, 100); + params.bpmZoomV = 1; + gui.add(params, 'bpmZoomV', 0.01, 100); params.bpmReference = '2GeV'; gui.add(params, 'bpmReference'); const ref = $('.name:contains("bpmReference")').parent().select('.widget').children().eq(1); @@ -663,8 +664,102 @@ addSelectedObject(selectedObject); outlinePass.selectedObjects = selectedObjects; } + let popupOn = false; if (navigator.userAgent.indexOf('Firefox/63')==-1) document.onclick = handleMouseMove; + if (navigator.userAgent.indexOf('Firefox/63')>-1 && document.location.search.indexOf('popup')>-1) document.addEventListener('click', handleClick); + function handleClick(event) { + // document.removeEventListener('click', handleClick); + console.log(event); + let j=1; + const debug = document.location.search.indexOf('debug=')>-1? document.location.search.split('debug=')[1].split('&')[0].split(','): ''; + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), event',event); + pointer.x = (event.clientX / window.innerWidth) * 2 - 1; + pointer.y = - ((28+event.clientY) / (window.innerHeight)) * 2 + 1; + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), pointer',pointer); + raycaster.setFromCamera(pointer, camera); + const intersects = raycaster.intersectObjects(scene.children); + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), intersects',intersects); + window.tooltipObject = tooltipObject = null; + document.getElementById('tooltipFrame').src = document.getElementById('compdb').href = ''; + document.getElementById('compdb').style.display = 'inline'; + document.getElementById('tooltip').style.display = 'none'; + document.getElementById('tooltipFrame').width = '500px'; + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), tooltipObject',tooltipObject); + if (!found) outlinePass.selectedObjects = selectedObjects = []; + found = false; + if (typeof intersects[0] == 'undefined') return; + let selectedObject = intersects[0].object.parent; + for (let i=intersects.length-1; i>=0; i--) { + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), i',i); + let visible = true; + let tobj = intersects[i].object; + // https://discourse.threejs.org/t/how-to-check-if-mesh-ancestor-is-visible-in-canvas/42494/5 + while (tobj !== scene) { + if (tobj.visible == false) visible = false; + tobj = tobj.parent; + } + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), tobj',tobj); + if (visible == false) continue; + // console.log("handleMouseMove()", event, intersects[i].object); + if (intersects[i].object.parent.name.length==0 && intersects[i].object.parent.parent.name.length==0) continue; + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), intersects[i].object',intersects[i].object); + if (intersects[i].object.parent.href) { + window.tooltipObject = tooltipObject = intersects[i].object.parent; + document.getElementById('tooltipFrame').src = demo? './magnetdemo.html?'+intersects[i].object.parent.href.split('?')[1]: intersects[i].object.parent.href; + document.getElementById('compdb').style.display = 'none'; + } + else if (intersects[i].object.href) { + window.tooltipObject = tooltipObject = intersects[i].object; + document.getElementById('tooltipFrame').src = demo? './magnetdemo.html?'+intersects[i].object.href.split('?')[1]: intersects[i].object.href; + document.getElementById('compdb').href = conf.compdb + intersects[i].object.name; + document.getElementById('compname').innerHTML = intersects[i].object.name; + } + else if (intersects[i].object.magnetType) { + window.tooltipObject = tooltipObject = intersects[i].object; + document.getElementById('tooltipFrame').src = conf.tooltipApp+'?s='+(demo? 'knobdemo': intersects[i].object.magnetType.replace('fast', '').replace('premium', ''))+'¶m='+intersects[i].object.name; + document.getElementById('compdb').href = conf.compdb+intersects[i].object.name; + document.getElementById('compname').innerHTML = intersects[i].object.name; + } + else if (intersects[i].object.parent.magnetType) { + window.tooltipObject = tooltipObject = intersects[i].object.parent; + document.getElementById('tooltipFrame').src = conf.tooltipApp+'?s='+(demo? 'knobdemo': intersects[i].object.parent.magnetType.replace('fast', '').replace('premium', ''))+'¶m='+intersects[i].object.parent.name; + document.getElementById('compdb').href = conf.compdb+intersects[i].object.parent.name; + document.getElementById('compname').innerHTML = intersects[i].object.parent.name; + } + else if (intersects[i].object.parent.parent.magnetType) { + document.getElementById('tooltipFrame').height = '320px'; + window.tooltipObject = tooltipObject = intersects[i].object.parent.parent; + selectedObject = intersects[i].object.parent.parent; + document.getElementById('tooltipFrame').src = conf.tooltipAppNormal+'?s='+(demo? 'knobdemo': intersects[i].object.parent.parent.magnetType.replace('fast', '').replace('premium', ''))+'¶m='+intersects[i].object.parent.parent.name; + document.getElementById('compdb').href = conf.compdb+intersects[i].object.parent.parent.name; + document.getElementById('compname').innerHTML = intersects[i].object.parent.parent.name; + } + else { + window.tooltipObject = tooltipObject = intersects[i].object.parent; + document.getElementById('tooltipFrame').src = conf.tooltipApp+'?s=label¶m='+intersects[i].object.parent.name; + document.getElementById('compdb').href = conf.compdb+intersects[i].object.parent.name; + document.getElementById('compname').innerHTML = intersects[i].object.parent.name; + } + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), src',document.getElementById('tooltipFrame').src, ', href',document.getElementById('compdb').href); + const name = document.getElementById('compname').innerHTML; + document.getElementById('compdb').removeAttribute("disabled"); + if (name.indexOf('_B')>-1 || name.indexOf('_P')>-1 || (name.indexOf('_S')>-1 && name.indexOf('_SFEL')==-1 && name.indexOf('_SP')==-1 && name.indexOf('_SC')==-1)) document.getElementById('compdb').setAttribute("disabled", true); + document.getElementById('compname').innerHTML = document.getElementById('compname').innerHTML.replace('RTBPM','BPM'); + document.getElementById('compdb').href = document.getElementById('compdb').href.replace('RTBPM','BPM').split(' ')[0].split('%')[0]; + if (document.getElementById('tooltipFrame').src.indexOf('?s=beamline')>-1) { + document.getElementById('compdb').href = 'http://adam.elettra.trieste.it/projects/blcs/beamwatch/'; + document.getElementById('compname').innerHTML = document.getElementById('compname').innerHTML + ' in ADAM Beamwatch'; + } + document.getElementById('tooltipFrame').src.replace('s=dipolefermi', 's=bending'); + } + console.log('handleMouseMove()', intersects, document.getElementById('tooltipFrame').src, selectedObject); + // if (selectedObject.parent && selectedObject.parent.type && selectedObject.parent.type == "Scene") return; // avoid selecting everything + checkOutline(selectedObject); + renderer.render(scene, camera); + if (debug.indexOf(''+j++)>-1) console.log('handleMouseMove(), compdb',document.getElementById("compdb")); + document.getElementById("compdb").addEventListener("click", compLink); // https://j11y.io/javascript/debug-jquery-events-with-listhandlers/ + } function handleMouseMove(event) { let j=1; const debug = document.location.search.indexOf('debug=')>-1? document.location.search.split('debug=')[1].split('&')[0].split(','): '';