diff --git a/components/bundle_elettra.js b/components/bundle_elettra.js new file mode 100644 index 0000000000000000000000000000000000000000..4002ee0af232edb6eaf25b3ab99f045cb2afd8e9 --- /dev/null +++ b/components/bundle_elettra.js @@ -0,0 +1,1999 @@ +/*jshint esversion: 6 */ + import * as THREE from 'three'; + import {FontLoader} from 'three/addons/loaders/FontLoader.js'; + import {TextGeometry} from 'three/addons/geometries/TextGeometry.js'; + + // gun rack + export function gun(param) { + const width=800, height=2000, depth=800; + const gunObject = new THREE.Object3D(); + const gunmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const gungeometry = new THREE.BoxGeometry(width, height, depth); + const gunmesh = new THREE.Mesh(gungeometry, gunmaterial); + gunObject.add(gunmesh); + return gunObject; + } + + // quadrupole booster + export function quadrupolebooster(param) { + const length = param && typeof param.length == "number"? param.length: 200; + const QuadrupolContiner = new THREE.Object3D(); + const QuadrupoleMaster = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040, side: THREE.DoubleSide}); + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + QuadrupoleMaster.add(d1mesh); + + // coil settings + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xcd7f32, side: THREE.DoubleSide}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/coil_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const coiltexture = new THREE.MeshBasicMaterial({ map: texture }); + const coilmaterials = [coiltexture, coilmaterial, coilmaterial]; + const coilgeometry = new THREE.CylinderGeometry(110 /*radiusTop*/, 110 /*radiusBottom*/, 120 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + + //spessore alto + const redmaterial = new THREE.MeshLambertMaterial({color: 0xe05040}); + const geometry_1 = new THREE.BoxGeometry(200, 100, 705); + const dmesh_1 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_1.position.set(0, 300, 0); + QuadrupoleMaster.add(dmesh_1); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_2.position.set(0, -300, 0); + QuadrupoleMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(200, 500, 100); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_3.position.set(0, 0, -300); + QuadrupoleMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_4.position.set(0, 0, 300); + QuadrupoleMaster.add(dmesh_4); + + const geometry_5 = new THREE.BoxGeometry(200, 115, 280); + const dmesh_5 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_5.rotateX(Math.PI * 0.25); + dmesh_5.position.set(0, 210, 210); + QuadrupoleMaster.add(dmesh_5); + const dmesh_6 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_6.rotateX(Math.PI * 0.75); + dmesh_6.position.set(0, 210, -210); + QuadrupoleMaster.add(dmesh_6); + const dmesh_7 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_7.rotateX(Math.PI * 0.75); + dmesh_7.position.set(0, -210, 210); + QuadrupoleMaster.add(dmesh_7); + const dmesh_8 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_8.rotateX(Math.PI * 0.25); + dmesh_8.position.set(0, -210, -210); + QuadrupoleMaster.add(dmesh_8); + + // coil basso destra + const d2mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d2mesh.position.set(0, -130, 120); + d2mesh.rotateX(Math.PI * 1.25); + d2mesh.rotateY(Math.PI * 1.50); + d2mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d2mesh); + + // coil basso sinistra + const d3mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d3mesh.position.set(0, -130, -120); + d3mesh.rotateX(Math.PI * 1.75); + d3mesh.rotateY(Math.PI * 1.50); + d3mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d3mesh); + + // coil alto destra + const d4mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d4mesh.position.set(0, 130, 120); + d4mesh.rotateX(Math.PI * 0.75); + d4mesh.rotateY(Math.PI * 1.50); + d4mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d4mesh); + + // coil alto destra + const d5mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d5mesh.position.set(0, 130, -120); + d5mesh.rotateX(Math.PI * 1.25); + d5mesh.rotateY(Math.PI * 1.50); + d5mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d5mesh); + + QuadrupoleMaster.position.set(0, 0, 0); + QuadrupolContiner.add(QuadrupoleMaster); + QuadrupolContiner.rotateY(Math.PI * -0.5); + + + return QuadrupolContiner; + } + // BPM (beam position monitor) + export function bpm(param) { + const width=300, height=300, depth=50, transverse=100; + const bpmObject = new THREE.Object3D(); + const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff}); + const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth); + const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial); + bpmObject.add(bpmmeshh); + const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth); + const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial); + bpmObject.add(bpmmeshv); + return bpmObject; + } + + + // Beam Loss Monitor + export function blm(param) { + const length=30, dcolor='white', width=30; + const cMaster = new THREE.Object3D(); + const d1geometry = new THREE.BoxGeometry(length, width, width); + const material = new THREE.MeshLambertMaterial({color: dcolor}); + const d1mesh = new THREE.Mesh(d1geometry, material); + d1mesh.position.set(-length/2, 0, 0); + cMaster.add(d1mesh); + return cMaster; + } + function blmColor(val) { + if (document.location.search.indexOf('demo')>-1) { + if (val < 0) return 'white'; + else if (val < 1) return 'yellow'; + else if (val < 2) return 'orange'; + else if (val < 3) return 'red'; + else return 'violet'; + } + if (val < 20) return 'white'; + else if (val < 50) return 'yellow'; + else if (val < 100) return 'orange'; + else if (val < 200) return 'red'; + else return 'violet'; + } + export function blmUpdate(c, val, direction, width=100, histogramFactor=50) { + if (typeof val !== 'number') val = 0; else val = Math.abs(val); + const blm = c.children[0]; + blm.material.dispose(); + blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)}); + blm.geometry.dispose(); + blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width); + blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0); + blm.geometry.computeVertexNormals(); + blm.geometry.normalsNeedUpdate = true; + blm.geometry.verticesNeedUpdate = true; + blm.geometry.dynamic = true; + } + // Current Monitor + export function cm(param) { + const cmContiner = new THREE.Object3D(); + const cmObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + cmObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + cmObject.add(cyl2mesh); + + + cmObject.scale.setX(1); + cmObject.scale.setY(1); + cmObject.scale.setZ(1); + cmObject.position.set(0, 0, 0); + cmContiner.add(cmObject); + cmContiner.rotateY(Math.PI * -0.5); + + + return cmContiner; + } + + // flsc + export function flsc(param) { + const length=700; + const flscSR = new THREE.Object3D(); + const flscContiner = new THREE.Object3D(); + + const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const materialDarkGrey = new THREE.MeshLambertMaterial({color: 0x8c8c8c}); + const materialOrange= new THREE.MeshLambertMaterial({color: 0xfc9403}); + const materialBlack= new THREE.MeshLambertMaterial({color: 0x000000}); + + //cil center + const d1geometry = new THREE.CylinderGeometry(25, 25, 400, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 200 , 0); + flscContiner.add(d1mesh); + flscContiner.rotateX(Math.PI * 1); + + // esagono + const d2geometry = new THREE.CylinderGeometry(70, 70, 70, 6); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + flscContiner.add(d2mesh); + + // box orange down + const orangegeometry = new THREE.CylinderGeometry(90, 90, 250, 15); + const orangegeometrymesh = new THREE.Mesh(orangegeometry, materialOrange); + orangegeometrymesh.position.set(0, 550, 0); + flscContiner.add(orangegeometrymesh); + + // box black down + const blackgeometry = new THREE.CylinderGeometry(90, 90, 25, 15); + const blackgeometrymesh = new THREE.Mesh(blackgeometry, materialBlack); + blackgeometrymesh.position.set(0, 412, 0); + flscContiner.add(blackgeometrymesh); + + // base zigrinatura + const d3geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d3mesh = new THREE.Mesh(d3geometry, materialGrey); + d3mesh.rotateX(Math.PI * 1); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1); + d3mesh.position.set(0, 170 , 0); + flscContiner.add(d3mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(60, 60, 170, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 60 , 0); + flscContiner.add(d4mesh); + + // tetto zigrinatura + const d5geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, -50 , 0); + flscContiner.add(d5mesh); + + //half sphere down1 + const down1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down1geometrymesh = new THREE.Mesh(down1geometry, materialGrey); + down1geometrymesh.position.set(-75, 170, -75); + flscContiner.add(down1geometrymesh); + + //half sphere up1 + const up1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up1geometrymesh = new THREE.Mesh(up1geometry, materialGrey); + up1geometrymesh.position.set(-75, -50, -75); + flscContiner.add(up1geometrymesh); + + //half sphere down2 + const down2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down2geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down2geometrymesh.position.set(75, 170, -75); + flscContiner.add(down2geometrymesh); + + //half sphere up2 + const up2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up2geometrymesh = new THREE.Mesh(up2geometry, materialGrey); + up2geometrymesh.position.set(75, -50, -75); + flscContiner.add(up2geometrymesh); + + //half sphere down3 + const down3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down3geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down3geometrymesh.position.set(0, 170, 100); + flscContiner.add(down3geometrymesh); + + //half sphere up3 + const up3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up3geometrymesh = new THREE.Mesh(up3geometry, materialGrey); + up3geometrymesh.position.set(0, -50, 100); + flscContiner.add(up3geometrymesh); + + //cil support1 + const d11geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d11mesh = new THREE.Mesh(d11geometry, materialGrey); + d11mesh.position.set(-75, 20, -75); + flscContiner.add(d11mesh); + + //cil support2 + const d12geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d12mesh = new THREE.Mesh(d12geometry, materialGrey); + d12mesh.position.set(75, 20, -75); + flscContiner.add(d12mesh); + + //cil support3 + const d13geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d13mesh = new THREE.Mesh(d13geometry, materialGrey); + d13mesh.position.set(0, 20, 100); + flscContiner.add(d13mesh); + + // blocco supporto + const d15geometry = new THREE.CylinderGeometry(120, 120, 20, 25); + const d15mesh = new THREE.Mesh(d15geometry, materialGrey); + d15mesh.position.set(0, -130, 0); + d15mesh.rotateX(Math.PI * 1); + flscContiner.add(d15mesh); + + //internal block + const d16geometry = new THREE.CylinderGeometry(20, 20, 60, 15); + const d16mesh = new THREE.Mesh(d16geometry, materialGrey); + d16mesh.position.set(0, -100, 0); + d16mesh.rotateX(Math.PI * 1); + flscContiner.add(d16mesh); + + // high box1 + const d7geometry = new THREE.BoxGeometry(40, 90, 100); + const d7mesh = new THREE.Mesh(d7geometry, materialDarkGrey); + d7mesh.position.set(-20, -180, 0); + flscContiner.add(d7mesh); + + // high box2 + const d8geometry = new THREE.BoxGeometry(40, 60, 100); + const d8mesh = new THREE.Mesh(d8geometry, materialDarkGrey); + d8mesh.position.set(20, -170, 0); + flscContiner.add(d8mesh); + + flscContiner.position.set(0, 290, 0); + flscSR.add(flscContiner); + flscSR.rotateY(Math.PI * -0.5); + return flscSR; + } + + // lens + export function lens(param) { + const lensContiner = new THREE.Object3D(); + const lensObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(105, 105, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + lensObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x737373}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + lensObject.add(cyl2mesh); + + // base1 + const basegeometry = new THREE.BoxGeometry(29, 160, 60 ); + const basemesh = new THREE.Mesh(basegeometry, cylmaterial); + basemesh.position.set(0, -70, 0); + lensObject.add(basemesh); + + + lensObject.scale.setX(1); + lensObject.scale.setY(1); + lensObject.scale.setZ(1); + lensObject.position.set(0, 0, 0); + lensContiner.add(lensObject); + lensContiner.rotateY(Math.PI * 0.5); + + return lensContiner; + } + + // corrector booster + export function correctorbooster(param) { + const length=140; + const CorrectorContiner = new THREE.Object3D(); + const correctorObject = new THREE.Object3D(); + + // box esterno + const correctormaterial = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry = new THREE.BoxGeometry(140, 65, length); + const d1mesh = new THREE.Mesh(correctorgeometry, correctormaterial); + correctormaterial.flatShading = true; + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.250); + d1mesh.rotateY(Math.PI * 1.5); + d1mesh.rotateZ(Math.PI * 1.25); + d1mesh.position.set(0, 0, 0); + correctorObject.add(d1mesh); + + // box lato1 + const correctormaterial2 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry2 = new THREE.BoxGeometry(140, 20, 140 ); + const d2mesh = new THREE.Mesh(correctorgeometry2, correctormaterial2); + correctormaterial.flatShading = true; + d2mesh.position.set(0, 0, 0); + d2mesh.rotateX(Math.PI * 1.5); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + d2mesh.position.set(-80, 37, 0); + correctorObject.add(d2mesh); + + // box lato2 + const correctormaterial3 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry3 = new THREE.BoxGeometry(140, 20, 140 ); + const d3mesh = new THREE.Mesh(correctorgeometry3, correctormaterial3); + correctormaterial.flatShading = true; + d3mesh.position.set(0, 0, 0); + d3mesh.rotateX(Math.PI * 1.5); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1.5); + d3mesh.position.set(80, 37, 0); + correctorObject.add(d3mesh); + + //Coil + const d4geometry = new THREE.CylinderGeometry(30, 30, 140, 15); + const correctormaterial4 = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4mesh = new THREE.Mesh(d4geometry, correctormaterial4); + d4mesh.rotateX(Math.PI); + d4mesh.rotateY(Math.PI); + d4mesh.rotateZ(Math.PI * 1.5); + d4mesh.position.set(0, 100, 0); + correctorObject.add(d4mesh); + + correctorObject.position.set(0, -150, 0); + correctorObject.scale.setX(3); + correctorObject.scale.setY(3); + CorrectorContiner.add(correctorObject); + CorrectorContiner.rotateY(Math.PI * -1); + + return CorrectorContiner; + } + + + // cavity for linac + export function cavitylinac(param) { + const length = param && typeof param.length == "number"? param.length: 1500; + const cavitylinacMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(200, 200, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + cavitylinacMaster.add(d1mesh); + cavitylinacMaster.rotateX(Math.PI * 0.5); + cavitylinacMaster.rotatedX = true; + return cavitylinacMaster; + } + + + // Bending Dipole booster + export function dipolebooster(length = 1615) { + const dipoleContainer = new THREE.Object3D(); + const dipoleMaster = new THREE.Object3D(); + + //texture + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/dipole.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.BoxGeometry(550, 400, length); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(-100, 100, 0); + dipoleMaster.add(d1mesh); + + //Coil + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + + dipoleMaster.position.set(200, 0, 0); + dipoleContainer.add(dipoleMaster); + + return dipoleContainer; + } + + // sextupole booster + export function sextupolebooster(param) { + const length = param && typeof param.length == "number"? param.length: 110; + const SextupoleContiner = new THREE.Object3D(); + const SextupoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xFFE000}); + + // support high + const geometry_1 = new THREE.BoxGeometry(length, 100, 200); + const dmesh_1 = new THREE.Mesh(geometry_1, dmaterial); + dmesh_1.position.set(0, 324, 0); + SextupoleMaster.add(dmesh_1); + + // support side + const dmesh_2 = new THREE.Mesh(geometry_1, dmaterial); + dmesh_2.position.set(0, 280, -162); + dmesh_2.rotateX(-Math.PI / 6); + SextupoleMaster.add(dmesh_2); + + const geometry3 = new THREE.BoxGeometry(length-30, 120, 50); + const dmesh3 = new THREE.Mesh(geometry3, dmaterial); + dmesh3.position.set(0, 140, 0); + SextupoleMaster.add(dmesh3); + + // coil + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/coil_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const d6geometry = new THREE.CylinderGeometry(80 /*radiusTop*/, 80 /*radiusBottom*/, 80 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const material6 = new THREE.MeshBasicMaterial({ map: texture }); + const materialside6 = new THREE.MeshBasicMaterial({color: 0xcd7f32}); + const materials6 = [material6, materialside6, materialside6]; + const d6mesh = new THREE.Mesh(d6geometry, materials6); + d6mesh.position.set(0, 230, 0); + d6mesh.rotateX(Math.PI * 1.50); + d6mesh.rotateY(Math.PI * 1.50); + d6mesh.rotateZ(Math.PI * 1.50); + SextupoleMaster.add(d6mesh); + + for (let i=1; i<6; i++) { + const Sextupole2 = SextupoleMaster.clone(); + Sextupole2.rotateX(-Math.PI / 3*i); + SextupoleContiner.add(Sextupole2); + } + SextupoleContiner.add(SextupoleMaster); + SextupoleContiner.rotateY(Math.PI * -0.5); + return SextupoleContiner; + } + + // kicker + export function kicker(param) { + const length = param && typeof param.length == "number"? param.length: 300; + const kickerMaster = new THREE.Object3D(); + + const d1geometry = new THREE.BoxGeometry(710, 500, 500); + const dmaterial = new THREE.MeshLambertMaterial({color: 0x405040}); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, -20, 330); + kickerMaster.add(d1mesh); + + //add quad2 + const d2geometry = new THREE.BoxGeometry(710, 270, 300); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0x405040}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, -135, 80); + kickerMaster.add(d2mesh); + + //add sest + const d3geometry = new THREE.CylinderGeometry(300, 300, 700, 6); + const dmateria3 = new THREE.MeshLambertMaterial({color: 0xffff00}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/kicker_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d3mesh = new THREE.Mesh(d3geometry, material); + d3mesh.rotateX(Math.PI * 1); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1.5); + d3mesh.position.set(0, 0 , 230); + kickerMaster.add(d3mesh); + + //capsule + const geometry = new THREE.CapsuleGeometry( 50, 50, 40, 80 ); + const material_cap = new THREE.MeshBasicMaterial( {color: 0xff0000} ); + const d4mesh = new THREE.Mesh( geometry, material_cap ); + d4mesh.position.set(0, 240 , 480); + kickerMaster.add(d4mesh); + + kickerMaster.rotateY(Math.PI * 0.5); + return kickerMaster; + } + + // septum + export function spte(param) { + const length = param && typeof param.length == "number"? param.length: 1000; + const septumSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(200, 200, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + septumSR.add(d1mesh); + septumSR.rotateX(Math.PI * 0.5); + septumSR.rotatedX = true; + + // left + const dmateria2 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d2geometry = new THREE.CylinderGeometry(250, 250, 100, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmateria2); + d2mesh.position.set(0, -length/2-50, 0); + septumSR.add(d2mesh); + + // right + const dmateria3 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d3geometry = new THREE.CylinderGeometry(250, 250, 100, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmateria3); + d3mesh.position.set(0, length/2+50, 0); + septumSR.add(d3mesh); + + // up1 + const dmateria4 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d4geometry = new THREE.CylinderGeometry(100, 100, 100, 25); + const d4mesh = new THREE.Mesh(d4geometry, dmateria4); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -300 , -200); + septumSR.add(d4mesh); + + // up2 + const dmateria5 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d5geometry = new THREE.CylinderGeometry(100, 100, 100, 25); + const d5mesh = new THREE.Mesh(d5geometry, dmateria5); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 300 , -200); + septumSR.add(d5mesh); + + septumSR.scale.setY(0.7); + + return septumSR; + } + + + // cavity + export function cavity(param) { + const sphereRadius=300, sphereFactor=0.5, cylinderRadius=40, cylinderHeight=600; + const cavityObject = new THREE.Object3D(); + const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0}); + const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32); + const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial); + cavitymesh.scale.setZ(sphereFactor); + cavityObject.add(cavitymesh); + const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius, cylinderHeight, 20, 2, false, 0, Math.PI * 2); + const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial); + // rfMesh.rotateX(Math.PI * 0.5); + rfMesh.position.set(0, sphereRadius, 0); + cavityObject.add(rfMesh); + return cavityObject; + } + + /* corrector2 + export function corrector2(param) { + const length = param && typeof param.length == "number"? param.length: 170; + const CorrectorContiner = new THREE.Object3D(); + const correctorObject = new THREE.Object3D(); + + // box esterno + const correctormaterial = new THREE.MeshLambertMaterial({color: 0x4040b0, side: THREE.DoubleSide}); + const d1mesh = new THREE.Mesh(correctorgeometry, correctormaterial); + correctormaterial.flatShading = true; + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + correctorObject.add(d1mesh); + + // box up + const correctormaterial2 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry2 = new THREE.CylinderGeometry(55, 55, 120); + const d2mesh = new THREE.Mesh(correctorgeometry2, correctormaterial2); + d2mesh.position.set(0, 100, 0); + d2mesh.rotateX(Math.PI * 1.5); + correctorObject.add(d2mesh); + + // box left + const correctormaterial3 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry3 = new THREE.CylinderGeometry(55, 55, 120); + const d3mesh = new THREE.Mesh(correctorgeometry3, correctormaterial3); + d3mesh.position.set(0, -40, 100); + d3mesh.rotateX(Math.PI * 1.0); + correctorObject.add(d3mesh); + + // box right + const correctormaterial4 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry4 = new THREE.CylinderGeometry(55, 55, 120); + const d4mesh = new THREE.Mesh(correctorgeometry4, correctormaterial4); + d4mesh.position.set(-0, -40, -100); + d4mesh.rotateX(Math.PI * 1.0); + correctorObject.add(d4mesh); + + correctorObject.position.set(0, 0, 0); + CorrectorContiner.add(correctorObject); + CorrectorContiner.rotateY(Math.PI * -0.5); + + // status + const faultMaterial = new THREE.MeshBasicMaterial({ color: 0xe00000, transparent: true, opacity: 1 }); + const warningMaterial = new THREE.MeshBasicMaterial({ color: 0xffff66, transparent: true, opacity: 1 }); + const normalMaterial = new THREE.MeshBasicMaterial({ color: 0xffff66, transparent: true, opacity: 0 }); + const sphereGeometry = new THREE.SphereGeometry(100, 10, 10); + const sphere = new THREE.Mesh(sphereGeometry, normalMaterial); + sphere.position.set(0, 350, 0); + correctorObject.add(sphere); + + return CorrectorContiner; + } + */ + // corrector + export function corrector(param) { + const length = param && typeof param.length == "number"? param.length: 170; + const CorrectorContiner = new THREE.Object3D(); + const correctorObject = new THREE.Object3D(); + + // box esterno + const correctormaterial = new THREE.MeshLambertMaterial({color: 0x4040b0, side: THREE.DoubleSide}); + const correctorgeometry = new THREE.CylinderGeometry(250 /*radiusTop*/, 250 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(correctorgeometry, correctormaterial); + correctormaterial.flatShading = true; + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + correctorObject.add(d1mesh); + + // box up + const correctormaterial2 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry2 = new THREE.CylinderGeometry(55, 55, 120); + const d2mesh = new THREE.Mesh(correctorgeometry2, correctormaterial2); + d2mesh.position.set(0, 100, 0); + d2mesh.rotateX(Math.PI * 1.5); + correctorObject.add(d2mesh); + + // box left + const correctormaterial3 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry3 = new THREE.CylinderGeometry(55, 55, 120); + const d3mesh = new THREE.Mesh(correctorgeometry3, correctormaterial3); + d3mesh.position.set(0, -40, 100); + d3mesh.rotateX(Math.PI * 1.0); + correctorObject.add(d3mesh); + + // box right + const correctormaterial4 = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry4 = new THREE.CylinderGeometry(55, 55, 120); + const d4mesh = new THREE.Mesh(correctorgeometry4, correctormaterial4); + d4mesh.position.set(-0, -40, -100); + d4mesh.rotateX(Math.PI * 1.0); + correctorObject.add(d4mesh); + + correctorObject.position.set(0, 0, 0); + CorrectorContiner.add(correctorObject); + CorrectorContiner.rotateY(Math.PI * -0.5); + + + return CorrectorContiner; + } + + + // Bending Dipole + export function dipole(length = 1449) { + const dipoleMaster = new THREE.Object3D(); + + // main body + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/dipole.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.BoxGeometry(500, 700, length); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(100, 100, 0); + dipoleMaster.add(d1mesh); + + // longitudinal coil + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + + // cylinder coil front + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + + // cylinder coil back + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + + // duplicate coil + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + return dipoleMaster; + } + + + // Quadrupole + export function quadrupole(param) { + const length = param && typeof param.length == "number"? param.length: 260; + const quadrupoleMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const quadrupolematerial = new THREE.MeshLambertMaterial({color: 0xff7050}); + const quadrupolegeometry = new THREE.CylinderGeometry(250, 250, length, 8); + const quadrupolemesh = new THREE.Mesh(quadrupolegeometry, quadrupolematerial); + quadrupoleMaster.add(quadrupolemesh); + const quadrupole2geometry = new THREE.CylinderGeometry(290, 290, 30, 50); + const quadrupole2mesh = new THREE.Mesh(quadrupole2geometry, chamberMaterial); + quadrupole2mesh.position.set(0, -length/2-15, 0); + quadrupoleMaster.add(quadrupole2mesh); + const quadrupole3mesh = new THREE.Mesh(quadrupole2geometry, chamberMaterial); + quadrupole3mesh.position.set(0, length/2+15, 0); + quadrupoleMaster.add(quadrupole3mesh); + quadrupoleMaster.rotateX(Math.PI * 0.5); + quadrupoleMaster.rotatedX = true; + const qedges = new THREE.EdgesGeometry(quadrupolegeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x600000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + quadrupoleMaster.add(qline); + return quadrupoleMaster; + } + + + // Sextupole + export function sextupole(param) { + const length = param && typeof param.length == "number"? param.length: 230; + const sextupoleMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const sextupolematerial = new THREE.MeshLambertMaterial({color: 0xffff00}); + const sextupolegeometry = new THREE.CylinderGeometry(250, 250, length, 6); + const sextupolemesh = new THREE.Mesh(sextupolegeometry, sextupolematerial); + sextupoleMaster.add(sextupolemesh); + const sextupole2geometry = new THREE.CylinderGeometry(290, 290, 30, 50); + const sextupole2mesh = new THREE.Mesh(sextupole2geometry, chamberMaterial); + sextupole2mesh.position.set(0, -length/2-15, 0); + sextupoleMaster.add(sextupole2mesh); + const sextupole3mesh = new THREE.Mesh(sextupole2geometry, chamberMaterial); + sextupole3mesh.position.set(0, length/2+15, 0); + sextupoleMaster.add(sextupole3mesh); + sextupoleMaster.rotateX(Math.PI * 0.5); + sextupoleMaster.rotatedX = true; + const sedges = new THREE.EdgesGeometry(sextupolegeometry); + const sline = new THREE.LineSegments(sedges, new THREE.LineBasicMaterial({color: 0x808000})); + sextupoleMaster.add(sline); + return sextupoleMaster; + } + + + // undulator + export function undulator(param) { + const length = param && typeof param.length == "number"? param.length: 1300; + const undulatorMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/undulator.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + undulatorMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + undulatorMaster.add(qline); + return undulatorMaster; + } + + + // wiggler + export function wiggler(param) { + const length = param && typeof param.length == "number"? param.length: 1300; + const wigglerMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xf3a1eb}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/wiggler.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + wigglerMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + wigglerMaster.add(qline); + return wigglerMaster; + } + + + // 3hc + export function cavity_3hc(param) { + const length = param && typeof param.length == "number"? param.length: 1500; + const threeHCSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0xffffff}); + const d1geometry = new THREE.CylinderGeometry(700, 700, length, 35); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + threeHCSR.add(d1mesh); + threeHCSR.rotateX(Math.PI * 0.5); + threeHCSR.rotatedX = true; + + // left + const lrgeometry = new THREE.CylinderGeometry(750, 750, 100, 65); + const d2mesh = new THREE.Mesh(lrgeometry, dmaterial); + d2mesh.position.set(0, -length/2-50, 0); + threeHCSR.add(d2mesh); + + // right + const d3mesh = new THREE.Mesh(lrgeometry, dmaterial); + d3mesh.position.set(0, length/2+50, 0); + threeHCSR.add(d3mesh); + + // up1 + const udgeometry = new THREE.CylinderGeometry(250, 250, 100, 25); + const d4mesh = new THREE.Mesh(udgeometry, dmaterial); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -400 , -730); + threeHCSR.add(d4mesh); + + // up2 + const udgeometry2 = new THREE.CylinderGeometry(150, 150, 100, 25); + const d5mesh = new THREE.Mesh(udgeometry2, dmaterial); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 400 , -730); + threeHCSR.add(d5mesh); + + // up1a + const udgeometrya = new THREE.CylinderGeometry(200, 200, 250, 25); + const d6mesh = new THREE.Mesh(udgeometrya, dmaterial); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, -400 , -870); + threeHCSR.add(d6mesh); + + // up1b + const udgeometryb = new THREE.CylinderGeometry(250, 250, 100, 25); + const d7mesh = new THREE.Mesh(udgeometryb, dmaterial); + d7mesh.rotateX(Math.PI * 0.5); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -400 , -1000); + threeHCSR.add(d7mesh); + + // up1c + const udgeometryc = new THREE.CylinderGeometry(200, 200, 400, 25); + const d8mesh = new THREE.Mesh(udgeometryc, dmaterial); + d8mesh.rotateX(Math.PI * 0.5); + d8mesh.rotateY(Math.PI * 1); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(0, -400 , -1100); + threeHCSR.add(d8mesh); + + // up2d + const udgeometry2d = new THREE.CylinderGeometry(100, 100, 200, 25); + const d9mesh = new THREE.Mesh(udgeometry2d, dmaterial); + d9mesh.rotateX(Math.PI * 0.5); + d9mesh.rotateY(Math.PI * 1); + d9mesh.rotateZ(Math.PI * 1); + d9mesh.position.set(0, 400 , -830); + threeHCSR.add(d9mesh); + + // up2e + const udgeometry2e = new THREE.CylinderGeometry(130, 130, 100, 25); + const d10mesh = new THREE.Mesh(udgeometry2e, dmaterial); + d10mesh.rotateX(Math.PI * 0.5); + d10mesh.rotateY(Math.PI * 1); + d10mesh.rotateZ(Math.PI * 1); + d10mesh.position.set(0, 400 , -930); + threeHCSR.add(d10mesh); + + + //tubo1 + const tubegeometry1 = new THREE.CylinderGeometry(30, 30, 1100, 25); + const d12mesh = new THREE.Mesh(tubegeometry1, dmaterial); + d12mesh.rotateX(Math.PI * 0.5); + d12mesh.rotateY(Math.PI * 0.5); + d12mesh.rotateZ(Math.PI * 0.5); + d12mesh.position.set(-430, -150 , -930); + threeHCSR.add(d12mesh); + + //tubo2 + const tubegeometry2 = new THREE.CylinderGeometry(30, 30, 450, 25); + const d13mesh = new THREE.Mesh(tubegeometry2, dmaterial); + d13mesh.rotateX(Math.PI * 0.5); + d13mesh.rotateY(Math.PI * 1); + d13mesh.rotateZ(Math.PI * 0.5); + d13mesh.position.set(-200, 400 , -930); + threeHCSR.add(d13mesh); + + //sferacopritubo + const sphereGeometry = new THREE.SphereGeometry(30, 30, 30); + const d14mesh = new THREE.Mesh(sphereGeometry, dmaterial); + d14mesh.position.set(-430, 400 , -930); + threeHCSR.add(d14mesh); + + //up3 + const udgeometry2g = new THREE.CylinderGeometry(50, 50, 100, 25); + const d15mesh = new THREE.Mesh(udgeometry2g, dmaterial); + d15mesh.rotateX(Math.PI * 0.5); + d15mesh.rotateY(Math.PI * 1); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(0, 650 , -700); + threeHCSR.add(d15mesh); + + + //up3a + const udgeometry2h = new THREE.CylinderGeometry(30, 30, 400, 25); + const d16mesh = new THREE.Mesh(udgeometry2h, dmaterial); + d16mesh.rotateX(Math.PI * 0.5); + d16mesh.rotateY(Math.PI * 1); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(0, 650 , -900); + threeHCSR.add(d16mesh); + + //up3b + const udgeometry2l = new THREE.CylinderGeometry(30, 30, 400, 25); + const d17mesh = new THREE.Mesh(udgeometry2l, dmaterial); + d17mesh.rotateX(Math.PI * 0.5); + d17mesh.rotateY(Math.PI * 1); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(0, 650 , -900); + threeHCSR.add(d16mesh); + + //up3c + const udgeometry2m = new THREE.CylinderGeometry(30, 30, 400, 25); + const d18mesh = new THREE.Mesh(udgeometry2m, dmaterial); + d18mesh.rotateX(Math.PI * 0.5); + d18mesh.rotateY(Math.PI * 0.75); + d18mesh.rotateZ(Math.PI * 1.5); + d18mesh.position.set(-140, 790 , -1100); + threeHCSR.add(d18mesh); + + //sferacopritubo laterale + const sphereGeometry2 = new THREE.SphereGeometry(30, 30, 30); + const d19mesh = new THREE.Mesh(sphereGeometry2, dmaterial); + d19mesh.position.set(0, 650 , -1100); + threeHCSR.add(d19mesh); + + //tubilaterali1 + const lateraltube1 = new THREE.CylinderGeometry(180, 180, 100, 25); + const d20mesh = new THREE.Mesh(lateraltube1, dmaterial); + d20mesh.rotateX(Math.PI * 0.5); + d20mesh.rotateY(Math.PI * 1); + d20mesh.rotateZ(Math.PI * 0.5); + d20mesh.position.set(-700, -400 , 0); + threeHCSR.add(d20mesh); + + //tubilaterali1a + const lateraltube1a = new THREE.CylinderGeometry(120, 120, 200, 25); + const d21mesh = new THREE.Mesh(lateraltube1a, dmaterial); + d21mesh.rotateX(Math.PI * 0.5); + d21mesh.rotateY(Math.PI * 1); + d21mesh.rotateZ(Math.PI * 0.5); + d21mesh.position.set(-800, -400 , 0); + threeHCSR.add(d21mesh); + + //cubo1 + const cube1 = new THREE.BoxGeometry(240, 240, 240); + const d22mesh = new THREE.Mesh(cube1, dmaterial); + d22mesh.position.set(-1000, -400 , 0); + threeHCSR.add(d22mesh); + + //cubo2 red + const cube2 = new THREE.BoxGeometry(190, 190, 190); + const cubematerial = new THREE.MeshLambertMaterial({color: 0xFF0000}); + const d23mesh = new THREE.Mesh(cube2, cubematerial); + d23mesh.position.set(-1000, -400 , -50); + threeHCSR.add(d23mesh); + + //tubilaterali2a + const lateraltube2a = new THREE.CylinderGeometry(140, 140, 200, 25); + const d24mesh = new THREE.Mesh(lateraltube2a, dmaterial); + d24mesh.rotateX(Math.PI * 0.5); + d24mesh.rotateY(Math.PI * 1); + d24mesh.rotateZ(Math.PI * 0.5); + d24mesh.position.set(-650, 0 , 0); + threeHCSR.add(d24mesh); + + //tubilaterali2b + const lateraltube2b = new THREE.CylinderGeometry(180, 180, 50, 25); + const d25mesh = new THREE.Mesh(lateraltube2b, dmaterial); + d25mesh.rotateX(Math.PI * 0.5); + d25mesh.rotateY(Math.PI * 1); + d25mesh.rotateZ(Math.PI * 0.5); + d25mesh.position.set(-770, 0 , 0); + threeHCSR.add(d25mesh); + + //tubilaterali3a + const lateraltube3a = new THREE.CylinderGeometry(180, 180, 110, 25); + const d26mesh = new THREE.Mesh(lateraltube3a, dmaterial); + d26mesh.rotateX(Math.PI * 0.5); + d26mesh.rotateY(Math.PI * 1); + d26mesh.rotateZ(Math.PI * 0.5); + d26mesh.position.set(-680, 520 , -200); + threeHCSR.add(d26mesh); + + //bulloni front + const bulloni1 = new THREE.CylinderGeometry(10, 10, 10, 8); + const d27mesh = new THREE.Mesh(bulloni1, dmaterial2); + d27mesh.rotateX(Math.PI * 0.5); + d27mesh.rotateY(Math.PI * 1); + d27mesh.rotateZ(Math.PI * 0.5); + d27mesh.position.set(-800,100,-120); + const bolt = new THREE.Object3D(); + const bolts = new THREE.Object3D(); + bolt.add(d27mesh); + for (let i=-6; i<6; i++) { + const bolt2 = bolt.clone(); + bolt2.rotateX(-Math.PI / 6*i); + bolts.add(bolt2); + } + bolts.add(bolt); + const bolts2 = bolts.clone(); + bolts2.position.set(60,520,-200); + threeHCSR.add(bolts); + threeHCSR.add(bolts2); + + threeHCSR.scale.set(0.7, 0.7, 0.7); + + return threeHCSR; + } + + + // scw + export function scw(param) { + const length = param && typeof param.length == "number"? param.length: 2200; + const SCWSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0xffffff}); + const d1geometry = new THREE.CylinderGeometry(700, 700, length, 35); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + SCWSR.add(d1mesh); + SCWSR.rotateX(Math.PI * 0.5); + SCWSR.rotatedX = true; + + // left + const lrgeometry = new THREE.CylinderGeometry(750, 750, 100, 65); + const d2mesh = new THREE.Mesh(lrgeometry, dmaterial); + d2mesh.position.set(0, -length/2-50, 0); + SCWSR.add(d2mesh); + + // left center + const lrgeometry2 = new THREE.CylinderGeometry(750, 750, 70, 65); + const d2meshc = new THREE.Mesh(lrgeometry2, dmaterial); + d2meshc.position.set(0, -length/2+800, 0); + SCWSR.add(d2meshc); + + // right + const d3mesh = new THREE.Mesh(lrgeometry, dmaterial); + d3mesh.position.set(0, length/2+50, 0); + SCWSR.add(d3mesh); + + // right center + const lrgeometry3 = new THREE.CylinderGeometry(750, 750, 70, 65); + const d3meshc = new THREE.Mesh(lrgeometry3, dmaterial); + d3meshc.position.set(0, -length/2+1400, 0); + SCWSR.add(d3meshc); + + // up1 + const udgeometry = new THREE.CylinderGeometry(200, 200, 300, 25); + const d4mesh = new THREE.Mesh(udgeometry, dmaterial); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -600 , -770); + SCWSR.add(d4mesh); + + // up2 + const udgeometry2 = new THREE.CylinderGeometry(200, 200, 300, 25); + const d5mesh = new THREE.Mesh(udgeometry2, dmaterial); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 0 , -730); + SCWSR.add(d5mesh); + + + + //up3 + const udgeometry2g = new THREE.CylinderGeometry(200, 200, 300, 25); + const d6mesh = new THREE.Mesh(udgeometry2g, dmaterial); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 600 , -730); + SCWSR.add(d6mesh); + + //cubo1 + const cube1 = new THREE.BoxGeometry(150, 150, 150); + const d7mesh = new THREE.Mesh(cube1, dmaterial2); + d7mesh.position.set(-610, 0 , -200); + SCWSR.add(d7mesh); + + + // up1b + const udgeometryb = new THREE.CylinderGeometry(250, 250, 100, 25); + const d9mesh = new THREE.Mesh(udgeometryb, dmaterial); + d9mesh.rotateX(Math.PI * 0.5); + d9mesh.rotateY(Math.PI * 1); + d9mesh.rotateZ(Math.PI * 1); + d9mesh.position.set(0, -600 , -900); + SCWSR.add(d9mesh); + + // up1c + const udgeometryc = new THREE.CylinderGeometry(200, 200, 300, 25); + const d10mesh = new THREE.Mesh(udgeometryc, dmaterial); + d10mesh.rotateX(Math.PI * 0.5); + d10mesh.rotateY(Math.PI * 1); + d10mesh.rotateZ(Math.PI * 1); + d10mesh.position.set(0, -600 , -1100); + SCWSR.add(d10mesh); + + // up1d + const udgeometrye = new THREE.CylinderGeometry(250, 250, 100, 25); + const d11mesh = new THREE.Mesh(udgeometryb, dmaterial); + d11mesh.rotateX(Math.PI * 0.5); + d11mesh.rotateY(Math.PI * 1); + d11mesh.rotateZ(Math.PI * 1); + d11mesh.position.set(0, -600 , -1300); + SCWSR.add(d11mesh); + + // up2b + const d12mesh = new THREE.Mesh(udgeometryb, dmaterial); + d12mesh.rotateX(Math.PI * 0.5); + d12mesh.rotateY(Math.PI * 1); + d12mesh.rotateZ(Math.PI * 1); + d12mesh.position.set(0, 0 , -900); + SCWSR.add(d12mesh); + + // up2c + const d13mesh = new THREE.Mesh(udgeometryc, dmaterial); + d13mesh.rotateX(Math.PI * 0.5); + d13mesh.rotateY(Math.PI * 1); + d13mesh.rotateZ(Math.PI * 1); + d13mesh.position.set(0, 0 , -900); + SCWSR.add(d13mesh); + + // up2d + const d14mesh = new THREE.Mesh(udgeometryb, dmaterial); + d14mesh.rotateX(Math.PI * 0.5); + d14mesh.rotateY(Math.PI * 1); + d14mesh.rotateZ(Math.PI * 1); + d14mesh.position.set(0, 0 , -1090); + SCWSR.add(d14mesh); + + // up3b + const d15mesh = new THREE.Mesh(udgeometryb, dmaterial); + d15mesh.rotateX(Math.PI * 0.5); + d15mesh.rotateY(Math.PI * 1); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(0, 600 , -900); + SCWSR.add(d15mesh); + + // up3c + const d16mesh = new THREE.Mesh(udgeometryc, dmaterial); + d16mesh.rotateX(Math.PI * 0.5); + d16mesh.rotateY(Math.PI * 1); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(0, 600 , -1100); + SCWSR.add(d16mesh); + + // up3d + const d17mesh = new THREE.Mesh(udgeometryb, dmaterial); + d17mesh.rotateX(Math.PI * 0.5); + d17mesh.rotateY(Math.PI * 1); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(0, 600 , -1300); + SCWSR.add(d17mesh); + + SCWSR.scale.set(0.7, 0.7, 0.7); + + return SCWSR; + } + // lmbf + export function lmbf(param) { + const length=300; + const lmbfSR = new THREE.Object3D(); + const lmbfContainer = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0x969696}); + + const d1geometry = new THREE.CylinderGeometry(100, 100, 250, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + lmbfContainer.add(d1mesh); + lmbfContainer.rotateX(Math.PI * 0.5); + lmbfContainer.rotatedX = true; + + // left + const d2geometry = new THREE.CylinderGeometry(100, 100, 10, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, -130, 0); + lmbfContainer.add(d2mesh); + + // right + const d3geometry = new THREE.CylinderGeometry(100, 100, 10, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmaterial2); + d3mesh.position.set(0, 130, 0); + lmbfContainer.add(d3mesh); + + // up1 + const d4geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d4mesh = new THREE.Mesh(d4geometry, dmaterial2); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -80 , 0); + lmbfContainer.add(d4mesh); + + // up2 + const d5geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d5mesh = new THREE.Mesh(d5geometry, dmaterial2); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 80 , 0); + lmbfContainer.add(d5mesh); + + // lef1 + const d6geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d6mesh = new THREE.Mesh(d6geometry, dmaterial2); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 0.5); + d6mesh.position.set(0, -80 , 0); + lmbfContainer.add(d6mesh); + + // right2 + const d7geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial2); + d7mesh.rotateX(Math.PI * 0.5); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 0.5); + d7mesh.position.set(0, 80 , 0); + lmbfContainer.add(d7mesh); + + lmbfContainer.position.set(0, 0, 0); + lmbfSR.add(lmbfContainer); + lmbfSR.rotateY(Math.PI * 1); + return lmbfSR; + } + // tmbf + export function tmbf(param) { + const length=600; + const tmbfSR = new THREE.Object3D(); + const tmbfContainer = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xffd700}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0x969696}); + const dmaterialsilver = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + const d1geometry = new THREE.CylinderGeometry(100, 100, 600, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + tmbfContainer.add(d1mesh); + tmbfContainer.rotateX(Math.PI * 0.5); + tmbfContainer.rotatedX = true; + + // coverleft + const d2geometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial); + d2mesh.position.set(0, -300, 0); + tmbfContainer.add(d2mesh); + + // coverleft silver + const dslgeometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const dslmesh = new THREE.Mesh(dslgeometry, dmaterialsilver); + dslmesh.position.set(0, -320, 0); + tmbfContainer.add(dslmesh); + + //covercenter + const dmgeometry = new THREE.CylinderGeometry(130, 130, 40, 25); + const dmmesh = new THREE.Mesh(dmgeometry, dmaterial); + dmmesh.position.set(0, 0, 0); + tmbfContainer.add(dmmesh); + + //coverright + const d3geometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmaterial); + d3mesh.position.set(0, 300, 0); + tmbfContainer.add(d3mesh); + + // coverright silver + const dsrgeometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const dsrmesh = new THREE.Mesh(dsrgeometry, dmaterialsilver); + dsrmesh.position.set(0, 320, 0); + tmbfContainer.add(dsrmesh); + + // up1 + const d4geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d4mesh = new THREE.Mesh(d4geometry, dmaterial2); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -80 , 0); + tmbfContainer.add(d4mesh); + + // up2 + const d5geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d5mesh = new THREE.Mesh(d5geometry, dmaterial2); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, -200 , 0); + tmbfContainer.add(d5mesh); + + // lef1 + const d6geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d6mesh = new THREE.Mesh(d6geometry, dmaterial2); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 0.5); + d6mesh.position.set(0, 80 , 0); + tmbfContainer.add(d6mesh); + + // right2 + const d7geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial2); + d7mesh.rotateX(Math.PI * 0.5); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 0.5); + d7mesh.position.set(0, 200 , 0); + tmbfContainer.add(d7mesh); + + tmbfContainer.position.set(0, 0, 0); + tmbfSR.add(tmbfContainer); + tmbfSR.rotateY(Math.PI * 1); + return tmbfSR; + } + // scraper + export function scraper(param) { + const ScraperContiner = new THREE.Object3D(); + const ScraperObject = new THREE.Object3D(); + + // box esterno + const boxmaterial = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const boxgeometry = new THREE.BoxGeometry(140, 40, 400); + const d1mesh = new THREE.Mesh(boxgeometry, boxmaterial); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.250); + d1mesh.rotateY(Math.PI * 1.5); + d1mesh.rotateZ(Math.PI * 1.25); + d1mesh.position.set(0, 0, 0); + ScraperObject.add(d1mesh); + + // box lato1 + const sidematerial2 = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const sidegeometry2 = new THREE.BoxGeometry(140, 20, 140 ); + const d2mesh = new THREE.Mesh(sidegeometry2, sidematerial2); + d2mesh.position.set(0, 0, 0); + d2mesh.rotateX(Math.PI * 1.5); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + d2mesh.position.set(-191, 50, 0); + ScraperObject.add(d2mesh); + + // box lato2 + const sidematerial3 = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const sidegeometry3 = new THREE.BoxGeometry(140, 20, 140 ); + const d3mesh = new THREE.Mesh(sidegeometry3, sidematerial3); + d3mesh.position.set(0, 0, 0); + d3mesh.rotateX(Math.PI * 1.5); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1.5); + d3mesh.position.set(191, 50, 0); + ScraperObject.add(d3mesh); + + // box esterno2 + const boxgeometry2 = new THREE.BoxGeometry(140, 40, 400); + const d5mesh = new THREE.Mesh(boxgeometry2, boxmaterial); + d5mesh.position.set(0, 0, 0); + d5mesh.rotateX(Math.PI * 1.250); + d5mesh.rotateY(Math.PI * 1.5); + d5mesh.rotateZ(Math.PI * 1.25); + d5mesh.position.set(0, 100, 0); + ScraperObject.add(d5mesh); + + //cilinder + const cilgeometry = new THREE.CylinderGeometry(50, 50, 340, 25); + const cilmaterial = new THREE.MeshLambertMaterial({color: 0xc4c4c4}); + const d4mesh = new THREE.Mesh(cilgeometry, cilmaterial); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1.5); + d4mesh.rotateZ(Math.PI * 1.5); + d4mesh.position.set(0,50 , 0); + ScraperObject.add(d4mesh); + + //cilinder2 + const cilgeometry2 = new THREE.CylinderGeometry(15, 15, 360, 15); + const d6mesh = new THREE.Mesh(cilgeometry2, cilmaterial); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1.0); + d6mesh.rotateZ(Math.PI * 1.5); + d6mesh.position.set(0,50 , 0); + ScraperObject.add(d6mesh); + + ScraperObject.position.set(0, -150, 0); + ScraperObject.scale.setX(3); + ScraperObject.scale.setY(3); + ScraperObject.scale.setZ(1); + ScraperContiner.add(ScraperObject); + ScraperContiner.rotateY(Math.PI * -1); + + + return ScraperContiner; + } + // valve + export function vlv(param) { + const vlvContiner = new THREE.Object3D(); + const vlvObject = new THREE.Object3D(); + + //cylinder + const cylgeometry = new THREE.CylinderGeometry(25, 25, 50, 15); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + vlvObject.add(cylmesh); + + // base1 + const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 ); + const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial); + vlv1mesh.position.set(0, 50, 0); + vlv1mesh.colorable = true; + vlvObject.add(vlv1mesh); + + // hat1 + const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const hatgeometry = new THREE.BoxGeometry(50, 20, 100 ); + const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial); + hatmesh.colorable = true; + hatmesh.position.set(0, 120, 0); + vlvObject.add(hatmesh); + + // blackbox + const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363}); + const blackboxgeometry = new THREE.BoxGeometry(40, 70, 70 ); + const blackboxmesh = new THREE.Mesh(blackboxgeometry, blackboxmaterial); + blackboxmesh.position.set(0, 165, 15); + vlvObject.add(blackboxmesh); + + // blackbox2 + const blackbox2material = new THREE.MeshLambertMaterial({color: 0x000000}); + const blackbox2geometry = new THREE.BoxGeometry(40, 40, 20 ); + const blackbo2xmesh = new THREE.Mesh(blackbox2geometry, blackbox2material); + blackbo2xmesh.position.set(0, 165, -30); + vlvObject.add(blackbo2xmesh); + vlvObject.scale.setX(1.5); + vlvObject.scale.setY(1.5); + vlvObject.scale.setZ(1.5); + + //TRIANGLE1 + const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3); + const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackbox2material); + trianglegeometrymesh.rotateX(Math.PI * 0); + trianglegeometrymesh.rotateY(Math.PI * 0); + trianglegeometrymesh.rotateZ(Math.PI * 0.5); + trianglegeometrymesh.position.set(0, 60 , -17); + vlvObject.add(trianglegeometrymesh); + + //TRIANGLE2 + const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3); + const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackbox2material); + triangle2geometrymesh.rotateX(Math.PI * 0); + triangle2geometrymesh.rotateY(Math.PI * 1); + triangle2geometrymesh.rotateZ(Math.PI * 0.5); + triangle2geometrymesh.position.set(0, 60 ,17); + vlvObject.add(triangle2geometrymesh); + + vlvObject.position.set(0, 0, 0); + vlvObject.rotateY(Math.PI * -0.5); + vlvContiner.add(vlvObject); + + return vlvContiner; + } + export function vlvUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + // bst + export function bst(param) { + const bstObject = new THREE.Object3D(); + const bstContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 190, 0); + bstObject.add(d1mesh); + bstObject.rotateX(Math.PI * 1); + + // circ base + const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + bstObject.add(d2mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 120 , 0); + bstObject.add(d4mesh); + + // cil Major + const d5geometry = new THREE.CylinderGeometry(90, 90, 20, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 50 , 0); + d5mesh.colorable = true; + bstObject.add(d5mesh); + + // cil Med + const d6geometry = new THREE.CylinderGeometry(70, 70, 80, 15); + const d6mesh = new THREE.Mesh(d6geometry, materialGrey); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 0 , 0); + d6mesh.colorable = true; + bstObject.add(d6mesh); + + // cil low + const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15); + const d7mesh = new THREE.Mesh(d7geometry, materialGrey); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -100 , 0); + d7mesh.colorable = true; + bstObject.add(d7mesh); + + const d8geometry = new THREE.CylinderGeometry(60, 60, 20, 15); + const d8mesh = new THREE.Mesh(d8geometry, materialGrey); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(0, -170 , 0); + bstObject.add(d8mesh); + + bstObject.position.set(0, 290, 0); + bstContiner.add(bstObject); + bstContiner.rotateY(Math.PI * -0.5); + return bstContiner; + } + export function bstUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + // BeamlinesUP + export function beamlineUp(param) { + // console.log('beamlineUp()',param); + const continer = new THREE.Object3D(); + const text=param.name, height=50; + let length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: 200; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: 18000*(param.labelReverse? -1: 1); + let size=500; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, Math.PI*0.5]); + continer.add(objLabel); + length=30000; + const material = new THREE.MeshBasicMaterial({color: 0x00e9ff, transparent: true, opacity: 0.4, side: THREE.DoubleSide}); + const geometry = new THREE.CylinderGeometry(1500*(param.labelReverse? 0: 1) /*radiusTop*/, 1500*(param.labelReverse? 1: 0) /*radiusBottom*/, length /*height*/, 2 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 0.5 /*thetaLength*/); + const beamlineUpMesh = new THREE.Mesh(geometry, material); + beamlineUpMesh.position.set(0, 0, length/2*(param.labelReverse? -1: 1)); + beamlineUpMesh.rotateX(Math.PI * 0.5); + beamlineUpMesh.rotateY(Math.PI * 0.5); + beamlineUpMesh.scale.setX(0.001); + continer.add(beamlineUpMesh); + return continer; + } + // BeamlinesDown + export function beamlineDown(param) { + // console.log('beamlineDown()',param); + const continer = new THREE.Object3D(); + const text=param.name, height=50; + let length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -700; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: 18000*(param.labelReverse? -1: 1); + let size=500; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, Math.PI*0.5]); + continer.add(objLabel); + length=30000; + const material = new THREE.MeshBasicMaterial({color: 0xd000ff, transparent: true, opacity: 0.2, side: THREE.DoubleSide}); + const geometry = new THREE.CylinderGeometry(1500*(param.labelReverse? 0: 1) /*radiusTop*/, 1500*(param.labelReverse? 1: 0) /*radiusBottom*/, length /*height*/, 2 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,Math.PI /*thetaStart*/, Math.PI * 0.5 /*thetaLength*/); + const beamlineUpMesh = new THREE.Mesh(geometry, material); + beamlineUpMesh.position.set(0, 0, length/2*(param.labelReverse? -1: 1)); + beamlineUpMesh.rotateX(Math.PI * 0.5); + beamlineUpMesh.rotateY(Math.PI * 0.5); + beamlineUpMesh.scale.setX(0.001); + continer.add(beamlineUpMesh); + return continer; + } + // PLC + export function plc_backup(param) { + const plcObject = new THREE.Object3D(); + const cardsObject = new THREE.Object3D(); + + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11}); + const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11}); + const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757}); + const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + + // base + const basegeometry = new THREE.BoxGeometry(500, 300, 600); + const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial); + basegeometrymesh.position.set( 0, 0 ,0); + plcObject.add(basegeometrymesh); + + // card + const cardgeometry = new THREE.BoxGeometry(502, 270, 50); + const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial); + cardgeometrymesh.position.set( 0, 0 , -200); + cardsObject.add(cardgeometrymesh); + + //led1 + const led1green = new THREE.BoxGeometry(504, 20, 20); + const led1greenmesh = new THREE.Mesh(led1green, greenmaterial); + led1greenmesh.position.set( 0, 120 , -200); + cardsObject.add(led1greenmesh); + //led2 + const led2green = new THREE.BoxGeometry(504, 20, 20); + const led2greenmesh = new THREE.Mesh(led2green, greenmaterial); + led2greenmesh.position.set( 0, 90 , -200); + cardsObject.add(led2greenmesh); + //led3 + const led3green = new THREE.BoxGeometry(504, 20, 20); + const led3greenmesh = new THREE.Mesh(led3green, greenmaterial); + led3greenmesh.position.set( 0, 60 , -200); + cardsObject.add(led3greenmesh); + //led4 + const led4green = new THREE.BoxGeometry(504, 20, 20); + const led4greenmesh = new THREE.Mesh(led4green, greenmaterial); + led4greenmesh.position.set( 0, 30 , -200); + cardsObject.add(led4greenmesh); + //led5 + const led5green = new THREE.BoxGeometry(504, 20, 20); + const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial); + led5greenmesh.position.set( 0, 0 , -200); + cardsObject.add(led5greenmesh); + //led6 + const led6green = new THREE.BoxGeometry(504, 20, 20); + const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial); + led6greenmesh.position.set( 0, -30 , -200); + cardsObject.add(led6greenmesh); + //led7 + const led7green = new THREE.BoxGeometry(504, 20, 20); + const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial); + led7greenmesh.position.set( 0, -60 , -200); + cardsObject.add(led7greenmesh); + //led8 + const led8green = new THREE.BoxGeometry(504, 20, 20); + const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial); + led8greenmesh.position.set( 0, -90 , -200); + cardsObject.add(led8greenmesh); + //led9 + const led9green = new THREE.BoxGeometry(504, 20, 20); + const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial); + led9greenmesh.position.set( 0, -120 , -200); + cardsObject.add(led9greenmesh); + + //CLONE Cards + + const card2 = cardsObject.clone(); + card2.position.set( 0, 0 , 50); + plcObject.add(card2); + + const card3 = cardsObject.clone(); + card3.position.set( 0, 0 , 100); + plcObject.add(card3); + + const card4 = cardsObject.clone(); + card4.position.set( 0, 0 , 150); + plcObject.add(card4); + + const card5 = cardsObject.clone(); + card5.position.set( 0, 0 , 200); + plcObject.add(card5); + + // baseScreen + const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200); + const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial); + baseScreengeometrymesh.position.set( 0, 0 , 120); + plcObject.add(baseScreengeometrymesh); + + // 1livel + const livel1geometry = new THREE.BoxGeometry(550, 150, 150); + const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial); + livel1geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel1geometrymesh); + // 2livel + const livel2geometry = new THREE.BoxGeometry(590, 100, 149); + const livel2geometrymesh = new THREE.Mesh(livel2geometry, graymaterial2); + livel2geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel2geometrymesh); + + plcObject.add(cardsObject); + + plcObject.scale.setX(0.7); + plcObject.scale.setY(0.7); + plcObject.scale.setZ(0.7); + + return plcObject; + } diff --git a/components/bundle_elettra2d.svg b/components/bundle_elettra2d.svg new file mode 100644 index 0000000000000000000000000000000000000000..6b20e48f2f5303c4240542d094ba76f0ddcfbf1f --- /dev/null +++ b/components/bundle_elettra2d.svg @@ -0,0 +1,270 @@ +<svg id="panther" viewBox="-40000 -40000 40000 40000" version="1.1" xmlns="http://www.w3.org/2000/svg" style="width: 100%; overflow: hidden; display: inline; min-width: inherit; max-width: inherit; min-height: inherit;"> + <symbol id="beamlineUp" width="30000" height="5000" viewBox="0 0 30000 5000" preserveAspectRatio="xMidYMid meet"><g class="beamlineUPscale scale" > + <g transform="translate(500 500)"> + <polygon points="820,1150 10320,500 12820,1150" fill="#A5D9FD" stroke="#2f2f2f" opacity="0.1" /> + </g> + </g></symbol> + <symbol id="beamlineUpOrig" width="30000" height="7000" viewBox="0 0 30000 3000" preserveAspectRatio="xMidYMid meet"><g class="beamlineUPscale scale" > + <g transform="scale(5) translate(-680 -350)"> + <polygon points="300,300 2200,300 2700,300" fill="#FF0000" stroke="#2f2f2f" opacity="0.1" /> + </g> + </g></symbol> + <symbol id="beamlineDown" width="30000" height="5000" viewBox="0 0 30000 5000" preserveAspectRatio="xMidYMid meet"><g class="beamlineDownscale scale" > + <g transform="scale(5) translate(-200 -80)"> + <polygon points="100,100 2200,220 2700,100" fill="white" stroke="#2f2f2f" opacity="0.5" /> + </g> + </g></symbol> + <symbol id="dipole" width="1200" height="660" viewBox="0 0 600px 330px"><g class="dipolescale scale"> + <g> + <polygon points="50,50 220,28 440,37 500,50 500,250 420,240 220,227 50,250" stroke="black" stroke-width="1" fill="forestgreen" /> + <path d="M 46 50 Q300 5 504 50" stroke="black" stroke-width="10" fill="none" /> + <path d="M 53 249 Q300 210 497 249" stroke="black" stroke-width="10" fill="none" /> + <line x1="50" y1="47" x2="50" y2="254" stroke="black" stroke-width="10" /> + <line x1="500" y1="47" x2="500" y2="254" stroke="black" stroke-width="10" /> + <path d="M 45 90 a 60 80 0 0 0 0 120 M 505 90 a 60 80 0 0 1 0 120" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <text class="bending" x="275" y="185" text-anchor="middle" font-family="Arial" font-size="150" fill="white" width="2">B</text> + </g> + </g></symbol> + <symbol id="dipolebooster" width="1200" height="660" viewBox="0 0 600px 330px"><g class="dipoleboosterscale scale"> + <g> + <polygon points="50,50 220,28 440,37 500,50 500,250 420,240 220,227 50,250" stroke="black" stroke-width="1" fill="forestgreen" /> + <path d="M 46 50 Q300 5 504 50" stroke="black" stroke-width="10" fill="none" /> + <path d="M 53 249 Q300 210 497 249" stroke="black" stroke-width="10" fill="none" /> + <line x1="50" y1="47" x2="50" y2="254" stroke="black" stroke-width="10" /> + <line x1="500" y1="47" x2="500" y2="254" stroke="black" stroke-width="10" /> + <path d="M 45 90 a 60 80 0 0 0 0 120 M 505 90 a 60 80 0 0 1 0 120" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <text class="bending" x="275" y="185" text-anchor="middle" font-family="Arial" font-size="150" fill="white" width="2">B</text> + </g> + </g></symbol> + <symbol id="lens" width="600" height="410" viewBox="0 0 600px 330px"><g class="lensscale scale" transform="rotate(180)"> + <g> + <path d="M 48 70 a 60 55 0 0 0 0 60 M 82 70 a 60 55 0 0 1 0 60" stroke="#ffe600" stroke-width="2" fill="#707070" /> + <rect x="50" y="50" width="30" height="100" rx="10" ry="10" fill="#adadad" stroke="darkslategrey" stroke-width="5"/> + <line x1="55" y1="65" x2="75" y2="65" stroke="white" stroke-width="7" /> + <line x1="72" y1="62" x2="72" y2="128" stroke="white" stroke-width="7" /> + </g> + </g></symbol> + <symbol id="bpm" viewBox="0 0 400px 210px"> + <g class="bpmscale scale"><g transform="translate(75 0) scale(2.5)"> + <rect x="5" y="20" width="15" height="40" rx="10" ry="10" fill="violet" stroke="darkslategrey" stroke-width="3"/> + <line x1="12.5" y1="33" x2="12.5" y2="47" stroke="white" stroke-width="3px" /> + <line x1="7" y1="40" x2="18" y2="40" stroke="white" stroke-width="3px" /> + </g></g> + </symbol> + <symbol id="cavity" viewBox="0 0 400px 300px"> + <g class="cavityscale scale"><g transform="scale(0.75) translate(0 -30)"> + <path d="M 80 50 a 60 100 0 0 0 0 220 M 80 50 a 60 100 0 0 1 0 220" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 60 a 60 101 0 0 0 0 200 M 80 60 a 60 101 0 0 1 0 200" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 70 a 60 97 0 0 0 0 180 M 80 70 a 60 97 0 0 1 0 180" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 80 a 60 100 0 0 0 0 160 M 80 80 a 60 100 0 0 1 0 160" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <circle r="20" cx="80" cy="160" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + </g></g> + </symbol> + <symbol id="cavitylinac" viewBox="0 0 3100px 210px" width="3100" height="310"> + <g class="cavitylinacscale scale"><g transform="rotate(180 800 80)"> + <rect x="0" y="30" width="3100" height="210" rx="10" ry="10" fill="#777777" stroke="darkslategrey" stroke-width="5"/> + <text x="850" y="120" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2" >Cavity</text> + </g></g> + </symbol> + <symbol id="cavity_3hc" width="1500" height="1410" viewBox="0 0 1000px 550px"> + <g class="cavity_3hcscale scale"><g transform="translate(0 -25) scale(1.5)"> + <rect x="40" y="70" width="300" height="200" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="20" y="40" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="340" y="40" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <circle r="30" cx="120" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="20" cx="120" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="30" cx="220" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="20" cx="220" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="25" cx="300" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="15" cx="300" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="5" cx="160" cy="145" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="5" cx="180" cy="145" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="5" cx="160" cy="180" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="5" cx="180" cy="180" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <rect x="260" y="230" width="40" height="20" stroke="#2f2f2f" stroke-width="6" fill="#c7c7c7" /> + <rect x="210" y="275" width="40" height="20" stroke="#2f2f2f" stroke-width="6" fill="#c7c7c7" /> + <rect x="95" y="275" width="50" height="40" stroke="#2f2f2f" stroke-width="6" fill="#c7c7c7" /> + <rect x="100" y="300" width="40" height="30" stroke="#2f2f2f" stroke-width="6" fill="red" /> + <line x1="300" y1="165" x2="400" y2="220" stroke="black" stroke-width="13px" /> + <line x1="220" y1="165" x2="220" y2="220" stroke="black" stroke-width="13px" /> + <line x1="75" y1="220" x2="225" y2="220" stroke="black" stroke-width="13px" /> + </g></g> + </symbol> + <symbol id="corrector" viewBox="0 0 400px 210px"><g class="correctorscale scale"> + <g transform="translate(10 0)"> + <path d="M 48 70 a 60 55 0 0 0 0 60 M 100 70 a 60 55 0 0 1 0 60" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <rect x="50" y="50" width="50" height="100" rx="10" ry="10" fill="blue" stroke="darkslategrey" stroke-width="5"/> + <text class="corrector" x="75" y="80" text-anchor="middle" font-family="Arial" font-size="55" fill="white" width="2" transform="scale(1 1.7)">C</text> + </g> + </g></symbol> + <symbol id="flsc" viewBox="0 0 300px 610px"> + <g class="flscscale scale"><g transform="translate(250 555) rotate(180)"> + <rect x="134" y="420" width="10" height="30" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="120" y="384" width="40" height="30" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <line x1="120" y1="388" x2="160" y2="388" stroke="black" stroke-width="1px" /> + <line x1="120" y1="392" x2="160" y2="392" stroke="black" stroke-width="1px" /> + <line x1="120" y1="396" x2="160" y2="396" stroke="black" stroke-width="1px" /> + <line x1="120" y1="400" x2="160" y2="400" stroke="black" stroke-width="1px" /> + <line x1="120" y1="404" x2="160" y2="404" stroke="black" stroke-width="1px" /> + <line x1="120" y1="408" x2="160" y2="408" stroke="black" stroke-width="1px" /> + <rect x="125" y="351" width="30" height="30" stroke="#2f2f2f" stroke-width="3" fill="#2f2f2f" /> + <line x1="110" y1="328" x2="170" y2="328" stroke="#c7c7c7" stroke-width="15px" /> + <rect x="120" y="305" width="40" height="50" stroke="#2f2f2f" stroke-width="3" fill="#5f5f5f" /> + <rect x="122" y="270" width="35" height="35" stroke="#2f2f2f" stroke-width="3" fill="orange" /> + <rect x="100" y="264" width="10" height="130" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <rect x="170" y="264" width="10" height="130" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <circle r="20" cx="140" cy="450" fill="#c7c7c7" stroke="#2f2f2f" stroke-width="3px" /> + </g></g> + </symbol> + <symbol id="gun" viewBox="0 0 400px 210px"> + <g class="gunscale scale"><g> + <rect x="50" y="50" width="110" height="110" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="5"/> + <text x="105" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">G</text> + </g></g> + </symbol> + <symbol id="kicker" viewBox="0 0 700px 350px"><g class="kickerscale scale"> + <g transform="translate(0 350) rotate(-90) scale(0.75)"> + <rect x="110" y="10" width="200" height="340" stroke="#2f2f2f" stroke-width="6px" fill="lightslategrey" /> + <rect x="310" y="14" width="80" height="330" stroke="#2f2f2f" stroke-width="6px" fill="lightslategrey" /> + <circle r="25" cx="350" cy="170" fill="red " stroke="red" stroke-width="6px" /> + <polygon points="110,10 60,40 60,310, 110,350" fill="lightslategrey" stroke="#2f2f2f" stroke-width="6px" /> + </g> + </g></symbol> + <symbol id="quadrupole" viewBox="0 0 400px 210px"> + <g class="quadrupolescale scale"><g> + <rect x="50" y="50" width="110" height="110" rx="10" ry="10" fill="#ff3d3d" stroke="darkslategrey" stroke-width="5"/> + <text class="quadrupole" x="105" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">Q</text> + <path d="M 47 60 a 90 55 0 0 0 0 45 M 162 60 a 90 55 0 0 1 0 45" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <path d="M 47 105 a 90 55 0 0 0 0 45 M 162 105 a 90 55 0 0 1 0 45" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + </g></g> + </symbol> + <symbol id="scw" width="2500" height="1410" viewBox="0 0 1800px 580px"> + <g class="scwscale scale"><g transform="translate(0 -25) scale(1.5)"> + <rect x="40" y="70" width="500" height="200" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="20" y="40" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="500" y="40" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <circle r="40" cx="140" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="140" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="40" cx="280" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="280" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="40" cx="420" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="420" cy="165" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <rect x="260" y="230" width="40" height="20" stroke="#2f2f2f" stroke-width="6" fill="#c7c7c7" /> + <line x1="210" y1="55" x2="210" y2="285" stroke="#a2a2a2" stroke-width="13px" /> + <line x1="350" y1="55" x2="350" y2="285" stroke="#a2a2a2" stroke-width="13px" /> + </g></g> + </symbol> + <symbol id="sextupole" viewBox="0 0 400px 400px"><g class="sextupolescale scale"> + <g> + <rect x="50" y="50" width="110" height="110" rx="10" ry="10" fill="#ffe000" stroke="darkslategrey" stroke-width="5"/> + <text class="sextupole" x="105" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="black" stroke-width="2">S</text> + <path d="M 48 60 a 90 55 0 0 0 0 45 M 162 60 a 90 55 0 0 1 0 45 " stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <path d="M 48 105 a 90 55 0 0 0 0 45 M 162 105 a 90 55 0 0 1 0 45" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <path d="M 80 48 Q105 30 130 48 M 80 162 Q105 180 135 162" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + </g> + </g></symbol> + <symbol id="spte" width="1300px" height="auto" viewBox="0 0 1200px 500px"><g class="sptescale scale"> + <g> + <rect x="25" y="35" width="350" height="200" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="5" y="5" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="335" y="5" width="40" height="260" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <circle r="40" cx="125" cy="130" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="125" cy="130" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="40" cx="260" cy="130" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="260" cy="130" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + </g> + </g></symbol> + <symbol id="undulator" width="1600" viewBox="0 0 750px 180px"><g class="undulatorscale scale"> + <g> + <defs> + <pattern id="Pattern" x="0" y="0" width=".05" height="1"> + <rect x="0" y="0" width="34" height="170" fill="#a6a4c9"/> + <rect x="0" y="0" width="17" height="85" fill="#8a89a7" stroke="black" stroke-width="1" /> + <rect x="17" y="85" width="17" height="85" fill="#8a89a7" stroke="black" stroke-width="1" /> + </pattern> + </defs> + <rect x="5" y="15" fill="url(#Pattern)" width="680" height="170" stroke="black" stroke-width="10" /> + </g> + </g></symbol> + <symbol id="undulatorfast" width="1600" viewBox="0 0 680px 170px"><g class="undulatorscale scale"> + <g> + <rect x="5" y="15" fill="#a6a4c9" width="680" height="170" stroke="black" stroke-width="10" /> + <rect x="5" y="15" fill="#a6a4c9" width="680" height="85" stroke="black" stroke-width="1" /> + <rect x="5" y="100" fill="#8a89a7" width="680" height="85" stroke="black" stroke-width="1" /> + </g> + </g></symbol> + <symbol id="miniundulator" width="1600" viewBox="0 0 750px 180px"><g class="miniundulatorscale scale"> + <g> + <defs> + <pattern id="Pattern" x="0" y="0" width=".05" height="1"> + <rect x="0" y="0" width="34" height="170" fill="#a6a4c9"/> + <rect x="0" y="0" width="17" height="85" fill="#8a89a7" stroke="black" stroke-width="1" /> + <rect x="17" y="85" width="17" height="85" fill="#8a89a7" stroke="black" stroke-width="1" /> + </pattern> + </defs> + <rect x="5" y="15" fill="url(#Pattern)" width="340" height="170" stroke="black" stroke-width="10" /> + </g> + </g></symbol> + <symbol id="vlv" viewBox="0 0 900px 900px" width="3200" height="3100"><g class="vlvscale scale"> + <g> + <polygon points="60,55 120,55 90,100" stroke="#2f2f2f" stroke-width="3" /> + <polygon points="90,100 60,145 120,145" stroke="#2f2f2f" stroke-width="3" /> + <circle r="15" cx="90" cy="100" stroke="#2f2f2f" stroke-width="3" /> + </g> + </g></symbol> + <symbol id="wiggler" viewBox="0 0 600px 300px"><g class="wigglerscale scale"> + <g> + <rect x="40" y="10" width="400" height="90" stroke="black" stroke-width="10" fill="plum" /> + <rect x="40" y="100" width="400" height="90" stroke="black" stroke-width="10" fill="plum" /> + <rect x="40" y="190" width="40" height="40" stroke="black" stroke-width="10" fill="none" /> + <rect x="400" y="190" width="40" height="40" stroke="black" stroke-width="10" fill="none" /> + </g> + </g></symbol> + <symbol id="scraper" viewBox="0 0 400px 300px"><g class="scaraperscale scale"> + <g> + <rect x="40" y="40" width="50" height="100" rx="10" ry="10" fill="#80c3ff" stroke="darkslategrey" stroke-width="5"/> + <rect x="53" y="55" width="25" height="70" rx="10" ry="10" fill="#ffc380" stroke="darkslategrey" stroke-width="5"/> + <line x1="65" y1="30" x2="65" y2="80" stroke="black" stroke-width="5" /> + <line x1="65" y1="100" x2="65" y2="150" stroke="black" stroke-width="5" /> + </g> + </g></symbol> + <symbol id="bst" viewBox="0 0 400px 400px"><g class="bstscale scale"> + <g> + <rect x="40" y="20" width="80" height="170" stroke="black" stroke-width="7" fill="#c7c7c7" /> + <circle r="50" cx="80" cy="105" stroke="#2f2f2f" stroke-width="10" /> + <circle r="40" cx="80" cy="105" stroke="#2f2f2f" stroke-width="5" /> + </g> + </g></symbol> + <symbol id="plc_backup" viewBox="0 0 400px 210px"><g class="plcscale scale"> + <rect x="50" y="50" width="120" height="90" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="5"/> + <text x="110" y="113" text-anchor="middle" font-family="Arial" font-size="55" fill="white" width="2">PLC</text> + </g></symbol> + <symbol id="cm" width="600" height="410" viewBox="0 0 600px 330px"><g class="cmscale scale"> + <g> + <rect x="50" y="50" width="40" height="90" rx="15" ry="15" fill="#00d0ff" stroke="darkslategrey" stroke-width="5"/> + <text x="70" y="74" text-anchor="middle" font-family="Arial" font-size="50" fill="white" width="2" transform="scale(1 1.7)">C</text> + <text x="72" y="70" text-anchor="middle" font-family="Arial" font-size="20" fill="white" width="2" transform="scale(1 1.5)">M</text> + </g> + </g></symbol> + <symbol id="lmbf" width="400" height="400" viewBox="0 0 400px 430px"><g class="lmbfscale scale"> + <g transform="translate(0 25) scale(1.3)"> + <rect x="50" y="20" width="10" height="70" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <rect x="100" y="20" width="10" height="70" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <rect x="30" y="30" width="100" height="50" stroke="#2f2f2f" stroke-width="5" fill="#c7c7c7" /> + <circle r="5" cx="55" cy="55" fill="#edebeb" stroke="#2f2f2f" stroke-width="3px" /> + <circle r="5" cx="105" cy="55" fill="#edebeb" stroke="#2f2f2f" stroke-width="3px" /> + </g> + </g></symbol> + <symbol id="tmbf" width="600" height="600" viewBox="0 0 500px 530px"><g class="tmbfscale scale"> + <g transform="translate(0 50) scale(0.65)"> + <rect x="70" y="20" width="10" height="120" stroke="#2f2f2f" stroke-width="3" fill="#ffd700" /> + <rect x="150" y="20" width="10" height="120" stroke="#2f2f2f" stroke-width="3" fill="#ffd700" /> + <rect x="35" y="30" width="370" height="100" stroke="#2f2f2f" stroke-width="5" fill="#ffd700" /> + <rect x="5" y="5" width="30" height="150" stroke="#2f2f2f" stroke-width="5" fill="#ffd700" /> + <rect x="200" y="5" width="30" height="150" stroke="#2f2f2f" stroke-width="5" fill="#ffd700" /> + <rect x="400" y="5" width="30" height="150" stroke="#2f2f2f" stroke-width="5" fill="#ffd700" /> + <circle r="7" cx="270" cy="80" fill="#edebeb" stroke="#2f2f2f" stroke-width="3px" /> + <circle r="7" cx="362" cy="80" fill="#edebeb" stroke="#2f2f2f" stroke-width="3px" /> + </g> + </g></symbol> +</svg> diff --git a/components/bundle_elettrafast.js b/components/bundle_elettrafast.js new file mode 100644 index 0000000000000000000000000000000000000000..eac5d6b7a951f46779add18be2796bb60c409287 --- /dev/null +++ b/components/bundle_elettrafast.js @@ -0,0 +1,1161 @@ +/*jshint esversion: 6 */ + import * as THREE from 'three'; + import {FontLoader} from 'three/addons/loaders/FontLoader.js'; + import {TextGeometry} from 'three/addons/geometries/TextGeometry.js'; + + // gun rack + export function gun(param) { + const width=800, height=2000, depth=800; + const gunObject = new THREE.Object3D(); + const gunmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const gungeometry = new THREE.BoxGeometry(width, height, depth); + const gunmesh = new THREE.Mesh(gungeometry, gunmaterial); + gunObject.add(gunmesh); + return gunObject; + } + + // quadrupole + export function quadrupoleboosterfast(param) { + const length=300; + const quadrupoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040}); + const d1geometry = new THREE.BoxGeometry(550, 500, length); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + quadrupoleMaster.add(d1mesh); + return quadrupoleMaster; + } + + // BPM (beam position monitor) + export function bpm(param) { + const width=300, height=300, depth=50, transverse=100; + const bpmObject = new THREE.Object3D(); + const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff}); + const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth); + const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial); + bpmObject.add(bpmmeshh); + const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth); + const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial); + bpmObject.add(bpmmeshv); + return bpmObject; + } + + // flsc + export function flscfast(param) { + const length=700; + const flscSR = new THREE.Object3D(); + const flscContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + + const d1geometry = new THREE.CylinderGeometry(25, 25, 500, 15); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + flscContiner.add(d1mesh); + flscContiner.rotateX(Math.PI * 1); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(70, 70, 160, 20); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 80 , 0); + flscContiner.add(d4mesh); + + // cil3 + const dmateria6 = new THREE.MeshLambertMaterial({color: 0x000000}); + const d6geometry = new THREE.CylinderGeometry(50, 50, 60, 15); + const d6mesh = new THREE.Mesh(d6geometry, dmateria6); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, -30 , 0); + flscContiner.add(d6mesh); + + // box gray + const d7geometry = new THREE.BoxGeometry(100, 100, 100); + const dmaterial7= new THREE.MeshLambertMaterial({color: 0x405040}); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial7); + d7mesh.position.set(0, -110, 0); + flscContiner.add(d7mesh); + + // box orange + const d9geometry = new THREE.BoxGeometry(100, 120, 100); + const dmaterial9= new THREE.MeshLambertMaterial({color: 0xffA500}); + const d9mesh = new THREE.Mesh(d9geometry, dmaterial9); + d9mesh.position.set(0, -220, 0); + flscContiner.add(d9mesh); + + flscContiner.position.set(0, 280, 0); + flscSR.add(flscContiner); + flscSR.rotateY(Math.PI * -0.5); + return flscSR; + } + + // corrector + export function correctorboosterfast(param) { + const width=250, height=250, depth=200; + const correctorObject = new THREE.Object3D(); + const correctormaterial = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry = new THREE.BoxGeometry(width, height, depth); + const correctormesh = new THREE.Mesh(correctorgeometry, correctormaterial); + correctorObject.add(correctormesh); + return correctorObject; + } + + + // cavity for linac + export function cavitylinac(param) { + const length=3000; + const cavitylinacMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(400, 400, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + cavitylinacMaster.add(d1mesh); + cavitylinacMaster.rotateX(Math.PI * 0.5); + cavitylinacMaster.rotatedX = true; + return cavitylinacMaster; + } + + + // Bending Dipole + export function dipoleboosterfast(length = 1915) { + const dipoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0x009000}); + const d1geometry = new THREE.BoxGeometry(550, 400, length); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(100, 100, 0); + dipoleMaster.add(d1mesh); + return dipoleMaster; + } + + + // Sextupole + export function sextupoleboosterfast(param) { + const length=200; + const sextupoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xffff00}); + const d1geometry = new THREE.CylinderGeometry(300, 300, length, 6); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.rotateX(Math.PI * 0.5); + d1mesh.rotateY(Math.PI * 0.5); + sextupoleMaster.add(d1mesh); + return sextupoleMaster; + } + // septum + export function spte(param) { + const length = param && typeof param.length == "number"? param.length: 1000; + const septumSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(200, 200, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + septumSR.add(d1mesh); + septumSR.rotateX(Math.PI * 0.5); + septumSR.rotatedX = true; + + // left + const dmateria2 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d2geometry = new THREE.CylinderGeometry(250, 250, 100, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmateria2); + d2mesh.position.set(0, -length/2-50, 0); + septumSR.add(d2mesh); + + // right + const dmateria3 = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d3geometry = new THREE.CylinderGeometry(250, 250, 100, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmateria3); + d3mesh.position.set(0, length/2+50, 0); + septumSR.add(d3mesh); + + + septumSR.scale.setY(0.7); + + return septumSR; + } + + // kicker + export function kicker(param) { + const length=300; + const septumMaster = new THREE.Object3D(); + + const d1geometry = new THREE.BoxGeometry(710, 500, 500); + const dmaterial = new THREE.MeshLambertMaterial({color: 0x405040}); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, -20, 330); + septumMaster.add(d1mesh); + + //add quad2 + const d2geometry = new THREE.BoxGeometry(710, 270, 300); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0x405040}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, -135, 80); + septumMaster.add(d2mesh); + + //add sest + const d3geometry = new THREE.CylinderGeometry(300, 300, 700, 6); + const dmateria3 = new THREE.MeshLambertMaterial({color: 0xffff00}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/kicker_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d3mesh = new THREE.Mesh(d3geometry, material); + d3mesh.rotateX(Math.PI * 1); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1.5); + d3mesh.position.set(0, 0 , 230); + septumMaster.add(d3mesh); + + //capsule + const geometry = new THREE.CapsuleGeometry( 50, 50, 40, 80 ); + const material_cap = new THREE.MeshBasicMaterial( {color: 0xff0000} ); + const d4mesh = new THREE.Mesh( geometry, material_cap ); + d4mesh.position.set(0, 240 , 480); + septumMaster.add(d4mesh); + + septumMaster.rotateY(Math.PI * 0.5); + return septumMaster; + } + + // lens + export function lens(param) { + const lensContiner = new THREE.Object3D(); + const lensObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(105, 105, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + lensObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x737373}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + lensObject.add(cyl2mesh); + + // base1 + const basegeometry = new THREE.BoxGeometry(29, 160, 60 ); + const basemesh = new THREE.Mesh(basegeometry, cylmaterial); + basemesh.position.set(0, -70, 0); + lensObject.add(basemesh); + + + lensObject.scale.setX(1); + lensObject.scale.setY(1); + lensObject.scale.setZ(1); + lensObject.position.set(0, 0, 0); + lensContiner.add(lensObject); + lensContiner.rotateY(Math.PI * 0.5); + + return lensContiner; + } + // cavity + export function cavity(param) { + const sphereRadius=300, sphereFactor=0.5, cylinderRadius=40, cylinderHeight=600; + const cavityObject = new THREE.Object3D(); + const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0}); + const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32); + const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial); + cavitymesh.scale.setZ(sphereFactor); + cavityObject.add(cavitymesh); + const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius, cylinderHeight, 20, 2, false, 0, Math.PI * 2); + const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial); + // rfMesh.rotateX(Math.PI * 0.5); + rfMesh.position.set(0, sphereRadius, 0); + cavityObject.add(rfMesh); + return cavityObject; + } + + // 3hc + export function cavity_3hc(param) { + const threeHCSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0xffffff}); + const d1geometry = new THREE.CylinderGeometry(700, 700, 1500, 35); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + threeHCSR.add(d1mesh); + threeHCSR.rotateX(Math.PI * 0.5); + threeHCSR.rotatedX = true; + + // left + const lrgeometry = new THREE.CylinderGeometry(750, 750, 100, 65); + const d2mesh = new THREE.Mesh(lrgeometry, dmaterial); + d2mesh.position.set(0, -1500/2-50, 0); + threeHCSR.add(d2mesh); + + // right + const d3mesh = new THREE.Mesh(lrgeometry, dmaterial); + d3mesh.position.set(0, 1500/2+50, 0); + threeHCSR.add(d3mesh); + + // up1 + const udgeometry = new THREE.CylinderGeometry(250, 250, 700, 25); + const d4mesh = new THREE.Mesh(udgeometry, dmaterial); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -400 , -730); + threeHCSR.add(d4mesh); + + // up2 + const udgeometry2 = new THREE.CylinderGeometry(150, 150, 700, 25); + const d5mesh = new THREE.Mesh(udgeometry2, dmaterial); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 400 , -730); + threeHCSR.add(d5mesh); + + + //tubo1 + const tubegeometry1 = new THREE.CylinderGeometry(30, 30, 1100, 25); + const d12mesh = new THREE.Mesh(tubegeometry1, dmaterial); + d12mesh.rotateX(Math.PI * 0.5); + d12mesh.rotateY(Math.PI * 0.5); + d12mesh.rotateZ(Math.PI * 0.5); + d12mesh.position.set(-430, -150 , -930); + threeHCSR.add(d12mesh); + + //tubo2 + const tubegeometry2 = new THREE.CylinderGeometry(30, 30, 450, 25); + const d13mesh = new THREE.Mesh(tubegeometry2, dmaterial); + d13mesh.rotateX(Math.PI * 0.5); + d13mesh.rotateY(Math.PI * 1); + d13mesh.rotateZ(Math.PI * 0.5); + d13mesh.position.set(-200, 400 , -930); + threeHCSR.add(d13mesh); + + //sferacopritubo + const sphereGeometry = new THREE.SphereGeometry(30, 30, 30); + const d14mesh = new THREE.Mesh(sphereGeometry, dmaterial); + d14mesh.position.set(-430, 400 , -930); + threeHCSR.add(d14mesh); + + + //up3a + const udgeometry2h = new THREE.CylinderGeometry(30, 30, 400, 25); + const d16mesh = new THREE.Mesh(udgeometry2h, dmaterial); + d16mesh.rotateX(Math.PI * 0.5); + d16mesh.rotateY(Math.PI * 1); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(0, 650 , -900); + threeHCSR.add(d16mesh); + + + //up3c + const udgeometry2m = new THREE.CylinderGeometry(30, 30, 400, 25); + const d18mesh = new THREE.Mesh(udgeometry2m, dmaterial); + d18mesh.rotateX(Math.PI * 0.5); + d18mesh.rotateY(Math.PI * 0.75); + d18mesh.rotateZ(Math.PI * 1.5); + d18mesh.position.set(-140, 790 , -1100); + threeHCSR.add(d18mesh); + + //sferacopritubo laterale + const sphereGeometry2 = new THREE.SphereGeometry(30, 30, 30); + const d19mesh = new THREE.Mesh(sphereGeometry2, dmaterial); + d19mesh.position.set(0, 650 , -800); + threeHCSR.add(d19mesh); + + + //cubo1 + const cube1 = new THREE.BoxGeometry(440, 240, 240); + const d22mesh = new THREE.Mesh(cube1, dmaterial); + d22mesh.position.set(-800, -400 , 0); + threeHCSR.add(d22mesh); + + + //tubilaterali2a + const lateraltube2a = new THREE.CylinderGeometry(140, 140, 200, 25); + const d24mesh = new THREE.Mesh(lateraltube2a, dmaterial); + d24mesh.rotateX(Math.PI * 0.5); + d24mesh.rotateY(Math.PI * 1); + d24mesh.rotateZ(Math.PI * 0.5); + d24mesh.position.set(-650, 0 , 0); + threeHCSR.add(d24mesh); + + + //tubilaterali3a + const lateraltube3a = new THREE.CylinderGeometry(180, 180, 110, 25); + const d26mesh = new THREE.Mesh(lateraltube3a, dmaterial); + d26mesh.rotateX(Math.PI * 0.5); + d26mesh.rotateY(Math.PI * 1); + d26mesh.rotateZ(Math.PI * 0.5); + d26mesh.position.set(-680, 520 , -200); + threeHCSR.add(d26mesh); + threeHCSR.scale.set(0.7, 0.7, 0.7); + + return threeHCSR; + } + // scw + export function scw(param) { + const length = param && typeof param.length == "number"? param.length: 2200; + const SCWSR = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0xffffff}); + const d1geometry = new THREE.CylinderGeometry(700, 700, length, 35); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + SCWSR.add(d1mesh); + SCWSR.rotateX(Math.PI * 0.5); + SCWSR.rotatedX = true; + + // left + const lrgeometry = new THREE.CylinderGeometry(750, 750, 100, 65); + const d2mesh = new THREE.Mesh(lrgeometry, dmaterial); + d2mesh.position.set(0, -length/2-50, 0); + SCWSR.add(d2mesh); + + + // right + const d3mesh = new THREE.Mesh(lrgeometry, dmaterial); + d3mesh.position.set(0, length/2+50, 0); + SCWSR.add(d3mesh); + + // up1 + const udgeometry = new THREE.CylinderGeometry(200, 200, 700, 25); + const d4mesh = new THREE.Mesh(udgeometry, dmaterial); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -600 , -770); + SCWSR.add(d4mesh); + + // up2 + const udgeometry2 = new THREE.CylinderGeometry(200, 200, 400, 25); + const d5mesh = new THREE.Mesh(udgeometry2, dmaterial); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 0 , -730); + SCWSR.add(d5mesh); + + //up3 + const udgeometry2g = new THREE.CylinderGeometry(200, 200, 700, 25); + const d6mesh = new THREE.Mesh(udgeometry2g, dmaterial); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 600 , -730); + SCWSR.add(d6mesh); + + //cubo1 + const cube1 = new THREE.BoxGeometry(150, 150, 150); + const d7mesh = new THREE.Mesh(cube1, dmaterial2); + d7mesh.position.set(-610, 0 , -200); + SCWSR.add(d7mesh); + + SCWSR.scale.set(0.7, 0.7, 0.7); + return SCWSR; + } + + // Current Monitor + export function cm(param) { + const cmContiner = new THREE.Object3D(); + const cmObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + cmObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + cmObject.add(cyl2mesh); + + + cmObject.scale.setX(1); + cmObject.scale.setY(1); + cmObject.scale.setZ(1); + cmObject.position.set(0, 0, 0); + cmContiner.add(cmObject); + cmContiner.rotateY(Math.PI * -0.5); + + + return cmContiner; + } + // corrector + export function correctorfast(param) { + const width=250, height=250, depth=200; + const correctorObject = new THREE.Object3D(); + const correctormaterial = new THREE.MeshLambertMaterial({color: 0x4040b0}); + const correctorgeometry = new THREE.BoxGeometry(width, height, depth); + const correctormesh = new THREE.Mesh(correctorgeometry, correctormaterial); + correctorObject.add(correctormesh); + return correctorObject; + } + + // Bending Dipole + export function dipolefast(length=1400) { + const dipoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0x00c000}); + const d1geometry = new THREE.BoxGeometry(500, 700, length); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(100, 100, 0); + dipoleMaster.add(d1mesh); + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + return dipoleMaster; + } + + // Quadrupole + export function quadrupole(param) { + const length=260; + const quadrupoleMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const quadrupolematerial = new THREE.MeshLambertMaterial({color: 0xff7050}); + const quadrupolegeometry = new THREE.CylinderGeometry(250, 250, length, 8); + const quadrupolemesh = new THREE.Mesh(quadrupolegeometry, quadrupolematerial); + quadrupoleMaster.add(quadrupolemesh); + const quadrupole2geometry = new THREE.CylinderGeometry(290, 290, 30, 50); + const quadrupole2mesh = new THREE.Mesh(quadrupole2geometry, chamberMaterial); + quadrupole2mesh.position.set(0, -length/2-15, 0); + quadrupoleMaster.add(quadrupole2mesh); + const quadrupole3mesh = new THREE.Mesh(quadrupole2geometry, chamberMaterial); + quadrupole3mesh.position.set(0, length/2+15, 0); + quadrupoleMaster.add(quadrupole3mesh); + quadrupoleMaster.rotateX(Math.PI * 0.5); + quadrupoleMaster.rotatedX = true; + const qedges = new THREE.EdgesGeometry(quadrupolegeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x600000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + quadrupoleMaster.add(qline); + return quadrupoleMaster; + } + + + // Sextupole + export function sextupole(param) { + const length=230; + const sextupoleMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const sextupolematerial = new THREE.MeshLambertMaterial({color: 0xffff00}); + const sextupolegeometry = new THREE.CylinderGeometry(250, 250, length, 6); + const sextupolemesh = new THREE.Mesh(sextupolegeometry, sextupolematerial); + sextupoleMaster.add(sextupolemesh); + const sextupole2geometry = new THREE.CylinderGeometry(290, 290, 30, 50); + const sextupole2mesh = new THREE.Mesh(sextupole2geometry, chamberMaterial); + sextupole2mesh.position.set(0, -length/2-15, 0); + sextupoleMaster.add(sextupole2mesh); + const sextupole3mesh = new THREE.Mesh(sextupole2geometry, chamberMaterial); + sextupole3mesh.position.set(0, length/2+15, 0); + sextupoleMaster.add(sextupole3mesh); + sextupoleMaster.rotateX(Math.PI * 0.5); + sextupoleMaster.rotatedX = true; + const sedges = new THREE.EdgesGeometry(sextupolegeometry); + const sline = new THREE.LineSegments(sedges, new THREE.LineBasicMaterial({color: 0x808000})); + sextupoleMaster.add(sline); + return sextupoleMaster; + } + + + // undulator + export function undulator(param) { + const length=1300; + const undulatorMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/undulator.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + undulatorMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + undulatorMaster.add(qline); + return undulatorMaster; + } + + // wiggler + export function wiggler(param) { + const length=1300; + const wigglerMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xf3a1eb}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/wiggler.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + wigglerMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + wigglerMaster.add(qline); + return wigglerMaster; + } + + // Beam Loss Monitor + export function blm(param) { + const length=100, dcolor=0xffffff, width=100; + const cMaster = new THREE.Object3D(); + const d1geometry = new THREE.BoxGeometry(length, width, width); + const material = new THREE.MeshLambertMaterial({color: dcolor}); + const d1mesh = new THREE.Mesh(d1geometry, material); + d1mesh.position.set(-length/2, 0, 0); + cMaster.add(d1mesh); + return cMaster; + } + function blmColor(val) { + if (document.location.search.indexOf('demo')>-1) { + if (val < 0) return 'white'; + else if (val < 1) return 'yellow'; + else if (val < 2) return 'orange'; + else if (val < 3) return 'red'; + else return 'violet'; + } + if (val < 20) return 'white'; + else if (val < 50) return 'yellow'; + else if (val < 100) return 'orange'; + else if (val < 200) return 'red'; + else return 'violet'; + } + export function blmUpdate(c, val, direction, width=100) { + if (typeof val !== 'number') val = 0; + const blm = c.children[0]; + blm.material.dispose(); + blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)}); + blm.geometry.dispose(); + const histogramFactor = document.location.search.indexOf('demo')>-1? 1000: 50; + blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width); + // console.log('blmUpdate()', c, val, direction, width, width+val*histogramFactor); + blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0); + blm.geometry.computeVertexNormals(); + blm.geometry.normalsNeedUpdate = true; + blm.geometry.verticesNeedUpdate = true; + blm.geometry.dynamic = true; + } + + // BeamlinesUP + export function beamlineUp(param) { + // console.log('beamlineUp()',param); + const continer = new THREE.Object3D(); + const text=param.name, height=50; + let length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: 200; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: 18000*(param.labelReverse? -1: 1); + let size=500; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, Math.PI*0.5]); + continer.add(objLabel); + length=30000; + const material = new THREE.MeshBasicMaterial({color: 0xA5D9FD, transparent: true, opacity: 0.4, side: THREE.DoubleSide}); + const geometry = new THREE.CylinderGeometry(1500*(param.labelReverse? 0: 1) /*radiusTop*/, 1500*(param.labelReverse? 1: 0) /*radiusBottom*/, length /*height*/, 2 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 0.5 /*thetaLength*/); + const beamlineUpMesh = new THREE.Mesh(geometry, material); + beamlineUpMesh.position.set(0, 0, length/2*(param.labelReverse? -1: 1)); + beamlineUpMesh.rotateX(Math.PI * 0.5); + beamlineUpMesh.rotateY(Math.PI * 0.5); + beamlineUpMesh.scale.setX(0.001); + continer.add(beamlineUpMesh); + return continer; + } + // BeamlinesDown + export function beamlineDown(param) { + // console.log('beamlineDown()',param); + const continer = new THREE.Object3D(); + const text=param.name, height=50; + let length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -700; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: 18000*(param.labelReverse? -1: 1); + let size=500; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, Math.PI*0.5]); + continer.add(objLabel); + length=30000; + const material = new THREE.MeshBasicMaterial({color: 'limegreen', transparent: true, opacity: 0.2, side: THREE.DoubleSide}); + const geometry = new THREE.CylinderGeometry(1500*(param.labelReverse? 0: 1) /*radiusTop*/, 1500*(param.labelReverse? 1: 0) /*radiusBottom*/, length /*height*/, 2 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,Math.PI /*thetaStart*/, Math.PI * 0.5 /*thetaLength*/); + const beamlineUpMesh = new THREE.Mesh(geometry, material); + beamlineUpMesh.position.set(0, 0, length/2*(param.labelReverse? -1: 1)); + beamlineUpMesh.rotateX(Math.PI * 0.5); + beamlineUpMesh.rotateY(Math.PI * 0.5); + beamlineUpMesh.scale.setX(0.001); + continer.add(beamlineUpMesh); + return continer; + } + + // scraper + export function scraper(param) { + const ScraperContiner = new THREE.Object3D(); + const ScraperObject = new THREE.Object3D(); + + // box esterno + const boxmaterial = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const boxgeometry = new THREE.BoxGeometry(140, 40, 400); + const d1mesh = new THREE.Mesh(boxgeometry, boxmaterial); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.250); + d1mesh.rotateY(Math.PI * 1.5); + d1mesh.rotateZ(Math.PI * 1.25); + d1mesh.position.set(0, 0, 0); + ScraperObject.add(d1mesh); + + // box lato1 + const sidematerial2 = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const sidegeometry2 = new THREE.BoxGeometry(140, 20, 140 ); + const d2mesh = new THREE.Mesh(sidegeometry2, sidematerial2); + d2mesh.position.set(0, 0, 0); + d2mesh.rotateX(Math.PI * 1.5); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + d2mesh.position.set(-191, 50, 0); + ScraperObject.add(d2mesh); + + // box lato2 + const sidematerial3 = new THREE.MeshLambertMaterial({color: 0xd6d6d6}); + const sidegeometry3 = new THREE.BoxGeometry(140, 20, 140 ); + const d3mesh = new THREE.Mesh(sidegeometry3, sidematerial3); + d3mesh.position.set(0, 0, 0); + d3mesh.rotateX(Math.PI * 1.5); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1.5); + d3mesh.position.set(191, 50, 0); + ScraperObject.add(d3mesh); + + // box esterno2 + const boxgeometry2 = new THREE.BoxGeometry(140, 40, 400); + const d5mesh = new THREE.Mesh(boxgeometry2, boxmaterial); + d5mesh.position.set(0, 0, 0); + d5mesh.rotateX(Math.PI * 1.250); + d5mesh.rotateY(Math.PI * 1.5); + d5mesh.rotateZ(Math.PI * 1.25); + d5mesh.position.set(0, 100, 0); + ScraperObject.add(d5mesh); + + //cilinder + const cilgeometry = new THREE.CylinderGeometry(50, 50, 340, 25); + const cilmaterial = new THREE.MeshLambertMaterial({color: 0xc4c4c4}); + const d4mesh = new THREE.Mesh(cilgeometry, cilmaterial); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1.5); + d4mesh.rotateZ(Math.PI * 1.5); + d4mesh.position.set(0,50 , 0); + ScraperObject.add(d4mesh); + + + + ScraperObject.position.set(0, -150, 0); + ScraperObject.scale.setX(3); + ScraperObject.scale.setY(3); + ScraperObject.scale.setZ(1); + ScraperContiner.add(ScraperObject); + ScraperContiner.rotateY(Math.PI * -1); + + + return ScraperContiner; + } + // lmbf + export function lmbf(param) { + const length=300; + const lmbfSR = new THREE.Object3D(); + const lmbfContainer = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0x969696}); + + const d1geometry = new THREE.CylinderGeometry(100, 100, 250, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + lmbfContainer.add(d1mesh); + lmbfContainer.rotateX(Math.PI * 0.5); + lmbfContainer.rotatedX = true; + + // left + const d2geometry = new THREE.CylinderGeometry(100, 100, 10, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, -130, 0); + lmbfContainer.add(d2mesh); + + // right + const d3geometry = new THREE.CylinderGeometry(100, 100, 10, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmaterial2); + d3mesh.position.set(0, 130, 0); + lmbfContainer.add(d3mesh); + + // up1 + const d4geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d4mesh = new THREE.Mesh(d4geometry, dmaterial2); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -80 , 0); + lmbfContainer.add(d4mesh); + + // up2 + const d5geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d5mesh = new THREE.Mesh(d5geometry, dmaterial2); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 80 , 0); + lmbfContainer.add(d5mesh); + + // lef1 + const d6geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d6mesh = new THREE.Mesh(d6geometry, dmaterial2); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 0.5); + d6mesh.position.set(0, -80 , 0); + lmbfContainer.add(d6mesh); + + // right2 + const d7geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial2); + d7mesh.rotateX(Math.PI * 0.5); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 0.5); + d7mesh.position.set(0, 80 , 0); + lmbfContainer.add(d7mesh); + + lmbfContainer.position.set(0, 0, 0); + lmbfSR.add(lmbfContainer); + lmbfSR.rotateY(Math.PI * 1); + return lmbfSR; + } + // tmbf + export function tmbf(param) { + const length=600; + const tmbfSR = new THREE.Object3D(); + const tmbfContainer = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xffd700}); + const dmaterial2 = new THREE.MeshLambertMaterial({color: 0x969696}); + const dmaterialsilver = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + + const d1geometry = new THREE.CylinderGeometry(100, 100, 600, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + tmbfContainer.add(d1mesh); + tmbfContainer.rotateX(Math.PI * 0.5); + tmbfContainer.rotatedX = true; + + // coverleft + const d2geometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial); + d2mesh.position.set(0, -300, 0); + tmbfContainer.add(d2mesh); + + + //covercenter + const dmgeometry = new THREE.CylinderGeometry(130, 130, 40, 25); + const dmmesh = new THREE.Mesh(dmgeometry, dmaterial); + dmmesh.position.set(0, 0, 0); + tmbfContainer.add(dmmesh); + + //coverright + const d3geometry = new THREE.CylinderGeometry(130, 130, 20, 25); + const d3mesh = new THREE.Mesh(d3geometry, dmaterial); + d3mesh.position.set(0, 300, 0); + tmbfContainer.add(d3mesh); + + // up1 + const d4geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d4mesh = new THREE.Mesh(d4geometry, dmaterial2); + d4mesh.rotateX(Math.PI * 0.5); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, -80 , 0); + tmbfContainer.add(d4mesh); + + // up2 + const d5geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d5mesh = new THREE.Mesh(d5geometry, dmaterial2); + d5mesh.rotateX(Math.PI * 0.5); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, -200 , 0); + tmbfContainer.add(d5mesh); + + // lef1 + const d6geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d6mesh = new THREE.Mesh(d6geometry, dmaterial2); + d6mesh.rotateX(Math.PI * 0.5); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 0.5); + d6mesh.position.set(0, 80 , 0); + tmbfContainer.add(d6mesh); + + // right2 + const d7geometry = new THREE.CylinderGeometry(10, 10, 250, 25); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial2); + d7mesh.rotateX(Math.PI * 0.5); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 0.5); + d7mesh.position.set(0, 200 , 0); + tmbfContainer.add(d7mesh); + + tmbfContainer.position.set(0, 0, 0); + tmbfSR.add(tmbfContainer); + tmbfSR.rotateY(Math.PI * 1); + return tmbfSR; + } + // bst + export function bst(param) { + const bstObject = new THREE.Object3D(); + const bstContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 190, 0); + bstObject.add(d1mesh); + bstObject.rotateX(Math.PI * 1); + + // circ base + const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + bstObject.add(d2mesh); + + // z + const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15); + const d4mesh = new THREE.Mesh(d4geometry, materialGrey); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 120 , 0); + d4mesh.colorable = true; + bstObject.add(d4mesh); + + // cil Med + const d6geometry = new THREE.CylinderGeometry(70, 70, 120, 15); + const d6mesh = new THREE.Mesh(d6geometry, materialGrey); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 0 , 0); + d6mesh.colorable = true; + bstObject.add(d6mesh); + + // cil low + const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15); + const d7mesh = new THREE.Mesh(d7geometry, materialGrey); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -100 , 0); + d7mesh.colorable = true; + bstObject.add(d7mesh); + + bstObject.position.set(0, 280, 0); + bstContiner.add(bstObject); + bstContiner.rotateY(Math.PI * -0.5); + return bstContiner; + } + export function bstUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + // valve + export function vlv(param) { + const vlvContiner = new THREE.Object3D(); + const vlvObject = new THREE.Object3D(); + const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363}); + //cylinder + const cylgeometry = new THREE.CylinderGeometry(25, 25, 100, 15); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + vlvObject.add(cylmesh); + + // base1 + const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 ); + const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial); + vlv1mesh.position.set(0, 50, 0); + vlv1mesh.colorable = true; + vlvObject.add(vlv1mesh); + + // hat1 + const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const hatgeometry = new THREE.BoxGeometry(50, 20, 100 ); + const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial); + hatmesh.colorable = true; + hatmesh.position.set(0, 120, 0); + vlvObject.add(hatmesh); + + + //TRIANGLE1 + const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3); + const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackboxmaterial); + trianglegeometrymesh.rotateX(Math.PI * 0); + trianglegeometrymesh.rotateY(Math.PI * 0); + trianglegeometrymesh.rotateZ(Math.PI * 0.5); + trianglegeometrymesh.position.set(0, 60 , -17); + vlvObject.add(trianglegeometrymesh); + + //TRIANGLE2 + const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3); + const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackboxmaterial); + triangle2geometrymesh.rotateX(Math.PI * 0); + triangle2geometrymesh.rotateY(Math.PI * 1); + triangle2geometrymesh.rotateZ(Math.PI * 0.5); + triangle2geometrymesh.position.set(0, 60 ,17); + vlvObject.add(triangle2geometrymesh); + + vlvObject.position.set(0, 0, 0); + vlvObject.rotateY(Math.PI * -0.5); + vlvContiner.add(vlvObject); + + return vlvContiner; + } + export function vlvUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } diff --git a/components/bundle_fermi.js b/components/bundle_fermi.js new file mode 100644 index 0000000000000000000000000000000000000000..9be39c1b60425d840da0861066e07279a409e8ef --- /dev/null +++ b/components/bundle_fermi.js @@ -0,0 +1,4074 @@ +/*jshint esversion: 6 */ + import * as THREE from 'three'; + // import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js'; + import {FontLoader} from 'three/addons/loaders/FontLoader.js'; + import {TextGeometry} from 'three/addons/geometries/TextGeometry.js'; + + // rack + export function rack(width=800, height=2000, depth=800, color=0xf0f0f0) { + const gunObject = new THREE.Object3D(); + const gunmaterial = new THREE.MeshLambertMaterial({color: color}); + const gungeometry = new THREE.BoxGeometry(width, height, depth); + const gunmesh = new THREE.Mesh(gungeometry, gunmaterial); + gunmesh.position.set(width/2, height/2, depth/2); + gunObject.add(gunmesh); + return gunObject; + } + // transparent wall + export function wall(param) { + const length=3000; + const material = new THREE.MeshBasicMaterial({color: 0xff8080, transparent: true, opacity: 0.2, side: THREE.DoubleSide,}); + const geometry = new THREE.CylinderGeometry(10 /*radiusTop*/, 10 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const chamberMesh = new THREE.Mesh(geometry, material); + chamberMesh.rotateX(Math.PI * 0.5); + chamberMesh.scale.setZ(100); + chamberMesh.rotatedX = true; + return chamberMesh; + } + // label + export function label(param) { + const text=param.name, height=-50; + const length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -3000; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: -3000; + let size=800; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, 0]); + + return objLabel; + } + export function rack2(width=800, height=2000, depth=600) {return rack(width, height, depth);} + + export function rv(param) { + const width=800, height=2500, depth=800; + const rv = new THREE.Object3D(); + const rv_rackObject = new THREE.Object3D(); + const pspump_rackObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const Darkwhitematerial = new THREE.MeshLambertMaterial({color: 0xbababa}); + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rv.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(800, 90, 800); + rv.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]); + + + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + //rrmesh.position.set( 0, 0 , -810); + rv_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -5); + rv_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -5); + rv_rackObject.add(Rtargetmesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -365); + rv_rackObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 380); + rv_rackObject.add(lremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , 3); + rv_rackObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , 3); + rv_rackObject.add(ldemesh); + //silverbase + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 750); + const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, silvermaterial); + drawer1geometrymesh.position.set( -400, 0 , -10); + rv_rackObject.add(drawer1geometrymesh); + + //base PS ionic Pump + const baseionicpump = new THREE.BoxGeometry(10, 250, 300); + const baseionicpumpmesh = new THREE.Mesh(baseionicpump, Darkwhitematerial); + baseionicpumpmesh.position.set( -401, 900 , -150); + pspump_rackObject.add(baseionicpumpmesh); + + //sceen PS ionic Pump + const screenionicpump = new THREE.BoxGeometry(10, 60, 180); + const screenionicpumpmesh = new THREE.Mesh(screenionicpump, screenmaterial); + screenionicpumpmesh.position.set( -402, 950 , -150); + pspump_rackObject.add(screenionicpumpmesh); + + //button ON OFF PS ionic Pump + const buttonionicpump = new THREE.BoxGeometry(10, 50, 30); + const buttonionicpumpmesh = new THREE.Mesh(buttonionicpump, materialVeryGreyDark); + buttonionicpumpmesh.position.set( -402, 830 , -250); + pspump_rackObject.add(buttonionicpumpmesh); + + //button ON Details + const I = new THREE.BoxGeometry(3, 12, 3); + const IMesh = new THREE.Mesh(I, Darkwhitematerial); + IMesh.position.set( -407, 844 , -250); + pspump_rackObject.add(IMesh); + + //button OFF Details + const OI1 = new THREE.CylinderGeometry(8, 8, 2, 15); + const OI1Mesh = new THREE.Mesh(OI1, Darkwhitematerial); + OI1Mesh.rotateX(Math.PI * 0.5); + OI1Mesh.rotateY(Math.PI * 1); + OI1Mesh.rotateZ(Math.PI * 0.5); + OI1Mesh.position.set( -407, 817 , -250); + pspump_rackObject.add(OI1Mesh); + + //button OFF Details 2 + const OI2 = new THREE.CylinderGeometry(6, 6, 2, 15); + const OI2Mesh = new THREE.Mesh(OI2, materialVeryGreyDark); + OI2Mesh.rotateX(Math.PI * 0.5); + OI2Mesh.rotateY(Math.PI * 1); + OI2Mesh.rotateZ(Math.PI * 0.5); + OI2Mesh.position.set( -408, 817 , -250); + pspump_rackObject.add(OI2Mesh); + + //border up + const borderup = new THREE.BoxGeometry(10, 2, 260); + const borderupmesh = new THREE.Mesh(borderup, bluematerial); + borderupmesh.position.set( -402, 1000 , -150); + pspump_rackObject.add(borderupmesh); + + //border mid + const bordermid = new THREE.BoxGeometry(10, 2, 260); + const bordermidmesh = new THREE.Mesh(bordermid, bluematerial); + bordermidmesh.position.set( -402, 900 , -150); + pspump_rackObject.add(bordermidmesh); + + //border left + const borderleft = new THREE.BoxGeometry(10, 100, 2); + const borderleftmesh = new THREE.Mesh(borderleft, bluematerial); + borderleftmesh.position.set( -402, 950 , -280); + pspump_rackObject.add(borderleftmesh); + + //border right + const borderright = new THREE.BoxGeometry(10, 100, 2); + const borderrightmesh = new THREE.Mesh(borderright, bluematerial); + borderrightmesh.position.set( -402, 950 , -20); + pspump_rackObject.add(borderrightmesh); + + //button1 PS ionic Pump + const button1ionicpump = new THREE.BoxGeometry(10, 30, 30); + const button1ionicpumpmesh = new THREE.Mesh(button1ionicpump, materialGreyDark); + button1ionicpumpmesh.position.set( -402, 830 , -200); + pspump_rackObject.add(button1ionicpumpmesh); + + //button2 up PS ionic Pump + const button2ionicpump = new THREE.BoxGeometry(10, 30, 30); + const button2ionicpumpmesh = new THREE.Mesh(button2ionicpump, materialGreyDark); + button2ionicpumpmesh.position.set( -402, 860 , -160); + pspump_rackObject.add(button2ionicpumpmesh); + + //button3 up PS ionic Pump + const button3ionicpump = new THREE.BoxGeometry(10, 30, 30); + const button3ionicpumpmesh = new THREE.Mesh(button3ionicpump, materialGreyDark); + button3ionicpumpmesh.position.set( -402, 860 , -120); + pspump_rackObject.add(button3ionicpumpmesh); + + //button4 up PS ionic Pump + const button4ionicpump = new THREE.BoxGeometry(10, 30, 30); + const button4ionicpumpmesh = new THREE.Mesh(button4ionicpump, materialGreyDark); + button4ionicpumpmesh.position.set( -402, 860 , -80); + pspump_rackObject.add(button4ionicpumpmesh); + + //button5 up PS ionic Pump + const button5ionicpump = new THREE.BoxGeometry(10, 30, 30); + const button5ionicpumpmesh = new THREE.Mesh(button5ionicpump, materialGreyDark); + button5ionicpumpmesh.position.set( -402, 860 , -40); + pspump_rackObject.add(button5ionicpumpmesh); + + rv_rackObject.add(pspump_rackObject); + //CLONE PS PUMP + + const pump2 = pspump_rackObject.clone(); + pump2.position.set( 0, 0 , 310); + rv_rackObject.add(pump2); + + const pump3 = pspump_rackObject.clone(); + pump3.position.set( 0, -260 , 0); + rv_rackObject.add(pump3); + + const pump4 = pspump_rackObject.clone(); + pump4.position.set( 0, -260 , 310); + rv_rackObject.add(pump4); + + const pump5 = pspump_rackObject.clone(); + pump5.position.set( 0, -520 , 0); + rv_rackObject.add(pump5); + + const pump6 = pspump_rackObject.clone(); + pump6.position.set( 0, -520 , 310); + rv_rackObject.add(pump6); + + rv_rackObject.rotateY(Math.PI); + rv_rackObject.position.set(400, 1250, 400); + rv.add(rv_rackObject); + return rv; + } + + // ID rack + export function rid(param) { + const width=800, height=1900, depth=600; + const rid = new THREE.Object3D(); + const id_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rid.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(800, 90, 650); + rid.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850,1730,550], [0, Math.PI / 2, 0]); + + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02}); + const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff}); + const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061}); + const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa}); + const materialviolet = new THREE.MeshLambertMaterial({color: 0xa425b8}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + + + //rack + const rgeometry = new THREE.BoxGeometry(width, height, depth); + const rmesh = new THREE.Mesh(rgeometry, silvermaterial); + rmesh.position.set(0 , 0 , 0); + id_rackObject.add(rmesh); + + //screen border + const screenbordergeometry = new THREE.BoxGeometry(10, 250, 350); + const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial); + screenbordergeometrymesh.position.set( -400, 500 , 0); + id_rackObject.add(screenbordergeometrymesh); + + //screen + const screengeometry = new THREE.BoxGeometry(10, 200, 300); + const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue); + screengeometrymesh.position.set( -401, 500 , 0); + id_rackObject.add(screengeometrymesh); + + //wiendow screen + const screenwindowgeometry = new THREE.BoxGeometry(10, 150, 150); + const screenwindowgeometrymesh = new THREE.Mesh(screenwindowgeometry, materialThightblue); + screenwindowgeometrymesh.position.set( -402, 500 , -40); + id_rackObject.add(screenwindowgeometrymesh); + + //window screen green button + const screenwindowgreenbuttongeometry = new THREE.BoxGeometry(10, 25, 35); + const screenwindowgreenbuttongeometryymesh = new THREE.Mesh(screenwindowgreenbuttongeometry, greenmaterial); + screenwindowgreenbuttongeometryymesh.position.set( -403, 540 , -80); + id_rackObject.add(screenwindowgreenbuttongeometryymesh); + + //window screen violet button + const screenwindowvioletbuttongeometry = new THREE.BoxGeometry(10, 25, 35); + const screenwindowvioletbuttongeometryymesh = new THREE.Mesh(screenwindowvioletbuttongeometry, materialviolet); + screenwindowvioletbuttongeometryymesh.position.set( -403, 510 , -80); + id_rackObject.add(screenwindowvioletbuttongeometryymesh); + + //window screen blu button + const screenwindowblubuttongeometry = new THREE.BoxGeometry(10, 25, 35); + const screenwindowblubuttongeometryymesh = new THREE.Mesh(screenwindowblubuttongeometry, materialDarkblue); + screenwindowblubuttongeometryymesh.position.set( -403, 480 , -80); + id_rackObject.add(screenwindowblubuttongeometryymesh); + + //key + const keygeometry = new THREE.BoxGeometry(50, 200, 50); + const keygeometrymesh = new THREE.Mesh(keygeometry, whitematerial); + keygeometrymesh.position.set( -400, -400 , -250); + id_rackObject.add(keygeometrymesh); + //key2 + const key2geometry = new THREE.CylinderGeometry(15, 15, 15, 15); + const key2geometrymesh = new THREE.Mesh(key2geometry, materialGreyMedium); + key2geometrymesh.rotateX(Math.PI * 0.5); + key2geometrymesh.rotateY(Math.PI * 1); + key2geometrymesh.rotateZ(Math.PI * 0.5); + key2geometrymesh.position.set(-421, -400 , -250); + id_rackObject.add(key2geometrymesh); + + //whitebutton1 + const whitebutton = new THREE.CylinderGeometry(30, 30, 30, 15); + const whitebuttonmesh = new THREE.Mesh(whitebutton, whitematerial); + whitebuttonmesh.rotateX(Math.PI * 0.5); + whitebuttonmesh.rotateY(Math.PI * 1); + whitebuttonmesh.rotateZ(Math.PI * 0.5); + whitebuttonmesh.position.set(-405, 200 , -200); + id_rackObject.add(whitebuttonmesh); + + //blackbutton1 + const blackbutton1 = new THREE.CylinderGeometry(30, 30, 30, 15); + const blackbutton1mesh = new THREE.Mesh(blackbutton1, materialVeryGreyDark); + blackbutton1mesh.rotateX(Math.PI * 0.5); + blackbutton1mesh.rotateY(Math.PI * 1); + blackbutton1mesh.rotateZ(Math.PI * 0.5); + blackbutton1mesh.position.set(-405, 200 , -100); + id_rackObject.add(blackbutton1mesh); + + //blackbutton2 + const blackbutton2 = new THREE.CylinderGeometry(30, 30, 30, 15); + const blackbutton2mesh = new THREE.Mesh(blackbutton2, materialVeryGreyDark); + blackbutton2mesh.rotateX(Math.PI * 0.5); + blackbutton2mesh.rotateY(Math.PI * 1); + blackbutton2mesh.rotateZ(Math.PI * 0.5); + blackbutton2mesh.position.set(-405, 200 , 0); + id_rackObject.add(blackbutton2mesh); + + //blackbutton3 + const blackbutton3 = new THREE.CylinderGeometry(30, 30, 30, 15); + const blackbutton3mesh = new THREE.Mesh(blackbutton3, materialVeryGreyDark); + blackbutton3mesh.rotateX(Math.PI * 0.5); + blackbutton3mesh.rotateY(Math.PI * 1); + blackbutton3mesh.rotateZ(Math.PI * 0.5); + blackbutton3mesh.position.set(-405, 200 , 100); + id_rackObject.add(blackbutton3mesh); + + //yellowbutton + const yellowbutton = new THREE.CylinderGeometry(30, 30, 30, 15); + const yellowbuttonmesh = new THREE.Mesh(yellowbutton, yellowmaterial); + yellowbuttonmesh.rotateX(Math.PI * 0.5); + yellowbuttonmesh.rotateY(Math.PI * 1); + yellowbuttonmesh.rotateZ(Math.PI * 0.5); + yellowbuttonmesh.position.set(-405, 200 , 200); + id_rackObject.add(yellowbuttonmesh); + + //emergencybutton yellow + const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15); + const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial); + emergencybuttonyellowmesh.rotateX(Math.PI * 0.5); + emergencybuttonyellowmesh.rotateY(Math.PI * 1); + emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5); + emergencybuttonyellowmesh.position.set(-403, 50 , 150); + id_rackObject.add(emergencybuttonyellowmesh); + + //emergencybutton red + const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15); + const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial); + emergencybuttonmesh.rotateX(Math.PI * 0.5); + emergencybuttonmesh.rotateY(Math.PI * 1); + emergencybuttonmesh.rotateZ(Math.PI * 0.5); + emergencybuttonmesh.position.set(-405, 50 , 150); + id_rackObject.add(emergencybuttonmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 500); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 900 , -15); + id_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 500); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 900 , -15); + id_rackObject.add(Rtargetmesh); + + id_rackObject.rotateY(Math.PI); + id_rackObject.position.set(400, 950, 300); + rid.add(id_rackObject); + return rid; + } + + // Low Level RF Rack + export function rllrf(param) { + const width=800, height=1900, depth=600; + const rllrf = new THREE.Object3D(); + const llrf_rackObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const materialDark= new THREE.MeshLambertMaterial({color: 0x000000}); + + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rllrf.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(1200, 90, 400); + rllrf.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [1000,1270,440], [0, Math.PI / 2, 0]); + + + + // rack llrf + const rrgeometry = new THREE.BoxGeometry(800, 1500, 600); + const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark); + rrmesh.position.set( 0, 0 , -depth+290); + llrf_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 550); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -405, 640 , -300); + llrf_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 550); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 405, 640 , -300); + llrf_rackObject.add(Rtargetmesh); + + //handle + const handlegeometry = new THREE.BoxGeometry(30, 300, 70); + const handlegeometrymesh = new THREE.Mesh(handlegeometry, materialDark); + handlegeometrymesh.position.set( -401, 0 , -550); + llrf_rackObject.add(handlegeometrymesh); + + llrf_rackObject.rotateY(Math.PI); + llrf_rackObject.position.set(600, 750, -depth+500); + rllrf.add(llrf_rackObject); + + return rllrf; + } + + // Bending rack + export function rpsb(param) { + const width=1000, height=2100, depth=1000; + const rpsb = new THREE.Object3D(); + const rpsb_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rpsb.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(790, 90, -850); + rpsb.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [900, 1925, -180], [0, Math.PI / 2, 0]); + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ac76}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02}); + const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff}); + const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa}); + const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + + //rack + const geometry = new THREE.BoxGeometry(width, height, depth); + const rackmesh = new THREE.Mesh(geometry, greenmaterial); + rackmesh.position.set( 0, 0 ,0); + rpsb_rackObject.add(rackmesh); + + //emergencybutton yellow + const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15); + const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial); + emergencybuttonyellowmesh.rotateX(Math.PI * 0.5); + emergencybuttonyellowmesh.rotateY(Math.PI * 1); + emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5); + emergencybuttonyellowmesh.position.set(-503, 320 , 0); + rpsb_rackObject.add(emergencybuttonyellowmesh); + + //emergencybutton red + const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15); + const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial); + emergencybuttonmesh.rotateX(Math.PI * 0.5); + emergencybuttonmesh.rotateY(Math.PI * 1); + emergencybuttonmesh.rotateZ(Math.PI * 0.5); + emergencybuttonmesh.position.set(-505, 320 , 0); + rpsb_rackObject.add(emergencybuttonmesh); + + //base border + const screenbordergeometry = new THREE.BoxGeometry(10, 350, 450); + const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial); + screenbordergeometrymesh.position.set( -500, 600 , 0); + rpsb_rackObject.add(screenbordergeometrymesh); + + //screen border + const basebordergeometry = new THREE.BoxGeometry(10, 100, 100); + const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial); + basebordergeometrymesh.position.set( -501, 700 , 0); + rpsb_rackObject.add(basebordergeometrymesh); + + //screen + const screengeometry = new THREE.BoxGeometry(10, 80, 80); + const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue); + screengeometrymesh.position.set( -502, 700 , 0); + rpsb_rackObject.add(screengeometrymesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -504, 999 , 0); + rpsb_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 504, 999 , 0); + rpsb_rackObject.add(Rtargetmesh); + + rpsb_rackObject.rotateY(Math.PI); + rpsb_rackObject.position.set(400, 1050, -400); + rpsb.add(rpsb_rackObject); + return rpsb; + } + + // PS rack + export function rps(param) { + const width=800, height=2500, depth=600; + const psObject = new THREE.Object3D(); + const rps_rackObject = new THREE.Object3D(); + const rps = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000b0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rps.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rps.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , 0); + rps_rackObject.add(rrmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rps_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rps_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rps_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rps_rackObject.add(ldemesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rps_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rps_rackObject.add(Rtargetmesh); + + // START PS base RED + const basered = new THREE.BoxGeometry(10, 30, 110); + const baseredmesh = new THREE.Mesh(basered, redmaterial); + baseredmesh.position.set( -401, 1100 , -170); + psObject.add(baseredmesh); + + // PS base BLUE + const baseblue = new THREE.BoxGeometry(10, 180, 110); + const basebluemesh = new THREE.Mesh(baseblue, bluematerial); + basebluemesh.position.set( -401, 995 , -170); + psObject.add(basebluemesh); + + // PS base SILVER + const basesilver = new THREE.BoxGeometry(10, 150, 500); + const basesilvermesh = new THREE.Mesh(basesilver, silvermaterial); + basesilvermesh.position.set( -401, -300 , 0); + rps_rackObject.add(basesilvermesh); + + rps_rackObject.add(psObject); + + //CLONE PS + + const psA2 = psObject.clone(); + psA2.position.set( 0, 0 , 120); + rps_rackObject.add(psA2); + + const psA3 = psObject.clone(); + psA3.position.set( 0, 0 , 240); + rps_rackObject.add(psA3); + + const psB1 = psObject.clone(); + psB1.position.set( 0, -220 , 0); + rps_rackObject.add(psB1); + + const psB2 = psObject.clone(); + psB2.position.set( 0, -220 , 120); + rps_rackObject.add(psB2); + + const psB3 = psObject.clone(); + psB3.position.set( 0, -220 , 240); + rps_rackObject.add(psB3); + + const psC1 = psObject.clone(); + psC1.position.set( 0, -440 , 0); + rps_rackObject.add(psC1); + + const psC2 = psObject.clone(); + psC2.position.set( 0, -440 , 120); + rps_rackObject.add(psC2); + + const psC3 = psObject.clone(); + psC3.position.set( 0, -440 , 240); + rps_rackObject.add(psC3); + + const psD1 = psObject.clone(); + psD1.position.set( 0, -660 , 0); + rps_rackObject.add(psD1); + + const psD2 = psObject.clone(); + psD2.position.set( 0, -660 , 120); + rps_rackObject.add(psD2); + + const psD3 = psObject.clone(); + psD3.position.set( 0, -660 , 240); + rps_rackObject.add(psD3); + + const psE1 = psObject.clone(); + psE1.position.set( 0, -880 , 0); + rps_rackObject.add(psE1); + + const psE2 = psObject.clone(); + psE2.position.set( 0, -880 , 120); + rps_rackObject.add(psE2); + + const psE3 = psObject.clone(); + psE3.position.set( 0, -880 , 240); + rps_rackObject.add(psE3); + + rps_rackObject.rotateY(Math.PI); + rps_rackObject.position.set(400, 1250, 300); + rps.add(rps_rackObject); + return rps; + } + + + // Control rack + export function rc(param) { + const width=800, height=2500, depth=600; + const rc = new THREE.Object3D(); + const rc_rackObject = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rc.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rc.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + + //rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rc_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 500); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rc_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 500); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rc_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rc_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rc_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rc_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rc_rackObject.add(ldemesh); + + + //borderEC down + const borderECgeometry = new THREE.BoxGeometry(10, 400, 600); + const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark); + borderECgeometrymesh.position.set( -400, -250 , -10); + rc_rackObject.add(borderECgeometrymesh); + + //EC1 down + const EC1geometry = new THREE.BoxGeometry(10, 350, 40); + const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium); + EC1geometrymesh.position.set( -402, -250 , -200); + rc_rackObject.add(EC1geometrymesh); + //EC2 down + const EC2geometry = new THREE.BoxGeometry(10, 350, 40); + const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium); + EC2geometrymesh.position.set( -402, -250 , -150); + rc_rackObject.add(EC2geometrymesh); + //EC2 down + const EC3geometry = new THREE.BoxGeometry(10, 350, 40); + const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium); + EC3geometrymesh.position.set( -402, -250 , -100); + rc_rackObject.add(EC3geometrymesh); + + //borderEC up + const borderupECgeometry = new THREE.BoxGeometry(10, 400, 600); + const borderupECgeometrymesh = new THREE.Mesh(borderupECgeometry, materialGreyDark); + borderupECgeometrymesh.position.set( -400, 250 , -10); + rc_rackObject.add(borderupECgeometrymesh); + + //EC1 up + const EC1geometryup = new THREE.BoxGeometry(10, 350, 40); + const EC1geometryupmesh = new THREE.Mesh(EC1geometryup, materialGreyMedium); + EC1geometryupmesh.position.set( -402, 250 , -200); + rc_rackObject.add(EC1geometryupmesh); + //EC2 up + const EC2geometryup = new THREE.BoxGeometry(10, 350, 40); + const EC2geometryupmesh = new THREE.Mesh(EC2geometryup, materialGreyMedium); + EC2geometryupmesh.position.set( -402, 250 , -150); + rc_rackObject.add(EC2geometryupmesh); + //EC2 up + const EC3geometryup = new THREE.BoxGeometry(10, 350, 40); + const EC3geometryupmesh = new THREE.Mesh(EC3geometryup, materialGreyMedium); + EC3geometryupmesh.position.set( -402, 250 , -100); + rc_rackObject.add(EC3geometryupmesh); + + rc_rackObject.rotateY(Math.PI); + rc_rackObject.position.set(400, 1250, 300); + rc.add(rc_rackObject); + return rc; + } + + // diagnostic rack + export function rd(param) { + const width=800, height=2500, depth=600; + const rd = new THREE.Object3D(); + const rd_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rd.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rd.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 500], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + + //rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rd_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 500); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rd_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 500); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rd_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rd_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rd_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rd_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rd_rackObject.add(ldemesh); + + + //borderEC + const borderECgeometry = new THREE.BoxGeometry(10, 400, 600); + const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark); + borderECgeometrymesh.position.set( -400, 0 , -10); + rd_rackObject.add(borderECgeometrymesh); + + //EC1 + const EC1geometry = new THREE.BoxGeometry(10, 350, 40); + const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium); + EC1geometrymesh.position.set( -402, 0 , -200); + rd_rackObject.add(EC1geometrymesh); + //EC2 + const EC2geometry = new THREE.BoxGeometry(10, 350, 40); + const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium); + EC2geometrymesh.position.set( -402, 0 , -150); + rd_rackObject.add(EC2geometrymesh); + //EC2 + const EC3geometry = new THREE.BoxGeometry(10, 350, 40); + const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium); + EC3geometrymesh.position.set( -402, 0 , -100); + rd_rackObject.add(EC3geometrymesh); + + //libera 1 + const libera1geometry = new THREE.BoxGeometry(10, 100, 600); + const libera1geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera1geometrymesh.position.set( -400, 900 , -10); + rd_rackObject.add(libera1geometrymesh); + + //libera 2 + const libera2geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera2geometrymesh.position.set( -400, 750 , -10); + rd_rackObject.add(libera2geometrymesh); + + //libera 3 + const libera3geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera3geometrymesh.position.set( -400, 600 , -10); + rd_rackObject.add(libera3geometrymesh); + + //libera 4 + const libera4geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera4geometrymesh.position.set( -400, -600 , -10); + rd_rackObject.add(libera4geometrymesh); + + //libera 5 + const libera5geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera5geometrymesh.position.set( -400, -750 , -10); + rd_rackObject.add(libera5geometrymesh); + + //libera 6 + const libera6geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium); + libera6geometrymesh.position.set( -400, -900 , -10); + rd_rackObject.add(libera6geometrymesh); + + rd_rackObject.rotateY(Math.PI); + rd_rackObject.position.set(400, 1250, 300); + rd.add(rd_rackObject); + return rd; + } + + // RRP rack + export function rrp(param) { + const width=800, height=2500, depth=600; + const rrp = new THREE.Object3D(); + const rrp_rackObject = new THREE.Object3D(); + const blackbaseObject = new THREE.Object3D(); + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rrp.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 1200); + rrp.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 800], [0, Math.PI / 2, 0]); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rrp_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 500); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rrp_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 500); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rrp_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rrp_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rrp_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rrp_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rrp_rackObject.add(ldemesh); + + // blackbase 1 + const black1geometry = new THREE.BoxGeometry(3, 200, 550); + const black1geometrymesh = new THREE.Mesh(black1geometry, blackmaterial); + black1geometrymesh.position.set( -402, 1000 , 0); + rrp_rackObject.add(black1geometrymesh); + + // blackbase 2 + const black2geometry = new THREE.BoxGeometry(3, 200, 550); + const black2geometrymesh = new THREE.Mesh(black2geometry, blackmaterial); + black2geometrymesh.position.set( -402, 780 , 0); + rrp_rackObject.add(black2geometrymesh); + + // blackbase 3 + const black3geometry = new THREE.BoxGeometry(3, 200, 550); + const black3geometrymesh = new THREE.Mesh(black3geometry, blackmaterial); + black3geometrymesh.position.set( -402, 560 , 0); + rrp_rackObject.add(black3geometrymesh); + + // blackbase 4 + const black4geometry = new THREE.BoxGeometry(3, 200, 550); + const black4geometrymesh = new THREE.Mesh(black4geometry, blackmaterial); + black4geometrymesh.position.set( -402, 340 , 0); + blackbaseObject.add(black4geometrymesh); + + const square1geometry = new THREE.BoxGeometry(3, 70, 70); + const square1geometrymesh = new THREE.Mesh(square1geometry, silvermaterial); + square1geometrymesh.position.set( -403, 340 , -100); + blackbaseObject.add(square1geometrymesh); + + const square2geometry = new THREE.BoxGeometry(3, 70, 70); + const square2geometrymesh = new THREE.Mesh(square2geometry, silvermaterial); + square2geometrymesh.position.set( -403, 340 , 100); + blackbaseObject.add(square2geometrymesh); + + //CLONE PS + + const psA2 = blackbaseObject.clone(); + psA2.position.set( 0, -220 , 0); + rrp_rackObject.add(psA2); + + const psA3 = blackbaseObject.clone(); + psA3.position.set( 0, -440 , 0); + rrp_rackObject.add(psA3); + + rrp_rackObject.add(blackbaseObject); + + // silverbase + const silvergeometry = new THREE.BoxGeometry(3, 200, 550); + const silvergeometrymesh = new THREE.Mesh(silvergeometry, silvermaterial); + silvergeometrymesh.position.set( -402, -320 , 0); + rrp_rackObject.add(silvergeometrymesh); + + //lastblack + + const black5geometry = new THREE.BoxGeometry(3, 780, 550); + const black5geometrymesh = new THREE.Mesh(black5geometry, blackmaterial); + black5geometrymesh.position.set( -402, -830 , 0); + rrp_rackObject.add(black5geometrymesh); + + rrp_rackObject.rotateY(Math.PI); + rrp_rackObject.position.set(400, 1250, depth); + rrp.add(rrp_rackObject); + return rrp; + } + + // RAR 1 - 2 - 3 + export function rar1(param) { + const width=800, height=2500, depth=800; + const rar = new THREE.Object3D(); + const kly_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rar.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 80, 750); + rar.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , 0); + kly_rackObject.add(lrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 700); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + kly_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 700); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + kly_rackObject.add(Rtargetmesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + kly_rackObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 375); + kly_rackObject.add(rremesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 1225 , 0); + kly_rackObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -1230 , 0); + kly_rackObject.add(rdemesh); + + //drawer1 rack right + const drawer1rrgeometry = new THREE.BoxGeometry(10, 250, 630); + const drawer1rrgeometrymesh = new THREE.Mesh(drawer1rrgeometry, materialGreyDark); + drawer1rrgeometrymesh.position.set( -400, 1000 , 0); + kly_rackObject.add(drawer1rrgeometrymesh); + + //display right rack + const display1rrgeometry = new THREE.BoxGeometry(50, 50, 150); + const display1rrgeometrymesh = new THREE.Mesh(display1rrgeometry, materialVeryGreyDark); + display1rrgeometrymesh.position.set( -400, 1000 , 0); + kly_rackObject.add(display1rrgeometrymesh); + + //GreenLed1 right rack + const greenled1rr = new THREE.SphereGeometry(13, 10, 10); + const greenled1rrmesh = new THREE.Mesh(greenled1rr, greenmaterial); + greenled1rrmesh.position.set(-400, 1050 , 200); + kly_rackObject.add(greenled1rrmesh); + + //GreenLed2 right rack + const greenled2rr = new THREE.SphereGeometry(13, 10, 10); + const greenled2rrmesh = new THREE.Mesh(greenled2rr, greenmaterial); + greenled2rrmesh.position.set(-400, 1000 , 200); + kly_rackObject.add(greenled2rrmesh); + + //GreenLed3 right rack + const greenled3rr = new THREE.SphereGeometry(13, 10, 10); + const greenled3rrmesh = new THREE.Mesh(greenled3rr, greenmaterial); + greenled3rrmesh.position.set(-400, 950 , 200); + kly_rackObject.add(greenled3rrmesh); + + //drawer2 rack right + const drawer2rrgeometry = new THREE.BoxGeometry(10, 250, 630); + const drawer2rrgeometrymesh = new THREE.Mesh(drawer2rrgeometry, materialGreyDark); + drawer2rrgeometrymesh.position.set( -400, 700 , 0); + kly_rackObject.add(drawer2rrgeometrymesh); + + //blackbutton1 right rack + const blackled1rr = new THREE.SphereGeometry(30, 10, 10); + const blackled1rrmesh = new THREE.Mesh(blackled1rr, materialVeryGreyDark); + blackled1rrmesh.position.set(-400, 750 , -200); + kly_rackObject.add(blackled1rrmesh); + + //blackbutton2 right rack + const blackled2rr = new THREE.SphereGeometry(30, 10, 10); + const blackled2rrmesh = new THREE.Mesh(blackled2rr, materialVeryGreyDark); + blackled2rrmesh.position.set(-400, 670 , -200); + kly_rackObject.add(blackled2rrmesh); + + //GreenLED1 right rack + const greenled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10); + const greenled1rrdrawer2rmesh = new THREE.Mesh(greenled1rrdrawer2, greenmaterial); + greenled1rrdrawer2rmesh.position.set(-400, 750 , -50); + kly_rackObject.add(greenled1rrdrawer2rmesh); + + //yellowLED1 right rack + const yellowled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10); + const yellowled1rrdrawer2rmesh = new THREE.Mesh(yellowled1rrdrawer2, yellowmaterial); + yellowled1rrdrawer2rmesh.position.set(-400, 750 , 30); + kly_rackObject.add(yellowled1rrdrawer2rmesh); + + //emergencyLED1 right rack + const emergencybutton = new THREE.CylinderGeometry(70, 10, 10); + const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial); + emergencybuttonmesh.rotateX(Math.PI * 0.5); + emergencybuttonmesh.rotateY(Math.PI * 1); + emergencybuttonmesh.rotateZ(Math.PI * 0.5); + emergencybuttonmesh.position.set(-405, 700 , 150); + kly_rackObject.add(emergencybuttonmesh); + + //drawer3 rack right + const drawer3rrgeometry = new THREE.BoxGeometry(10, 250, 630); + const drawer3rrgeometrymesh = new THREE.Mesh(drawer3rrgeometry, materialGreyMedium); + drawer3rrgeometrymesh.position.set( -400, 400 , 0); + kly_rackObject.add(drawer3rrgeometrymesh); + + //darkscreen rack right + const darkscreenrrgeometry = new THREE.BoxGeometry(10, 150, 270); + const darkscreenrrgeometrymesh = new THREE.Mesh(darkscreenrrgeometry, materialVeryGreyDark); + darkscreenrrgeometrymesh.position.set( -402, 400 , -120); + kly_rackObject.add(darkscreenrrgeometrymesh); + + //drawer4 rack right + const drawer4rrgeometry = new THREE.BoxGeometry(10, 250, 630); + const drawer4rrgeometrymesh = new THREE.Mesh(drawer4rrgeometry, materialGreyDark); + drawer4rrgeometrymesh.position.set( -400, 100 , 0); + kly_rackObject.add(drawer4rrgeometrymesh); + + //drawer4 dark rack right + const drawer4darkrrgeometry = new THREE.BoxGeometry(10, 220, 500); + const drawer4darkrrgeometrymesh = new THREE.Mesh(drawer4darkrrgeometry, materialVeryGreyDark); + drawer4darkrrgeometrymesh.position.set( -402, 100 , 50); + kly_rackObject.add(drawer4darkrrgeometrymesh); + + //GreenLed1 drawer4 right rack + const greenled1drawer4rr = new THREE.SphereGeometry(13, 10, 10); + const greenled1drawer4rrmesh = new THREE.Mesh(greenled1drawer4rr, greenmaterial); + greenled1drawer4rrmesh.position.set(-400, 150 , -250); + kly_rackObject.add(greenled1drawer4rrmesh); + + //GreenLed2 drawer4 right rack + const greenled2drawer4rr = new THREE.SphereGeometry(13, 10, 10); + const greenled2drawer4rrmesh = new THREE.Mesh(greenled2drawer4rr, greenmaterial); + greenled2drawer4rrmesh.position.set(-400, 100 , -250); + kly_rackObject.add(greenled2drawer4rrmesh); + + //GreenLed3 drawer4 right rack + const greenled3drawer4rr = new THREE.SphereGeometry(13, 10, 10); + const greenled3drawer4rrmesh = new THREE.Mesh(greenled3drawer4rr, greenmaterial); + greenled3drawer4rrmesh.position.set(-400, 50 , -250); + kly_rackObject.add(greenled3drawer4rrmesh); + + //RdLed1 drawer4 right rack + const greenred1drawer4rr = new THREE.SphereGeometry(13, 10, 10); + const greenred1drawer4rrmesh = new THREE.Mesh(greenred1drawer4rr, redmaterial); + greenred1drawer4rrmesh.position.set(-400, 150 , 180); + kly_rackObject.add(greenred1drawer4rrmesh); + + //RdLed1 drawer4 right rack + const greenred2drawer4rr = new THREE.SphereGeometry(13, 10, 10); + const greenred2drawer4rrmesh = new THREE.Mesh(greenred2drawer4rr, redmaterial); + greenred2drawer4rrmesh.position.set(-400, 100 , 180); + kly_rackObject.add(greenred2drawer4rrmesh); + + //drawer5 rack right + const drawer5rrgeometry = new THREE.BoxGeometry(10, 350, 630); + const drawer5rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark); + drawer5rrgeometrymesh.position.set( -400, -250 , 0); + kly_rackObject.add(drawer5rrgeometrymesh); + + //display1 drawer5 rack right + const display1drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display1drawer5rrgeometrymesh = new THREE.Mesh(display1drawer5rrgeometry, materialVeryGreyDark); + display1drawer5rrgeometrymesh.position.set( -402, -120 , 0); + kly_rackObject.add(display1drawer5rrgeometrymesh); + + //display2 drawer5 rack right + const display2drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display2drawer5rrgeometrymesh = new THREE.Mesh(display2drawer5rrgeometry, materialVeryGreyDark); + display2drawer5rrgeometrymesh.position.set( -402, -200 , 0); + kly_rackObject.add(display2drawer5rrgeometrymesh); + + //display3 drawer5 rack right + const display3drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display3drawer5rrgeometrymesh = new THREE.Mesh(display3drawer5rrgeometry, materialVeryGreyDark); + display3drawer5rrgeometrymesh.position.set( -402, -280 , 0); + kly_rackObject.add(display3drawer5rrgeometrymesh); + + //display4 drawer5 rack right + const display4drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display4drawer5rrgeometrymesh = new THREE.Mesh(display4drawer5rrgeometry, materialVeryGreyDark); + display4drawer5rrgeometrymesh.position.set( -402, -360 , 0); + kly_rackObject.add(display4drawer5rrgeometrymesh); + + //drawer6 rack right + const drawer6rrgeometry = new THREE.BoxGeometry(10, 350, 630); + const drawer6rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark); + drawer6rrgeometrymesh.position.set( -400, -650 , 0); + kly_rackObject.add(drawer6rrgeometrymesh); + + //display1 drawer6 rack right + const display1drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display1drawer6rrgeometrymesh = new THREE.Mesh(display1drawer6rrgeometry, materialVeryGreyDark); + display1drawer6rrgeometrymesh.position.set( -402, -570 , 0); + kly_rackObject.add(display1drawer6rrgeometrymesh); + + //display2 drawer6 rack right + const display2drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150); + const display2drawer6rrgeometrymesh = new THREE.Mesh(display2drawer6rrgeometry, materialVeryGreyDark); + display2drawer6rrgeometrymesh.position.set( -402, -650 , 0); + kly_rackObject.add(display2drawer6rrgeometrymesh); + + kly_rackObject.rotateY(Math.PI); + kly_rackObject.position.set(400, 1250, 400); + rar.add(kly_rackObject); + return rar; + } + + // RAR2 + export function rar2(param) { + const width=800, height=2500, depth=800; + const rar2 = new THREE.Object3D(); + const kly_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rar2.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 80, 750); + rar2.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + //rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -810); + kly_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 700); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -815); + kly_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 700); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -815); + kly_rackObject.add(Rtargetmesh); + + //edge + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -1185); + kly_rackObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , -430); + kly_rackObject.add(lremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 1225 , -807); + kly_rackObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -1230 , -807); + kly_rackObject.add(ldemesh); + + //drawer1 + const drawer1geometry = new THREE.BoxGeometry(10, 250, 630); + const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, materialGreyDark); + drawer1geometrymesh.position.set( -400, 1000 , -810); + kly_rackObject.add(drawer1geometrymesh); + + //display1 left + const display1leftgeometry = new THREE.BoxGeometry(50, 50, 150); + const display1leftgeometrygeometrymesh = new THREE.Mesh(display1leftgeometry, materialVeryGreyDark); + display1leftgeometrygeometrymesh.position.set( -400, 1050 , -1000); + kly_rackObject.add(display1leftgeometrygeometrymesh); + + //display1 right + const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150); + const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark); + displayupgeometrymesh2.position.set( -400, 1050 , -820); + kly_rackObject.add(displayupgeometrymesh2); + + //selector1 + const selector1geometry = new THREE.BoxGeometry(20, 70, 20); + const selector1geometrymesh = new THREE.Mesh(selector1geometry, materialVeryGreyDark); + selector1geometrymesh.position.set( -400, 940 , -1030); + selector1geometrymesh.rotateX(Math.PI * 1.75); + selector1geometrymesh.rotateY(Math.PI * 1.50); + selector1geometrymesh.rotateZ(Math.PI * 1.50); + kly_rackObject.add(selector1geometrymesh); + + //sfere selector1 + const sphereselector1drawer1 = new THREE.SphereGeometry(20, 10, 10); + const sphereselector1drawer1mesh = new THREE.Mesh(sphereselector1drawer1, materialVeryGreyDark); + sphereselector1drawer1mesh.position.set(-400, 940 , -1030); + kly_rackObject.add(sphereselector1drawer1mesh); + + //sfere drawer1 button1 + const spherebutton1drawer1 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton1drawer1mesh = new THREE.Mesh(spherebutton1drawer1, materialVeryGreyDark); + spherebutton1drawer1mesh.position.set(-400, 990 , -630); + kly_rackObject.add(spherebutton1drawer1mesh); + + //sfere drawer1 button2 + const spherebutton2drawer1 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton2drawer1mesh = new THREE.Mesh(spherebutton2drawer1, materialVeryGreyDark); + spherebutton2drawer1mesh.position.set(-400, 990 , -550); + kly_rackObject.add(spherebutton2drawer1mesh); + + //drawer2 + const drawer2geometry = new THREE.BoxGeometry(10, 250, 630); + const drawer2geometrymesh = new THREE.Mesh(drawer2geometry, materialGreyDark); + drawer2geometrymesh.position.set( -400, 700 , -810); + kly_rackObject.add(drawer2geometrymesh); + + //display2 left + const display1leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150); + const display1leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display1leftgeometrydrawer2, materialVeryGreyDark); + display1leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -1000); + kly_rackObject.add(display1leftgeometrygeometrydrawer2mesh); + + //display2 right + const display2leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150); + const display2leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display2leftgeometrydrawer2, materialVeryGreyDark); + display2leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -820); + kly_rackObject.add(display2leftgeometrygeometrydrawer2mesh); + + //selector2 + const selector1geometrydrawer2 = new THREE.BoxGeometry(20, 70, 20); + const selector1geometrydrawer2mesh = new THREE.Mesh(selector1geometrydrawer2, materialVeryGreyDark); + selector1geometrydrawer2mesh.position.set( -400, 640 , -1030); + selector1geometrydrawer2mesh.rotateX(Math.PI * 1.75); + selector1geometrydrawer2mesh.rotateY(Math.PI * 1.50); + selector1geometrydrawer2mesh.rotateZ(Math.PI * 1.50); + kly_rackObject.add(selector1geometrydrawer2mesh); + + //sfere selector2 + const sphereselector1drawer2 = new THREE.SphereGeometry(20, 10, 10); + const sphereselector1drawer2mesh = new THREE.Mesh(sphereselector1drawer2, materialVeryGreyDark); + sphereselector1drawer2mesh.position.set(-400, 640 , -1030); + kly_rackObject.add(sphereselector1drawer2mesh); + + //sfere drawer2 button1 + const spherebutton1drawer2 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton1drawer2mesh = new THREE.Mesh(spherebutton1drawer2, materialVeryGreyDark); + spherebutton1drawer2mesh.position.set(-400, 690 , -630); + kly_rackObject.add(spherebutton1drawer2mesh); + + //sfere drawer2 button2 + const spherebutton2drawer2 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton2drawer2mesh = new THREE.Mesh(spherebutton2drawer2, materialVeryGreyDark); + spherebutton2drawer2mesh.position.set(-400, 690 , -550); + kly_rackObject.add(spherebutton2drawer2mesh); + + //drawer3 + const drawer3geometry = new THREE.BoxGeometry(10, 250, 630); + const drawer3geometrymesh = new THREE.Mesh(drawer3geometry, materialGreyDark); + drawer3geometrymesh.position.set( -400, 400 , -810); + kly_rackObject.add(drawer3geometrymesh); + + //display2 left + const display1leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150); + const display1leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display1leftgeometrydrawer3, materialVeryGreyDark); + display1leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -1000); + kly_rackObject.add(display1leftgeometrygeometrydrawer3mesh); + + //display2 right + const display2leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150); + const display2leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display2leftgeometrydrawer3, materialVeryGreyDark); + display2leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -820); + kly_rackObject.add(display2leftgeometrygeometrydrawer3mesh); + + //selector2 + const selector1geometrydrawer3 = new THREE.BoxGeometry(20, 70, 20); + const selector1geometrydrawer3mesh = new THREE.Mesh(selector1geometrydrawer3, materialVeryGreyDark); + selector1geometrydrawer3mesh.position.set( -400, 340 , -1030); + selector1geometrydrawer3mesh.rotateX(Math.PI * 1.75); + selector1geometrydrawer3mesh.rotateY(Math.PI * 1.50); + selector1geometrydrawer3mesh.rotateZ(Math.PI * 1.50); + kly_rackObject.add(selector1geometrydrawer3mesh); + + //sfere selector2 + const sphereselector1drawer3 = new THREE.SphereGeometry(20, 10, 10); + const sphereselector1drawer3mesh = new THREE.Mesh(sphereselector1drawer3, materialVeryGreyDark); + sphereselector1drawer3mesh.position.set(-400, 340 , -1030); + kly_rackObject.add(sphereselector1drawer3mesh); + + //sfere drawer2 button1 + const spherebutton1drawer3 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton1drawer3mesh = new THREE.Mesh(spherebutton1drawer3, materialVeryGreyDark); + spherebutton1drawer3mesh.position.set(-400, 390 , -630); + kly_rackObject.add(spherebutton1drawer3mesh); + + //sfere drawer2 button2 + const spherebutton2drawer3 = new THREE.SphereGeometry(20, 10, 10); + const spherebutton2drawer3mesh = new THREE.Mesh(spherebutton2drawer3, materialVeryGreyDark); + spherebutton2drawer3mesh.position.set(-400, 390 , -550); + kly_rackObject.add(spherebutton2drawer3mesh); + + //borderscreen + const borderscreengeometry = new THREE.BoxGeometry(10, 400, 500); + const borderscreengeometrymesh = new THREE.Mesh(borderscreengeometry, materialGreyDark); + borderscreengeometrymesh.position.set( -400, 0 , -810); + kly_rackObject.add(borderscreengeometrymesh); + + //screen + const screengeometry = new THREE.BoxGeometry(10, 300, 400); + const screengeometrymesh = new THREE.Mesh(screengeometry, materialVeryGreyDark); + screengeometrymesh.position.set( -402, 0 , -810); + kly_rackObject.add(screengeometrymesh); + + //GreenLed1 + const greenled1 = new THREE.SphereGeometry(13, 10, 10); + const greenled1mesh = new THREE.Mesh(greenled1, greenmaterial); + greenled1mesh.position.set(-400, 175 , -750); + kly_rackObject.add(greenled1mesh); + + //GreenLed2 + const greenled2 = new THREE.SphereGeometry(13, 10, 10); + const greenled2mesh = new THREE.Mesh(greenled2, greenmaterial); + greenled2mesh.position.set(-400, 175 , -700); + kly_rackObject.add(greenled2mesh); + + + //borderEC + const borderECgeometry = new THREE.BoxGeometry(10, 400, 600); + const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark); + borderECgeometrymesh.position.set( -400, -650 , -810); + kly_rackObject.add(borderECgeometrymesh); + + //EC1 + const EC1geometry = new THREE.BoxGeometry(10, 350, 40); + const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium); + EC1geometrymesh.position.set( -402, -650 , -1000); + kly_rackObject.add(EC1geometrymesh); + //EC2 + const EC2geometry = new THREE.BoxGeometry(10, 350, 40); + const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium); + EC2geometrymesh.position.set( -402, -650 , -950); + kly_rackObject.add(EC2geometrymesh); + //EC2 + const EC3geometry = new THREE.BoxGeometry(10, 350, 40); + const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium); + EC3geometrymesh.position.set( -402, -650 , -900); + kly_rackObject.add(EC3geometrymesh); + + kly_rackObject.rotateY(Math.PI); + kly_rackObject.position.set(400, 1250, -400); + rar2.add(kly_rackObject); + return rar2; + } + + // RAR3 + export function rar3(param) { + const width=800, height=2500, depth=800; + const rar3 = new THREE.Object3D(); + const rar3_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rar3.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 80, 750); + rar3.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + + //rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -10); + rar3_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 700); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rar3_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 700); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rar3_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -370); + rar3_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , 375); + rar3_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 1225 , 0); + rar3_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -1230 , 0); + rar3_rackObject.add(ldemesh); + + + //drawer 1 + const d1geometry = new THREE.BoxGeometry(10, 200, 600); + const d1geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d1geometrymesh.position.set( -400, 900 , -10); + rar3_rackObject.add(d1geometrymesh); + + //drawer 2 + const d2geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d2geometrymesh.position.set( -400, 600 , -10); + rar3_rackObject.add(d2geometrymesh); + + //drawer 3 + const d3geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d3geometrymesh.position.set( -400, 300 , -10); + rar3_rackObject.add(d3geometrymesh); + + //drawer 4 + const d4geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d4geometrymesh.position.set( -400, 0 , -10); + rar3_rackObject.add(d4geometrymesh); + + //drawer 5 + const d5geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d5geometrymesh.position.set( -400, -300 , -10); + rar3_rackObject.add(d5geometrymesh); + + //drawer 6 + const d6geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium); + d6geometrymesh.position.set( -400, -600 , -10); + rar3_rackObject.add(d6geometrymesh); + + rar3_rackObject.rotateY(Math.PI); + rar3_rackObject.position.set(400, 1250, 400); + rar3.add(rar3_rackObject); + return rar3; + } + + + + // rack Terafermi + export function rtf(param) { + const width=800, height=2500, depth=600; + const rtf = new THREE.Object3D(); + const rtf_rackObject = new THREE.Object3D(); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff}); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rtf.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 850); + rtf.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rtf_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 500); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rtf_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 500); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rtf_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rtf_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rtf_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rtf_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rtf_rackObject.add(ldemesh); + + //base border + const screenbordergeometry = new THREE.BoxGeometry(10, 350, 550); + const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial); + screenbordergeometrymesh.position.set( -400, 400 , 0); + rtf_rackObject.add(screenbordergeometrymesh); + + //screen border + const basebordergeometry = new THREE.BoxGeometry(10, 150, 200); + const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial); + basebordergeometrymesh.position.set( -401, 450 , 0); + rtf_rackObject.add(basebordergeometrymesh); + + //screen + const screengeometry = new THREE.BoxGeometry(10, 140, 180); + const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue); + screengeometrymesh.position.set( -402, 450 , 0); + rtf_rackObject.add(screengeometrymesh); + + //base border2 + const baseborder2geometry = new THREE.BoxGeometry(10, 450, 550); + const baseborder2geometrymesh = new THREE.Mesh(baseborder2geometry, whitematerial); + baseborder2geometrymesh.position.set( -400, -800 , 0); + rtf_rackObject.add(baseborder2geometrymesh); + + rtf_rackObject.rotateY(Math.PI); + rtf_rackObject.position.set(400, 1250, 400); + rtf.add(rtf_rackObject); + return rtf; + } + + + + // camod rack + export function camod(param) { + const width=800, height=2500, depth=800; + const camod = new THREE.Object3D(); + const camod_rackObject = new THREE.Object3D(); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xFBE928}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, materialGreyDark); + lrmesh.position.set(0 , 0 , 0); + camod_rackObject.add(lrmesh); + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark); + rrmesh.position.set( 0, 0 , -810); + camod_rackObject.add(rrmesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const llemesh = new THREE.Mesh(llegeometry, blackmaterial); + llemesh.position.set( -377, 0 , -1155); + camod_rackObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const lremesh = new THREE.Mesh(lregeometry, blackmaterial); + lremesh.position.set( -377, 0 , -470); + camod_rackObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const rlemesh = new THREE.Mesh(rlegeometry, blackmaterial); + rlemesh.position.set( -377, 0 , -340); + camod_rackObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const rremesh = new THREE.Mesh(rregeometry, blackmaterial); + rremesh.position.set( -377, 0 , 345); + camod_rackObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const luemesh = new THREE.Mesh(luegeometry, blackmaterial); + luemesh.position.set( -377, 1200 , -813); + camod_rackObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const ldemesh = new THREE.Mesh(ldegeometry, blackmaterial); + ldemesh.position.set( -377, -1200 , -807); + camod_rackObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const ruemesh = new THREE.Mesh(ruegeometry, blackmaterial); + ruemesh.position.set( -377, 1200 , 0); + camod_rackObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const rdemesh = new THREE.Mesh(rdegeometry, blackmaterial); + rdemesh.position.set( -377, -1200 , 0); + camod_rackObject.add(rdemesh); + + //triangle warning1 + const trianglewarning = new THREE.CylinderGeometry(200, 200, 1, 3); + const trianglewarningmesh = new THREE.Mesh(trianglewarning, yellowmaterial); + trianglewarningmesh.rotateX(Math.PI * 0.5); + trianglewarningmesh.rotateY(Math.PI * 1); + trianglewarningmesh.rotateZ(Math.PI * 0.5); + trianglewarningmesh.position.set(-401, 700 , 0); + camod_rackObject.add(trianglewarningmesh); + + //triangle warning black + const trianglewarning2 = new THREE.CylinderGeometry(180, 180, 1, 3); + const trianglewarning2mesh = new THREE.Mesh(trianglewarning2, blackmaterial); + trianglewarning2mesh.rotateX(Math.PI * 0.5); + trianglewarning2mesh.rotateY(Math.PI * 1); + trianglewarning2mesh.rotateZ(Math.PI * 0.5); + trianglewarning2mesh.position.set(-402, 700 , 0); + camod_rackObject.add(trianglewarning2mesh); + + //triangle warning yellow2 + const trianglewarning3 = new THREE.CylinderGeometry(150, 150, 1, 3); + const trianglewarning3mesh = new THREE.Mesh(trianglewarning3, yellowmaterial); + trianglewarning3mesh.rotateX(Math.PI * 0.5); + trianglewarning3mesh.rotateY(Math.PI * 1); + trianglewarning3mesh.rotateZ(Math.PI * 0.5); + trianglewarning3mesh.position.set(-403, 700 , 0); + camod_rackObject.add(trianglewarning3mesh); + + //ZOT1 + const zot1geometry = new THREE.BoxGeometry(10, 110, 10); + const zot1geometrymesh = new THREE.Mesh(zot1geometry, blackmaterial); + zot1geometrymesh.position.set( -404, 750 , -20); + zot1geometrymesh.rotateX(Math.PI * 1.65); + zot1geometrymesh.rotateY(Math.PI * 1.50); + zot1geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot1geometrymesh); + + //ZOT2 + const zot2geometry = new THREE.BoxGeometry(10, 70, 10); + const zot2geometrymesh = new THREE.Mesh(zot2geometry, blackmaterial); + zot2geometrymesh.position.set( -404, 715 , -16); + zot2geometrymesh.rotateX(Math.PI * 1.85); + zot2geometrymesh.rotateY(Math.PI * 1.50); + zot2geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot2geometrymesh); + + //ZOT3 + const zot3geometry = new THREE.BoxGeometry(10, 80, 10); + const zot3geometrymesh = new THREE.Mesh(zot3geometry, blackmaterial); + zot3geometrymesh.position.set( -404, 697 , -1); + zot3geometrymesh.rotateX(Math.PI * 1.65); + zot3geometrymesh.rotateY(Math.PI * 1.50); + zot3geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot3geometrymesh); + + //ZOT TRIANGLE + const zottrianglegeometry = new THREE.CylinderGeometry(22, 22, 1, 3); + const zottrianglegeometrymesh = new THREE.Mesh(zottrianglegeometry, blackmaterial); + zottrianglegeometrymesh.rotateX(Math.PI * 0.95); + zottrianglegeometrymesh.rotateY(Math.PI * 1); + zottrianglegeometrymesh.rotateZ(Math.PI * 0.5); + zottrianglegeometrymesh.position.set(-405, 660 , -19); + camod_rackObject.add(zottrianglegeometrymesh); + + //handle1 + const handle1geometry = new THREE.BoxGeometry(10, 250, 80); + const handle1geometrymesh = new THREE.Mesh(handle1geometry, materialVeryGreyDark); + handle1geometrymesh.position.set( -401, 100 , -550); + camod_rackObject.add(handle1geometrymesh); + + //handle2 + const handle2geometry = new THREE.BoxGeometry(10, 250, 80); + const handle2geometrymesh = new THREE.Mesh(handle2geometry, materialVeryGreyDark); + handle2geometrymesh.position.set( -401, 100 , -260); + camod_rackObject.add(handle2geometrymesh); + camod_rackObject.rotateY(Math.PI); + camod_rackObject.position.set(400, 1250, 340); + camod_rackObject.scale.set(1, 1, 0.94); + camod.add(camod_rackObject); + return camod; + } + + // base mod + export function klystron(param) { + const text = param.name; + const myscale=0.625; + console.log('klystron(), text:',text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K')); + const width=1500, height=1500, depth=1500; + const ModK = new THREE.Object3D(); + const ModContainer = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const klystron = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + klystron.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(75, [940,730,560], [0, Math.PI / 2, 0]); + + const basegeometry = new THREE.BoxGeometry(width, height, depth); + const d1mesh = new THREE.Mesh(basegeometry, materialBase); + ModContainer.add(d1mesh); + + // cover + const d2geometry = new THREE.BoxGeometry(width+100, 100, depth+100); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, 800, 0); + ModContainer.add(d2mesh); + + // base + const d3geometry = new THREE.BoxGeometry(width+100, 100, depth+100); + const d3mesh = new THREE.Mesh(d3geometry, materialBase); + d3mesh.position.set(0, -800, 0); + ModContainer.add(d3mesh); + + // big cylinder + const d4geometry = new THREE.CylinderGeometry(400, 400, 1200, 50); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/mod_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 970 , 300); + ModContainer.add(d4mesh); + + // small cylinder + const d5geometry = new THREE.CylinderGeometry(200, 200, 1200, 50); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader.load('./components/mod_texture.png'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(3, 3); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const d5mesh = new THREE.Mesh(d5geometry, material2); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 1670 , 300); + ModContainer.add(d5mesh); + + // high cover + const d6geometry = new THREE.CylinderGeometry(220, 220, 90, 50); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const d6mesh = new THREE.Mesh(d6geometry, materialGreyDark); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 2300 , 300); + ModContainer.add(d6mesh); + + // right arm + const Bracciodx = new THREE.BoxGeometry( 600, 100, 200 ); + const d7mesh = new THREE.Mesh(Bracciodx, materialBase); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1.25); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(300, 1300 , 600); + ModContainer.add(d7mesh); + + // left arm + const Bracciosx = new THREE.BoxGeometry( 600, 100, 200 ); + const d8mesh = new THREE.Mesh(Bracciosx, materialBase); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1.75); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(300, 1300 , 0); + ModContainer.add(d8mesh); + + // right arm continue + const PBracciodx = new THREE.BoxGeometry( 600, 100, 190 ); + const d9mesh = new THREE.Mesh(PBracciodx, materialBase); + d9mesh.rotateX(Math.PI * 1); + d9mesh.rotateY(Math.PI * 1); + d9mesh.rotateZ(Math.PI * 1); + d9mesh.position.set(743, 1300 , 790); + ModContainer.add(d9mesh); + + //prolung braccia sx + const PBracciosx = new THREE.BoxGeometry( 600, 100, 190 ); + const d10mesh = new THREE.Mesh(PBracciosx, materialBase); + d10mesh.rotateX(Math.PI * 1); + d10mesh.rotateY(Math.PI * 1); + d10mesh.rotateZ(Math.PI * 1); + d10mesh.position.set(743, 1300 , -190); + ModContainer.add(d10mesh); + + //trave 1 base + const trave1 = new THREE.BoxGeometry( 80, 1500, 190 ); + const materialtrave= new THREE.MeshLambertMaterial({color: 0xd80000}); + const d12mesh = new THREE.Mesh(trave1, materialtrave); + d12mesh.rotateX(Math.PI * 1); + d12mesh.rotateY(Math.PI * 1); + d12mesh.rotateZ(Math.PI * 1); + d12mesh.position.set(-760, 0 , -300); + ModContainer.add(d12mesh); + + //trave 2 base + const trave2 = new THREE.BoxGeometry( 80, 1500, 190 ); + const d13mesh = new THREE.Mesh(trave1, materialtrave); + d13mesh.rotateX(Math.PI * 1); + d13mesh.rotateY(Math.PI * 1); + d13mesh.rotateZ(Math.PI * 1); + d13mesh.position.set(-760, 0 , 300); + ModContainer.add(d13mesh); + + //targhetta + const targhetta = new THREE.BoxGeometry( 10, 300, 300 ); + const d14mesh = new THREE.Mesh(targhetta, dmaterial2); + d14mesh.position.set(-750, 550 , 0); + ModContainer.add(d14mesh); + + //Torus basso sx + const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark ); + d15mesh.rotateX(Math.PI * 1); + d15mesh.rotateY(Math.PI * 1.5); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(-700, 900 , -600); + ModContainer.add(d15mesh); + + //Torus basso dx + const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark ); + d16mesh.rotateX(Math.PI * 1); + d16mesh.rotateY(Math.PI * 1.5); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(-700, 900 , 600); + ModContainer.add(d16mesh); + + //Torus alto sx + const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d17mesh = new THREE.Mesh( torus_as, materialGreyDark ); + d17mesh.rotateX(Math.PI * 1); + d17mesh.rotateY(Math.PI * 1.5); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(700, 900 , -600); + ModContainer.add(d17mesh); + + //Torus alto dx + const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark ); + d18mesh.rotateX(Math.PI * 1); + d18mesh.rotateY(Math.PI * 1.5); + d18mesh.rotateZ(Math.PI * 1); + d18mesh.position.set(700, 900 , 600); + ModContainer.add(d18mesh); + ModContainer.rotateY(Math.PI); + ModContainer.scale.set(myscale, myscale, myscale); + ModContainer.position.set(width*myscale/2, height*myscale/2+50, depth*myscale/2); + klystron.add(ModContainer); + return klystron; + } + + // base KXS + export function klystronx(param) { + const text = param.name; + const myscale=0.625; + const width=1200, height=1200, depth=1200; + const ModK = new THREE.Object3D(); + const ModContainer = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const klystron = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + klystron.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(75, [760,600,840], [0, Math.PI / 2, 0]); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const basegeometry = new THREE.BoxGeometry(width, height+200, depth); + const d1mesh = new THREE.Mesh(basegeometry, materialBase); + d1mesh.position.set(0, 100, -900); + ModContainer.add(d1mesh); + + // redcube + const d2geometry = new THREE.BoxGeometry(width-400, height, depth); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0xe02900}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(200, 1400, -900); + ModContainer.add(d2mesh); + + // base + const d3geometry = new THREE.BoxGeometry(width, height, depth); + const d3mesh = new THREE.Mesh(d3geometry, materialBase); + d3mesh.position.set(0, 0, 300); + ModContainer.add(d3mesh); + + // big red cylinder + const d4geometry = new THREE.CylinderGeometry(450, 450, 1200, 50); + const material = new THREE.MeshLambertMaterial({color: 0xfc0303}); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 800 , 300); + ModContainer.add(d4mesh); + + // yellow 1 cylinder + const d5geometry = new THREE.CylinderGeometry(300, 370, 200, 50); + const material2 = new THREE.MeshLambertMaterial({color: 0xecfc03}); + const d5mesh = new THREE.Mesh(d5geometry, material2); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 1450 , 300); + ModContainer.add(d5mesh); + + // yellow 2 cylinder + const d6geometry = new THREE.CylinderGeometry(150, 150, 250, 50); + const material3= new THREE.MeshLambertMaterial({color: 0xecfc03}); + const d6mesh = new THREE.Mesh(d6geometry, material3); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 1680 , 300); + ModContainer.add(d6mesh); + + // yellow 3 cylinder + const d7geometry = new THREE.CylinderGeometry(200, 200, 100, 50); + const d7mesh = new THREE.Mesh(d7geometry, material3); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, 1780 , 300); + ModContainer.add(d7mesh); + + // tag + const targhetta = new THREE.BoxGeometry( 10, 200, 300 ); + const materialwhite= new THREE.MeshLambertMaterial({color: 0xeffffff}); + const d14mesh = new THREE.Mesh(targhetta, materialwhite); + d14mesh.position.set(-610, 600 , -600); + ModContainer.add(d14mesh); + + // torus red1 + const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark ); + d15mesh.rotateX(Math.PI * 1); + d15mesh.rotateY(Math.PI * 1.5); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(550, 2050 , -1400); + ModContainer.add(d15mesh); + + // torus red2 + const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark ); + d16mesh.rotateX(Math.PI * 1); + d16mesh.rotateY(Math.PI * 1.5); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(-150, 2050 , -400); + ModContainer.add(d16mesh); + + // torus 1 white + const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d17mesh = new THREE.Mesh( torus_as, materialGreyDark ); + d17mesh.rotateX(Math.PI * 1); + d17mesh.rotateY(Math.PI * 1.5); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(-400, 850 , -500); + ModContainer.add(d17mesh); + + // torus 2 white + const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark ); + d18mesh.rotateX(Math.PI * 1); + d18mesh.rotateY(Math.PI * 1.5); + d18mesh.rotateZ(Math.PI * 1); + d18mesh.position.set(-400, 850 , -1300); + ModContainer.add(d18mesh); + + // line1 + const line1 = new THREE.BoxGeometry(10, 10, 1150); + const d19mesh = new THREE.Mesh(line1, dmaterial2); + d19mesh.position.set(-610, 750, -900); + ModContainer.add(d19mesh); + + // line2 + const line2 = new THREE.BoxGeometry(10, 10, 1150); + const d20mesh = new THREE.Mesh(line2, dmaterial2); + d20mesh.position.set(-610, 550, 300); + ModContainer.add(d20mesh); + + ModContainer.rotateY(Math.PI); + ModContainer.scale.set(myscale, myscale, myscale); + ModContainer.position.set(width*myscale/2, height*myscale/2, depth*myscale/2); + klystron.add(ModContainer); + return klystron; + } + + // cavity for linac + export function cavitylinac(param) { + const length = param.length? param.length: 1100; + const cavitylinacMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(75, 75, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, length/2+350, 0); + cavitylinacMaster.add(d1mesh); + cavitylinacMaster.rotateX(Math.PI * 0.5); + cavitylinacMaster.rotatedX = true; + return cavitylinacMaster; + } + // Current Monitor + export function cm(param) { + const cmContiner = new THREE.Object3D(); + const cmObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + cmObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + cmObject.add(cyl2mesh); + + + cmObject.scale.setX(1); + cmObject.scale.setY(1); + cmObject.scale.setZ(1); + cmObject.position.set(0, 0, 0); + cmContiner.add(cmObject); + cmContiner.rotateY(Math.PI * -0.5); + + + return cmContiner; + } + // flsc + export function flsc(param) { + const length=700; + const flscSR = new THREE.Object3D(); + const flscContiner = new THREE.Object3D(); + + const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const materialDarkGrey = new THREE.MeshLambertMaterial({color: 0x8c8c8c}); + const materialOrange= new THREE.MeshLambertMaterial({color: 0xfc9403}); + const materialBlack= new THREE.MeshLambertMaterial({color: 0x000000}); + + //cil center + const d1geometry = new THREE.CylinderGeometry(25, 25, 400, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 200 , 0); + flscContiner.add(d1mesh); + flscContiner.rotateX(Math.PI * 1); + + // esagono + const d2geometry = new THREE.CylinderGeometry(70, 70, 70, 6); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + flscContiner.add(d2mesh); + + // box orange down + const orangegeometry = new THREE.CylinderGeometry(90, 90, 250, 15); + const orangegeometrymesh = new THREE.Mesh(orangegeometry, materialOrange); + orangegeometrymesh.position.set(0, 550, 0); + flscContiner.add(orangegeometrymesh); + + // box black down + const blackgeometry = new THREE.CylinderGeometry(90, 90, 25, 15); + const blackgeometrymesh = new THREE.Mesh(blackgeometry, materialBlack); + blackgeometrymesh.position.set(0, 412, 0); + flscContiner.add(blackgeometrymesh); + + // base zigrinatura + const d3geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d3mesh = new THREE.Mesh(d3geometry, materialGrey); + d3mesh.rotateX(Math.PI * 1); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1); + d3mesh.position.set(0, 170 , 0); + flscContiner.add(d3mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(60, 60, 170, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 60 , 0); + flscContiner.add(d4mesh); + + // tetto zigrinatura + const d5geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, -50 , 0); + flscContiner.add(d5mesh); + + //half sphere down1 + const down1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down1geometrymesh = new THREE.Mesh(down1geometry, materialGrey); + down1geometrymesh.position.set(-75, 170, -75); + flscContiner.add(down1geometrymesh); + + //half sphere up1 + const up1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up1geometrymesh = new THREE.Mesh(up1geometry, materialGrey); + up1geometrymesh.position.set(-75, -50, -75); + flscContiner.add(up1geometrymesh); + + //half sphere down2 + const down2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down2geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down2geometrymesh.position.set(75, 170, -75); + flscContiner.add(down2geometrymesh); + + //half sphere up2 + const up2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up2geometrymesh = new THREE.Mesh(up2geometry, materialGrey); + up2geometrymesh.position.set(75, -50, -75); + flscContiner.add(up2geometrymesh); + + //half sphere down3 + const down3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down3geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down3geometrymesh.position.set(0, 170, 100); + flscContiner.add(down3geometrymesh); + + //half sphere up3 + const up3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up3geometrymesh = new THREE.Mesh(up3geometry, materialGrey); + up3geometrymesh.position.set(0, -50, 100); + flscContiner.add(up3geometrymesh); + + //cil support1 + const d11geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d11mesh = new THREE.Mesh(d11geometry, materialGrey); + d11mesh.position.set(-75, 20, -75); + flscContiner.add(d11mesh); + + //cil support2 + const d12geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d12mesh = new THREE.Mesh(d12geometry, materialGrey); + d12mesh.position.set(75, 20, -75); + flscContiner.add(d12mesh); + + //cil support3 + const d13geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d13mesh = new THREE.Mesh(d13geometry, materialGrey); + d13mesh.position.set(0, 20, 100); + flscContiner.add(d13mesh); + + // blocco supporto + const d15geometry = new THREE.CylinderGeometry(120, 120, 20, 25); + const d15mesh = new THREE.Mesh(d15geometry, materialGrey); + d15mesh.position.set(0, -130, 0); + d15mesh.rotateX(Math.PI * 1); + flscContiner.add(d15mesh); + + //internal block + const d16geometry = new THREE.CylinderGeometry(20, 20, 60, 15); + const d16mesh = new THREE.Mesh(d16geometry, materialGrey); + d16mesh.position.set(0, -100, 0); + d16mesh.rotateX(Math.PI * 1); + flscContiner.add(d16mesh); + + // high box1 + const d7geometry = new THREE.BoxGeometry(40, 90, 100); + const d7mesh = new THREE.Mesh(d7geometry, materialDarkGrey); + d7mesh.position.set(-20, -180, 0); + flscContiner.add(d7mesh); + + // high box2 + const d8geometry = new THREE.BoxGeometry(40, 60, 100); + const d8mesh = new THREE.Mesh(d8geometry, materialDarkGrey); + d8mesh.position.set(20, -170, 0); + flscContiner.add(d8mesh); + + flscContiner.position.set(0, 235, 0); + flscContiner.scale.setX(0.8); + flscContiner.scale.setY(0.8); + flscContiner.scale.setZ(0.8); + flscSR.add(flscContiner); + flscSR.rotateY(Math.PI * -0.5); + return flscSR; + } + + // FuG PS + export function fug(width=800, height=1700, depth=600) { + const text = 'Fug'; + const fugObject = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + fugObject.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x272c7d , flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x272c7d } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(270, [-650,-1500,-720], [0, -Math.PI / 2, 0]); + + + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const testmaterial = new THREE.MeshLambertMaterial({color: 0x00ff00}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x095c23}); + const greenmaterial2 = new THREE.MeshLambertMaterial({color: 0x0f993b}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xab0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02}); + const emergencymaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const blumaterial = new THREE.MeshLambertMaterial({color: 0x272c7d}); + const whiteaterial = new THREE.MeshLambertMaterial({color: 0xdfdfe8}); + + //fix FUG logo + const fugfixgeometry = new THREE.BoxGeometry(10, 50, 460); + const fugfixgeometrymesh = new THREE.Mesh(fugfixgeometry, blumaterial); + fugfixgeometrymesh.position.set(-655,-1157,-310); + fugObject.add(fugfixgeometrymesh); + + //left rack + const lrgeometry = new THREE.BoxGeometry(800, 1700, 600); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , -100); + fugObject.add(lrmesh); + + //right rack + const rrgeometry = new THREE.BoxGeometry(800, 1700, 600); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -710); + fugObject.add(rrmesh); + + //basefug + const basegeometry = new THREE.BoxGeometry(1050, 900, 1200); + const basemesh = new THREE.Mesh(basegeometry, silvermaterial); + basemesh.position.set( -130, -1320 , -400); + fugObject.add(basemesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(50, 1700, 50); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -985); + fugObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(50, 1700, 50); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , -430); + fugObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(50, 1700, 50); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + fugObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(50, 1700, 50); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 175); + fugObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(50, 50, 505); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 825 , -707); + fugObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(50, 50, 505); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -830 , -707); + fugObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(50, 50, 505); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 825 , -100); + fugObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(50, 50, 505); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -825 , -100); + fugObject.add(rdemesh); + + //GreenButton + const greenbutton = new THREE.CylinderGeometry(55, 55, 40, 15); + const greenbuttonmesh = new THREE.Mesh(greenbutton, greenmaterial); + greenbuttonmesh.rotateX(Math.PI * 0.5); + greenbuttonmesh.rotateY(Math.PI * 1); + greenbuttonmesh.rotateZ(Math.PI * 0.5); + greenbuttonmesh.position.set(-400, 600 , -670); + fugObject.add(greenbuttonmesh); + + //GreenLed + const greenled = new THREE.CylinderGeometry(40, 40, 40, 15); + const greenledmesh = new THREE.Mesh(greenled, greenmaterial2); + greenledmesh.rotateX(Math.PI * 0.5); + greenledmesh.rotateY(Math.PI * 1); + greenledmesh.rotateZ(Math.PI * 0.5); + greenledmesh.position.set(-400, 600 , -550); + fugObject.add(greenledmesh); + + //RedButton + const redbutton = new THREE.CylinderGeometry(55, 55, 40, 15); + const redbuttonmesh = new THREE.Mesh(redbutton, redmaterial); + redbuttonmesh.rotateX(Math.PI * 0.5); + redbuttonmesh.rotateY(Math.PI * 1); + redbuttonmesh.rotateZ(Math.PI * 0.5); + redbuttonmesh.position.set(-400, 450 , -670); + fugObject.add(redbuttonmesh); + + //YelloyLed + const yellowled = new THREE.CylinderGeometry(40, 40, 40, 15); + const yellowledmesh = new THREE.Mesh(yellowled, yellowmaterial); + yellowledmesh.rotateX(Math.PI * 0.5); + yellowledmesh.rotateY(Math.PI * 1); + yellowledmesh.rotateZ(Math.PI * 0.5); + yellowledmesh.position.set(-400, 450 , -550); + fugObject.add(yellowledmesh); + + //EmergenctButton + const emergencybutton = new THREE.CylinderGeometry(80, 80, 40, 15); + const emergencybuttonmesh = new THREE.Mesh(emergencybutton, emergencymaterial); + emergencybuttonmesh.rotateX(Math.PI * 0.5); + emergencybuttonmesh.rotateY(Math.PI * 1); + emergencybuttonmesh.rotateZ(Math.PI * 0.5); + emergencybuttonmesh.position.set(-400, 270 , -620); + fugObject.add(emergencybuttonmesh); + + //display up + const displayupgeometry = new THREE.BoxGeometry(50, 50, 150); + const displayupgeometrymesh = new THREE.Mesh(displayupgeometry, materialVeryGreyDark); + displayupgeometrymesh.position.set( -400, 600 , -850); + fugObject.add(displayupgeometrymesh); + + //display2 down + const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150); + const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark); + displayupgeometrymesh2.position.set( -400, 500 , -850); + fugObject.add(displayupgeometrymesh2); + + //switch + const switchgeometry = new THREE.BoxGeometry(10, 350, 200); + const switchgeometrymesh = new THREE.Mesh(switchgeometry, materialVeryGreyDark); + switchgeometrymesh.position.set( -400, -50 , -850); + fugObject.add(switchgeometrymesh); + + + //Lgrid2 down + const grid2geometry = new THREE.BoxGeometry(10, 200, 520); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader2.load('./components/grid_texture.png'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(50, 1); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const grid2geometrymesh = new THREE.Mesh(grid2geometry, material2); + grid2geometrymesh.rotateX(Math.PI * 1); + grid2geometrymesh.rotateY(Math.PI * 1); + grid2geometrymesh.rotateZ(Math.PI * 1); + grid2geometrymesh.position.set( -400, -650 , -710); + fugObject.add(grid2geometrymesh); + + + //Rgrid2 down + const grid4geometry = new THREE.BoxGeometry(10, 200, 520); + const textureLoader4 = new THREE.TextureLoader(); + const texture4 = textureLoader4.load('./components/grid_texture.png'); + texture4.wrapS = texture4.wrapT = THREE.RepeatWrapping; + texture4.repeat.set(50, 1); + const material4 = new THREE.MeshBasicMaterial({ map: texture2 }); + const grid4geometrymesh = new THREE.Mesh(grid4geometry, material2); + grid4geometrymesh.rotateX(Math.PI * 1); + grid4geometrymesh.rotateY(Math.PI * 1); + grid4geometrymesh.rotateZ(Math.PI * 1); + grid4geometrymesh.position.set( -400, -650 , -130); + fugObject.add(grid4geometrymesh); + + //drawer1 + const drawer1geometry = new THREE.BoxGeometry(10, 220, 500); + const drawer1geometrytrymesh = new THREE.Mesh(drawer1geometry, whiteaterial); + drawer1geometrytrymesh.position.set( -400, 650 , -100); + fugObject.add(drawer1geometrytrymesh); + + //drawer2 + const drawer2geometry = new THREE.BoxGeometry(10, 220, 500); + const drawer2geometrytrymesh = new THREE.Mesh(drawer2geometry, whiteaterial); + drawer2geometrytrymesh.position.set( -400, 400 , -100); + fugObject.add(drawer2geometrytrymesh); + + fugObject.rotateY(Math.PI); + fugObject.position.set(400, 1750, 300); + const fug = new THREE.Object3D(); + fug.add(fugObject); + return fug; + } +/* + export function fug(param) { + const width=800, height=1700, depth=600; + const fug = new THREE.Object3D(); + const fugObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const basematerial = new THREE.MeshLambertMaterial({color: 0xc4b2a8}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , -100); + fugObject.add(lrmesh); + + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -710); + fugObject.add(rrmesh); + + //basefug + const basegeometry = new THREE.BoxGeometry(width+250, height-800, depth+600); + const basemesh = new THREE.Mesh(basegeometry, silvermaterial); + basemesh.position.set( -130, -1320 , -400); + fugObject.add(basemesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(50, 1700, 50); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -985); + fugObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(50, 1700, 50); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , -430); + fugObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(50, 1700, 50); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + fugObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(50, 1700, 50); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 175); + fugObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(50, 50, 505); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 825 , -707); + fugObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(50, 50, 505); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -830 , -707); + fugObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(50, 50, 505); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 825 , -100); + fugObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(50, 50, 505); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -825 , -100); + fugObject.add(rdemesh); + + //base1 left and texture + const drawer1geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/fug1screenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -707); + fugObject.add(gridgeometrymesh); + + //base2 right and texture + const drawer2geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader2.load('./components/fug2screenfoto.jpg'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(1, 1); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const gridgeometry2mesh = new THREE.Mesh(drawer2geometry, material2); + gridgeometry2mesh.rotateX(Math.PI * 1); + gridgeometry2mesh.rotateY(Math.PI * 1); + gridgeometry2mesh.rotateZ(Math.PI * 1); + gridgeometry2mesh.position.set( -400, 0 , -100); + fugObject.add(gridgeometry2mesh); + + //base3 FUG write and texture + const drawer0geometry = new THREE.BoxGeometry(1, 900, 1200); + const textureLoader0 = new THREE.TextureLoader(); + const texture0 = textureLoader0.load('./components/fug0screenfoto.jpg'); + texture0.wrapS = texture0.wrapT = THREE.RepeatWrapping; + texture0.repeat.set(1, 1); + const material0 = new THREE.MeshBasicMaterial({ map: texture0 }); + const gridgeometry0mesh = new THREE.Mesh(drawer0geometry, material0); + gridgeometry0mesh.rotateX(Math.PI * 1); + gridgeometry0mesh.rotateY(Math.PI * 1); + gridgeometry0mesh.rotateZ(Math.PI * 1); + gridgeometry0mesh.position.set( -655, -1320 , -400); + fugObject.add(gridgeometry0mesh); + + fugObject.rotateY(Math.PI); + fugObject.position.set(400, 1750, 300); + fug.add(fugObject); + return fug; + } +*/ + export function gun(param) { + const sphereRadius=400, sphereFactor=0.3; + const cavityObject = new THREE.Object3D(); + const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0}); + const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32); + const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial); + cavitymesh.scale.setZ(sphereFactor); + cavityObject.add(cavitymesh); + /*const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius, cylinderHeight, 20, 2, false, 0, Math.PI * 2); + const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial); + // rfMesh.rotateX(Math.PI * 0.5); + rfMesh.position.set(0, sphereRadius, 0); + cavityObject.add(rfMesh);*/ + return cavityObject; + } + + // corrector fermi + export function correctorfermi() { + const length=400; + const CorrectorContiner = new THREE.Object3D(); + const CorrectorMaster = new THREE.Object3D(); + + // coil settings + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/coil_texture_fermi.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(2, 20); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(d1mesh); + + //spessore esterno plastica bianca + const redmaterialp = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_1p = new THREE.CylinderGeometry(501 /*radiusTop*/, 501 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_1p = new THREE.Mesh(geometry_1p, redmaterialp); + dmesh_1p.position.set(0, 0, 0); + dmesh_1p.rotateX(Math.PI * 1.25); + dmesh_1p.rotateY(Math.PI * 1); + dmesh_1p.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(dmesh_1p); + + //spessore alto centro + const redmaterial_5 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2}); + const geometry_1_5 = new THREE.BoxGeometry(length, 150, 700); + const dmesh_1_5 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_1_5.position.set(0, 277, 0); + CorrectorMaster.add(dmesh_1_5); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_2.position.set(0, -277, 0); + CorrectorMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(length, 600, 150); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_3.position.set(0, 0, -275); + CorrectorMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_4.position.set(0, 0, 275); + CorrectorMaster.add(dmesh_4); + + //cubo al centro + const loader_2 = new THREE.TextureLoader(); + const texture_2 = loader.load('./components/coil_texture_fermi.png'); + texture_2.wrapS = texture_2.wrapT = THREE.RepeatWrapping; + texture_2.repeat.set(20, 20); + const textureTop_2 = texture.clone(); + const textureSide_2 = texture.clone(); + const dmaterial_2 = new THREE.MeshLambertMaterial({map: texture_2}); + const geometry_2 = new THREE.BoxGeometry(390, 390, 390); + const dmesh_5 = new THREE.Mesh(geometry_2, dmaterial_2); + dmesh_5.position.set(0, 0, 0); + CorrectorMaster.add(dmesh_5); + + //spessore interno plastica bianca + const redmaterial_6 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_6 = new THREE.CylinderGeometry(280 /*radiusTop*/, 280 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_6 = new THREE.Mesh(geometry_6, redmaterial_6); + dmesh_6.position.set(0, 0, 0); + dmesh_6.rotateX(Math.PI * 1); + dmesh_6.rotateY(Math.PI * 1.25); + dmesh_6.rotateZ(Math.PI * 1); + CorrectorMaster.add(dmesh_6); + + CorrectorMaster.position.set(0, 0, 0); + CorrectorContiner.add(CorrectorMaster); + CorrectorContiner.rotateY(Math.PI * 1); + CorrectorContiner.scale.setX(0.25); + CorrectorContiner.scale.setY(0.125); + CorrectorContiner.scale.setZ(0.25); + + return CorrectorContiner; + } + + + // BPM (beam position monitor) + export function bpm(param) { + const width=300, height=300, depth=50, transverse=100; + const bpmObject = new THREE.Object3D(); + const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff}); + const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth); + const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial); + bpmObject.add(bpmmeshh); + const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth); + const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial); + bpmObject.add(bpmmeshv); + return bpmObject; + } + + + // quadrupole fermi + export function quadrupolefermi(param) { + const length=200; + const QuadrupolContiner = new THREE.Object3D(); + const QuadrupoleMaster = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040, side: THREE.DoubleSide}); + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + QuadrupoleMaster.add(d1mesh); + + // coil settings + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xcd7f32, side: THREE.DoubleSide}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/coil_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const coiltexture = new THREE.MeshBasicMaterial({ map: texture }); + const coilmaterials = [coiltexture, coilmaterial, coilmaterial]; + const coilgeometry = new THREE.CylinderGeometry(110 /*radiusTop*/, 110 /*radiusBottom*/, 120 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + + //spessore alto + const redmaterial = new THREE.MeshLambertMaterial({color: 0xe05040}); + const geometry_1 = new THREE.BoxGeometry(200, 100, 705); + const dmesh_1 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_1.position.set(0, 300, 0); + QuadrupoleMaster.add(dmesh_1); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_2.position.set(0, -300, 0); + QuadrupoleMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(200, 500, 100); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_3.position.set(0, 0, -300); + QuadrupoleMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_4.position.set(0, 0, 300); + QuadrupoleMaster.add(dmesh_4); + + const geometry_5 = new THREE.BoxGeometry(200, 115, 280); + const dmesh_5 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_5.rotateX(Math.PI * 0.25); + dmesh_5.position.set(0, 210, 210); + QuadrupoleMaster.add(dmesh_5); + const dmesh_6 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_6.rotateX(Math.PI * 0.75); + dmesh_6.position.set(0, 210, -210); + QuadrupoleMaster.add(dmesh_6); + const dmesh_7 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_7.rotateX(Math.PI * 0.75); + dmesh_7.position.set(0, -210, 210); + QuadrupoleMaster.add(dmesh_7); + const dmesh_8 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_8.rotateX(Math.PI * 0.25); + dmesh_8.position.set(0, -210, -210); + QuadrupoleMaster.add(dmesh_8); + + // coil basso destra + const d2mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d2mesh.position.set(0, -130, 120); + d2mesh.rotateX(Math.PI * 1.25); + d2mesh.rotateY(Math.PI * 1.50); + d2mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d2mesh); + + // coil basso sinistra + const d3mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d3mesh.position.set(0, -130, -120); + d3mesh.rotateX(Math.PI * 1.75); + d3mesh.rotateY(Math.PI * 1.50); + d3mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d3mesh); + + // coil alto destra + const d4mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d4mesh.position.set(0, 130, 120); + d4mesh.rotateX(Math.PI * 0.75); + d4mesh.rotateY(Math.PI * 1.50); + d4mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d4mesh); + + // coil alto destra + const d5mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d5mesh.position.set(0, 130, -120); + d5mesh.rotateX(Math.PI * 1.25); + d5mesh.rotateY(Math.PI * 1.50); + d5mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d5mesh); + + QuadrupoleMaster.position.set(0, 0, 0); + QuadrupolContiner.add(QuadrupoleMaster); + QuadrupolContiner.rotateY(Math.PI * -0.5); + QuadrupolContiner.scale.setX(0.5); + QuadrupolContiner.scale.setY(0.5); + QuadrupolContiner.scale.setZ(0.5); + + return QuadrupolContiner; + } + + // Bending Dipole + export function dipolefermi(length = 500) { + const dipoleContainer = new THREE.Object3D(); + const dipoleMaster = new THREE.Object3D(); + + //texture + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/dipole.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.BoxGeometry(550, 400, length); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(-100, 100, 0); + dipoleMaster.add(d1mesh); + + //Coil + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + + dipoleMaster.position.set(100, 0, 0); + dipoleMaster.scale.setX(0.7); + dipoleMaster.scale.setY(0.7); + dipoleMaster.scale.setZ(0.7); + + dipoleContainer.add(dipoleMaster); + + return dipoleContainer; + } + + // undulator + export function undulator(param) { + const length=1000; + const undulatorMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/undulator.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + undulatorMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + undulatorMaster.add(qline); + return undulatorMaster; + } + // valve + export function vlv(param) { + const vlvContiner = new THREE.Object3D(); + const vlvObject = new THREE.Object3D(); + + //cylinder + const cylgeometry = new THREE.CylinderGeometry(25, 25, 50, 15); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + vlvObject.add(cylmesh); + + // base1 + const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 ); + const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial); + vlv1mesh.position.set(0, 50, 0); + vlv1mesh.colorable = true; + vlvObject.add(vlv1mesh); + + // hat1 + const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const hatgeometry = new THREE.BoxGeometry(50, 20, 100 ); + const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial); + hatmesh.colorable = true; + hatmesh.position.set(0, 120, 0); + vlvObject.add(hatmesh); + + // blackbox + const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363}); + const blackboxgeometry = new THREE.BoxGeometry(40, 70, 70 ); + const blackboxmesh = new THREE.Mesh(blackboxgeometry, blackboxmaterial); + blackboxmesh.position.set(0, 165, 15); + vlvObject.add(blackboxmesh); + + // blackbox2 + const blackbox2material = new THREE.MeshLambertMaterial({color: 0x000000}); + const blackbox2geometry = new THREE.BoxGeometry(40, 40, 20 ); + const blackbo2xmesh = new THREE.Mesh(blackbox2geometry, blackbox2material); + blackbo2xmesh.position.set(0, 165, -30); + vlvObject.add(blackbo2xmesh); + vlvObject.scale.setX(1.5); + vlvObject.scale.setY(1.5); + vlvObject.scale.setZ(1.5); + + //TRIANGLE1 + const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3); + const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackbox2material); + trianglegeometrymesh.rotateX(Math.PI * 0); + trianglegeometrymesh.rotateY(Math.PI * 0); + trianglegeometrymesh.rotateZ(Math.PI * 0.5); + trianglegeometrymesh.position.set(0, 60 , -17); + vlvObject.add(trianglegeometrymesh); + + //TRIANGLE2 + const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3); + const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackbox2material); + triangle2geometrymesh.rotateX(Math.PI * 0); + triangle2geometrymesh.rotateY(Math.PI * 1); + triangle2geometrymesh.rotateZ(Math.PI * 0.5); + triangle2geometrymesh.position.set(0, 60 ,17); + vlvObject.add(triangle2geometrymesh); + + vlvObject.position.set(0, 0, 0); + vlvObject.rotateY(Math.PI * -0.5); + vlvContiner.add(vlvObject); + + return vlvContiner; + } + export function vlvUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + + // Beam Loss Monitor + export function blm(param) { + const length=100, dcolor='white', width=100; + const cMaster = new THREE.Object3D(); + const d1geometry = new THREE.BoxGeometry(length, width, width); + const material = new THREE.MeshLambertMaterial({color: dcolor}); + const d1mesh = new THREE.Mesh(d1geometry, material); + d1mesh.position.set(-length/2, 0, 0); + cMaster.add(d1mesh); + return cMaster; + } + function blmColor(val) { + if (document.location.search.indexOf('demo')>-1) { + if (val < 0) return 'white'; + else if (val < 1) return 'yellow'; + else if (val < 2) return 'orange'; + else if (val < 3) return 'red'; + else return 'violet'; + } + if (val < 20) return 'white'; + else if (val < 50) return 'yellow'; + else if (val < 100) return 'orange'; + else if (val < 200) return 'red'; + else return 'violet'; + } + export function blmUpdate(c, val, direction, width=100, histogramFactor=50) { + if (typeof val !== 'number') val = 0; else val = Math.abs(val); + const blm = c.children[0]; + blm.material.dispose(); + blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)}); + blm.geometry.dispose(); + blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width); + blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0); + blm.geometry.computeVertexNormals(); + blm.geometry.normalsNeedUpdate = true; + blm.geometry.verticesNeedUpdate = true; + blm.geometry.dynamic = true; + } + + // PLC + export function plc(param) { + const plcObject = new THREE.Object3D(); + const cardsObject = new THREE.Object3D(); + + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11}); + const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11}); + const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757}); + const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + + // base + const basegeometry = new THREE.BoxGeometry(500, 300, 600); + const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial); + basegeometrymesh.position.set( 0, 0 ,0); + plcObject.add(basegeometrymesh); + + // card + const cardgeometry = new THREE.BoxGeometry(502, 270, 50); + const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial); + cardgeometrymesh.position.set( 0, 0 , -200); + cardsObject.add(cardgeometrymesh); + + //led1 + const led1green = new THREE.BoxGeometry(504, 20, 20); + const led1greenmesh = new THREE.Mesh(led1green, greenmaterial); + led1greenmesh.position.set( 0, 120 , -200); + cardsObject.add(led1greenmesh); + //led2 + const led2green = new THREE.BoxGeometry(504, 20, 20); + const led2greenmesh = new THREE.Mesh(led2green, greenmaterial); + led2greenmesh.position.set( 0, 90 , -200); + cardsObject.add(led2greenmesh); + //led3 + const led3green = new THREE.BoxGeometry(504, 20, 20); + const led3greenmesh = new THREE.Mesh(led3green, greenmaterial); + led3greenmesh.position.set( 0, 60 , -200); + cardsObject.add(led3greenmesh); + //led4 + const led4green = new THREE.BoxGeometry(504, 20, 20); + const led4greenmesh = new THREE.Mesh(led4green, greenmaterial); + led4greenmesh.position.set( 0, 30 , -200); + cardsObject.add(led4greenmesh); + //led5 + const led5green = new THREE.BoxGeometry(504, 20, 20); + const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial); + led5greenmesh.position.set( 0, 0 , -200); + cardsObject.add(led5greenmesh); + //led6 + const led6green = new THREE.BoxGeometry(504, 20, 20); + const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial); + led6greenmesh.position.set( 0, -30 , -200); + cardsObject.add(led6greenmesh); + //led7 + const led7green = new THREE.BoxGeometry(504, 20, 20); + const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial); + led7greenmesh.position.set( 0, -60 , -200); + cardsObject.add(led7greenmesh); + //led8 + const led8green = new THREE.BoxGeometry(504, 20, 20); + const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial); + led8greenmesh.position.set( 0, -90 , -200); + cardsObject.add(led8greenmesh); + //led9 + const led9green = new THREE.BoxGeometry(504, 20, 20); + const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial); + led9greenmesh.position.set( 0, -120 , -200); + cardsObject.add(led9greenmesh); + + //CLONE Cards + + const card2 = cardsObject.clone(); + card2.position.set( 0, 0 , 50); + plcObject.add(card2); + + const card3 = cardsObject.clone(); + card3.position.set( 0, 0 , 100); + plcObject.add(card3); + + const card4 = cardsObject.clone(); + card4.position.set( 0, 0 , 150); + plcObject.add(card4); + + const card5 = cardsObject.clone(); + card5.position.set( 0, 0 , 200); + plcObject.add(card5); + + // baseScreen + const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200); + const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial); + baseScreengeometrymesh.position.set( 0, 0 , 120); + plcObject.add(baseScreengeometrymesh); + + // 1livel + const livel1geometry = new THREE.BoxGeometry(550, 150, 150); + const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial); + livel1geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel1geometrymesh); + // 2livel + const livel2geometry = new THREE.BoxGeometry(590, 100, 149); + const livel2geometrymesh = new THREE.Mesh(livel2geometry, graymaterial2); + livel2geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel2geometrymesh); + + plcObject.add(cardsObject); + + plcObject.scale.setX(0.7); + plcObject.scale.setY(0.7); + plcObject.scale.setZ(0.7); + + return plcObject; + } + // bst + export function bst(param) { + const bstObject = new THREE.Object3D(); + const bstContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 190, 0); + bstObject.add(d1mesh); + bstObject.rotateX(Math.PI * 1); + + // circ base + const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + bstObject.add(d2mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 120 , 0); + bstObject.add(d4mesh); + + // cil Major + const d5geometry = new THREE.CylinderGeometry(90, 90, 20, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 50 , 0); + d5mesh.colorable = true; + bstObject.add(d5mesh); + + // cil Med + const d6geometry = new THREE.CylinderGeometry(70, 70, 80, 15); + const d6mesh = new THREE.Mesh(d6geometry, materialGrey); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 0 , 0); + d6mesh.colorable = true; + bstObject.add(d6mesh); + + // cil low + const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15); + const d7mesh = new THREE.Mesh(d7geometry, materialGrey); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -100 , 0); + d7mesh.colorable = true; + bstObject.add(d7mesh); + + const d8geometry = new THREE.CylinderGeometry(60, 60, 20, 15); + const d8mesh = new THREE.Mesh(d8geometry, materialGrey); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(0, -170 , 0); + bstObject.add(d8mesh); + + bstObject.position.set(0, 290, 0); + bstContiner.add(bstObject); + bstContiner.rotateY(Math.PI * -0.5); + return bstContiner; + } + export function bstUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } diff --git a/components/bundle_fermi2d.svg b/components/bundle_fermi2d.svg new file mode 100644 index 0000000000000000000000000000000000000000..799281e2b7ca05e5f5b231aa4505c65584d6308c --- /dev/null +++ b/components/bundle_fermi2d.svg @@ -0,0 +1,221 @@ +<svg id="panther" viewBox="-50000 -50000 50000 50000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="width: 100%; overflow: hidden; display: inline; min-width: inherit; max-width: inherit; min-height: inherit;"> + <symbol id="bending" viewBox="0 0 600px 330px" width="1200" height="660"><g class="bendingscale scale"> + <g transform="translate(150 0)"> + <rect x="50" y="50" width="190" height="140" rx="10" ry="10" fill="forestgreen" stroke="#2f2f2f" stroke-width="5"/> + <text x="150" y="152" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">B</text> + <path d="M 48 78 a 60 70 0 0 0 0 80 M 242 78 a 60 70 0 0 1 0 80" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + </g> + </g></symbol> + <symbol id="label" viewBox="0 0 6000px 6000px" width="6000" height="6000"><g class="labelscale scale"> + </g></symbol> + <symbol id="bpm" viewBox="0 0 400px 210px"><g class="bpmscale scale"> + <g transform="translate(75 0) scale(2.5)"> + <rect x="5" y="20" width="15" height="40" rx="10" ry="10" fill="violet" stroke="darkslategrey" stroke-width="3"/> + <line x1="12.5" y1="33" x2="12.5" y2="47" stroke="white" stroke-width="3px" /> + <line x1="7" y1="40" x2="18" y2="40" stroke="white" stroke-width="3px" /> + </g></g> + </symbol> + <symbol id="plc" viewBox="0 0 400px 210px"><g class="plcscale scale"> + <rect x="50" y="50" width="120" height="90" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="5"/> + <text x="110" y="113" text-anchor="middle" font-family="Arial" font-size="55" fill="white" width="2">PLC</text> + </g></symbol> + <symbol id="cavity" viewBox="0 0 400px 300px"><g class="cavityscale scale"> + <path d="M 80 50 a 60 100 0 0 0 0 220 M 80 50 a 60 100 0 0 1 0 220" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 60 a 60 101 0 0 0 0 200 M 80 60 a 60 101 0 0 1 0 200" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 70 a 60 97 0 0 0 0 180 M 80 70 a 60 97 0 0 1 0 180" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <path d="M 80 80 a 60 100 0 0 0 0 160 M 80 80 a 60 100 0 0 1 0 160" stroke="#f5b942" stroke-width="5" fill="#B87333" /> + <circle r="20" cx="80" cy="160" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + </g></symbol> + <symbol id="cavitylinac" viewBox="0 0 6100px 420px " width="6100" height="420"><g class="cavitylinacscale scale"> + <rect x="50" y="50" width="1000" height="110" rx="10" ry="10" fill="#777777" stroke="darkslategrey" stroke-width="5"/> + <text x="500" y="130" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">Cavity</text> + </g></symbol> + <symbol id="correctorfermi" viewBox="0 0 400px 210px"><g class="correctorfermiscale scale"> + <g transform="translate(10 0)"> + <path d="M 48 70 a 60 55 0 0 0 0 60 M 100 70 a 60 55 0 0 1 0 60" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <rect x="50" y="50" width="50" height="100" rx="10" ry="10" fill="blue" stroke="darkslategrey" stroke-width="5"/> + <text class="corrector" x="75" y="80" text-anchor="middle" font-family="Arial" font-size="55" fill="white" width="2" transform="scale(1 1.7)">C</text> + </g> + </g></symbol> + <symbol id="flsc" viewBox="0 0 300px 610px"><g class="flscscale scale"> + <g transform="translate(250 555) rotate(180)"> + <rect x="134" y="420" width="10" height="30" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="120" y="384" width="40" height="30" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <line x1="120" y1="388" x2="160" y2="388" stroke="black" stroke-width="1px" /> + <line x1="120" y1="392" x2="160" y2="392" stroke="black" stroke-width="1px" /> + <line x1="120" y1="396" x2="160" y2="396" stroke="black" stroke-width="1px" /> + <line x1="120" y1="400" x2="160" y2="400" stroke="black" stroke-width="1px" /> + <line x1="120" y1="404" x2="160" y2="404" stroke="black" stroke-width="1px" /> + <line x1="120" y1="408" x2="160" y2="408" stroke="black" stroke-width="1px" /> + <rect x="125" y="351" width="30" height="30" stroke="#2f2f2f" stroke-width="3" fill="#2f2f2f" /> + <line x1="110" y1="328" x2="170" y2="328" stroke="#c7c7c7" stroke-width="15px" /> + <rect x="120" y="305" width="40" height="50" stroke="#2f2f2f" stroke-width="3" fill="#5f5f5f" /> + <rect x="122" y="270" width="35" height="35" stroke="#2f2f2f" stroke-width="3" fill="orange" /> + <rect x="100" y="264" width="10" height="130" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <rect x="170" y="264" width="10" height="130" stroke="#2f2f2f" stroke-width="3" fill="#c7c7c7" /> + <circle r="20" cx="140" cy="450" fill="#c7c7c7" stroke="#2f2f2f" stroke-width="3px" /> + </g></g> + </symbol> + <symbol id="exp" viewBox="0 0 1200px 1200px" width="2000" height="2000"><g class="expscale scale"> + <g transform="translate(200, 300) rotate(-90) scale(2)"> + <rect style="fill:#c5bfbf;fill-opacity:1;stroke:#000000;stroke-width:1.32291667;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect4523-3-6" width="102.45801" height="31.942427" x="22.617872" y="36.94545" rx="6.0450201" ry="1.1538386" /> + <circle style="fill:#c5bfbf;fill-opacity:1;stroke:#000000;stroke-width:1.32291667;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path823" cx="82.020836" cy="52.916668" r="49.650208"/> + <circle style="fill:#646464;fill-opacity:1;stroke:none;stroke-width:1.19845712;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path823-3" cx="82.020836" cy="52.916668" r="44.979168"/> + <g transform="translate(0,7.9375004)"> + <path d="m 81.276152,58.132694 c 3.91656,-40.369942 3.73102,-40.494156 3.73102,-40.494156 v 0" style="fill:none;stroke:#d89101;stroke-width:1.32291663;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.93750005, 1.32291666999999991;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#DotM-3-5)"/> + <g transform="matrix(0.39692782,0.29994399,-0.23720179,0.72461573,55.109022,-9.4969653)" style="fill:#fcff00;fill-opacity:0.97948716;stroke:none" id="g1773"> + <path d="m 124.80895,46.20606 c -0.1902,0.02154 -0.38237,0.05288 -0.57456,0.09598 -0.19217,0.04114 -0.38237,0.09403 -0.57455,0.156705 -0.19219,0.06268 -0.38436,0.135159 -0.57654,0.217429 -0.1902,0.08423 -0.38238,0.176293 -0.57456,0.278152 -0.19218,0.101859 -0.38237,0.213511 -0.57456,0.334958 -0.19218,0.119488 -0.38435,0.250729 -0.57455,0.387846 -0.19219,0.139075 -0.38436,0.285988 -0.57654,0.440735 -0.1902,0.154745 -0.38238,0.315369 -0.57456,0.485785 -0.19218,0.170418 -0.38436,0.346712 -0.57456,0.53084 -0.19218,0.182171 -0.38435,0.372176 -0.57654,0.568058 -0.19019,0.195881 -0.38238,0.395681 -0.57455,0.601357 -0.19219,0.207635 -0.38238,0.417229 -0.57456,0.632699 -0.19218,0.213511 -0.38436,0.432898 -0.57456,0.654245 -0.19218,0.221346 -0.38436,0.44661 -0.57654,0.673833 -0.19218,0.225265 -0.38238,0.454446 -0.57455,0.685587 -0.19218,0.229181 -0.38437,0.460322 -0.57457,0.691463 -0.19217,0.23114 -0.38435,0.462281 -0.57653,0.693421 -0.1902,0.23114 -0.38238,0.460323 -0.57456,0.689504 -0.19218,0.227223 -0.38238,0.454446 -0.57456,0.677751 -0.19217,0.223306 -0.38436,0.444652 -0.57653,0.660122 -0.1902,0.217429 -0.38238,0.43094 -0.57457,0.640533 -0.19217,0.209594 -0.38237,0.413311 -0.57455,0.613111 -0.19218,0.199799 -0.38436,0.391763 -0.57456,0.57981 -0.19218,0.188047 -0.38436,0.370217 -0.57654,0.544551 -0.1902,0.174335 -0.38237,0.340835 -0.57456,0.501458 -0.19217,0.158664 -0.38435,0.311452 -0.57455,0.454446 -0.19218,0.144953 -0.38436,0.280111 -0.57654,0.405475 -0.1902,0.127323 -0.38238,0.244853 -0.57456,0.354546 -0.19218,0.107735 -0.38238,0.207631 -0.57455,0.295781 -0.19219,0.09011 -0.38436,0.168457 -0.57456,0.238977 -0.19218,0.06856 -0.38436,0.129283 -0.57654,0.178253 -0.1902,0.04897 -0.38238,0.08618 -0.57456,0.11557 -0.19218,0.02742 -0.38436,0.04499 -0.57455,0.05289 -0.19219,0.0059 -0.38437,0.0039 -0.57654,-0.01176 -0.1902,-0.01372 -0.38239,-0.03721 -0.57456,-0.07248 -0.19218,-0.03526 -0.38238,-0.08228 -0.57456,-0.137117 -0.19218,-0.05681 -0.38436,-0.121451 -0.57456,-0.197841 -0.19218,-0.07639 -0.38436,-0.162583 -0.57654,-0.258563 -0.19218,-0.09598 -0.38238,-0.201759 -0.57456,-0.31537 -0.19218,-0.11557 -0.38436,-0.238976 -0.57456,-0.372176 -0.19217,-0.13124 -0.38435,-0.272275 -0.57654,-0.423105 -0.1902,-0.14887 -0.38237,-0.305576 -0.57455,-0.470116 -0.19218,-0.16454 -0.38238,-0.336916 -0.57456,-0.517128 -0.192174,-0.178251 -0.384364,-0.36434 -0.576544,-0.556304 -0.1902,-0.190005 -0.38237,-0.387846 -0.57456,-0.591563 -0.19217,-0.201759 -0.38237,-0.409393 -0.57455,-0.620945 -0.19219,-0.213512 -0.38436,-0.428982 -0.57456,-0.648369 -0.19218,-0.219388 -0.38436,-0.442693 -0.57654,-0.667957 -0.1902,-0.225264 -0.38237,-0.452487 -0.57456,-0.681669 -0.19217,-0.229182 -0.38435,-0.460323 -0.574548,-0.691463 -0.192183,-0.23114 -0.384358,-0.462281 -0.576541,-0.693421 -0.190198,-0.231141 -0.382381,-0.462282 -0.574556,-0.689505 -0.192183,-0.229182 -0.382381,-0.458364 -0.574556,-0.683628 -0.192183,-0.225264 -0.384358,-0.44661 -0.574556,-0.667956 -0.192183,-0.219388 -0.384366,-0.434858 -0.576541,-0.64641 -0.192183,-0.211553 -0.382381,-0.419187 -0.574556,-0.622904 -0.192183,-0.201759 -0.384366,-0.3996 -0.574564,-0.591564 -0.192175,-0.191964 -0.384358,-0.378052 -0.576533,-0.556304 -0.190199,-0.178252 -0.382381,-0.350629 -0.574556,-0.51517 -0.192183,-0.164541 -0.382382,-0.323204 -0.574564,-0.472074 -0.192175,-0.148871 -0.384358,-0.289906 -0.576533,-0.423105 -0.190199,-0.1332 -0.382381,-0.256606 -0.574564,-0.370217 -0.192175,-0.11557 -0.382374,-0.221349 -0.574556,-0.317329 -0.192176,-0.09402 -0.384358,-0.180215 -0.574557,-0.256605 -0.192175,-0.07639 -0.384358,-0.143 -0.57654,-0.19784 -0.190199,-0.05681 -0.382374,-0.101858 -0.574557,-0.137118 -0.192175,-0.03525 -0.384357,-0.06072 -0.574556,-0.07443 -0.192183,-0.0137 -0.384358,-0.0177 -0.57654,-0.0098 -0.190199,0.0059 -0.382374,0.0235 -0.574557,0.05289 -0.192175,0.02742 -0.382373,0.0666 -0.574556,0.11557 -0.192183,0.04897 -0.384358,0.107732 -0.574556,0.178252 -0.192183,0.06856 -0.384358,0.148868 -0.576541,0.237018 -0.192183,0.09011 -0.382381,0.188046 -0.574556,0.297739 -0.192183,0.107736 -0.384358,0.225265 -0.574556,0.352587 -0.192183,0.127324 -0.384358,0.262482 -0.576541,0.405476 -0.190198,0.144953 -0.382378,0.295782 -0.574558,0.456405 -0.192179,0.158664 -0.382378,0.327123 -0.574558,0.501457 -0.192178,0.174336 -0.384358,0.356505 -0.576538,0.542593 -0.190198,0.188046 -0.382378,0.38197 -0.574558,0.581769 -0.192179,0.19784 -0.382378,0.403516 -0.574557,0.611151 -0.192179,0.209594 -0.384359,0.423105 -0.574557,0.640533 -0.19218,0.217429 -0.38436,0.438776 -0.57654,0.662081 -0.190198,0.223306 -0.382377,0.44857 -0.574557,0.677751 -0.192179,0.227223 -0.384359,0.458364 -0.574557,0.687546 l -0.576539,0.693421 c -0.190198,0.231141 -0.382378,0.462282 -0.574557,0.693422 -0.19218,0.229183 -0.382379,0.458363 -0.574558,0.685587 -0.19218,0.225264 -0.384359,0.450528 -0.574557,0.671875 -0.19218,0.223305 -0.38436,0.440733 -0.576539,0.656204 -0.19218,0.213511 -0.382378,0.425063 -0.574558,0.630739 -0.192179,0.205676 -0.384359,0.407434 -0.574557,0.603316 -0.19218,0.193923 -0.38436,0.383928 -0.576539,0.568057 -0.190199,0.18217 -0.382378,0.360423 -0.574557,0.528881 -0.19218,0.170418 -0.382378,0.332999 -0.574558,0.487746 -0.19218,0.154746 -0.384359,0.301658 -0.576539,0.438775 -0.190199,0.139076 -0.382377,0.268358 -0.574557,0.389805 -0.19218,0.119488 -0.382378,0.231141 -0.574558,0.332999 -0.19218,0.103817 -0.384359,0.195882 -0.574558,0.278152 -0.192179,0.08227 -0.384358,0.156708 -0.576538,0.219388 -0.190198,0.06269 -0.382378,0.113616 -0.574558,0.156706 -0.19218,0.04113 -0.382378,0.07443 -0.574557,0.09402 -0.19218,0.02155 -0.384359,0.0333 -0.576539,0.0333 -0.190198,0 -0.382378,-0.01175 -0.574558,-0.0333 -0.192179,-0.01959 -0.382378,-0.05288 -0.574557,-0.09402 -0.192179,-0.0431 -0.384359,-0.09403 -0.574558,-0.156706 -0.192179,-0.06268 -0.384359,-0.137118 -0.576539,-0.219388 -0.190198,-0.08227 -0.382377,-0.174335 -0.574557,-0.278152 -0.192179,-0.101858 -0.384359,-0.213511 -0.574557,-0.332999 -0.19218,-0.121447 -0.38436,-0.250729 -0.576539,-0.389805 -0.190198,-0.137117 -0.382378,-0.284029 -0.574558,-0.438775 -0.192179,-0.154747 -0.382378,-0.317328 -0.574557,-0.487746 -0.19218,-0.168458 -0.384359,-0.346711 -0.574557,-0.528881 -0.19218,-0.184129 -0.38436,-0.374134 -0.576539,-0.568057 -0.19218,-0.195882 -0.382378,-0.39764 -0.574558,-0.603316 -0.192179,-0.205676 -0.384359,-0.417228 -0.574557,-0.630739 -0.19218,-0.215471 -0.38436,-0.432899 -0.576539,-0.656204 -0.190199,-0.221347 -0.382378,-0.446611 -0.574557,-0.671875 -0.19218,-0.227224 -0.382378,-0.456404 -0.574558,-0.685587 l -0.576539,-0.693422 c -0.190199,-0.23114 -0.382378,-0.462281 -0.574557,-0.693421 -0.19218,-0.229182 -0.382378,-0.460323 -0.574558,-0.687546 -0.19218,-0.229181 -0.384359,-0.454445 -0.574558,-0.677751 -0.192179,-0.223305 -0.384358,-0.444652 -0.576538,-0.662081 -0.190198,-0.217428 -0.382378,-0.430939 -0.574558,-0.640533 -0.19218,-0.207635 -0.384359,-0.413311 -0.574557,-0.611151 -0.19218,-0.199799 -0.384359,-0.393723 -0.576539,-0.581769 -0.190198,-0.186088 -0.382378,-0.368257 -0.574558,-0.542593 -0.192179,-0.174334 -0.382377,-0.342793 -0.574557,-0.501457 -0.19218,-0.160623 -0.384359,-0.311452 -0.574558,-0.456405 -0.192179,-0.142994 -0.384359,-0.278152 -0.576538,-0.405476 -0.19218,-0.127322 -0.382378,-0.244851 -0.574558,-0.352587 -0.192179,-0.109693 -0.384359,-0.207629 -0.574557,-0.297739 -0.19218,-0.08815 -0.384359,-0.168468 -0.576539,-0.237018 -0.190198,-0.07052 -0.382378,-0.129282 -0.574558,-0.178252 -0.192179,-0.04897 -0.382378,-0.08814 -0.574557,-0.11557 -0.192179,-0.02938 -0.384359,-0.04699 -0.576539,-0.05289 -0.190198,-0.0078 -0.382378,-0.0039 -0.574558,0.0098 -0.192179,0.01371 -0.382378,0.03917 -0.574557,0.07443 -0.192179,0.03526 -0.384359,0.08032 -0.574557,0.137118 -0.19218,0.05485 -0.38436,0.12145 -0.576539,0.19784 -0.190199,0.07639 -0.382378,0.162585 -0.574557,0.256605 -0.19218,0.09598 -0.38436,0.201759 -0.574558,0.317329 -0.19218,0.113611 -0.38436,0.237017 -0.576539,0.370217 -0.190199,0.133199 -0.382378,0.274234 -0.574557,0.423105 -0.19218,0.14887 -0.382378,0.307533 -0.574558,0.472074 -0.19218,0.164541 -0.38436,0.336918 -0.574558,0.51517 -0.192179,0.178252 -0.384359,0.36434 -0.576538,0.556304 -0.19218,0.191964 -0.382378,0.389805 -0.574558,0.591564 -0.19218,0.203717 -0.384359,0.411351 -0.574557,0.622904 -0.19218,0.211552 -0.384359,0.427022 -0.576539,0.64641 -0.190198,0.221346 -0.382378,0.442692 -0.574558,0.667956 -0.192179,0.225264 -0.382377,0.454446 -0.574557,0.683628 -0.19218,0.227223 -0.384359,0.458364 -0.576539,0.689505 -0.190198,0.23114 -0.382378,0.462281 -0.574557,0.693421 -0.192179,0.23114 -0.382378,0.462281 -0.574557,0.691463 -0.19218,0.229182 -0.38436,0.456405 -0.574558,0.681669 -0.19218,0.225264 -0.384359,0.448569 -0.576539,0.667957 -0.190198,0.219387 -0.382378,0.434857 -0.574557,0.648369 -0.19218,0.211552 -0.38436,0.419186 -0.574558,0.620945 -0.192179,0.203717 -0.384359,0.401558 -0.576539,0.591563 -0.190198,0.191964 -0.382378,0.378053 -0.574557,0.556304 -0.19218,0.180212 -0.382378,0.352588 -0.574557,0.517128 -0.19218,0.16454 -0.38436,0.321246 -0.574558,0.470116 -0.19218,0.15083 -0.384359,0.291865 -0.576539,0.423105 -0.192179,0.1332 -0.382377,0.256606 -0.574557,0.372176 -0.19218,0.113611 -0.38436,0.21939 -0.574558,0.31537 -0.19218,0.09598 -0.384359,0.182173 -0.576538,0.258563 -0.190199,0.07639 -0.382378,0.141041 -0.574558,0.197841 -0.19218,0.05485 -0.382378,0.101857 -0.574558,0.137117 -0.19218,0.03526 -0.384359,0.05877 -0.574557,0.07248 -0.19218,0.01566 -0.384359,0.01766 -0.576539,0.01176 -0.19218,-0.0078 -0.382378,-0.02546 -0.574558,-0.05289 -0.192179,-0.02938 -0.384358,-0.0666 -0.574557,-0.11557 C 25.119259,61.1205 24.927079,61.059768 24.734899,60.991218 24.544701,60.920701 24.352521,60.842351 24.160341,60.752241 23.968162,60.664095 23.777964,60.564195 23.585784,60.45646 23.393605,60.346767 23.201425,60.229237 23.009245,60.101914 22.819047,59.97655 22.626867,59.841392 22.434688,59.696439 22.242508,59.553445 22.05231,59.400657 21.86013,59.241993 21.667951,59.08137 21.475771,58.91487 21.285572,58.740535 21.093393,58.564242 20.901214,58.384031 20.709034,58.195984 20.518836,58.007937 20.326656,57.815973 20.134476,57.616174 19.942297,57.416374 19.750117,57.212657 19.559918,57.003063 19.36774,56.79347 19.17556,56.579959 18.98338,56.36253 18.793182,56.14706 18.601002,55.925714 18.408822,55.702408 18.216643,55.479103 18.026444,55.25188 17.834265,55.024657 17.642086,54.795476 17.449906,54.566293 17.259708,54.335153 l -0.57654,-0.693421 c -0.192179,-0.231141 -0.382377,-0.462282 -0.574557,-0.691463 -0.192179,-0.231141 -0.384359,-0.460322 -0.574557,-0.685587 -0.19218,-0.227223 -0.38436,-0.452487 -0.576539,-0.673833 -0.190198,-0.221347 -0.382378,-0.440734 -0.574557,-0.654245 -0.19218,-0.21547 -0.382379,-0.425064 -0.574557,-0.632699 -0.19218,-0.205676 -0.38436,-0.405476 -0.57654,-0.601357 -0.190198,-0.195882 -0.382378,-0.385887 -0.574557,-0.568058 -0.192179,-0.184128 -0.382378,-0.360422 -0.574557,-0.53084 -0.19218,-0.170416 -0.38436,-0.33104 -0.574558,-0.485785 -0.19218,-0.154747 -0.38436,-0.30166 -0.576539,-0.440735 -0.190198,-0.137117 -0.382774,-0.268358 -0.574557,-0.387846 -0.191784,-0.121447 -0.3833688,-0.233099 -0.5751528,-0.334958 -0.191782,-0.101859 -0.383368,-0.193922 -0.575151,-0.278152 -0.191784,-0.08227 -0.383369,-0.154749 -0.575152,-0.217429 -0.191585,-0.06269 -0.383368,-0.115575 -0.575152,-0.156705 -0.191585,-0.04309 -0.383369,-0.07443 -0.575152,-0.09598 -0.191585,-0.02154 -0.383368,-0.03134 -0.5751495,-2.100887 0.1917865,-2.069547 0.3835695,-2.059747 0.5751545,-2.038207 0.191783,0.02155 0.383567,0.05289 0.575152,0.09598 0.191784,0.04113 0.383567,0.09402 0.575152,0.156705 0.191783,0.06268 0.383368,0.135158 0.575152,0.217429 0.191783,0.08423 0.383369,0.176293 0.575151,0.278152 0.191784,0.101859 0.3833688,0.213511 0.5751528,0.334958 0.191783,0.119488 0.384359,0.250729 0.574557,0.387846 0.192179,0.139075 0.384359,0.285988 0.576539,0.440735 0.190198,0.154745 0.382378,0.315369 0.574558,0.485785 0.192179,0.170418 0.382378,0.346712 0.574557,0.53084 0.192179,0.182171 0.384359,0.372176 0.574557,0.568058 0.19218,0.195881 0.38436,0.395681 0.57654,0.601357 0.192178,0.207635 0.382377,0.417229 0.574557,0.632699 0.192179,0.213511 0.384359,0.432898 0.574557,0.654245 0.192179,0.221346 0.384359,0.44661 0.576539,0.673833 0.190198,0.225265 0.382378,0.454446 0.574557,0.685587 0.19218,0.229181 0.382378,0.460322 0.574557,0.691463 l 0.57654,0.693421 c 0.190198,0.23114 0.382378,0.460323 0.574557,0.689504 0.192179,0.227223 0.382378,0.454446 0.574557,0.677751 0.19218,0.223306 0.38436,0.444652 0.574558,0.660122 0.19218,0.217429 0.38436,0.43094 0.576538,0.640533 0.190199,0.209594 0.382379,0.413311 0.574558,0.613111 0.19218,0.199799 0.38436,0.391763 0.574558,0.57981 0.19218,0.188047 0.384359,0.368258 0.576538,0.544551 0.190199,0.174335 0.382379,0.340835 0.574558,0.501458 0.19218,0.158664 0.382378,0.311452 0.574558,0.454446 0.192179,0.144953 0.384359,0.280111 0.574557,0.405475 0.19218,0.127323 0.38436,0.244853 0.576539,0.354546 0.19218,0.107735 0.382378,0.207635 0.574557,0.295781 0.19218,0.09011 0.38436,0.16846 0.574558,0.238977 0.19218,0.06855 0.38436,0.129282 0.576539,0.178253 0.190199,0.04897 0.382378,0.08619 0.574557,0.11557 0.19218,0.02743 0.382378,0.04505 0.574558,0.05289 0.19218,0.0059 0.384359,0.0039 0.576539,-0.01176 0.190198,-0.01371 0.382377,-0.03722 0.574557,-0.07248 0.19218,-0.03526 0.382378,-0.08227 0.574558,-0.137117 0.19218,-0.0568 0.384359,-0.121446 0.574558,-0.197841 0.192179,-0.07639 0.384358,-0.162581 0.576538,-0.258563 0.190198,-0.09598 0.382378,-0.201759 0.574558,-0.31537 0.19218,-0.11557 0.382378,-0.238976 0.574557,-0.372176 0.19218,-0.13124 0.384359,-0.272275 0.576539,-0.423105 0.190198,-0.14887 0.382378,-0.305576 0.574558,-0.470116 0.192179,-0.16454 0.382377,-0.336916 0.574557,-0.517128 0.192179,-0.178251 0.384359,-0.36434 0.574557,-0.556304 0.19218,-0.190005 0.38436,-0.387846 0.576539,-0.591563 0.190198,-0.201759 0.382378,-0.409393 0.574558,-0.620945 0.192178,-0.213512 0.384358,-0.428982 0.574556,-0.648369 0.19218,-0.219388 0.384361,-0.442692 0.576541,-0.667957 0.190198,-0.225263 0.382375,-0.452487 0.574556,-0.681669 0.19218,-0.229181 0.382378,-0.460323 0.574558,-0.691463 0.192178,-0.23114 0.384358,-0.462281 0.574556,-0.693421 0.19218,-0.231141 0.38436,-0.462281 0.57654,-0.689505 0.192181,-0.229182 0.382379,-0.458363 0.574556,-0.683628 0.19218,-0.225263 0.384361,-0.446609 0.574559,-0.667956 0.19218,-0.219388 0.384357,-0.434858 0.576538,-0.646409 0.190198,-0.211554 0.382378,-0.419188 0.574558,-0.622905 0.19218,-0.201759 0.382379,-0.399599 0.574559,-0.591563 0.192177,-0.191965 0.384357,-0.378052 0.576537,-0.556305 0.190199,-0.178252 0.382379,-0.350629 0.574556,-0.515169 0.19218,-0.164541 0.382379,-0.323204 0.574559,-0.472075 0.19218,-0.14887 0.384358,-0.289905 0.574559,-0.423105 0.192177,-0.133199 0.384357,-0.256605 0.576537,-0.370216 0.190199,-0.11557 0.382379,-0.221346 0.574559,-0.317329 0.19218,-0.09402 0.384357,-0.180211 0.574556,-0.256605 0.19218,-0.07639 0.38436,-0.142993 0.57654,-0.19784 0.190198,-0.0568 0.382379,-0.101859 0.574556,-0.137118 0.19218,-0.03526 0.382378,-0.06072 0.574559,-0.07443 0.19218,-0.01371 0.38436,-0.01763 0.574556,-0.0098 0.19218,0.0059 0.38436,0.02351 0.57654,0.05289 0.192177,0.02743 0.382378,0.0666 0.574556,0.11557 0.19218,0.04897 0.38436,0.107735 0.574558,0.178252 0.19218,0.06855 0.384361,0.14887 0.576541,0.237018 0.190195,0.09011 0.382376,0.188046 0.574556,0.297739 0.19218,0.107736 0.382378,0.225265 0.574558,0.352587 0.192178,0.127323 0.384358,0.262482 0.576538,0.405476 0.190198,0.144952 0.382378,0.295782 0.574558,0.456404 0.192181,0.158665 0.382376,0.327123 0.574556,0.501457 0.192181,0.174336 0.384361,0.356506 0.574559,0.542594 0.19218,0.188046 0.384358,0.38197 0.576538,0.581768 0.190198,0.19784 0.382378,0.403516 0.574558,0.611151 0.19218,0.209595 0.38436,0.423105 0.574559,0.640534 0.192177,0.217428 0.384357,0.438776 0.576538,0.66208 0.190198,0.223306 0.382375,0.448571 0.574555,0.677751 0.192181,0.227223 0.382379,0.458365 0.574559,0.687546 0.19218,0.23114 0.384358,0.462281 0.574559,0.693421 0.192177,0.231141 0.384357,0.462283 0.576537,0.693423 0.19218,0.229182 0.382379,0.458362 0.574559,0.685587 0.192177,0.225263 0.384357,0.450528 0.574556,0.671874 0.19218,0.223305 0.38436,0.440733 0.57654,0.656204 0.190199,0.213511 0.382379,0.425063 0.574556,0.630739 0.19218,0.205676 0.382379,0.407434 0.574559,0.603316 0.19218,0.193923 0.384357,0.383928 0.576537,0.568057 0.190199,0.18217 0.382379,0.360423 0.574559,0.528881 0.192177,0.170418 0.382378,0.332999 0.574556,0.487746 0.19218,0.154746 0.38436,0.301658 0.574558,0.438775 0.192181,0.139076 0.384361,0.268358 0.576541,0.389805 0.190196,0.119488 0.382376,0.231141 0.574556,0.332999 0.19218,0.103817 0.384357,0.195882 0.574556,0.278152 0.19218,0.08227 0.38436,0.156705 0.57654,0.219388 0.190198,0.06268 0.382378,0.113611 0.574559,0.156706 0.192177,0.04114 0.382375,0.07443 0.574556,0.09402 0.19218,0.02155 0.38436,0.0333 0.574558,0.0333 0.19218,0 0.384358,-0.01175 0.576538,-0.0333 0.19218,-0.01959 0.382378,-0.05289 0.574558,-0.09402 0.19218,-0.04309 0.384361,-0.09402 0.574556,-0.156706 0.19218,-0.06268 0.384361,-0.137117 0.576541,-0.219388 0.190198,-0.08227 0.382375,-0.174335 0.574556,-0.278152 0.19218,-0.101858 0.382378,-0.213511 0.574558,-0.332999 0.19218,-0.121447 0.384358,-0.250729 0.574559,-0.389805 0.192177,-0.137117 0.384357,-0.284029 0.576537,-0.438775 0.192181,-0.154747 0.382379,-0.317328 0.574559,-0.487746 0.192177,-0.168458 0.384358,-0.346711 0.574556,-0.528881 0.19218,-0.184129 0.38436,-0.374134 0.57654,-0.568057 0.190199,-0.195882 0.382376,-0.39764 0.574556,-0.603316 0.19218,-0.205676 0.382379,-0.417228 0.574559,-0.630739 0.192177,-0.215471 0.384357,-0.432899 0.576537,-0.656204 0.190199,-0.221346 0.382379,-0.446611 0.574559,-0.671874 0.192177,-0.227225 0.382379,-0.456405 0.574559,-0.685587 0.192177,-0.23114 0.384357,-0.462282 0.574556,-0.693423 l 0.576537,-0.693421 c 0.190199,-0.229181 0.382379,-0.460323 0.574559,-0.687546 0.19218,-0.22918 0.384357,-0.454445 0.574556,-0.677751 0.19218,-0.223304 0.38436,-0.444652 0.57654,-0.66208 0.190198,-0.217429 0.382379,-0.430939 0.574556,-0.640534 0.19218,-0.207635 0.382378,-0.413311 0.574559,-0.611151 0.19218,-0.199798 0.38436,-0.393722 0.574558,-0.581768 0.19218,-0.186088 0.38436,-0.368258 0.576538,-0.542594 0.19218,-0.174334 0.382378,-0.342792 0.574558,-0.501457 0.192181,-0.160622 0.384358,-0.311452 0.574556,-0.456404 0.192183,-0.142994 0.384361,-0.278153 0.576543,-0.405476 0.190196,-0.127322 0.382374,-0.244851 0.574556,-0.352587 0.192175,-0.109693 0.382373,-0.207634 0.574556,-0.297739 0.192183,-0.08815 0.384358,-0.16846 0.576541,-0.237018 0.190198,-0.07052 0.382373,-0.129281 0.574555,-0.178252 0.192183,-0.04897 0.382382,-0.08815 0.574556,-0.11557 0.192183,-0.02939 0.384358,-0.04701 0.574556,-0.05289 0.192183,-0.0079 0.384358,-0.0039 0.576541,0.0098 0.190198,0.01371 0.382381,0.03918 0.574556,0.07443 0.192182,0.03526 0.384357,0.08031 0.574558,0.137118 0.19218,0.05484 0.384363,0.121446 0.576541,0.19784 0.190198,0.07639 0.382378,0.162582 0.574555,0.256605 0.192183,0.09598 0.382382,0.201759 0.574556,0.317329 0.192183,0.113611 0.384366,0.237017 0.574564,0.370216 0.192175,0.1332 0.384358,0.274235 0.576533,0.423105 0.192182,0.148871 0.382381,0.307534 0.574564,0.472075 0.192174,0.16454 0.384357,0.336917 0.574555,0.515169 0.192175,0.178253 0.384358,0.36434 0.576536,0.556305 0.190195,0.191964 0.382378,0.389804 0.574563,0.591563 0.192175,0.203717 0.382371,0.411351 0.574556,0.622905 0.192175,0.211551 0.384358,0.427021 0.576541,0.646409 0.190198,0.221347 0.382373,0.442693 0.574556,0.667956 0.192174,0.225265 0.382373,0.454446 0.574554,0.683628 0.19218,0.227224 0.38436,0.458364 0.57456,0.689505 0.19218,0.23114 0.38435,0.462281 0.576537,0.693421 0.1902,0.23114 0.38238,0.462282 0.57455,0.691463 0.19219,0.229182 0.38436,0.456406 0.57456,0.681669 0.19218,0.225265 0.38436,0.448569 0.57654,0.667957 0.1902,0.219387 0.38236,0.434857 0.57456,0.648369 0.19218,0.211552 0.38238,0.419186 0.57455,0.620945 0.19219,0.203717 0.38436,0.401558 0.57455,0.591563 0.19218,0.191964 0.38438,0.378053 0.576539,0.556304 0.19219,0.180212 0.38239,0.352588 0.57457,0.517128 0.19218,0.16454 0.38435,0.321246 0.57455,0.470116 0.19218,0.15083 0.38437,0.291865 0.57653,0.423105 0.19021,0.1332 0.38239,0.256606 0.57457,0.372176 0.19218,0.113611 0.38238,0.219388 0.57455,0.31537 0.19218,0.09598 0.38436,0.182169 0.57654,0.258563 0.19021,0.07639 0.38239,0.141035 0.57457,0.197841 0.19218,0.05484 0.38237,0.101859 0.57455,0.137117 0.19218,0.03527 0.38436,0.05876 0.57457,0.07248 0.19217,0.01568 0.38435,0.01763 0.57654,0.01176 0.19019,-0.0079 0.38237,-0.02547 0.57455,-0.05289 0.19218,-0.02939 0.38435,-0.0666 0.57455,-0.11557 0.19218,-0.04897 0.38436,-0.109694 0.57654,-0.178253 0.19021,-0.07052 0.38237,-0.148871 0.57457,-0.238977 0.19216,-0.08815 0.38236,-0.188046 0.57454,-0.295781 0.19218,-0.109693 0.38436,-0.227223 0.57456,-0.354546 0.19218,-0.125364 0.38436,-0.260522 0.57654,-0.405475 0.1902,-0.142994 0.38238,-0.295782 0.57455,-0.454446 0.19219,-0.160623 0.38436,-0.327123 0.57456,-0.501458 0.19218,-0.174334 0.38436,-0.356504 0.57654,-0.544551 0.1902,-0.188047 0.38238,-0.380011 0.57456,-0.57981 0.19218,-0.1998 0.38238,-0.403517 0.57455,-0.613111 0.19219,-0.209593 0.38437,-0.423104 0.57457,-0.640533 0.19218,-0.21547 0.38436,-0.436816 0.57654,-0.660122 0.19218,-0.223305 0.38237,-0.450528 0.57455,-0.677751 0.19218,-0.229181 0.38436,-0.458364 0.57457,-0.689504 0.19218,-0.23114 0.38436,-0.462281 0.57652,-0.693421 0.1902,-0.231141 0.38239,-0.462282 0.57457,-0.691463 0.19217,-0.231141 0.38237,-0.460322 0.57455,-0.685587 0.19218,-0.227223 0.38436,-0.452487 0.57654,-0.673833 0.1902,-0.221347 0.38238,-0.440734 0.57456,-0.654245 0.19218,-0.21547 0.38237,-0.425064 0.57456,-0.632699 0.19217,-0.205676 0.38436,-0.405476 0.57455,-0.601357 0.19219,-0.195882 0.38436,-0.385887 0.57654,-0.568058 0.1902,-0.184128 0.38238,-0.360422 0.57456,-0.53084 0.19218,-0.170416 0.38436,-0.33104 0.57456,-0.485785 0.19218,-0.154747 0.38436,-0.30166 0.57654,-0.440735 0.1902,-0.137117 0.38237,-0.268358 0.57455,-0.387846 0.19219,-0.121447 0.38238,-0.233099 0.57457,-0.334958 0.19218,-0.101859 0.38435,-0.193923 0.57455,-0.278152 0.19218,-0.08227 0.38435,-0.154747 0.57654,-0.217429 0.19218,-0.06268 0.38239,-0.11557 0.57455,-0.156705 0.19219,-0.0431 0.38436,-0.07444 0.57456,-0.09598 0.19218,-0.02155 0.38436,-0.03134 0.57654,2.038207 -0.19217,2.069547 -0.38435,2.079337 -0.57653,2.100887 z" id="path3033" style="fill:#fcff00;fill-opacity:0.97948716;stroke:none;stroke-width:0.50683445;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:48.99999237" /> + </g> + <path d="M 81.276152,58.132694 C 117.00193,38.930085 117.00193,38.706801 117.00193,38.706801 v 0" style="fill:none;stroke:#2faaff;stroke-width:1.32291663;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.93750005, 1.32291666999999991;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#DotM)"/> + <path d="M 81.276152,58.132694 C 103.89337,24.464718 103.78907,24.267296 103.78907,24.267296 v 0" style="fill:none;stroke:#00b93a;stroke-width:1.32291663;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.93750005, 1.32291666999999991;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#DotM-3)"/> + <rect ry="1.0093123" rx="1.0093123" y="58.461468" x="62.99786" height="11.924848" width="38.045948" id="rect831" style="fill:#960087;fill-opacity:1;stroke:#000000;stroke-width:1.68218708;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/> + </g> + </g> + </g></symbol> + <symbol id="fug" viewBox="0 0 1200px 1200px" width="1200" height="1200"><g class="fugscale scale"> + <rect x="0" y="200" width="600" height="400" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="5"/> + <text x="275" y="450" text-anchor="middle" font-family="Arial" font-size="120" fill="white" width="2">FuG</text> + </g></symbol> + <symbol id="gun" viewBox="0 0 400px 210px"><g class="gunscale scale"> + <g transform="translate(0, 0)"> + <rect x="50" y="50" width="110" height="110" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="5"/> + <text x="105" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">G</text> + </g> + </g></symbol> + <symbol id="klystron" viewBox="0 0 1400px 1400px" width="1400" height="1400"><g class="klystronscale scale"><g transform="translate(550 750) scale(1.5) rotate(180)"> + <rect x="40" y="70" width="300" height="300" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <circle r="80" cx="240" cy="215" fill="#7a7a7a" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="40" cx="240" cy="215" fill="#edebeb" stroke="#2f2f2f" stroke-width="10px" /> + <circle r="30" cx="240" cy="215" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="70" cy="105" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="70" cy="340" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="310" cy="105" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="310" cy="340" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <line x1="130" y1="120" x2="185" y2="160" stroke="red" stroke-width="28px" /> + <line x1="340" y1="120" x2="295" y2="160" stroke="red" stroke-width="28px" /> + <line x1="137" y1="30" x2="137" y2="134" stroke="red" stroke-width="28px" /> + <line x1="334" y1="30" x2="334" y2="134" stroke="red" stroke-width="28px" /> + </g></g></symbol> + <symbol id="klystronx" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 2000px 2000px" width="2000" height="2000"><g class="klystronxscale scale"><g transform="translate(800 840) scale(1.75) rotate(180)"> + <rect x="40" y="70" width="400" height="300" stroke="#2f2f2f" stroke-width="13" fill="#c7c7c7" /> + <rect x="40" y="70" width="200" height="200" stroke="#2f2f2f" stroke-width="7" fill="#e02900" /> + <circle r="90" cx="340" cy="215" fill="red" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="70" cx="340" cy="215" fill="yellow" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="60" cx="340" cy="215" fill="yellow" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="70" cy="105" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="70" cy="320" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="210" cy="240" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <circle r="7" cx="210" cy="320" fill="#edebeb" stroke="#2f2f2f" stroke-width="5px" /> + <line x1="240" y1="70" x2="240" y2="370" stroke="black" stroke-width="5px" /> + <image x="207" y="238" width="5" height="5" xlink:href="https://pwma-dev.elettra.eu/panther/components/src/r.jpg" /> + </g></g></symbol> + <symbol id="quadrupolefermi" viewBox="0 0 400px 210px"> + <g class="quadrupolefermiscale scale"><g> + <rect x="50" y="50" width="110" height="110" rx="10" ry="10" fill="#ff3d3d" stroke="darkslategrey" stroke-width="5"/> + <text class="quadrupole" x="105" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="white" width="2">Q</text> + <path d="M 47 60 a 90 55 0 0 0 0 45 M 162 60 a 90 55 0 0 1 0 45" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + <path d="M 47 105 a 90 55 0 0 0 0 45 M 162 105 a 90 55 0 0 1 0 45" stroke="#ffe600" stroke-width="2" fill="#ff7501" /> + </g>+</g> + </symbol> + <symbol id="mrc2" viewBox="0 0 400px 210px"><g class="mrcfermiscale scale"> + <rect x="250" y="50" width="110" height="110" rx="10" ry="10" fill="#e3e3e3" stroke="darkslategrey" stroke-width="5"/> + <text class="mrc" x="305" y="135" text-anchor="middle" font-family="Arial" font-size="90" fill="black" width="2">M</text> + </g> + </symbol> + <symbol id="mrc" viewBox="0 0 1000px 800px" width="1000" height="800"><g class="mrcfermiscale scale"> + <g transform="translate(160 0) scale(2)"> + <rect style="fill:#c5bfbf;fill-opacity:1;stroke:#000000;stroke-width:1.32291667;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="106.21842" height="31.942427" x="13.036623" y="-68.887886" rx="6.2668848" ry="1.1538386" transform="scale(1,-1)"/> + <rect style="fill:#c5bfbf;fill-opacity:1;stroke:#000000;stroke-width:1.32291667;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="93.845367" height="61.705067" x="19.22315" y="-83.769203" rx="5.2916665" ry="5.2916665" transform="scale(1,-1)"/> + <rect style="fill:#646464;fill-opacity:1;stroke:none;stroke-width:1.38850284;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="83.570442" height="53.096321" x="24.360613" y="26.368509" rx="4.9306588" ry="1.9179652" /> + <path style="fill:none;stroke:#f7ff00;stroke-width:2.35089684;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 106.37366,60.558346 66.788652,43.860332 33.748191,60.212299 l -6.13291,3.035222 -0.893513,0.05461" /> + <g id="g921" transform="matrix(-0.99961185,0.02785953,0.02785953,0.99961185,130.82403,-11.72759)"> + <path d="m 31.902614,54.186421 c 11.390948,-1.955934 22.781627,-3.911822 34.166809,-4.088542 11.385183,-0.176719 22.764866,1.425643 34.144327,3.027974" style="fill:none;fill-opacity:1;stroke:#097fb1;stroke-width:7.09675312;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/> + </g> + </g> + </g></symbol> + <symbol id="rack" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rackscale scale"> + <rect x="0" y="200" width="400" height="400" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="camod" viewBox="0 0 1600px 1600px" width="1600" height="1600"><g class="camodscale scale"> + <rect x="0" y="200" width="750" height="600" rx="10" ry="10" fill="#707070" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rack2" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="rack2scale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rllrf" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="rllrfscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#707070" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rd" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="rdscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#2b7cff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rv" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rvscale scale"> + <rect x="0" y="200" width="400" height="400" rx="10" ry="10" fill="#2b7cff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rps" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="rpsscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#2b7cff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rc" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="rcscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#2b7cff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rid" viewBox="0 0 2000px 2000px" width="1200" height="1200"><g class="ridscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#ffffff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rar1" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rar1scale scale"> + <rect x="0" y="200" width="400" height="400" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rar2" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rar2scale scale"> + <rect x="0" y="200" width="400" height="400" rx="10" ry="10" fill="#999999" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rpsb" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rpsbscale scale"> + <rect x="0" y="200" width="400" height="400" rx="10" ry="10" fill="#00ac76" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + <symbol id="rtf" viewBox="0 0 600px 600px" width="1200" height="1200"><g class="rtfscale scale"> + <rect x="0" y="200" width="300" height="400" rx="10" ry="10" fill="#2b7cff" stroke="darkslategrey" stroke-width="10"/> + </g></symbol> + + <symbol id="undulator" viewBox="0 0 1600 400" width="1600" height="400"><g class="unduilatorscale scale"> + <defs> + <pattern id="Pattern" x="0" y="0" width=".05" height="1"> + <rect x="0" y="0" width="40" height="200" fill="#a6a4c9"/> + <rect x="0" y="0" width="20" height="100" fill="#8a89a7" stroke="black" stroke-width="1" /> + <rect x="20" y="100" width="20" height="100" fill="#8a89a7" stroke="black" stroke-width="1" /> + </pattern> + </defs> + <rect fill="url(#Pattern)" width="800" height="200" stroke="black" stroke-width="10" /> + </g></symbol> + <symbol id="miniundulator" viewBox="0 0 800 400" width="1600" height="400"><g class="unduilatorscale scale"> + <defs> + <pattern id="Pattern" x="0" y="0" width=".05" height="1"> + <rect x="0" y="0" width="40" height="200" fill="#a6a4c9"/> + <rect x="0" y="0" width="20" height="100" fill="#8a89a7" stroke="black" stroke-width="1" /> + <rect x="20" y="100" width="20" height="100" fill="#8a89a7" stroke="black" stroke-width="1" /> + </pattern> + </defs> + <rect x="5" y="15" fill="url(#Pattern)" width="340" height="170" stroke="black" stroke-width="10" /> + </g></symbol> + <symbol id="vlv" viewBox="0 0 900px 900px" width="3200" height="3100"><g class="vlvscale scale"> + <g transform="translate(150,7) rotate(90)"> + <polygon points="55,65 125,65 90,100" stroke="#2f2f2f" stroke-width="3" /> + <polygon points="90,100 55,135 125,135" stroke="#2f2f2f" stroke-width="3" /> + <circle r="15" cx="90" cy="100" stroke="#2f2f2f" stroke-width="3" /> + </g> + </g></symbol> + <symbol id="wiggler" viewBox="0 0 1200px 400px" width="1200" height="400"><g class="wigglerscale scale"> + <rect x="40" y="10" width="400" height="90" stroke="black" stroke-width="10" fill="plum" /> + <rect x="40" y="100" width="400" height="90" stroke="black" stroke-width="10" fill="plum" /> + <rect x="40" y="190" width="40" height="40" stroke="black" stroke-width="10" fill="none" /> + <rect x="400" y="190" width="40" height="40" stroke="black" stroke-width="10" fill="none" /> + </g></symbol> + <symbol id="bst" viewBox="0 0 400px 400px"><g class="bstscale scale"> + <rect x="40" y="20" width="80" height="170" stroke="black" stroke-width="7" fill="#c7c7c7" /> + <circle r="50" cx="80" cy="105" stroke="#2f2f2f" stroke-width="10" /> + <circle r="40" cx="80" cy="105" stroke="#2f2f2f" stroke-width="5" /> + </g></symbol> + <symbol id="cm" width="600" height="410" viewBox="0 0 600px 330px"><g class="cmscale scale"> + <g> + <rect x="50" y="55" width="40" height="90" rx="15" ry="15" fill="#00d0ff" stroke="darkslategrey" stroke-width="5"/> + <text x="70" y="77" text-anchor="middle" font-family="Arial" font-size="50" fill="white" width="2" transform="scale(1 1.7)">C</text> + <text x="72" y="73" text-anchor="middle" font-family="Arial" font-size="20" fill="white" width="2" transform="scale(1 1.5)">M</text> + </g> + </g></symbol> +</svg> diff --git a/components/bundle_fermifast.js b/components/bundle_fermifast.js new file mode 100644 index 0000000000000000000000000000000000000000..2b1fcbe289e2a167b7ea5b182e8a52c48f1e554d --- /dev/null +++ b/components/bundle_fermifast.js @@ -0,0 +1,1104 @@ +/*jshint esversion: 6 */ + import * as THREE from 'three'; + // import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js'; + import {FontLoader} from 'three/addons/loaders/FontLoader.js'; + import {TextGeometry} from 'three/addons/geometries/TextGeometry.js'; + + // rack + export function rack(text, width=800, height=2500, depth=800, color=0xf0f0f0) { + const rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rackObject.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(width, 90, depth-100); + rackObject.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [width+10, height-170, depth-150], [0, Math.PI / 2, 0]); + + const tag = new THREE.MeshLambertMaterial({color: 0xfbe928}); + //front yellow tag + const Ftag = new THREE.BoxGeometry(2, 90, depth-100); + const Ftagmesh = new THREE.Mesh(Ftag, tag); + Ftagmesh.position.set(-10, height-50, depth/2-5); + rackObject.add(Ftagmesh); + //Rear yellow tag + const Rtag = new THREE.BoxGeometry(2, 90, depth-100); + const Rtagmesh = new THREE.Mesh(Rtag, tag); + Rtagmesh.position.set(width+10, height-50, depth/2-5); + rackObject.add(Rtagmesh); + + const rackmaterial = new THREE.MeshLambertMaterial({color: color}); + const rackgeometry = new THREE.BoxGeometry(width, height, depth); + const rackmesh = new THREE.Mesh(rackgeometry, rackmaterial); + rackmesh.position.set(width/2, height/2, depth/2); + rackObject.add(rackmesh); + return rackObject; + } + // transparent wall + export function wall(param) { + const length=3000; + const material = new THREE.MeshBasicMaterial({color: 0xff8080, transparent: true, opacity: 0.2, side: THREE.DoubleSide,}); + const geometry = new THREE.CylinderGeometry(10 /*radiusTop*/, 10 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const chamberMesh = new THREE.Mesh(geometry, material); + chamberMesh.rotateX(Math.PI * 0.5); + chamberMesh.scale.setZ(100); + chamberMesh.rotatedX = true; + return chamberMesh; + } + // label + export function label(param) { + let size = 700; + const label = new THREE.Object3D(); + const text=param.name, height=-50; + const length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -3000; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: -3000; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, 0]); + + return objLabel; + } + export function rack2fast(param) {return rack(param.name, 800, 2000, 600);} + export function rdfast(param) {return rack(param.name, 800, 2500, 600,0x0060f0);} + export function rvfast(param) {return rack(param.name, 800, 2500, 800, 0x0060f0);} + export function ridfast(param) {return rack(param.name, 800, 2500, 600, 0x0060f0);} + export function rpsfast(param) {return rack(param.name, 800, 2500, 600,0x0060f0);} + export function rcfast(param) {return rack(param.name, 800, 2500, 600,0x0060f0);} + export function fugfast(param) {return rack(param.name, 1000, 2000, 1000);} + export function rllrffast(param) {return rack(param.name, 800, 1200, 600);} + export function rar1fast(param) {return rack(param.name, 800, 2000, 800);} + export function rar2fast(param) {return rack(param.name, 800, 2000, 800);} + export function camodfast(param) {return rack(param.name, 1200, 2000, 1500);} + export function klystronxfast(param) {return rack(param.name, 1000, 2000, 800, 'darkred');} + + export function klystronfast(param) { + const text=param.name, myscale=0.625; + const width=1500, height=1500, depth=1500; + const ModK = new THREE.Object3D(); + const ModContainer = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const klystron = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + klystron.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(75, [950,680,560], [0, Math.PI / 2, 0]); + + const basegeometry = new THREE.BoxGeometry(width, height, depth); + const d1mesh = new THREE.Mesh(basegeometry, materialBase); + ModContainer.add(d1mesh); + + // cover + const d2geometry = new THREE.BoxGeometry(width+100, 100, depth+100); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, 800, 0); + ModContainer.add(d2mesh); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + + // big cylinder + const d4geometry = new THREE.CylinderGeometry(400, 400, 1200, 50); + const d4mesh = new THREE.Mesh(d4geometry, materialGreyDark); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 970 , 300); + ModContainer.add(d4mesh); + + // small cylinder + const d5geometry = new THREE.CylinderGeometry(200, 200, 1200, 50); + const d5mesh = new THREE.Mesh(d5geometry, materialGreyDark); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 1670 , 300); + ModContainer.add(d5mesh); + + // high cover + const d6geometry = new THREE.CylinderGeometry(220, 220, 90, 50); + const d6mesh = new THREE.Mesh(d6geometry, materialGreyDark); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 2300 , 300); + ModContainer.add(d6mesh); + + // right arm + const Bracciodx = new THREE.BoxGeometry( 600, 100, 200 ); + const d7mesh = new THREE.Mesh(Bracciodx, materialBase); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1.25); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(300, 1300 , 600); + ModContainer.add(d7mesh); + + // left arm + const Bracciosx = new THREE.BoxGeometry( 600, 100, 200 ); + const d8mesh = new THREE.Mesh(Bracciosx, materialBase); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1.75); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(300, 1300 , 0); + ModContainer.add(d8mesh); + + // right arm continue + const PBracciodx = new THREE.BoxGeometry( 600, 100, 190 ); + const d9mesh = new THREE.Mesh(PBracciodx, materialBase); + d9mesh.rotateX(Math.PI * 1); + d9mesh.rotateY(Math.PI * 1); + d9mesh.rotateZ(Math.PI * 1); + d9mesh.position.set(743, 1300 , 790); + ModContainer.add(d9mesh); + + //prolung braccia sx + const PBracciosx = new THREE.BoxGeometry( 600, 100, 190 ); + const d10mesh = new THREE.Mesh(PBracciosx, materialBase); + d10mesh.rotateX(Math.PI * 1); + d10mesh.rotateY(Math.PI * 1); + d10mesh.rotateZ(Math.PI * 1); + d10mesh.position.set(743, 1300 , -190); + ModContainer.add(d10mesh); + + + //targhetta + const targhetta = new THREE.BoxGeometry( 10, 300, 300 ); + const d14mesh = new THREE.Mesh(targhetta, dmaterial2); + d14mesh.position.set(-750, 550 , 0); + ModContainer.add(d14mesh); + + + ModContainer.rotateY(Math.PI); + ModContainer.scale.set(myscale, myscale, myscale); + ModContainer.position.set(width*myscale/2, height*myscale/2, depth*myscale/2); + klystron.add(ModContainer); + return klystron; + } + + // rpsb rack + export function rpsb(param) { + const width=1000, height=2100, depth=1000; + const rpsb = new THREE.Object3D(); + const rpsb_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rpsb.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(790, 90, -850); + rpsb.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [900, 1725, -180], [0, Math.PI / 2, 0]); + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ac76}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + //rack + const geometry = new THREE.BoxGeometry(width, height, depth); + const rackmesh = new THREE.Mesh(geometry, greenmaterial); + rackmesh.position.set( 0, 0 , 0); + rpsb_rackObject.add(rackmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -504, 800 , 0); + rpsb_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 504, 800 , 0); + rpsb_rackObject.add(Rtargetmesh); + + rpsb_rackObject.rotateY(Math.PI); + rpsb_rackObject.position.set(400, 1050, -400); + rpsb.add(rpsb_rackObject); + + + rpsb_rackObject.position.set(400, 1050, -400); + rpsb.add(rpsb_rackObject); + return rpsb; + } + + // cavity for linac + export function cavitylinac(param) { + const length = param.length? param.length: 1200; + const cavitylinacMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(75, 75, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, length/2+350, 0); + cavitylinacMaster.add(d1mesh); + cavitylinacMaster.rotateX(Math.PI * 0.5); + cavitylinacMaster.rotatedX = true; + return cavitylinacMaster; + } + + // flsc + export function flscfast(param) { + const length=700; + const flscSR = new THREE.Object3D(); + const flscContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + + + const d1geometry = new THREE.CylinderGeometry(25, 25, 500, 15); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + flscContiner.add(d1mesh); + flscContiner.rotateX(Math.PI * 1); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(70, 70, 160, 20); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 80 , 0); + flscContiner.add(d4mesh); + + // cil3 + const dmateria6 = new THREE.MeshLambertMaterial({color: 0x000000}); + const d6geometry = new THREE.CylinderGeometry(50, 50, 60, 15); + const d6mesh = new THREE.Mesh(d6geometry, dmateria6); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, -30 , 0); + flscContiner.add(d6mesh); + + // box gray + const d7geometry = new THREE.BoxGeometry(100, 100, 100); + const dmaterial7= new THREE.MeshLambertMaterial({color: 0x405040}); + const d7mesh = new THREE.Mesh(d7geometry, dmaterial7); + d7mesh.position.set(0, -110, 0); + flscContiner.add(d7mesh); + + // box orange + const d9geometry = new THREE.BoxGeometry(100, 120, 100); + const dmaterial9= new THREE.MeshLambertMaterial({color: 0xffA500}); + const d9mesh = new THREE.Mesh(d9geometry, dmaterial9); + d9mesh.position.set(0, -220, 0); + flscContiner.add(d9mesh); + + flscContiner.position.set(0, 280, 0); + flscSR.add(flscContiner); + flscSR.rotateY(Math.PI * -0.5); + return flscSR; + } + + // fug PS + export function fug(param) { + const width=800, height=1700, depth=600; + const fug = new THREE.Object3D(); + const fugObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const basematerial = new THREE.MeshLambertMaterial({color: 0xc4b2a8}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , -100); + fugObject.add(lrmesh); + + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -710); + fugObject.add(rrmesh); + + //basefug + const basegeometry = new THREE.BoxGeometry(width+250, height-800, depth+600); + const basemesh = new THREE.Mesh(basegeometry, silvermaterial); + basemesh.position.set( -130, -1320 , -400); + fugObject.add(basemesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(50, 1700, 50); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -985); + fugObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(50, 1700, 50); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , -430); + fugObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(50, 1700, 50); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + fugObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(50, 1700, 50); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 175); + fugObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(50, 50, 505); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 825 , -707); + fugObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(50, 50, 505); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -830 , -707); + fugObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(50, 50, 505); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 825 , -100); + fugObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(50, 50, 505); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -825 , -100); + fugObject.add(rdemesh); + + //base1 left and texture + const drawer1geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/fug1screenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -707); + fugObject.add(gridgeometrymesh); + + //base2 right and texture + const drawer2geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader2.load('./components/fug2screenfoto.jpg'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(1, 1); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const gridgeometry2mesh = new THREE.Mesh(drawer2geometry, material2); + gridgeometry2mesh.rotateX(Math.PI * 1); + gridgeometry2mesh.rotateY(Math.PI * 1); + gridgeometry2mesh.rotateZ(Math.PI * 1); + gridgeometry2mesh.position.set( -400, 0 , -100); + fugObject.add(gridgeometry2mesh); + + //base3 FUG write and texture + const drawer0geometry = new THREE.BoxGeometry(1, 900, 1200); + const textureLoader0 = new THREE.TextureLoader(); + const texture0 = textureLoader0.load('./components/fug0screenfoto.jpg'); + texture0.wrapS = texture0.wrapT = THREE.RepeatWrapping; + texture0.repeat.set(1, 1); + const material0 = new THREE.MeshBasicMaterial({ map: texture0 }); + const gridgeometry0mesh = new THREE.Mesh(drawer0geometry, material0); + gridgeometry0mesh.rotateX(Math.PI * 1); + gridgeometry0mesh.rotateY(Math.PI * 1); + gridgeometry0mesh.rotateZ(Math.PI * 1); + gridgeometry0mesh.position.set( -655, -1320 , -400); + fugObject.add(gridgeometry0mesh); + + fugObject.rotateY(Math.PI); + fugObject.position.set(400, 1750, 400); + fug.add(fugObject); + return fug; + } + + export function gun(param) { + const sphereRadius=200, sphereFactor=0.8; + const cavityObject = new THREE.Object3D(); + const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0}); + const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32); + const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial); + cavitymesh.scale.setZ(sphereFactor); + cavityObject.add(cavitymesh); + /*const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius, cylinderHeight, 20, 2, false, 0, Math.PI * 2); + const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial); + // rfMesh.rotateX(Math.PI * 0.5); + rfMesh.position.set(0, sphereRadius, 0); + cavityObject.add(rfMesh);*/ + return cavityObject; + } + + // corrector fermi + export function correctorfermi(param) { + const length=400; + const CorrectorContiner = new THREE.Object3D(); + const CorrectorMaster = new THREE.Object3D(); + + // coil settings + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/coil_texture_fermi.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(2, 20); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(d1mesh); + + //spessore esterno plastica bianca + const redmaterialp = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_1p = new THREE.CylinderGeometry(501 /*radiusTop*/, 501 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_1p = new THREE.Mesh(geometry_1p, redmaterialp); + dmesh_1p.position.set(0, 0, 0); + dmesh_1p.rotateX(Math.PI * 1.25); + dmesh_1p.rotateY(Math.PI * 1); + dmesh_1p.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(dmesh_1p); + + //spessore alto centro + const redmaterial_5 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2}); + const geometry_1_5 = new THREE.BoxGeometry(length, 150, 700); + const dmesh_1_5 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_1_5.position.set(0, 277, 0); + CorrectorMaster.add(dmesh_1_5); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_2.position.set(0, -277, 0); + CorrectorMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(length, 600, 150); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_3.position.set(0, 0, -275); + CorrectorMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_4.position.set(0, 0, 275); + CorrectorMaster.add(dmesh_4); + + //cubo al centro + const loader_2 = new THREE.TextureLoader(); + const texture_2 = loader.load('./components/coil_texture_fermi.png'); + texture_2.wrapS = texture_2.wrapT = THREE.RepeatWrapping; + texture_2.repeat.set(20, 20); + const textureTop_2 = texture.clone(); + const textureSide_2 = texture.clone(); + const dmaterial_2 = new THREE.MeshLambertMaterial({map: texture_2}); + const geometry_2 = new THREE.BoxGeometry(390, 390, 390); + const dmesh_5 = new THREE.Mesh(geometry_2, dmaterial_2); + dmesh_5.position.set(0, 0, 0); + CorrectorMaster.add(dmesh_5); + + //spessore interno plastica bianca + const redmaterial_6 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_6 = new THREE.CylinderGeometry(280 /*radiusTop*/, 280 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_6 = new THREE.Mesh(geometry_6, redmaterial_6); + dmesh_6.position.set(0, 0, 0); + dmesh_6.rotateX(Math.PI * 1); + dmesh_6.rotateY(Math.PI * 1.25); + dmesh_6.rotateZ(Math.PI * 1); + CorrectorMaster.add(dmesh_6); + + CorrectorMaster.position.set(0, 0, 0); + CorrectorContiner.add(CorrectorMaster); + CorrectorContiner.rotateY(Math.PI * 1); + CorrectorContiner.scale.setX(0.25); + CorrectorContiner.scale.setY(0.125); + CorrectorContiner.scale.setZ(0.25); + + return CorrectorContiner; + } + + + // BPM (beam position monitor) + export function bpm(param) { + const width=300, height=300, depth=50, transverse=100; + const bpmObject = new THREE.Object3D(); + const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff}); + const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth); + const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial); + bpmObject.add(bpmmeshh); + const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth); + const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial); + bpmObject.add(bpmmeshv); + return bpmObject; + } + + + // Quadrupole + export function quadrupolefermi(param) { + const length=200; + const quadrupoleMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040}); + const d1geometry = new THREE.BoxGeometry(550, 500, length); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + quadrupoleMaster.add(d1mesh); + return quadrupoleMaster; + } + + // PLC + export function plc(width=500, height=300, depth=600) { + const plcObject = new THREE.Object3D(); + const cardsObject = new THREE.Object3D(); + const mirrorObject = new THREE.Object3D(); + + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11}); + const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11}); + const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757}); + const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + + // base + const basegeometry = new THREE.BoxGeometry(500, 300, 600); + const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial); + basegeometrymesh.position.set( 0, 0 ,0); + plcObject.add(basegeometrymesh); + + // card + const cardgeometry = new THREE.BoxGeometry(502, 270, 250); + const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial); + cardgeometrymesh.position.set( 0, 0 , -100); + cardsObject.add(cardgeometrymesh); + + //led1 + const led1green = new THREE.BoxGeometry(504, 20, 20); + const led1greenmesh = new THREE.Mesh(led1green, greenmaterial); + led1greenmesh.position.set( 0, 120 , -200); + cardsObject.add(led1greenmesh); + //led2 + const led2green = new THREE.BoxGeometry(504, 20, 20); + const led2greenmesh = new THREE.Mesh(led2green, greenmaterial); + led2greenmesh.position.set( 0, 90 , -200); + cardsObject.add(led2greenmesh); + //led3 + const led3green = new THREE.BoxGeometry(504, 20, 20); + const led3greenmesh = new THREE.Mesh(led3green, greenmaterial); + led3greenmesh.position.set( 0, 60 , -200); + cardsObject.add(led3greenmesh); + //led4 + const led4green = new THREE.BoxGeometry(504, 20, 20); + const led4greenmesh = new THREE.Mesh(led4green, greenmaterial); + led4greenmesh.position.set( 0, 30 , -200); + cardsObject.add(led4greenmesh); + //led5 + const led5green = new THREE.BoxGeometry(504, 20, 20); + const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial); + led5greenmesh.position.set( 0, 0 , -200); + cardsObject.add(led5greenmesh); + //led6 + const led6green = new THREE.BoxGeometry(504, 20, 20); + const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial); + led6greenmesh.position.set( 0, -30 , -200); + cardsObject.add(led6greenmesh); + //led7 + const led7green = new THREE.BoxGeometry(504, 20, 20); + const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial); + led7greenmesh.position.set( 0, -60 , -200); + cardsObject.add(led7greenmesh); + //led8 + const led8green = new THREE.BoxGeometry(504, 20, 20); + const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial); + led8greenmesh.position.set( 0, -90 , -200); + cardsObject.add(led8greenmesh); + //led9 + const led9green = new THREE.BoxGeometry(504, 20, 20); + const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial); + led9greenmesh.position.set( 0, -120 , -200); + cardsObject.add(led9greenmesh); + + + + // baseScreen + const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200); + const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial); + baseScreengeometrymesh.position.set( 0, 0 , 120); + plcObject.add(baseScreengeometrymesh); + + // 1livel + const livel1geometry = new THREE.BoxGeometry(550, 150, 150); + const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial); + livel1geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel1geometrymesh); + + + + plcObject.add(cardsObject); + + + + return plcObject; + } + + + // Bending Dipole + export function dipolefermi(length=500) { + const dipoleContainer = new THREE.Object3D(); + const dipoleMaster = new THREE.Object3D(); + + //texture + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/dipole.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.BoxGeometry(550, 400, length); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(-100, 100, 0); + dipoleMaster.add(d1mesh); + + //Coil + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + + dipoleMaster.position.set(200, 0, 0); + dipoleContainer.add(dipoleMaster); + + return dipoleContainer; + } + // Current Monitor + export function cm(param) { + const cmContiner = new THREE.Object3D(); + const cmObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + cmObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + cmObject.add(cyl2mesh); + + + cmObject.scale.setX(1); + cmObject.scale.setY(1); + cmObject.scale.setZ(1); + cmObject.position.set(0, 0, 0); + cmContiner.add(cmObject); + cmContiner.rotateY(Math.PI * -0.5); + + + return cmContiner; + } + // undulator + export function undulator(param) { + const length=1000; + const undulatorMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/undulator.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + undulatorMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + undulatorMaster.add(qline); + return undulatorMaster; + } + + // Beam Loss Monitor + export function blm(length=100, dcolor='white', width=100) { + const cMaster = new THREE.Object3D(); + const d1geometry = new THREE.BoxGeometry(length, width, width); + const material = new THREE.MeshLambertMaterial({color: dcolor}); + const d1mesh = new THREE.Mesh(d1geometry, material); + d1mesh.position.set(-length/2, 0, 0); + cMaster.add(d1mesh); + return cMaster; + } + function blmColor(val) { + if (document.location.search.indexOf('demo')>-1) { + if (val < 0) return 'white'; + else if (val < 1) return 'yellow'; + else if (val < 2) return 'orange'; + else if (val < 3) return 'red'; + else return 'violet'; + } + if (val < 20) return 'white'; + else if (val < 50) return 'yellow'; + else if (val < 100) return 'orange'; + else if (val < 200) return 'red'; + else return 'violet'; + } + export function blmUpdate(c, val, direction, width=100, histogramFactor=50) { + if (typeof val !== 'number') val = 0; else val = Math.abs(val); + const blm = c.children[0]; + blm.material.dispose(); + blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)}); + blm.geometry.dispose(); + blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width); + blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0); + blm.geometry.computeVertexNormals(); + blm.geometry.normalsNeedUpdate = true; + blm.geometry.verticesNeedUpdate = true; + blm.geometry.dynamic = true; + } + // bst + export function bstfast(param) { + const bstObject = new THREE.Object3D(); + const bstContiner = new THREE.Object3D(); + + const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + + const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 190, 0); + bstObject.add(d1mesh); + bstObject.rotateX(Math.PI * 1); + + // circ base + const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + bstObject.add(d2mesh); + + // z + const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15); + const d4mesh = new THREE.Mesh(d4geometry, materialGrey); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 120 , 0); + bstObject.add(d4mesh); + + // cil Med + const d6geometry = new THREE.CylinderGeometry(70, 70, 120, 15); + const d6mesh = new THREE.Mesh(d6geometry, materialGrey); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 0 , 0); + bstObject.add(d6mesh); + + // cil low + const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15); + const d7mesh = new THREE.Mesh(d7geometry, materialGrey); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -100 , 0); + bstObject.add(d7mesh); + + + bstObject.position.set(0, 280, 0); + bstContiner.add(bstObject); + bstContiner.rotateY(Math.PI * -0.5); + return bstContiner; + } + export function bstUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + // valve + export function vlv(param) { + const vlvContiner = new THREE.Object3D(); + const vlvObject = new THREE.Object3D(); + const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363}); + //cylinder + const cylgeometry = new THREE.CylinderGeometry(25, 25, 100, 15); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + vlvObject.add(cylmesh); + + // base1 + const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 ); + const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial); + vlv1mesh.position.set(0, 50, 0); + vlv1mesh.colorable = true; + vlvObject.add(vlv1mesh); + + // hat1 + const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const hatgeometry = new THREE.BoxGeometry(50, 20, 100 ); + const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial); + hatmesh.colorable = true; + hatmesh.position.set(0, 120, 0); + vlvObject.add(hatmesh); + + + //TRIANGLE1 + const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3); + const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackboxmaterial); + trianglegeometrymesh.rotateX(Math.PI * 0); + trianglegeometrymesh.rotateY(Math.PI * 0); + trianglegeometrymesh.rotateZ(Math.PI * 0.5); + trianglegeometrymesh.position.set(0, 60 , -17); + vlvObject.add(trianglegeometrymesh); + + //TRIANGLE2 + const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3); + const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackboxmaterial); + triangle2geometrymesh.rotateX(Math.PI * 0); + triangle2geometrymesh.rotateY(Math.PI * 1); + triangle2geometrymesh.rotateZ(Math.PI * 0.5); + triangle2geometrymesh.position.set(0, 60 ,17); + vlvObject.add(triangle2geometrymesh); + + vlvObject.position.set(0, 0, 0); + vlvObject.rotateY(Math.PI * -0.5); + vlvContiner.add(vlvObject); + + return vlvContiner; + } + export function vlvUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } diff --git a/components/bundle_fermipremium.js b/components/bundle_fermipremium.js new file mode 100644 index 0000000000000000000000000000000000000000..2264ea30ed79c6fc4dd98d1c380df6e6ca938fdf --- /dev/null +++ b/components/bundle_fermipremium.js @@ -0,0 +1,2765 @@ +/*jshint esversion: 6 */ + import * as THREE from 'three'; + // import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js'; + import {FontLoader} from 'three/addons/loaders/FontLoader.js'; + import {TextGeometry} from 'three/addons/geometries/TextGeometry.js'; + + // rack + export function rack(width=800, height=2000, depth=800, color=0xf0f0f0) { + const gunObject = new THREE.Object3D(); + const gunmaterial = new THREE.MeshLambertMaterial({color: color}); + const gungeometry = new THREE.BoxGeometry(width, height, depth); + const gunmesh = new THREE.Mesh(gungeometry, gunmaterial); + gunmesh.position.set(width/2, height/2, depth/2); + gunObject.add(gunmesh); + return gunObject; + } + // transparent wall + export function wall(param) { + const length=3000; + const material = new THREE.MeshBasicMaterial({color: 0xff8080, transparent: true, opacity: 0.2, side: THREE.DoubleSide,}); + const geometry = new THREE.CylinderGeometry(10 /*radiusTop*/, 10 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const chamberMesh = new THREE.Mesh(geometry, material); + chamberMesh.rotateX(Math.PI * 0.5); + chamberMesh.scale.setZ(100); + chamberMesh.rotatedX = true; + return chamberMesh; + } + // label + export function label(param) { + const text=param.name, height=-50; + const length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -3000; + const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: -3000; + let size=800; + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const objLabel = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let textheight = 50; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + objLabel.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materialBase ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, 0]); + + return objLabel; + } + export function rack2(width=800, height=2000, depth=600) {return rack(width, height, depth);} + + export function rv(param) { + const width=800, height=2500, depth=800; + const rv = new THREE.Object3D(); + const rv_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rv.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 800); + rv.add(group2); + + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -5); + rv_rackObject.add(rrmesh); + + //front yellow target + const Ftarget = new THREE.BoxGeometry(2, 90, 700); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -5); + rv_rackObject.add(Ftargetmesh); + //Rear yellow target + const Rtarget = new THREE.BoxGeometry(2, 90, 700); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -5); + rv_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -365); + rv_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 380); + rv_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , 3); + rv_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , 3); + rv_rackObject.add(ldemesh); + + + //base and add texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rvscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rv_rackObject.add(gridgeometrymesh); + + rv_rackObject.rotateY(Math.PI); + rv_rackObject.position.set(400, 1250, 400); + rv.add(rv_rackObject); + return rv; + } + + // ID rack + export function rid(param) { + const width=800, height=1900, depth=600; + const rid = new THREE.Object3D(); + const id_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rid.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(800, 90, 650); + rid.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [810,1730,550], [0, Math.PI / 2, 0]); + + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xc5c2bd}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + //rack + const geometry = new THREE.BoxGeometry(width, height, depth); + const rackmesh = new THREE.Mesh(geometry, silvermaterial); + rackmesh.position.set( 0, 0 , 0); + id_rackObject.add(rackmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 550); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -401, 900 , -15); + id_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 550); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 900 , -15); + id_rackObject.add(Rtargetmesh); + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(2, height, width-200); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/idscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , 0); + id_rackObject.add(gridgeometrymesh); + + id_rackObject.rotateY(Math.PI); + id_rackObject.position.set(400, 950, 300); + rid.add(id_rackObject); + return rid; + } + + // Low Level RF Rack + export function rllrf(param) { + const width=800, height=1500, depth=600; + const rllrf = new THREE.Object3D(); + const llrf_rackObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rllrf.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(1200, 90, 600); + rllrf.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [1000,1270,550], [0, Math.PI / 2, 0]); + + //rrmesh.position.set( 0, 0 , -depth+290); + llrf_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 550); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -405, 640 , 10); + llrf_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 550); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 405, 640 , 10); + llrf_rackObject.add(Rtargetmesh); + + + //base and add texture + const drawer1geometry = new THREE.BoxGeometry(10, 1500, 600); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rllrfscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , 10); + llrf_rackObject.add(gridgeometrymesh); + + llrf_rackObject.rotateY(Math.PI); + llrf_rackObject.position.set(600, 750, 300); + rllrf.add(llrf_rackObject); + return rllrf; + } + + // Bending rack + export function rpsb(param) { + const width=1000, height=2100, depth=1000; + const rpsb = new THREE.Object3D(); + const rpsb_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rpsb.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(790, 90, -850); + rpsb.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [900, 1925, -180], [0, Math.PI / 2, 0]); + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ac76}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + //rack + const geometry = new THREE.BoxGeometry(width, height, depth); + const rackmesh = new THREE.Mesh(geometry, greenmaterial); + rackmesh.position.set( 0, 0 , 0); + rpsb_rackObject.add(rackmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -504, 999 , 0); + rpsb_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 504, 999 , 0); + rpsb_rackObject.add(Rtargetmesh); + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(2, height, width); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rpsbscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -503, 0 , 0); + rpsb_rackObject.add(gridgeometrymesh); + + rpsb_rackObject.rotateY(Math.PI); + rpsb_rackObject.position.set(400, 1050, -400); + rpsb.add(rpsb_rackObject); + return rpsb; + } + + // PS rack + export function rps(param) { + const width=800, height=2500, depth=600; + const rps = new THREE.Object3D(); + const rps_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000b0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rps.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rps.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 500], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rps_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rps_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rps_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rps_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rps_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rps_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rps_rackObject.add(ldemesh); + + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rpsscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rps_rackObject.add(gridgeometrymesh); + + rps_rackObject.rotateY(Math.PI); + rps_rackObject.position.set(400, 1250, 300); + rps.add(rps_rackObject); + return rps; + } + + + // Control rack + export function rc(param) { + const width=800, height=2500, depth=600; + const rc = new THREE.Object3D(); + const rc_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rc.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rc.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 450], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rc_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 550); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , 0); + rc_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 550); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , 0); + rc_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rc_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rc_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rc_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rc_rackObject.add(ldemesh); + + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rcscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rc_rackObject.add(gridgeometrymesh); + + rc_rackObject.rotateY(Math.PI); + rc_rackObject.position.set(400, 1250, 300); + rc.add(rc_rackObject); + return rc; + } + + // diagnostic rack + export function rd(param) { + const width=800, height=2500, depth=600; + const rd = new THREE.Object3D(); + const rd_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rd.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 550); + rd.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 500], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + // rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rd_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 550); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rd_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 550); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rd_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rd_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rd_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rd_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rd_rackObject.add(ldemesh); + + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rdscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rd_rackObject.add(gridgeometrymesh); + + rd_rackObject.rotateY(Math.PI); + rd_rackObject.position.set(400, 1250, 300); + rd.add(rd_rackObject); + return rd; + } + + // PRP rack + export function rrp(param) { + const width=800, height=2500, depth=600; + const rrp = new THREE.Object3D(); + const rrp_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rrp.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 1050); + rrp.add(group2); + + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 800], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + //rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rrp_rackObject.add(rrmesh); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 700); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rrp_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 700); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rrp_rackObject.add(Rtargetmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rrp_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rrp_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rrp_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rrp_rackObject.add(ldemesh); + + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rrpscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rrp_rackObject.add(gridgeometrymesh); + + rrp_rackObject.rotateY(Math.PI); + rrp_rackObject.position.set(400, 1250, depth); + rrp.add(rrp_rackObject); + return rrp; + } + + // RAR 1 - 2 - 3 + export function rar1(param, num=1) { + const width=800, height=2500, depth=800; + const rar = new THREE.Object3D(); + const kly_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rar.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 80, 750); + rar.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 630], [0, Math.PI / 2, 0]); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + kly_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + kly_rackObject.add(Rtargetmesh); + + // rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , 0); + kly_rackObject.add(lrmesh); + + //edge le + const rlegeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + kly_rackObject.add(rlemesh); + + //edge re + const rregeometry = new THREE.BoxGeometry(width-750, height, depth-750); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 375); + kly_rackObject.add(rremesh); + + //edge ue + const ruegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 1225 , 0); + kly_rackObject.add(ruemesh); + + //edge de + const rdegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -1230 , 0); + kly_rackObject.add(rdemesh); + + //base and texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 750); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rar'+num+'texture.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , 0); + kly_rackObject.add(gridgeometrymesh); + + kly_rackObject.rotateY(Math.PI); + kly_rackObject.position.set(400, 1250, 400); + rar.add(kly_rackObject); + return rar; + } + + // rack Terafermi + export function rtf(param) { + const width=800, height=2500, depth=600; + const rtf = new THREE.Object3D(); + const rtf_rackObject = new THREE.Object3D(); + + const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0}); + const text = param.name; + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + rtf.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + function createText() { + textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x); + textMesh = new THREE.Mesh(textGeo, materialBase); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + const group2 = group.clone(); + group2.rotateY(Math.PI); + group2.position.set(850, 90, 850); + rtf.add(group2); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]); + + const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9}); + const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff}); + const target = new THREE.MeshLambertMaterial({color: 0xfbe928}); + //front yellow tag + const Ftarget = new THREE.BoxGeometry(2, 90, 600); + const Ftargetmesh = new THREE.Mesh(Ftarget, target); + Ftargetmesh.position.set( -451, 1200 , -15); + rtf_rackObject.add(Ftargetmesh); + //Rear yellow tag + const Rtarget = new THREE.BoxGeometry(2, 90, 600); + const Rtargetmesh = new THREE.Mesh(Rtarget, target); + Rtargetmesh.position.set( 401, 1200 , -15); + rtf_rackObject.add(Rtargetmesh); + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial); + rrmesh.position.set( 0, 0 , -10); + rtf_rackObject.add(rrmesh); + + //edge le + const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const llemesh = new THREE.Mesh(llegeometry, bluematerial); + llemesh.position.set( -425, 0 , -285); + rtf_rackObject.add(llemesh); + + //edge re + const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550); + const lremesh = new THREE.Mesh(lregeometry, bluematerial); + lremesh.position.set( -425, 0 , 265); + rtf_rackObject.add(lremesh); + + //edge ue + const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const luemesh = new THREE.Mesh(luegeometry, bluematerial); + luemesh.position.set( -425, 1225 , -7); + rtf_rackObject.add(luemesh); + + //edge de + const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50); + const ldemesh = new THREE.Mesh(ldegeometry, bluematerial); + ldemesh.position.set( -425, -1230 , -7); + rtf_rackObject.add(ldemesh); + + + //base and build texture + const drawer1geometry = new THREE.BoxGeometry(10, 2450, 550); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/rtfscreenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -10); + rtf_rackObject.add(gridgeometrymesh); + + rtf_rackObject.rotateY(Math.PI); + rtf_rackObject.position.set(400, 1250, 400); + rtf.add(rtf_rackObject); + return rtf; + } + + + // RAR2 + export function rar2(param) { + return rar1(param, 2); + } + + // RAR3 + export function rar3(param) { + return rar1(param, 3); + } + + // camod rack + export function camod(param) { + const width=800, height=2500, depth=800; + const camod = new THREE.Object3D(); + const camod_rackObject = new THREE.Object3D(); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03}); + const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); + const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xFBE928}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, materialGreyDark); + lrmesh.position.set(0 , 0 , 0); + camod_rackObject.add(lrmesh); + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark); + rrmesh.position.set( 0, 0 , -810); + camod_rackObject.add(rrmesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const llemesh = new THREE.Mesh(llegeometry, blackmaterial); + llemesh.position.set( -377, 0 , -1155); + camod_rackObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const lremesh = new THREE.Mesh(lregeometry, blackmaterial); + lremesh.position.set( -377, 0 , -470); + camod_rackObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const rlemesh = new THREE.Mesh(rlegeometry, blackmaterial); + rlemesh.position.set( -377, 0 , -340); + camod_rackObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790); + const rremesh = new THREE.Mesh(rregeometry, blackmaterial); + rremesh.position.set( -377, 0 , 345); + camod_rackObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const luemesh = new THREE.Mesh(luegeometry, blackmaterial); + luemesh.position.set( -377, 1200 , -813); + camod_rackObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const ldemesh = new THREE.Mesh(ldegeometry, blackmaterial); + ldemesh.position.set( -377, -1200 , -807); + camod_rackObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const ruemesh = new THREE.Mesh(ruegeometry, blackmaterial); + ruemesh.position.set( -377, 1200 , 0); + camod_rackObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105); + const rdemesh = new THREE.Mesh(rdegeometry, blackmaterial); + rdemesh.position.set( -377, -1200 , 0); + camod_rackObject.add(rdemesh); + + //triangle warning1 + const trianglewarning = new THREE.CylinderGeometry(200, 200, 1, 3); + const trianglewarningmesh = new THREE.Mesh(trianglewarning, yellowmaterial); + trianglewarningmesh.rotateX(Math.PI * 0.5); + trianglewarningmesh.rotateY(Math.PI * 1); + trianglewarningmesh.rotateZ(Math.PI * 0.5); + trianglewarningmesh.position.set(-401, 700 , 0); + camod_rackObject.add(trianglewarningmesh); + + //triangle warning black + const trianglewarning2 = new THREE.CylinderGeometry(180, 180, 1, 3); + const trianglewarning2mesh = new THREE.Mesh(trianglewarning2, blackmaterial); + trianglewarning2mesh.rotateX(Math.PI * 0.5); + trianglewarning2mesh.rotateY(Math.PI * 1); + trianglewarning2mesh.rotateZ(Math.PI * 0.5); + trianglewarning2mesh.position.set(-402, 700 , 0); + camod_rackObject.add(trianglewarning2mesh); + + //triangle warning yellow2 + const trianglewarning3 = new THREE.CylinderGeometry(150, 150, 1, 3); + const trianglewarning3mesh = new THREE.Mesh(trianglewarning3, yellowmaterial); + trianglewarning3mesh.rotateX(Math.PI * 0.5); + trianglewarning3mesh.rotateY(Math.PI * 1); + trianglewarning3mesh.rotateZ(Math.PI * 0.5); + trianglewarning3mesh.position.set(-403, 700 , 0); + camod_rackObject.add(trianglewarning3mesh); + + //ZOT1 + const zot1geometry = new THREE.BoxGeometry(10, 110, 10); + const zot1geometrymesh = new THREE.Mesh(zot1geometry, blackmaterial); + zot1geometrymesh.position.set( -404, 750 , -20); + zot1geometrymesh.rotateX(Math.PI * 1.65); + zot1geometrymesh.rotateY(Math.PI * 1.50); + zot1geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot1geometrymesh); + + //ZOT2 + const zot2geometry = new THREE.BoxGeometry(10, 70, 10); + const zot2geometrymesh = new THREE.Mesh(zot2geometry, blackmaterial); + zot2geometrymesh.position.set( -404, 715 , -16); + zot2geometrymesh.rotateX(Math.PI * 1.85); + zot2geometrymesh.rotateY(Math.PI * 1.50); + zot2geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot2geometrymesh); + + //ZOT3 + const zot3geometry = new THREE.BoxGeometry(10, 80, 10); + const zot3geometrymesh = new THREE.Mesh(zot3geometry, blackmaterial); + zot3geometrymesh.position.set( -404, 697 , -1); + zot3geometrymesh.rotateX(Math.PI * 1.65); + zot3geometrymesh.rotateY(Math.PI * 1.50); + zot3geometrymesh.rotateZ(Math.PI * 1.50); + camod_rackObject.add(zot3geometrymesh); + + //ZOT TRIANGLE + const zottrianglegeometry = new THREE.CylinderGeometry(22, 22, 1, 3); + const zottrianglegeometrymesh = new THREE.Mesh(zottrianglegeometry, blackmaterial); + zottrianglegeometrymesh.rotateX(Math.PI * 0.95); + zottrianglegeometrymesh.rotateY(Math.PI * 1); + zottrianglegeometrymesh.rotateZ(Math.PI * 0.5); + zottrianglegeometrymesh.position.set(-405, 660 , -19); + camod_rackObject.add(zottrianglegeometrymesh); + + //handle1 + const handle1geometry = new THREE.BoxGeometry(10, 250, 80); + const handle1geometrymesh = new THREE.Mesh(handle1geometry, materialVeryGreyDark); + handle1geometrymesh.position.set( -401, 100 , -550); + camod_rackObject.add(handle1geometrymesh); + + //handle2 + const handle2geometry = new THREE.BoxGeometry(10, 250, 80); + const handle2geometrymesh = new THREE.Mesh(handle2geometry, materialVeryGreyDark); + handle2geometrymesh.position.set( -401, 100 , -260); + camod_rackObject.add(handle2geometrymesh); + camod_rackObject.rotateY(Math.PI); + camod_rackObject.position.set(400, 1250, 340); + camod_rackObject.scale.set(1, 1, 0.94); + camod.add(camod_rackObject); + return camod; + } + + // base mod + export function klystron(param) { + const text = param.name; + const myscale=0.625; + console.log('klystron(), text:',text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K')); + const width=1500, height=1500, depth=1500; + const ModK = new THREE.Object3D(); + const ModContainer = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000}); + const klystron = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + klystron.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(75, [940,730,560], [0, Math.PI / 2, 0]); + + const basegeometry = new THREE.BoxGeometry(width, height, depth); + const d1mesh = new THREE.Mesh(basegeometry, materialBase); + ModContainer.add(d1mesh); + + // cover + const d2geometry = new THREE.BoxGeometry(width+100, 100, depth+100); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(0, 800, 0); + ModContainer.add(d2mesh); + + // base + const d3geometry = new THREE.BoxGeometry(width+100, 100, depth+100); + const d3mesh = new THREE.Mesh(d3geometry, materialBase); + d3mesh.position.set(0, -800, 0); + ModContainer.add(d3mesh); + + // big cylinder + const d4geometry = new THREE.CylinderGeometry(400, 400, 1200, 50); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/mod_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 970 , 300); + ModContainer.add(d4mesh); + + // small cylinder + const d5geometry = new THREE.CylinderGeometry(200, 200, 1200, 50); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader.load('./components/mod_texture.png'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(3, 3); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const d5mesh = new THREE.Mesh(d5geometry, material2); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 1670 , 300); + ModContainer.add(d5mesh); + + // high cover + const d6geometry = new THREE.CylinderGeometry(220, 220, 90, 50); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const d6mesh = new THREE.Mesh(d6geometry, materialGreyDark); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 2300 , 300); + ModContainer.add(d6mesh); + + // right arm + const Bracciodx = new THREE.BoxGeometry( 600, 100, 200 ); + const d7mesh = new THREE.Mesh(Bracciodx, materialBase); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1.25); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(300, 1300 , 600); + ModContainer.add(d7mesh); + + // left arm + const Bracciosx = new THREE.BoxGeometry( 600, 100, 200 ); + const d8mesh = new THREE.Mesh(Bracciosx, materialBase); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1.75); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(300, 1300 , 0); + ModContainer.add(d8mesh); + + // right arm continue + const PBracciodx = new THREE.BoxGeometry( 600, 100, 190 ); + const d9mesh = new THREE.Mesh(PBracciodx, materialBase); + d9mesh.rotateX(Math.PI * 1); + d9mesh.rotateY(Math.PI * 1); + d9mesh.rotateZ(Math.PI * 1); + d9mesh.position.set(743, 1300 , 790); + ModContainer.add(d9mesh); + + //prolung braccia sx + const PBracciosx = new THREE.BoxGeometry( 600, 100, 190 ); + const d10mesh = new THREE.Mesh(PBracciosx, materialBase); + d10mesh.rotateX(Math.PI * 1); + d10mesh.rotateY(Math.PI * 1); + d10mesh.rotateZ(Math.PI * 1); + d10mesh.position.set(743, 1300 , -190); + ModContainer.add(d10mesh); + + //trave 1 base + const trave1 = new THREE.BoxGeometry( 80, 1500, 190 ); + const materialtrave= new THREE.MeshLambertMaterial({color: 0xd80000}); + const d12mesh = new THREE.Mesh(trave1, materialtrave); + d12mesh.rotateX(Math.PI * 1); + d12mesh.rotateY(Math.PI * 1); + d12mesh.rotateZ(Math.PI * 1); + d12mesh.position.set(-760, 0 , -300); + ModContainer.add(d12mesh); + + //trave 2 base + const trave2 = new THREE.BoxGeometry( 80, 1500, 190 ); + const d13mesh = new THREE.Mesh(trave1, materialtrave); + d13mesh.rotateX(Math.PI * 1); + d13mesh.rotateY(Math.PI * 1); + d13mesh.rotateZ(Math.PI * 1); + d13mesh.position.set(-760, 0 , 300); + ModContainer.add(d13mesh); + + //targhetta + const targhetta = new THREE.BoxGeometry( 10, 300, 300 ); + const d14mesh = new THREE.Mesh(targhetta, dmaterial2); + d14mesh.position.set(-750, 550 , 0); + ModContainer.add(d14mesh); + + //Torus basso sx + const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark ); + d15mesh.rotateX(Math.PI * 1); + d15mesh.rotateY(Math.PI * 1.5); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(-700, 900 , -600); + ModContainer.add(d15mesh); + + //Torus basso dx + const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark ); + d16mesh.rotateX(Math.PI * 1); + d16mesh.rotateY(Math.PI * 1.5); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(-700, 900 , 600); + ModContainer.add(d16mesh); + + //Torus alto sx + const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d17mesh = new THREE.Mesh( torus_as, materialGreyDark ); + d17mesh.rotateX(Math.PI * 1); + d17mesh.rotateY(Math.PI * 1.5); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(700, 900 , -600); + ModContainer.add(d17mesh); + + //Torus alto dx + const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark ); + d18mesh.rotateX(Math.PI * 1); + d18mesh.rotateY(Math.PI * 1.5); + d18mesh.rotateZ(Math.PI * 1); + d18mesh.position.set(700, 900 , 600); + ModContainer.add(d18mesh); + ModContainer.rotateY(Math.PI); + ModContainer.scale.set(myscale, myscale, myscale); + ModContainer.position.set(width*myscale/2, height*myscale/2+50, depth*myscale/2); + klystron.add(ModContainer); + return klystron; + } + + // base KXS + export function klystronx(param) { + const text = param.name; + const myscale=0.625; + const width=1200, height=1200, depth=1200; + const ModK = new THREE.Object3D(); + const ModContainer = new THREE.Object3D(); + const materialBase = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const klystron = new THREE.Object3D(); + let group, textMesh, textGeo, materials; + let size = 60; + let textheight = 10; + let pos = []; + let rot = []; + const hover = 30; + const curveSegments = 8; + let font; + function insertText(isize, ipos, irot) { + group = new THREE.Group(); + group.position.y = 100; + klystron.add( group ); + size = isize; + pos = ipos; + rot = irot; + loadFont(); + } + function loadFont() { + const loader = new FontLoader(); + // https://threejs.org/examples/fonts/droid_sans_bold.typeface.json + loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) { + font = response; + refreshText(); + } ); + } + materials = [ + new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front + new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side + ]; + function createText() { + textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments}); + textGeo.computeBoundingBox(); + const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x ); + textMesh = new THREE.Mesh( textGeo, materials ); + textMesh.position.x = pos[0]; + textMesh.position.y = pos[1]; + textMesh.position.z = pos[2]; + textMesh.rotation.x = rot[0]; + textMesh.rotation.y = rot[1]; + textMesh.rotation.z = rot[2]; + group.add( textMesh ); + } + function refreshText() { + group.remove( textMesh ); + if ( ! text ) return; + createText(); + } + insertText(75, [760,600,840], [0, Math.PI / 2, 0]); + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const basegeometry = new THREE.BoxGeometry(width, height+200, depth); + const d1mesh = new THREE.Mesh(basegeometry, materialBase); + d1mesh.position.set(0, 100, -900); + ModContainer.add(d1mesh); + + // redcube + const d2geometry = new THREE.BoxGeometry(width-400, height, depth); + const dmaterial2= new THREE.MeshLambertMaterial({color: 0xe02900}); + const d2mesh = new THREE.Mesh(d2geometry, dmaterial2); + d2mesh.position.set(200, 1400, -900); + ModContainer.add(d2mesh); + + // base + const d3geometry = new THREE.BoxGeometry(width, height, depth); + const d3mesh = new THREE.Mesh(d3geometry, materialBase); + d3mesh.position.set(0, 0, 300); + ModContainer.add(d3mesh); + + // big red cylinder + const d4geometry = new THREE.CylinderGeometry(450, 450, 1200, 50); + const material = new THREE.MeshLambertMaterial({color: 0xfc0303}); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 800 , 300); + ModContainer.add(d4mesh); + + // yellow 1 cylinder + const d5geometry = new THREE.CylinderGeometry(300, 370, 200, 50); + const material2 = new THREE.MeshLambertMaterial({color: 0xecfc03}); + const d5mesh = new THREE.Mesh(d5geometry, material2); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 1450 , 300); + ModContainer.add(d5mesh); + + // yellow 2 cylinder + const d6geometry = new THREE.CylinderGeometry(150, 150, 250, 50); + const material3= new THREE.MeshLambertMaterial({color: 0xecfc03}); + const d6mesh = new THREE.Mesh(d6geometry, material3); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 1680 , 300); + ModContainer.add(d6mesh); + + // yellow 3 cylinder + const d7geometry = new THREE.CylinderGeometry(200, 200, 100, 50); + const d7mesh = new THREE.Mesh(d7geometry, material3); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, 1780 , 300); + ModContainer.add(d7mesh); + + // tag + const targhetta = new THREE.BoxGeometry( 10, 200, 300 ); + const materialwhite= new THREE.MeshLambertMaterial({color: 0xeffffff}); + const d14mesh = new THREE.Mesh(targhetta, materialwhite); + d14mesh.position.set(-610, 600 , -600); + ModContainer.add(d14mesh); + + // torus red1 + const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark ); + d15mesh.rotateX(Math.PI * 1); + d15mesh.rotateY(Math.PI * 1.5); + d15mesh.rotateZ(Math.PI * 1); + d15mesh.position.set(550, 2050 , -1400); + ModContainer.add(d15mesh); + + // torus red2 + const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark ); + d16mesh.rotateX(Math.PI * 1); + d16mesh.rotateY(Math.PI * 1.5); + d16mesh.rotateZ(Math.PI * 1); + d16mesh.position.set(-150, 2050 , -400); + ModContainer.add(d16mesh); + + // torus 1 white + const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d17mesh = new THREE.Mesh( torus_as, materialGreyDark ); + d17mesh.rotateX(Math.PI * 1); + d17mesh.rotateY(Math.PI * 1.5); + d17mesh.rotateZ(Math.PI * 1); + d17mesh.position.set(-400, 850 , -500); + ModContainer.add(d17mesh); + + // torus 2 white + const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); + const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark ); + d18mesh.rotateX(Math.PI * 1); + d18mesh.rotateY(Math.PI * 1.5); + d18mesh.rotateZ(Math.PI * 1); + d18mesh.position.set(-400, 850 , -1300); + ModContainer.add(d18mesh); + + // line1 + const line1 = new THREE.BoxGeometry(10, 10, 1150); + const d19mesh = new THREE.Mesh(line1, dmaterial2); + d19mesh.position.set(-610, 750, -900); + ModContainer.add(d19mesh); + + // line2 + const line2 = new THREE.BoxGeometry(10, 10, 1150); + const d20mesh = new THREE.Mesh(line2, dmaterial2); + d20mesh.position.set(-610, 550, 300); + ModContainer.add(d20mesh); + + ModContainer.rotateY(Math.PI); + ModContainer.scale.set(myscale, myscale, myscale); + ModContainer.position.set(width*myscale/2, height*myscale/2, depth*myscale/2); + klystron.add(ModContainer); + return klystron; + } + + // cavity for linac + export function cavitylinac(param) { + const length=1500; + const cavitylinacMaster = new THREE.Object3D(); + const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const d1geometry = new THREE.CylinderGeometry(400, 400, length, 25); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + cavitylinacMaster.add(d1mesh); + cavitylinacMaster.rotateX(Math.PI * 0.5); + cavitylinacMaster.rotatedX = true; + return cavitylinacMaster; + } + // Current Monitor + export function cm(param) { + const cmContiner = new THREE.Object3D(); + const cmObject = new THREE.Object3D(); + + //cylinder mid + const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + cmObject.add(cylmesh); + + //cylinder center + const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20); + const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70}); + const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material); + cyl2mesh.rotateX(Math.PI * 1); + cyl2mesh.rotateY(Math.PI * 1.0); + cyl2mesh.rotateZ(Math.PI * 1.5); + cyl2mesh.position.set(0, 0 , 0); + cmObject.add(cyl2mesh); + + + cmObject.scale.setX(1); + cmObject.scale.setY(1); + cmObject.scale.setZ(1); + cmObject.position.set(0, 0, 0); + cmContiner.add(cmObject); + cmContiner.rotateY(Math.PI * -0.5); + + + return cmContiner; + } + // flsc + export function flsc(param) { + const length=700; + const flscSR = new THREE.Object3D(); + const flscContiner = new THREE.Object3D(); + + const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const materialDarkGrey = new THREE.MeshLambertMaterial({color: 0x8c8c8c}); + const materialOrange= new THREE.MeshLambertMaterial({color: 0xfc9403}); + const materialBlack= new THREE.MeshLambertMaterial({color: 0x000000}); + + //cil center + const d1geometry = new THREE.CylinderGeometry(25, 25, 400, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 200 , 0); + flscContiner.add(d1mesh); + flscContiner.rotateX(Math.PI * 1); + + // esagono + const d2geometry = new THREE.CylinderGeometry(70, 70, 70, 6); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + flscContiner.add(d2mesh); + + // box orange down + const orangegeometry = new THREE.CylinderGeometry(90, 90, 250, 15); + const orangegeometrymesh = new THREE.Mesh(orangegeometry, materialOrange); + orangegeometrymesh.position.set(0, 550, 0); + flscContiner.add(orangegeometrymesh); + + // box black down + const blackgeometry = new THREE.CylinderGeometry(90, 90, 25, 15); + const blackgeometrymesh = new THREE.Mesh(blackgeometry, materialBlack); + blackgeometrymesh.position.set(0, 412, 0); + flscContiner.add(blackgeometrymesh); + + // base zigrinatura + const d3geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d3mesh = new THREE.Mesh(d3geometry, materialGrey); + d3mesh.rotateX(Math.PI * 1); + d3mesh.rotateY(Math.PI * 1); + d3mesh.rotateZ(Math.PI * 1); + d3mesh.position.set(0, 170 , 0); + flscContiner.add(d3mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(60, 60, 170, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 60 , 0); + flscContiner.add(d4mesh); + + // tetto zigrinatura + const d5geometry = new THREE.CylinderGeometry(90, 90, 50, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, -50 , 0); + flscContiner.add(d5mesh); + + //half sphere down1 + const down1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down1geometrymesh = new THREE.Mesh(down1geometry, materialGrey); + down1geometrymesh.position.set(-75, 170, -75); + flscContiner.add(down1geometrymesh); + + //half sphere up1 + const up1geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up1geometrymesh = new THREE.Mesh(up1geometry, materialGrey); + up1geometrymesh.position.set(-75, -50, -75); + flscContiner.add(up1geometrymesh); + + //half sphere down2 + const down2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down2geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down2geometrymesh.position.set(75, 170, -75); + flscContiner.add(down2geometrymesh); + + //half sphere up2 + const up2geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up2geometrymesh = new THREE.Mesh(up2geometry, materialGrey); + up2geometrymesh.position.set(75, -50, -75); + flscContiner.add(up2geometrymesh); + + //half sphere down3 + const down3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const down3geometrymesh = new THREE.Mesh(down2geometry, materialGrey); + down3geometrymesh.position.set(0, 170, 100); + flscContiner.add(down3geometrymesh); + + //half sphere up3 + const up3geometry = new THREE.CylinderGeometry(30, 30, 15, 25); + const up3geometrymesh = new THREE.Mesh(up3geometry, materialGrey); + up3geometrymesh.position.set(0, -50, 100); + flscContiner.add(up3geometrymesh); + + //cil support1 + const d11geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d11mesh = new THREE.Mesh(d11geometry, materialGrey); + d11mesh.position.set(-75, 20, -75); + flscContiner.add(d11mesh); + + //cil support2 + const d12geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d12mesh = new THREE.Mesh(d12geometry, materialGrey); + d12mesh.position.set(75, 20, -75); + flscContiner.add(d12mesh); + + //cil support3 + const d13geometry = new THREE.CylinderGeometry(10, 10, 300, 25); + const d13mesh = new THREE.Mesh(d13geometry, materialGrey); + d13mesh.position.set(0, 20, 100); + flscContiner.add(d13mesh); + + // blocco supporto + const d15geometry = new THREE.CylinderGeometry(120, 120, 20, 25); + const d15mesh = new THREE.Mesh(d15geometry, materialGrey); + d15mesh.position.set(0, -130, 0); + d15mesh.rotateX(Math.PI * 1); + flscContiner.add(d15mesh); + + //internal block + const d16geometry = new THREE.CylinderGeometry(20, 20, 60, 15); + const d16mesh = new THREE.Mesh(d16geometry, materialGrey); + d16mesh.position.set(0, -100, 0); + d16mesh.rotateX(Math.PI * 1); + flscContiner.add(d16mesh); + + // high box1 + const d7geometry = new THREE.BoxGeometry(40, 90, 100); + const d7mesh = new THREE.Mesh(d7geometry, materialDarkGrey); + d7mesh.position.set(-20, -180, 0); + flscContiner.add(d7mesh); + + // high box2 + const d8geometry = new THREE.BoxGeometry(40, 60, 100); + const d8mesh = new THREE.Mesh(d8geometry, materialDarkGrey); + d8mesh.position.set(20, -170, 0); + flscContiner.add(d8mesh); + + flscContiner.position.set(0, 235, 0); + flscContiner.scale.setX(0.8); + flscContiner.scale.setY(0.8); + flscContiner.scale.setZ(0.8); + flscSR.add(flscContiner); + flscSR.rotateY(Math.PI * -0.5); + return flscSR; + } + + // fug PS + export function fug(param) { + const width=800, height=1700, depth=600; + const fug = new THREE.Object3D(); + const fugObject = new THREE.Object3D(); + + const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d}); + const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0}); + const basematerial = new THREE.MeshLambertMaterial({color: 0xc4b2a8}); + + //right rack + const lrgeometry = new THREE.BoxGeometry(width, height, depth); + const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial); + lrmesh.position.set(0 , 0 , -100); + fugObject.add(lrmesh); + + + //left rack + const rrgeometry = new THREE.BoxGeometry(width, height, depth); + const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial); + rrmesh.position.set( 0, 0 , -710); + fugObject.add(rrmesh); + + //basefug + const basegeometry = new THREE.BoxGeometry(width+250, height-800, depth+600); + const basemesh = new THREE.Mesh(basegeometry, silvermaterial); + basemesh.position.set( -130, -1320 , -400); + fugObject.add(basemesh); + + //edge lle + const llegeometry = new THREE.BoxGeometry(50, 1700, 50); + const llemesh = new THREE.Mesh(llegeometry, materialGreyDark); + llemesh.position.set( -425, 0 , -985); + fugObject.add(llemesh); + + //edge lre + const lregeometry = new THREE.BoxGeometry(50, 1700, 50); + const lremesh = new THREE.Mesh(lregeometry, materialGreyDark); + lremesh.position.set( -425, 0 , -430); + fugObject.add(lremesh); + + //edge rle + const rlegeometry = new THREE.BoxGeometry(50, 1700, 50); + const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark); + rlemesh.position.set( -425, 0 , -370); + fugObject.add(rlemesh); + + //edge rre + const rregeometry = new THREE.BoxGeometry(50, 1700, 50); + const rremesh = new THREE.Mesh(rregeometry, materialGreyDark); + rremesh.position.set( -425, 0 , 175); + fugObject.add(rremesh); + + //edge lue + const luegeometry = new THREE.BoxGeometry(50, 50, 505); + const luemesh = new THREE.Mesh(luegeometry, materialGreyDark); + luemesh.position.set( -425, 825 , -707); + fugObject.add(luemesh); + + //edge lde + const ldegeometry = new THREE.BoxGeometry(50, 50, 505); + const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark); + ldemesh.position.set( -425, -830 , -707); + fugObject.add(ldemesh); + + //edge rue + const ruegeometry = new THREE.BoxGeometry(50, 50, 505); + const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark); + ruemesh.position.set( -425, 825 , -100); + fugObject.add(ruemesh); + + //edge rde + const rdegeometry = new THREE.BoxGeometry(50, 50, 505); + const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark); + rdemesh.position.set( -425, -825 , -100); + fugObject.add(rdemesh); + + //base1 left and texture + const drawer1geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/fug1screenfoto.jpg'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material); + gridgeometrymesh.rotateX(Math.PI * 1); + gridgeometrymesh.rotateY(Math.PI * 1); + gridgeometrymesh.rotateZ(Math.PI * 1); + gridgeometrymesh.position.set( -400, 0 , -707); + fugObject.add(gridgeometrymesh); + + //base2 right and texture + const drawer2geometry = new THREE.BoxGeometry(10, 1600, 500); + const textureLoader2 = new THREE.TextureLoader(); + const texture2 = textureLoader2.load('./components/fug2screenfoto.jpg'); + texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping; + texture2.repeat.set(1, 1); + const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); + const gridgeometry2mesh = new THREE.Mesh(drawer2geometry, material2); + gridgeometry2mesh.rotateX(Math.PI * 1); + gridgeometry2mesh.rotateY(Math.PI * 1); + gridgeometry2mesh.rotateZ(Math.PI * 1); + gridgeometry2mesh.position.set( -400, 0 , -100); + fugObject.add(gridgeometry2mesh); + + //base3 FUG write and texture + const drawer0geometry = new THREE.BoxGeometry(1, 900, 1200); + const textureLoader0 = new THREE.TextureLoader(); + const texture0 = textureLoader0.load('./components/fug0screenfoto.jpg'); + texture0.wrapS = texture0.wrapT = THREE.RepeatWrapping; + texture0.repeat.set(1, 1); + const material0 = new THREE.MeshBasicMaterial({ map: texture0 }); + const gridgeometry0mesh = new THREE.Mesh(drawer0geometry, material0); + gridgeometry0mesh.rotateX(Math.PI * 1); + gridgeometry0mesh.rotateY(Math.PI * 1); + gridgeometry0mesh.rotateZ(Math.PI * 1); + gridgeometry0mesh.position.set( -655, -1320 , -400); + fugObject.add(gridgeometry0mesh); + + fugObject.rotateY(Math.PI); + fugObject.position.set(400, 1750, 300); + fug.add(fugObject); + return fug; + } + + export function gun(param) { + const sphereRadius=200, sphereFactor=0.8; + const cavityObject = new THREE.Object3D(); + const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0}); + const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32); + const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial); + cavitymesh.scale.setZ(sphereFactor); + cavityObject.add(cavitymesh); + /*const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius, cylinderHeight, 20, 2, false, 0, Math.PI * 2); + const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial); + // rfMesh.rotateX(Math.PI * 0.5); + rfMesh.position.set(0, sphereRadius, 0); + cavityObject.add(rfMesh);*/ + return cavityObject; + } + + // corrector fermi + export function correctorfermi() { + const length=400; + const CorrectorContiner = new THREE.Object3D(); + const CorrectorMaster = new THREE.Object3D(); + + // coil settings + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/coil_texture_fermi.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(2, 20); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(d1mesh); + + //spessore esterno plastica bianca + const redmaterialp = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_1p = new THREE.CylinderGeometry(501 /*radiusTop*/, 501 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_1p = new THREE.Mesh(geometry_1p, redmaterialp); + dmesh_1p.position.set(0, 0, 0); + dmesh_1p.rotateX(Math.PI * 1.25); + dmesh_1p.rotateY(Math.PI * 1); + dmesh_1p.rotateZ(Math.PI * 1.5); + CorrectorMaster.add(dmesh_1p); + + //spessore alto centro + const redmaterial_5 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2}); + const geometry_1_5 = new THREE.BoxGeometry(length, 150, 700); + const dmesh_1_5 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_1_5.position.set(0, 277, 0); + CorrectorMaster.add(dmesh_1_5); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1_5, redmaterial_5); + dmesh_2.position.set(0, -277, 0); + CorrectorMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(length, 600, 150); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_3.position.set(0, 0, -275); + CorrectorMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial_5); + dmesh_4.position.set(0, 0, 275); + CorrectorMaster.add(dmesh_4); + + //cubo al centro + const loader_2 = new THREE.TextureLoader(); + const texture_2 = loader.load('./components/coil_texture_fermi.png'); + texture_2.wrapS = texture_2.wrapT = THREE.RepeatWrapping; + texture_2.repeat.set(20, 20); + const textureTop_2 = texture.clone(); + const textureSide_2 = texture.clone(); + const dmaterial_2 = new THREE.MeshLambertMaterial({map: texture_2}); + const geometry_2 = new THREE.BoxGeometry(390, 390, 390); + const dmesh_5 = new THREE.Mesh(geometry_2, dmaterial_2); + dmesh_5.position.set(0, 0, 0); + CorrectorMaster.add(dmesh_5); + + //spessore interno plastica bianca + const redmaterial_6 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide}); + const geometry_6 = new THREE.CylinderGeometry(280 /*radiusTop*/, 280 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const dmesh_6 = new THREE.Mesh(geometry_6, redmaterial_6); + dmesh_6.position.set(0, 0, 0); + dmesh_6.rotateX(Math.PI * 1); + dmesh_6.rotateY(Math.PI * 1.25); + dmesh_6.rotateZ(Math.PI * 1); + CorrectorMaster.add(dmesh_6); + + CorrectorMaster.position.set(0, 0, 0); + CorrectorContiner.add(CorrectorMaster); + CorrectorContiner.rotateY(Math.PI * 1); + CorrectorContiner.scale.setX(0.25); + CorrectorContiner.scale.setY(0.125); + CorrectorContiner.scale.setZ(0.25); + + return CorrectorContiner; + } + + + // BPM (beam position monitor) + export function bpm(param) { + const width=300, height=300, depth=50, transverse=100; + const bpmObject = new THREE.Object3D(); + const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff}); + const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth); + const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial); + bpmObject.add(bpmmeshh); + const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth); + const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial); + bpmObject.add(bpmmeshv); + return bpmObject; + } + + + // quadrupole fermi + export function quadrupolefermi(param) { + const length=200; + const QuadrupolContiner = new THREE.Object3D(); + const QuadrupoleMaster = new THREE.Object3D(); + + const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040, side: THREE.DoubleSide}); + const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + const d1mesh = new THREE.Mesh(d1geometry, dmaterial); + d1mesh.position.set(0, 0, 0); + d1mesh.rotateX(Math.PI * 1.25); + d1mesh.rotateY(Math.PI * 1); + d1mesh.rotateZ(Math.PI * 1.5); + QuadrupoleMaster.add(d1mesh); + + // coil settings + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xcd7f32, side: THREE.DoubleSide}); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/coil_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 5); + const coiltexture = new THREE.MeshBasicMaterial({ map: texture }); + const coilmaterials = [coiltexture, coilmaterial, coilmaterial]; + const coilgeometry = new THREE.CylinderGeometry(110 /*radiusTop*/, 110 /*radiusBottom*/, 120 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/); + + //spessore alto + const redmaterial = new THREE.MeshLambertMaterial({color: 0xe05040}); + const geometry_1 = new THREE.BoxGeometry(200, 100, 705); + const dmesh_1 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_1.position.set(0, 300, 0); + QuadrupoleMaster.add(dmesh_1); + + //spessore basso + const dmesh_2 = new THREE.Mesh(geometry_1, redmaterial); + dmesh_2.position.set(0, -300, 0); + QuadrupoleMaster.add(dmesh_2); + + //spessore destro + const geometry_3 = new THREE.BoxGeometry(200, 500, 100); + const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_3.position.set(0, 0, -300); + QuadrupoleMaster.add(dmesh_3); + + //spessore sinistro + const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial); + dmesh_4.position.set(0, 0, 300); + QuadrupoleMaster.add(dmesh_4); + + const geometry_5 = new THREE.BoxGeometry(200, 115, 280); + const dmesh_5 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_5.rotateX(Math.PI * 0.25); + dmesh_5.position.set(0, 210, 210); + QuadrupoleMaster.add(dmesh_5); + const dmesh_6 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_6.rotateX(Math.PI * 0.75); + dmesh_6.position.set(0, 210, -210); + QuadrupoleMaster.add(dmesh_6); + const dmesh_7 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_7.rotateX(Math.PI * 0.75); + dmesh_7.position.set(0, -210, 210); + QuadrupoleMaster.add(dmesh_7); + const dmesh_8 = new THREE.Mesh(geometry_5, redmaterial); + dmesh_8.rotateX(Math.PI * 0.25); + dmesh_8.position.set(0, -210, -210); + QuadrupoleMaster.add(dmesh_8); + + // coil basso destra + const d2mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d2mesh.position.set(0, -130, 120); + d2mesh.rotateX(Math.PI * 1.25); + d2mesh.rotateY(Math.PI * 1.50); + d2mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d2mesh); + + // coil basso sinistra + const d3mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d3mesh.position.set(0, -130, -120); + d3mesh.rotateX(Math.PI * 1.75); + d3mesh.rotateY(Math.PI * 1.50); + d3mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d3mesh); + + // coil alto destra + const d4mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d4mesh.position.set(0, 130, 120); + d4mesh.rotateX(Math.PI * 0.75); + d4mesh.rotateY(Math.PI * 1.50); + d4mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d4mesh); + + // coil alto destra + const d5mesh = new THREE.Mesh(coilgeometry, coilmaterials); + d5mesh.position.set(0, 130, -120); + d5mesh.rotateX(Math.PI * 1.25); + d5mesh.rotateY(Math.PI * 1.50); + d5mesh.rotateZ(Math.PI * 1.50); + QuadrupoleMaster.add(d5mesh); + + QuadrupoleMaster.position.set(0, 0, 0); + QuadrupolContiner.add(QuadrupoleMaster); + QuadrupolContiner.rotateY(Math.PI * -0.5); + QuadrupolContiner.scale.setX(0.5); + QuadrupolContiner.scale.setY(0.5); + QuadrupolContiner.scale.setZ(0.5); + + return QuadrupolContiner; + } + + // Bending Dipole + export function dipolefermi(length = 500) { + const dipoleContainer = new THREE.Object3D(); + const dipoleMaster = new THREE.Object3D(); + + //texture + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/dipole.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.center.set(0.5, 0.5); + textureTop.rotation = THREE.MathUtils.degToRad(90); + textureSide.offset.set(0, 0.8); + const dmaterial = new THREE.MeshLambertMaterial({map: texture}); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [face,face,faceTop,faceSide,faceSide,faceSide]; + const d1geometry = new THREE.BoxGeometry(550, 400, length); + const d1mesh = new THREE.Mesh(d1geometry, materials); + d1mesh.position.set(-100, 100, 0); + dipoleMaster.add(d1mesh); + + //Coil + const dipoleCoil = new THREE.Object3D(); + const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000}); + const d4geometry = new THREE.BoxGeometry(100, 100, length); + const d4mesh = new THREE.Mesh(d4geometry, coilmaterial); + d4mesh.position.set(-200, 0, 0); + dipoleCoil.add(d4mesh); + const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d2mesh = new THREE.Mesh(d2geometry, coilmaterial); + d2mesh.position.set(-100, 0, length/2); + dipoleCoil.add(d2mesh); + const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/); + const d3mesh = new THREE.Mesh(d3geometry, coilmaterial); + d3mesh.position.set(-100, 0, -length/2); + dipoleCoil.add(d3mesh); + dipoleCoil.position.set(0, 0, 0); + dipoleMaster.add(dipoleCoil); + const dipoleCoil2 = dipoleCoil.clone(); + dipoleCoil2.position.set(0, 200, 0); + dipoleMaster.add(dipoleCoil2); + + dipoleMaster.position.set(200, 0, 0); + dipoleContainer.add(dipoleMaster); + + return dipoleContainer; + } + + // undulator + export function undulator(param) { + const length=1000; + const undulatorMaster = new THREE.Object3D(); + const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + const loader = new THREE.TextureLoader(); + const texture = loader.load('./components/undulator.png'); + const textureTop = texture.clone(); + const textureSide = texture.clone(); + textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping; + textureTop.repeat.set(30, 1); + textureSide.offset.set(0.95, 0.95); + const face = new THREE.MeshBasicMaterial({map: texture}); + const faceTop = new THREE.MeshBasicMaterial({map: textureTop}); + const faceSide = new THREE.MeshBasicMaterial({map: textureSide}); + const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial]; + const ugeometry = new THREE.BoxGeometry(400, 400, length); + const umesh = new THREE.Mesh(ugeometry, materials); + undulatorMaster.add(umesh); + const qedges = new THREE.EdgesGeometry(ugeometry); + const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000}); + lineMaterial.linewidth = 4; + const qline = new THREE.LineSegments(qedges, lineMaterial); + undulatorMaster.add(qline); + return undulatorMaster; + } + + // PLC + export function plc(param) { + const plcObject = new THREE.Object3D(); + const cardsObject = new THREE.Object3D(); + + + const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11}); + const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11}); + const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757}); + const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d}); + const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6}); + const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000}); + + + // base + const basegeometry = new THREE.BoxGeometry(500, 300, 600); + const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial); + basegeometrymesh.position.set( 0, 0 ,0); + plcObject.add(basegeometrymesh); + + // card + const cardgeometry = new THREE.BoxGeometry(502, 270, 50); + const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial); + cardgeometrymesh.position.set( 0, 0 , -200); + cardsObject.add(cardgeometrymesh); + + //led1 + const led1green = new THREE.BoxGeometry(504, 20, 20); + const led1greenmesh = new THREE.Mesh(led1green, greenmaterial); + led1greenmesh.position.set( 0, 120 , -200); + cardsObject.add(led1greenmesh); + //led2 + const led2green = new THREE.BoxGeometry(504, 20, 20); + const led2greenmesh = new THREE.Mesh(led2green, greenmaterial); + led2greenmesh.position.set( 0, 90 , -200); + cardsObject.add(led2greenmesh); + //led3 + const led3green = new THREE.BoxGeometry(504, 20, 20); + const led3greenmesh = new THREE.Mesh(led3green, greenmaterial); + led3greenmesh.position.set( 0, 60 , -200); + cardsObject.add(led3greenmesh); + //led4 + const led4green = new THREE.BoxGeometry(504, 20, 20); + const led4greenmesh = new THREE.Mesh(led4green, greenmaterial); + led4greenmesh.position.set( 0, 30 , -200); + cardsObject.add(led4greenmesh); + //led5 + const led5green = new THREE.BoxGeometry(504, 20, 20); + const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial); + led5greenmesh.position.set( 0, 0 , -200); + cardsObject.add(led5greenmesh); + //led6 + const led6green = new THREE.BoxGeometry(504, 20, 20); + const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial); + led6greenmesh.position.set( 0, -30 , -200); + cardsObject.add(led6greenmesh); + //led7 + const led7green = new THREE.BoxGeometry(504, 20, 20); + const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial); + led7greenmesh.position.set( 0, -60 , -200); + cardsObject.add(led7greenmesh); + //led8 + const led8green = new THREE.BoxGeometry(504, 20, 20); + const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial); + led8greenmesh.position.set( 0, -90 , -200); + cardsObject.add(led8greenmesh); + //led9 + const led9green = new THREE.BoxGeometry(504, 20, 20); + const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial); + led9greenmesh.position.set( 0, -120 , -200); + cardsObject.add(led9greenmesh); + + //CLONE Cards + + const card2 = cardsObject.clone(); + card2.position.set( 0, 0 , 50); + plcObject.add(card2); + + const card3 = cardsObject.clone(); + card3.position.set( 0, 0 , 100); + plcObject.add(card3); + + const card4 = cardsObject.clone(); + card4.position.set( 0, 0 , 150); + plcObject.add(card4); + + const card5 = cardsObject.clone(); + card5.position.set( 0, 0 , 200); + plcObject.add(card5); + + // baseScreen + const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200); + const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial); + baseScreengeometrymesh.position.set( 0, 0 , 120); + plcObject.add(baseScreengeometrymesh); + + // 1livel + const livel1geometry = new THREE.BoxGeometry(550, 150, 150); + const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial); + livel1geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel1geometrymesh); + // 2livel + const livel2geometry = new THREE.BoxGeometry(590, 100, 149); + const livel2geometrymesh = new THREE.Mesh(livel2geometry, graymaterial2); + livel2geometrymesh.position.set( 0, 0 , 120); + plcObject.add(livel2geometrymesh); + + plcObject.add(cardsObject); + + plcObject.scale.setX(0.7); + plcObject.scale.setY(0.7); + plcObject.scale.setZ(0.7); + + return plcObject; + } + + // Beam Loss Monitor + export function blm(param) { + const length=100, dcolor='white', width=100; + const cMaster = new THREE.Object3D(); + const d1geometry = new THREE.BoxGeometry(length, width, width); + const material = new THREE.MeshLambertMaterial({color: dcolor}); + const d1mesh = new THREE.Mesh(d1geometry, material); + d1mesh.position.set(-length/2, 0, 0); + cMaster.add(d1mesh); + return cMaster; + } + function blmColor(val) { + if (document.location.search.indexOf('demo')>-1) { + if (val < 0) return 'white'; + else if (val < 1) return 'yellow'; + else if (val < 2) return 'orange'; + else if (val < 3) return 'red'; + else return 'violet'; + } + if (val < 20) return 'white'; + else if (val < 50) return 'yellow'; + else if (val < 100) return 'orange'; + else if (val < 200) return 'red'; + else return 'violet'; + } + export function blmUpdate(c, val, direction, width=100, histogramFactor=50) { + if (typeof val !== 'number') val = 0; else val = Math.abs(val); + const blm = c.children[0]; + blm.material.dispose(); + blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)}); + blm.geometry.dispose(); + blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width); + blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0); + blm.geometry.computeVertexNormals(); + blm.geometry.normalsNeedUpdate = true; + blm.geometry.verticesNeedUpdate = true; + blm.geometry.dynamic = true; + } + // bst + export function bst(param) { + const bstObject = new THREE.Object3D(); + const bstContiner = new THREE.Object3D(); + const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0}); + + const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25); + const d1mesh = new THREE.Mesh(d1geometry, materialGrey); + d1mesh.position.set(0, 190, 0); + bstObject.add(d1mesh); + bstObject.rotateX(Math.PI * 1); + + // circ base + const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15); + const d2mesh = new THREE.Mesh(d2geometry, materialGrey); + d2mesh.position.set(0, 290, 0); + d2mesh.rotateX(Math.PI * 1); + d2mesh.rotateY(Math.PI * 1); + d2mesh.rotateZ(Math.PI * 1.5); + bstObject.add(d2mesh); + + // zigrinatura + const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15); + const textureLoader = new THREE.TextureLoader(); + const texture = textureLoader.load('./components/flsc_texture.png'); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(5, 40); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const d4mesh = new THREE.Mesh(d4geometry, material); + d4mesh.rotateX(Math.PI * 1); + d4mesh.rotateY(Math.PI * 1); + d4mesh.rotateZ(Math.PI * 1); + d4mesh.position.set(0, 120 , 0); + bstObject.add(d4mesh); + + // cil Major + const d5geometry = new THREE.CylinderGeometry(90, 90, 20, 15); + const d5mesh = new THREE.Mesh(d5geometry, materialGrey); + d5mesh.rotateX(Math.PI * 1); + d5mesh.rotateY(Math.PI * 1); + d5mesh.rotateZ(Math.PI * 1); + d5mesh.position.set(0, 50 , 0); + d5mesh.colorable = true; + bstObject.add(d5mesh); + + // cil Med + const d6geometry = new THREE.CylinderGeometry(70, 70, 80, 15); + const d6mesh = new THREE.Mesh(d6geometry, materialGrey); + d6mesh.rotateX(Math.PI * 1); + d6mesh.rotateY(Math.PI * 1); + d6mesh.rotateZ(Math.PI * 1); + d6mesh.position.set(0, 0 , 0); + d6mesh.colorable = true; + bstObject.add(d6mesh); + + // cil low + const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15); + const d7mesh = new THREE.Mesh(d7geometry, materialGrey); + d7mesh.rotateX(Math.PI * 1); + d7mesh.rotateY(Math.PI * 1); + d7mesh.rotateZ(Math.PI * 1); + d7mesh.position.set(0, -100 , 0); + d7mesh.colorable = true; + bstObject.add(d7mesh); + + const d8geometry = new THREE.CylinderGeometry(60, 60, 20, 15); + const d8mesh = new THREE.Mesh(d8geometry, materialGrey); + d8mesh.rotateX(Math.PI * 1); + d8mesh.rotateY(Math.PI * 1); + d8mesh.rotateZ(Math.PI * 1); + d8mesh.position.set(0, -170 , 0); + bstObject.add(d8mesh); + + bstObject.position.set(0, 290, 0); + bstContiner.add(bstObject); + bstContiner.rotateY(Math.PI * -0.5); + return bstContiner; + } + export function bstUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } + // valve + export function vlv(param) { + const vlvContiner = new THREE.Object3D(); + const vlvObject = new THREE.Object3D(); + + //cylinder + const cylgeometry = new THREE.CylinderGeometry(25, 25, 50, 15); + const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial); + cylmesh.rotateX(Math.PI * 1); + cylmesh.rotateY(Math.PI * 1.0); + cylmesh.rotateZ(Math.PI * 1.5); + cylmesh.position.set(0, 0 , 0); + vlvObject.add(cylmesh); + + // base1 + const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 ); + const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial); + vlv1mesh.position.set(0, 50, 0); + vlv1mesh.colorable = true; + vlvObject.add(vlv1mesh); + + // hat1 + const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7}); + const hatgeometry = new THREE.BoxGeometry(50, 20, 100 ); + const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial); + hatmesh.colorable = true; + hatmesh.position.set(0, 120, 0); + vlvObject.add(hatmesh); + + // blackbox + const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363}); + const blackboxgeometry = new THREE.BoxGeometry(40, 70, 70 ); + const blackboxmesh = new THREE.Mesh(blackboxgeometry, blackboxmaterial); + blackboxmesh.position.set(0, 165, 15); + vlvObject.add(blackboxmesh); + + // blackbox2 + const blackbox2material = new THREE.MeshLambertMaterial({color: 0x000000}); + const blackbox2geometry = new THREE.BoxGeometry(40, 40, 20 ); + const blackbo2xmesh = new THREE.Mesh(blackbox2geometry, blackbox2material); + blackbo2xmesh.position.set(0, 165, -30); + vlvObject.add(blackbo2xmesh); + vlvObject.scale.setX(1.5); + vlvObject.scale.setY(1.5); + vlvObject.scale.setZ(1.5); + + //TRIANGLE1 + const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3); + const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackbox2material); + trianglegeometrymesh.rotateX(Math.PI * 0); + trianglegeometrymesh.rotateY(Math.PI * 0); + trianglegeometrymesh.rotateZ(Math.PI * 0.5); + trianglegeometrymesh.position.set(0, 60 , -17); + vlvObject.add(trianglegeometrymesh); + + //TRIANGLE2 + const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3); + const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackbox2material); + triangle2geometrymesh.rotateX(Math.PI * 0); + triangle2geometrymesh.rotateY(Math.PI * 1); + triangle2geometrymesh.rotateZ(Math.PI * 0.5); + triangle2geometrymesh.position.set(0, 60 ,17); + vlvObject.add(triangle2geometrymesh); + + vlvObject.position.set(0, 0, 0); + vlvObject.rotateY(Math.PI * -0.5); + vlvContiner.add(vlvObject); + + return vlvContiner; + } + export function vlvUpdate(c, color) { + const vlv = c.children[0].children; + for (let i=0; i<vlv.length; i++) { + if (vlv[i].colorable) { + vlv[i].material.dispose(); + vlv[i].material = new THREE.MeshLambertMaterial({color: color}); + } + } + } diff --git a/components/coil_texture_fermi.png b/components/coil_texture_fermi.png new file mode 100644 index 0000000000000000000000000000000000000000..b29233cfc304c91d0598f07ac4808936010d80e2 Binary files /dev/null and b/components/coil_texture_fermi.png differ diff --git a/components/dipole.png b/components/dipole.png new file mode 100644 index 0000000000000000000000000000000000000000..bb97cea3d03fde9fd30fddb1380ba57ab5c82816 Binary files /dev/null and b/components/dipole.png differ diff --git a/components/flsc_texture.png b/components/flsc_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..40f12ee9b5dbaf63a1fac294aa6f51bfccefb083 Binary files /dev/null and b/components/flsc_texture.png differ diff --git a/components/kicker_texture.png b/components/kicker_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..2c04cc4012ed8d3f9348b9f6e662274960e15d8a Binary files /dev/null and b/components/kicker_texture.png differ diff --git a/components/preview/blm_preview.jpg b/components/preview/blm_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c8803b0b0e973bdeb0cddabe905f1d10d1b2522 Binary files /dev/null and b/components/preview/blm_preview.jpg differ diff --git a/components/preview/blmplus_preview.jpg b/components/preview/blmplus_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e1b1cfb49b74ebff4cc886d972cad59f5352ffb Binary files /dev/null and b/components/preview/blmplus_preview.jpg differ diff --git a/components/preview/bpm_preview.jpg b/components/preview/bpm_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf19599482fb7d692f891bfc82373e1905620861 Binary files /dev/null and b/components/preview/bpm_preview.jpg differ diff --git a/components/preview/cavity_preview.jpg b/components/preview/cavity_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d0b45b5ff07d07652a5ed758fd53c6fc6cd4dca Binary files /dev/null and b/components/preview/cavity_preview.jpg differ diff --git a/components/preview/cavitylinac_preview.jpg b/components/preview/cavitylinac_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bcd441a92aa83cc84196a055c67f23b2ad6e2fd Binary files /dev/null and b/components/preview/cavitylinac_preview.jpg differ diff --git a/components/preview/chamber_preview.jpg b/components/preview/chamber_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..984a95ac7bde13af6c53efbfe913cce7a5bda5fa Binary files /dev/null and b/components/preview/chamber_preview.jpg differ diff --git a/components/preview/corrector_preview.jpg b/components/preview/corrector_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e8bb67c465041f3389efc46778a11c73b6c9be2 Binary files /dev/null and b/components/preview/corrector_preview.jpg differ diff --git a/components/preview/correctorbooster_preview.jpg b/components/preview/correctorbooster_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..027f625196bbba51f70afdacf247d44822800ce7 Binary files /dev/null and b/components/preview/correctorbooster_preview.jpg differ diff --git a/components/preview/correctorboosterfast_preview.jpg b/components/preview/correctorboosterfast_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2efdf7d44c9f84085e16d1457c33346df7e3e022 Binary files /dev/null and b/components/preview/correctorboosterfast_preview.jpg differ diff --git a/components/preview/correctorfast_preview.jpg b/components/preview/correctorfast_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2efdf7d44c9f84085e16d1457c33346df7e3e022 Binary files /dev/null and b/components/preview/correctorfast_preview.jpg differ diff --git a/components/preview/correctorfermi_preview.jpg b/components/preview/correctorfermi_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3abd4a40dbd5c57baa580e7b8e1e0ba5de6b3b02 Binary files /dev/null and b/components/preview/correctorfermi_preview.jpg differ diff --git a/components/preview/dipole_preview.jpg b/components/preview/dipole_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e111b0561c2616e8f8f423e2208fc1aae88bff6 Binary files /dev/null and b/components/preview/dipole_preview.jpg differ diff --git a/components/preview/dipolebooster_preview.jpg b/components/preview/dipolebooster_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7230a50504c652bd147a78538b70b32e450a57ad Binary files /dev/null and b/components/preview/dipolebooster_preview.jpg differ diff --git a/components/preview/dipolefast_preview.jpg b/components/preview/dipolefast_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b9124e502d0befadffc24854b97ec1e1aefe597 Binary files /dev/null and b/components/preview/dipolefast_preview.jpg differ diff --git a/components/preview/dipolefermi_preview.jpg b/components/preview/dipolefermi_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7e32215602055d976eb04f9747767b2ecdff0f1 Binary files /dev/null and b/components/preview/dipolefermi_preview.jpg differ diff --git a/components/preview/dipoleplus_preview.jpg b/components/preview/dipoleplus_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..472f6727f0eb26f18ee2e0167fdb7f574713e356 Binary files /dev/null and b/components/preview/dipoleplus_preview.jpg differ diff --git a/components/preview/ellipticaltube_preview.jpg b/components/preview/ellipticaltube_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4d006e21afa49b2cfee99e44bb9b21b42bcec8d Binary files /dev/null and b/components/preview/ellipticaltube_preview.jpg differ diff --git a/components/preview/flsc_preview.jpg b/components/preview/flsc_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..162db5c5d3ddde6e98311bb6352743518ec2b4f5 Binary files /dev/null and b/components/preview/flsc_preview.jpg differ diff --git a/components/preview/flscfast_preview.jpg b/components/preview/flscfast_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a94c502876097ed142f05dca7f576c60913a950 Binary files /dev/null and b/components/preview/flscfast_preview.jpg differ diff --git a/components/preview/gun_preview.jpg b/components/preview/gun_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95b8cd395b51b1203cf5279bf50243cf2993650b Binary files /dev/null and b/components/preview/gun_preview.jpg differ diff --git a/components/preview/kicker_preview.jpg b/components/preview/kicker_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1f18c24aee6871c085d7e2d25047965c51484c7 Binary files /dev/null and b/components/preview/kicker_preview.jpg differ diff --git a/components/preview/quadrupole_preview.jpg b/components/preview/quadrupole_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b082b9243f88933168abd8924a5a7ad5bc017b0 Binary files /dev/null and b/components/preview/quadrupole_preview.jpg differ diff --git a/components/preview/quadrupolebooster_preview.jpg b/components/preview/quadrupolebooster_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee85bdfe0a62281a8216c2193e92ec91df743bb2 Binary files /dev/null and b/components/preview/quadrupolebooster_preview.jpg differ diff --git a/components/preview/sextupole_preview.jpg b/components/preview/sextupole_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9d6937264151a76817647457b84f9d747dd86c5 Binary files /dev/null and b/components/preview/sextupole_preview.jpg differ diff --git a/components/preview/sextupolebooster_preview.jpg b/components/preview/sextupolebooster_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04e149be47ad02c86c597dd6626d160cb2f3f998 Binary files /dev/null and b/components/preview/sextupolebooster_preview.jpg differ diff --git a/components/preview/spte_preview.jpg b/components/preview/spte_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f32c3560befb08f9c3c40cbc3e0b4f075288f53d Binary files /dev/null and b/components/preview/spte_preview.jpg differ diff --git a/components/preview/undulator_preview.jpg b/components/preview/undulator_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d56377f370ae47b32d06a506b50484c69a614ae5 Binary files /dev/null and b/components/preview/undulator_preview.jpg differ diff --git a/components/preview/wiggler_preview.jpg b/components/preview/wiggler_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..005b0b796d071b8b93b1a1bde09d4f437c530ea5 Binary files /dev/null and b/components/preview/wiggler_preview.jpg differ diff --git a/components/rar1pic.jpg b/components/rar1pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90191381948d503070b715f479fc4993b1aff54a Binary files /dev/null and b/components/rar1pic.jpg differ diff --git a/components/undulator.png b/components/undulator.png new file mode 100644 index 0000000000000000000000000000000000000000..c94082447f6e0bf4ee27f9af48944af525cf648d Binary files /dev/null and b/components/undulator.png differ diff --git a/components/vlv.png b/components/vlv.png new file mode 100644 index 0000000000000000000000000000000000000000..22d19fbb80dd0d5707731ec12604826a8e248e92 --- /dev/null +++ b/components/vlv.png @@ -0,0 +1,7 @@ +<svg viewBox="0 0 900px 900px" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + <g transform="scale(2) translate(0 45)"> + <polygon points="10,10 70,10 40,55" fill="red" stroke="#2f2f2f" stroke-width="3" /> + <polygon points="40,55 10,100 70,100" fill="red" stroke="#2f2f2f" stroke-width="3" /> + <circle r="15" cx="40" cy="55" fill="red" stroke="#2f2f2f" stroke-width="3px" /> + </g> +</svg> diff --git a/components/wiggler.png b/components/wiggler.png new file mode 100644 index 0000000000000000000000000000000000000000..fefe5e38d8eb67ec532b596dd927f03dc1b72e30 Binary files /dev/null and b/components/wiggler.png differ