From cb4956c3ad2f8511cd3aeec6ef0854a961d19ba2 Mon Sep 17 00:00:00 2001
From: Lucio Zambon <lucio.zambon@elettra.eu>
Date: Fri, 31 May 2024 02:00:02 +0000
Subject: [PATCH] Update panther.js

---
 panther.js | 119 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 107 insertions(+), 12 deletions(-)

diff --git a/panther.js b/panther.js
index 105ba7a..bb69576 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', ''))+'&param='+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', ''))+'&param='+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', ''))+'&param='+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&param='+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(','): '';
-- 
GitLab