From 71b9b7a1aec7cd4be4640f709a2096d9fe953c78 Mon Sep 17 00:00:00 2001
From: Lucio Zambon <lucio.zambon@elettra.eu>
Date: Mon, 13 Jan 2025 00:15:20 +0000
Subject: [PATCH] Update simulator2d.js

---
 simulator2d.js | 91 ++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 66 insertions(+), 25 deletions(-)

diff --git a/simulator2d.js b/simulator2d.js
index 5319ede..8ff9428 100644
--- a/simulator2d.js
+++ b/simulator2d.js
@@ -16,11 +16,12 @@
 		factorsHor = {"": 1000, "position": 5000, 'beta': 0.5, 'eta': 100, 'mu': 0.2, 'sigma': 5000000};
 		factorsVer = {"": 1000, "position": 5000, 'beta': 0.25, 'eta': 100, 'mu': 0.2, 'sigma': 5000000};
 	}
-	const simulator = document.location.search.indexOf('simulator=')>-1? document.location.search.split('simulator=')[1].split('&')[0]: '';
+	let simulator = document.location.search.indexOf('simulator=')>-1? document.location.search.split('simulator=')[1].split('&')[0]: '';
 	const readerPeriod = document.location.search.indexOf('readerPeriod=')>-1? document.location.search.split('readerPeriod=')[1].split('&')[0]: 200;
 	const displayerPeriod = document.location.search.indexOf('displayerPeriod=')>-1? document.location.search.split('displayerPeriod=')[1].split('&')[0]: 200;
 	const visibility = simulator==''? 'hidden': 'visible';
 	const scaleType = 'slider';
+	const simfacilities = [];
 	let simulatorDataHor = [];
 	let simulatorDataVer = [];
 	let scaleHor;
@@ -34,8 +35,14 @@
 	function myreference(param) {
 		const dir = param.split('_')[0];
 		const action = param.split('_')[1];
-		if (action=='set') localStorage.setItem('reference'+dir, JSON.stringify(dir=='hor'? simulatorDataHor: simulatorDataVer));
-		if (action=='clear') localStorage.removeItem('reference'+dir);
+		if (action=='set') {
+			localStorage.setItem('reference'+simulator+dir, JSON.stringify(simulatorBuffer[dir=='hor'? 'Hor': 'Ver']));
+			$("#sr_simulatorreference"+dir).attr('visibility', "visible");
+		}
+		if (action=='clear') {
+			localStorage.removeItem('reference'+simulator+dir);
+			$("#sr_simulatorreference"+dir).attr('visibility', "hidden");
+		}
 	}
 	function elapseHor(step, up) {
 		// console.log('elapseHor()',step,scaleHor.$fill.style.width, (scaleSteps-step)/scaleSteps*90);
@@ -58,14 +65,14 @@
 	}
 	function elapseVer(step, up) {
 		if (up) {
-			if (step<scaleSteps) {const pc = Math.round(100 - (scaleSteps-step)/scaleSteps*90); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 200, step+1, up); return;}
+			if (step<scaleSteps) {const pc = Math.round((scaleSteps-step)/scaleSteps*90); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 20, step+1, up); return;}
 			const buf = scaleVer._max; 
 			scaleVer.max(buf*10); 
 			scaleVer.min(buf/10); 
 			scaleVer.step(buf/100);
 		}
 		else {
-			if (step<scaleSteps) {const pc = Math.round(step/scaleSteps*10); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 200, step+1, up); return;}
+			if (step<scaleSteps) {const pc = Math.round(step/scaleSteps*10); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 20, step+1, up); return;}
 			const buf = scaleVer._max/10; 
 			scaleVer.max(buf); 
 			scaleVer.min(buf/100);
@@ -92,6 +99,7 @@
 		simulatorFactorHor = v * 1000;
 	}
 	function factorVer(v) {
+		console.log('factorVer(v)', v, scaleVer.$fill.style.width);
 		scaleVer.$fill.style.borderColor = (scaleVer.$fill.style.width=="100%" || scaleVer.$fill.style.width=="0%")? 'yellow': '#2cc9ff';
 		simulatorFactorVer = v * 1000;
 	}
