-
Lucio Zambon authored
- /blm.js - /blm2d.js - /bpm2d.js - /component.php - /elettra_lattice.php - /fermi_lattice.php - /magnet.php - /open.svg - /panther.js - /panther.php - /panther_conf.js - /panther_lattice.json - /panther2d.js - /panther2d.php - /save.svg - /updater.php - /elettra_lattice.json - /fermi_lattice.json - /README.md
94836396
magnet.php 12.25 KiB
<?php
if (empty($_REQUEST['component'])) {
$list = empty($_REQUEST['list'])? array(): explode(',', $_REQUEST['list']);
if (!empty($_REQUEST['machine'])) {
$f = json_decode(file_get_contents($_REQUEST['machine'].'_lattice.json'), true);
foreach($f as $facility) foreach($facility['sections'] as $sec) foreach($sec['components'] as $c) $l[$c['type']] = true;
$list = array_keys($l);
// print_r($l); exit();
}
$f = scandir('./components/src');
$background = empty($_REQUEST['background'])? '': " background-color: {$_REQUEST['background']};";
echo "<div class='flex-container' style='display: flex; flex-direction: row; flex-wrap: wrap;$background'>\n";
foreach($f as $file) {
if (strpos($file, 'bundle')!==false) continue;
if (isset($_REQUEST['svg'])) {
if (strpos($file, '.svg')===false) continue;
$comp = strtr($file, array('.svg'=>''));
if (!empty($list) && !in_array($comp, $list)) continue;
echo "<div><img style='max-width: 250px;' src='./components/src/$file'><br><br>$file<br><br></div>";
}
else {
if (strpos($file, '.js')===false) continue;
$comp = strtr($file, array('.js'=>''));
if (!empty($list) && !in_array($comp, $list)) continue;
echo "<div style='text-align: center;'><a href='?component=$comp'><img style='max-width: 250px;' src='./components/preview/{$comp}_preview.jpg'><br>$comp</a></div>\n";
}
}
die("</div>");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Components</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
background-color: #ccc;
color: #000;
}
a {
color: #f00;
}
#c {
width: 100%;
height: 100%;
display: block;
}
</style>
</head>
<body>
<canvas id="c"></canvas>
<div id="info" style='display: none'>
<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - map controls
<span id="timer" title="loading" style="display: none"><img src="../../egiga2m/img/timer.gif"></span>
camera position, x: <input id="cameraX" size="20" value="-7500"> y: <input id="cameraY" size="20" value="1500"> z: <input id="cameraZ" size="20" value="4500">
camera rotation, x: <input id="rx" size="20" value="-0.6"> y: <input id="ry" size="20" value="-0.3"> z: <input id="rz" size="20" value="-0.2">
cdebug <input id="cdebug" size="3" value="0">
</div>
<div style="position: absolute; left: 5px; bottom: 5px;">
<button onclick="document.location = './magnet.php?component=<?php echo $_REQUEST['component'];?>'">1x</button>
<button onclick="document.location = './magnet.php?component=<?php echo $_REQUEST['component'];?>&mul=2'">8x</button>
<button onclick="document.location = './magnet.php?component=<?php echo $_REQUEST['component'];?>&mul=5'">125x</button>
<button onclick="document.location = './magnet.php?component=<?php echo $_REQUEST['component'];?>&mul=10'">1000x</button>
<button onclick="document.location = './magnet.php?component=<?php echo $_REQUEST['component'];?>&mul=20'">8000x</button>
</div>
<script type="importmap">
{
"imports": {
"three": "../../lib/node_modules/three/build/three.module.js",
"three/addons/": "../../lib/node_modules/three/examples/jsm/",
"components/": "./components/src/"
}
}
</script>
<script type="module">
// coordinates in millimeters relative to the center of the ring
console.log('globalThis', globalThis, window, self, frames, Object);
import * as THREE from 'three';
import Stats from 'three/addons/libs/stats.module.js'
const raycaster = new THREE.Raycaster();
const pointer = new THREE.Vector2();
// const dipole = [];
window.quadrupole = [];
window.sextupole = [];
window.corrector = [];
let selectedObjects = [];
const stats = new Stats();
const statmode = document.location.search.indexOf('statmode=')>-1? document.location.search.split('statmode=')[1].split('&')[0]-0: 0;
stats.showPanel(statmode); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild(stats.dom);
const obj3d = new THREE.Object3D();
// import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { MapControls } from 'three/addons/controls/OrbitControls.js';
// import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js';
import { <?php echo ($_REQUEST['component']=='ellipticaltube'? 'ellipticaltubeGeometry': $_REQUEST['component']); ?> } from 'components/<?php echo $_REQUEST['component']; ?>.js';
let camera, controls, scene, renderer;
let cx=-1500, cy=500, cz=4500, rx=-0.6, ry=-0.3, rz=-0.2, cdebug;
let composer, outlinePass;
const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0});
init();
//render(); // remove when using next line for animation loop (requestAnimationFrame)
animate();
function moveCamera() {
if (cdebug != document.getElementById('cdebug').value) {cdebug = document.getElementById('cdebug').value; console.log(cdebug, camera); return;}
if (cx==document.getElementById('cameraX').value && cy==document.getElementById('cameraY').value && cz==document.getElementById('cameraZ').value &&
rx==document.getElementById('rx').value && ry==document.getElementById('ry').value && rz==document.getElementById('rz').value) return;
rx = document.getElementById('rx').value;
ry = document.getElementById('ry').value;
rz = document.getElementById('rz').value;
cx = document.getElementById('cameraX').value;
cy = document.getElementById('cameraY').value;
cz = document.getElementById('cameraZ').value;
// camera.position.set( document.getElementById('cameraX').value, document.getElementById('cameraY').value, document.getElementById('cameraZ').value );
console.log('moveCamera()');
camera.position.set(cx,cy,cz);
camera.rotation.set(rx,ry,rz);
controls.update();
window.scene = scene;
window.camera = camera;
window.controls = controls;
}
function init() {
scene = new THREE.Scene();
scene.background = new THREE.Color( 0xffffff );
//scene.fog = new THREE.FogExp2( 0xcccccc, 0.0000002 );
const canvas = document.querySelector('#c');
renderer = new THREE.WebGLRenderer({antialias: true, canvas, logarithmicDepthBuffer: true});
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.001, 100000 );
camera.position.set(-1500,500,4500);
camera.rotation.set(-0.6, -0.3, -0.2);
// camera.position.set( document.getElementById('cameraX').value, document.getElementById('cameraY').value, document.getElementById('cameraZ').value );
// controls
controls = new MapControls( camera, renderer.domElement );
controls.enableDamping = true; // an animation loop is required when either damping or auto-rotation are enabled
controls.dampingFactor = 0.1;
controls.screenSpacePanning = false;
controls.minDistance = 0.01;
controls.maxDistance = 300000;
controls.maxPolarAngle = Math.PI / 2;
controls.update();
window.addEventListener( 'resize', onWindowResize );
if (document.location.search.indexOf('debug')>-1) {
var geometryDebug = new THREE.SphereGeometry(100, 32, 32);
var materialDebug = new THREE.MeshLambertMaterial({ color: 0x000000 });
var meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(0, 0, 0);
meshDebug.name = 'debug000';
scene.add(meshDebug);
for (var c=1; c<=1000; c=c*10) {
geometryDebug = new THREE.SphereGeometry(50+100*c/2, 32, 32);
materialDebug = new THREE.MeshLambertMaterial({ color: 0xff0000 });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(1000*c, 0, 0);
meshDebug.name = 'debug100_'+c;
scene.add(meshDebug);
materialDebug = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(0, 1000*c, 0);
meshDebug.name = 'debug010_'+c;
scene.add(meshDebug);
materialDebug = new THREE.MeshLambertMaterial({ color: 0x0000ff });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(0, 0, 1000*c);
meshDebug.name = 'debug001_'+c;
scene.add(meshDebug);
materialDebug = new THREE.MeshLambertMaterial({ color: 0x800000 });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(-1000*c, 0, 0);
meshDebug.name = 'debug200_'+c;
scene.add(meshDebug);
materialDebug = new THREE.MeshLambertMaterial({ color: 0x008000 });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(0, -1000*c, 0);
meshDebug.name = 'debug020_'+c;
scene.add(meshDebug);
materialDebug = new THREE.MeshLambertMaterial({ color: 0x000080 });
meshDebug = new THREE.Mesh(geometryDebug, materialDebug);
meshDebug.position.set(0, 0, -1000*c);
meshDebug.name = 'debug002_'+c;
scene.add(meshDebug);
}
}
camera.position.set(1, 100, 100);
camera.rotation.set(-1.5497719738079266e-16, -1.164613656151594, -1.4236759551018105e-16);
camera.updateMatrixWorld(true);
cx = 0;
if (document.location.search.indexOf('wiggler')>-1) {
scene.add(wiggler(1300));
}
/*else if (document.location.search.indexOf('cavity')>-1) {
scene.add(cavity(5000,0.5,500,8000));
}*/
// if (document.location.search.indexOf('envelope')>-1) magnet = envelopeMaster;
else if (document.location.search.indexOf('ellipticaltube')>-1) {
const envelopegeometry = ellipticaltubeGeometry(5,10,10,5,10,50);
console.log('envelopegeometry', envelopegeometry);
const envelopematerial = new THREE.MeshBasicMaterial({color: 0x00f0f0, transparent: true, opacity: 0.2, side: THREE.DoubleSide,});
const envelopemesh = new THREE.Mesh( envelopegeometry, envelopematerial );
envelopemesh.position.set(500, 500, 500);
envelopemesh.scale.setX(100);
envelopemesh.scale.setY(100);
envelopemesh.scale.setZ(100);
envelopemesh.rotateY(Math.PI/2);
envelopemesh.rotateZ(Math.PI/2);
scene.add(envelopemesh);
const envelopegeometry2 = ellipticaltubeGeometry(10,5,6,8,10,50);
const envelopemesh2 = new THREE.Mesh( envelopegeometry2, envelopematerial );
envelopemesh2.position.set(1500, 500, 500);
envelopemesh2.scale.setX(100);
envelopemesh2.scale.setY(100);
envelopemesh2.scale.setZ(100);
envelopemesh2.rotateY(Math.PI/2);
envelopemesh2.rotateZ(Math.PI/2);
scene.add(envelopemesh2);
}
else if (document.location.search.indexOf('mul=')>-1) {
const component = <?php echo $_REQUEST['component']; ?>();
const dist = document.location.search.indexOf('dist=')>-1? document.location.search.split('dist=')[1].split('&')[0]: 3000;
const mul = document.location.search.split('mul=')[1].split('&')[0];
for (let i=0; i<mul; i++) {
for (let j=0; j<mul; j++) {
for (let k=0; k<mul; k++) {
const c = component.clone();
c.position.set(dist*i, dist*j, dist*k);
scene.add(c);
}
}
}
}
else {
const component = <?php echo $_REQUEST['component']; ?>();
scene.add(component);
}
const dirLight1 = new THREE.DirectionalLight( 0xffffff );
dirLight1.position.set( 1, 1, 1 );
scene.add( dirLight1 );
const dirLight2 = new THREE.DirectionalLight( 0x888888 );
dirLight2.position.set( - 1, - 1, - 1 );
scene.add( dirLight2 );
const ambientLight = new THREE.AmbientLight( 0x555555 );
scene.add( ambientLight );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function animate() {
requestAnimationFrame( animate );
stats.begin();
moveCamera();
controls.update(); // only required if controls.enableDamping = true, or if controls.autoRotate = true
render();
stats.end();
// composer.render();
}
function render() {
renderer.render(scene, camera);
}
</script>
</body>
</html>