@@ -99,18 +107,9 @@
 		if (dirNum==0) logScaleHor = $('#logHor').attr('checked')=='checked';
 		else logScaleVer = $('#logVer').attr('checked')=='checked';
 	}
-	function decademinus(id) {
-		const buf = scaleHor._max/10; scaleHor.max(buf); scaleHor.min(buf/100);scaleHor.step(buf/1000);
-		console.log(id, scaleHor._max);
-	}
-	function decadeplus(id) {
-		const buf = scaleHor._max; scaleHor.max(buf*10); scaleHor.min(buf/10); scaleHor.step(buf/100);
-		console.log(id, scaleHor._max);
-	}
 	function guiscale(gui, id) {
 		const i = gui.children.length - 1;
 		gui.children[i].domElement.style.display = 'none';
-		// gui.children[i].domElement.children[0].innerHTML = '<span style="padding: 5px;" onClick="decademinus(\''+id+'\')">-</span> '+ gui.children[i].domElement.children[0].innerHTML + ' <span style="padding: 3px;" onClick="decadeplus(\''+id+'\')">+</span>';
 		gui.children[i].domElement.setAttribute('id', id);
 	}
 	function simulatorMenu(lattice, facilities, params) {
@@ -133,7 +132,7 @@
 			scaleHor = gui.add(menuParams, 'scale H', maxVer/100, maxVer, Math.round(maxVer/1000)).onChange(function() {factorHor(menuParams['scale H'], gui);}).onFinishChange(function() {finishHor(gui);});
 			guiscale(gui, 'scaleh');
 			menuParams['scale V'] = simulatorFactorHor/1000;
-			scaleVer = gui.add(menuParams, 'scale V', maxHor/100, maxHor, Math.round(maxHor/1000)).onChange(function() {factorVer(menuParams['scale V'], gui);});
+			scaleVer = gui.add(menuParams, 'scale V', maxHor/100, maxHor, Math.round(maxHor/1000)).onChange(function() {factorVer(menuParams['scale V'], gui);}).onFinishChange(function() {finishVer(gui);});
 			guiscale(gui, 'scalev');
 		}
 		else {
@@ -187,10 +186,10 @@
 								  Math.round(compData[facility].pos[i][1] + f*1.05*Math.cos(beta))
 							);
 						}
-						appendSvg("path", {id:facility+"_simulatorhor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorhor", fill: "none", "stroke-width":"150", "stroke":"red", "stroke-opacity":"0.8", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_hor, false, false, '.svg-pan-zoom_viewport');
-						appendSvg("path", {id:facility+"_simulatorreferencehor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorreferencehor", fill: "none", "stroke-width":"150", "stroke":"darkred", "stroke-opacity":"0.8", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_hor, false, false, '.svg-pan-zoom_viewport');
-						appendSvg("path", {id:facility+"_simulatorver", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorver", fill: "none", "stroke-width":"150", "stroke":"green", "stroke-opacity":"0.8", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_ver, false, false, '.svg-pan-zoom_viewport');
-						appendSvg("path", {id:facility+"_simulatorreferencever", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorreferencever", fill: "none", "stroke-width":"150", "stroke":"darkgreen", "stroke-opacity":"0.8", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_ver, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorhor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorhor", fill: "none", "stroke-width":"150", "stroke":"red", "stroke-opacity":"0.6", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_hor, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorreferencehor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorreferencehor", fill: "none", "stroke-width":"150", "stroke":"darkred", "stroke-opacity":"0.9", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_hor, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorver", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorver", fill: "none", "stroke-width":"150", "stroke":"limegreen", "stroke-opacity":"0.6", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_ver, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorreferencever", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorreferencever", fill: "none", "stroke-width":"150", "stroke":"darkgreen", "stroke-opacity":"0.9", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_ver, false, false, '.svg-pan-zoom_viewport');
 						// console.log("path", {id:facility+"_simulatorhor", name:"simulatorhor", d: dver.join(' ')+' Z'});
 					}
 				}
@@ -210,12 +209,33 @@
 	}
 	function simulator2d(lattice, params) {
 		console.log('simulator2d',lattice, params);
-		const facilities = [];
-		for (let i in lattice) {if (i!='conf') facilities.push(i);}
-		simulatorMenu(lattice, facilities, params);
+		for (let i in lattice) {if (i!='conf') simfacilities.push(i);}
+		simulatorMenu(lattice, simfacilities, params);
+	}
+	if (document.location.search.indexOf('ruler')>-1) {
+		const main = document.getElementById('main');
+		main.style.cursor = 'crosshair';
+		// main.addEventListener(measurementEvent, measurementListener, false);
+		main.addEventListener('mousemove', function(e) {getRulerPosition(main, e);});
+		rulerSwitch(500, 500);
+	}
+	function getRulerPosition(main, event) {
+		const rect = main.getBoundingClientRect();
+		const x = event.clientX - rect.left;
+		const y = event.clientY - rect.top;
+		$('#ruler1').attr('transform', 'translate('+ ((x - panZoomPanther.getPan().x)/panZoomPanther.getSizes().realZoom)+' '+((y - panZoomPanther.getPan().y)/panZoomPanther.getSizes().realZoom)+')');
+	}
+	function rulerSwitch(cx, cy) {
+		appendSvg("line", {id: 'ruler1', x1: cx, y1: cy, x2: cx+1000, y2: cy, style:"display: block", stroke:"yellow", "stroke-width":100});
+		/*for (let i=1; i<32; i++) {
+			appendSvg("line", {id: 'tick'+i, x1: cx, y1: cy, x2: cx, y2: cy, style:"display: block", fill:"yellow", stroke:"black","stroke-width":1});
+			appendSvg("text", {id: 'tickLabel'+i, x: cx, y: cy, fill:"white", stroke:"black","stroke-width":1, "font-family":"Arial", "font-size":20, "font-weight":"bold", "text-anchor": "start"});
+		}*/
 	}
 	function simulatorSwitch(simulatorData, params) {
-		console.log('simulatorSwitch()',simulatorData, params, params.simulator);
+		simulator = params.simulator;
+		$("#sr_simulatorreferencehor").attr('visibility', "hidden");
+		$("#sr_simulatorreferencever").attr('visibility', "hidden");
 		scaleHor.$fill.style.width = "50%";
 		scaleVer.$fill.style.width = "50%";
 		if (simulatorData.reader !== false) {
@@ -223,11 +243,9 @@
 		}
 		simulatorData.reader = false;
 		if (params.simulator=='position') {
-			$('#application').show();
 			$('#applicationFrame').attr("src", $('#applicationFrame').attr("data-src"));
 		}
 		else {
-			$('#application').hide();
 			$('#applicationFrame').removeAttr("src");
 		}
 		if (params.simulator=='') {
@@ -235,14 +253,18 @@
 				if (typeof $('#'+facility+"_simulatorhor").attr('visibility') != 'undefined') {
 					$('#'+facility+"_simulatorhor").attr('visibility', "hidden");
 					$('#'+facility+"_simulatorver").attr('visibility', "hidden");
+					$('#'+facility+"_simulatorreferencehor").attr('visibility', "hidden");
+					$('#'+facility+"_simulatorreferencever").attr('visibility', "hidden");
 				}
 			}
 			$('.simulatorgauge').hide();
 			$('#scaleh').hide();
 			$('#scalev').hide();
+			$('#application').hide();
 			$('#applicationReference').hide();
 		} 
 		else {
+			$('#application').show();
 			$('#applicationReference').show();
 			$('#scaleh').show();
 			$('#scalev').show();
@@ -250,6 +272,8 @@
 				if (typeof $('#'+facility+"_simulatorhor").attr('visibility') != 'undefined') {
 					$('#'+facility+"_simulatorhor").attr('visibility', "visible");
 					$('#'+facility+"_simulatorver").attr('visibility', "visible");
+					if (localStorage.getItem('reference'+simulator+'hor')!=null) $('#'+facility+"_simulatorreferencehor").attr('visibility', "visible");
+					if (localStorage.getItem('reference'+simulator+'ver')!=null) $('#'+facility+"_simulatorreferencever").attr('visibility', "visible");
 				}
 				// console.log('#'+facility+"_simulatorhor", $('#'+facility+"_simulatorhor").attr('visibility'), typeof simulatorData[facility]);
 				if (typeof simulatorData[facility] == 'undefined' || typeof simulatorData[facility].map == 'undefined') continue;
@@ -295,6 +319,11 @@
 		// console.log('simulatorRender(), val', val, simulator, compData[facility]);
 		simulatorDataHor = [];
 		simulatorDataVer = [];
+		let refHor, refVer;
+		const referenceDataHor = [];
+		const referenceDataVer = [];
+		const referencehor = JSON.parse(localStorage.getItem('reference'+simulator+'hor'));
+		const referencever = JSON.parse(localStorage.getItem('reference'+simulator+'ver'));
 		if (val.Hor) {
 			for (i=0; i<val.Hor.length; i++) {
 				if (typeof compData[facility].map[i] == 'undefined') continue;
@@ -305,20 +334,32 @@
 				const beta = Math.PI*compData[facility].dir[j]/180;
 				// https://en.wikipedia.org/wiki/Logarithmic_scale#Extensions
 				const valHor = logScaleHor? Math.sign(val.Hor[i])*Math.log10(1+ Math.abs(val.Hor[i]*Math.LN10)): val.Hor[i];
+				if (localStorage.getItem('reference'+simulator+'hor')!=null) refHor = logScaleHor? Math.sign(referencehor[i])*Math.log10(1+ Math.abs(referencehor[i]*Math.LN10)): referencehor[i];
 				const valVer = logScaleVer? Math.sign(val.Ver[i])*Math.log10(1+ Math.abs(val.Ver[i]*Math.LN10)): val.Ver[i];
+				if (localStorage.getItem('reference'+simulator+'ver')!=null) refVer = logScaleVer? Math.sign(referencever[i])*Math.log10(1+ Math.abs(referencever[i]*Math.LN10)): referencever[i];
 				// if (i<20) console.log('i', i, 'pos',pos, 'dir', compData[facility].dir[i], 'facility', facility, beta, Math.cos(beta), Math.sin(beta));
 				simulatorDataHor.push((simulatorDataHor.length==0?'M':'L')+ 
 					Math.round(pos[0] - valHor*simulatorFactorHor*Math.sin(beta)) + ' ' + 
 					Math.round(pos[1] + valHor*simulatorFactorHor*Math.cos(beta))
 				);
+				if (localStorage.getItem('reference'+simulator+'hor')!=null) referenceDataHor.push((referenceDataHor.length==0?'M':'L')+ 
+					Math.round(pos[0] - refHor*simulatorFactorHor*Math.sin(beta)) + ' ' + 
+					Math.round(pos[1] + refHor*simulatorFactorHor*Math.cos(beta))
+				);
 				simulatorDataVer.push((simulatorDataVer.length==0?'M':'L')+ 
 					Math.round(pos[0] - valVer*simulatorFactorVer*Math.sin(beta)) + ' ' + 
 					Math.round(pos[1] + valVer*simulatorFactorVer*Math.cos(beta))
 				);
+				if (localStorage.getItem('reference'+simulator+'ver')!=null) referenceDataVer.push((referenceDataVer.length==0?'M':'L')+ 
+					Math.round(pos[0] - refVer*simulatorFactorVer*Math.sin(beta)) + ' ' + 
+					Math.round(pos[1] + refVer*simulatorFactorVer*Math.cos(beta))
+				);
 			}
 			// console.log('Hor', simulatorDataHor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
 			$('#'+facility+"_simulatorhor").attr('d', simulatorDataHor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
 			$('#'+facility+"_simulatorver").attr('d', simulatorDataVer.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
+			if (localStorage.getItem('reference'+simulator+'hor')!=null) $('#'+facility+"_simulatorreferencehor").attr('d', referenceDataHor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
+			if (localStorage.getItem('reference'+simulator+'ver')!=null) $('#'+facility+"_simulatorreferencever").attr('d', referenceDataVer.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
 		}
 	}
 	function simulatorDisplay(params) {
-- 
GitLab