Merge branch 'develop'

This commit is contained in:
zaccaria.majid
2023-10-24 10:34:09 +02:00
21 changed files with 2557 additions and 442 deletions
+25 -12
View File
@@ -21,23 +21,30 @@
let options ={
_dimX : X,
_dimY: Y,
_fileName: "Cubo.3mf",
_showLimitedGrid: true,
_fileName: "ProjectSlice.3mf",
_showGrid: true,
_showInfiniteGrid: false,
_isOrtographic: true,
_modelsDir: "./src/test3/"
_modelsDir: "./src/test3/",
_fileType: '3MF',
_showFrame: true,
_frameType: 2,
_frameLen: 150, //mm
_frameFat: 4 //mm
}
console.log(options._modelsDir + options._fileName)
WGL.initcall(options);
//document.getElementById("refre_slider").oninput = function() {
// myFunction()
//};
document.getElementById("refre_slider").oninput = function() {
myFunction()
};
//function myFunction() {
// var val = document.getElementById("refre_slider").value //gets the oninput value
// console.log(val)
// WGL.refreshcall(1, val)
//}
function myFunction() {
var val = document.getElementById("refre_slider").value //gets the oninput value
console.log(val)
WGL.refreshcall(1, val)
}
document.getElementById('btnRef').onclick = function() {
@@ -62,6 +69,12 @@
WGL.setCameraType();
}
document.getElementById('ck_print').onclick = function(){
var val = document.getElementById('ck_print').checked;
WGL.showPrintDirection(val);
}
</script>
<script src="./node_modules/webgl-visualizer/draw/webgl_drawVue.js" type="module"></script>
<script src="webgl-visualizer/draw/webgl_drawVue.js" type="module"></script>
</html>
+4 -4
View File
@@ -10,7 +10,7 @@
"license": "MIT",
"dependencies": {
"vue": "^2.5.11",
"webgl-visualizer": "^1.2.231005-beta.942"
"webgl-visualizer": "^1.2.231023-beta.1106"
},
"devDependencies": {
"babel-core": "^6.26.0",
@@ -9296,9 +9296,9 @@
}
},
"node_modules/webgl-visualizer": {
"version": "1.2.231005-beta.942",
"resolved": "https://nexus.steamware.net/repository/npm-group/webgl-visualizer/-/webgl-visualizer-1.2.231005-beta.942.tgz",
"integrity": "sha512-Fbx6Ogvo6g7lbuqQaQX33toQcoLmCbpH3c6spOwg16t02JYW+F75IUbzyUvi1FW5HM5/yNqku6ci8yOYzroJQQ==",
"version": "1.2.231023-beta.1106",
"resolved": "https://nexus.steamware.net/repository/npm-group/webgl-visualizer/-/webgl-visualizer-1.2.231023-beta.1106.tgz",
"integrity": "sha512-sEA/GbeshPuIKnDDDfZGdS91QhnJsy8Vi/k/az57J2Wv9Ahx7DMhjF5S7EhI33JxQ0ZXJQYCSaoBe3eTOwgZ3A==",
"license": "ISC"
},
"node_modules/webpack": {
+1 -1
View File
@@ -11,7 +11,7 @@
},
"dependencies": {
"vue": "^2.5.11",
"webgl-visualizer": "^1.2.231005-beta.942"
"webgl-visualizer": "^1.2.231023-beta.1106"
},
"browserslist": [
"> 1%",
+4 -2
View File
@@ -1,7 +1,7 @@
<template>
<div id="app">
<div style="display: flex; justify-content: center; flex: wrap; align-items: center; margin-bottom: 10px; ">
<img src="src/WebGl/styles/LogoClassic_NoText.png" style="width: 175px; height: 175px;"/>
<img src="src/assets/LogoClassic_NoText.png" style="width: 175px; height: 175px;"/>
<h1 style="margin: 20px;">
EGW Web3D Viewer
</h1>
@@ -9,11 +9,13 @@
<div>
<input type="number" id="dimX" placeholder="dimX" value="960" />
<input type="number" id="dimY" placeholder="dimY" value="540" />
<input type="range" id="refre_slider" max="1000" />
<button id="btnRef">Resize</button>
<button id="btnResetCam">Reset camera</button>
<input type='button' id='bt_camera' value = "Toggle Camera">
<input type='checkbox' id='ck_print' checked>
</div>
<div id = "WebGL-3mfExport">
<div id = "WebGL-Export">
</div>
</div>
</template>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+347 -169
View File
@@ -1,23 +1,44 @@
import * as THREE from '../threeJsLib/three.module.js';
import { OrbitControls } from '../jsm/controls/OrbitControls.js';
import { ThreeMFLoader } from '../jsm/loaders/3MFLoader.js';
import { Rhino3dmLoader } from '../jsm/addons/loaders/3DMLoader.js';
// VARIABILI DI CONTROLLO
// *** div dimensions ***
var m_divStartDimX = 500;
var m_divStartDimY = 400;
var fName = "Cubo.3mf";
var m_fileSource = '';
//var fileType = "3MF";
// *** camera settings ***
var m_bZoom = true;
var m_bPan = true;
var m_bRot = true;
var m_bAutoRot = false;
var m_bGrid_v1 = true ;
var m_nCameraStartPos = 8 ;
//var useInSlider = false;
var m_nCamPos = 0;
var m_nCameraStartPos = 8 ;
var m_bIsOrtographic = true ;
// *** index blender ***
var m_nStartL = 0;
var m_nEndL = 0;
var m_bIsOrtographic = true ;
// *** frame settings ***
var m_bShowFrame = true ;
var m_lFrameLen = 100 ;
var m_dFrameFat = 2; // raggio del cilindro
var m_bFrameType = 2 ;
var m_bAutoRot = false;
// *** grid settings ***
var m_bShowGrid = true ;
var m_bInfGrid = true ;
// *** Direction Arrows ***
var m_bShowPrintDir = true ;
//var useInSlider = false;
var counter = 0;
@@ -26,14 +47,25 @@ var layer_list = [];
const GLBox3D = new THREE.Box3(); // Box3D globale delle geometrie
//init();
class webgl_original {
async initcall({ _dimX, _dimY, _fileName, _showInfiniteGrid}) {
async initcall({ _dimX, _dimY, _fileName, _showInfiniteGrid, _fileType}) {
m_divStartDimX = _dimX;
m_divStartDimY = _dimY;
fName = _fileName;
m_bGrid_v1 = _showInfiniteGrid;
m_bInfGrid = _showInfiniteGrid;
//console.log(fName)
setLoaders();
await init();
if(_fileType.toUpperCase() == '3MF')
{
await init3mf();
}
else if(_fileType.toUpperCase() == '3DM')
{
await init3dm();
}
else
{
console.log('File type not supported')
}
}
setCameraType(){
@@ -184,8 +216,8 @@ function setLoaders() {
}
function init() {
const manager = new THREE.LoadingManager();
function init3mf() {
const manager = new THREE.LoadingManager();
const loader = new ThreeMFLoader(manager);
let startTime = performance.now();
return new Promise(() => {
@@ -205,169 +237,199 @@ function init() {
// Adapting Scene to contest
let endTime = performance.now();
let timeElapsed = endTime - startTime;
console.log('init in : ' + timeElapsed)
console.log('init3mf in : ' + timeElapsed)
});
}, 0);
});
}
function AdaptSeceneToContest() {
scene = new THREE.Scene();
scene.background = new THREE.Color(0xa0a0a0);
//if (useInSlider) {
document.getElementById("refre_slider").max = layer_list[layer_list.length - 1].children[0].nLayer;
document.getElementById("refre_slider").value = layer_list[layer_list.length - 1].children[0].nLayer;
document.getElementById("refre_slider").removeAttribute('hidden');
//}
for (var i = 0; i < layer_list.length; ++i) {
const Objbox = new THREE.Box3().setFromObject(layer_list[i]);
GLBox3D.union(Objbox);
layer_list[i].children[0].material.side = THREE.DoubleSide;
if (typeof layer_list[i].children[0].nLayer !== "undefined") {
scene.add(layer_list[i]);
}
}
const BoxHelper = new THREE.Box3Helper(GLBox3D, 0xffff00);
// setting camera position
const vtCenter = new THREE.Vector3(0, 0, 0);
GLBox3D.getCenter(vtCenter);
const vtPosition = vtCenter.clone().multiplyScalar(5);
const vtBoxDim = new THREE.Vector3(0, 0, 0);
GLBox3D.getSize(vtBoxDim);
// camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 30000);
// camera.position.set(2 * vtBoxDim.x, 2 * vtBoxDim.y, 2 * vtBoxDim.z);
// camera.lookAt(vtCenter.x, vtCenter.y, vtCenter.z);
// scene.add(camera);
perspectiveCamera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 300000 );
//perspectiveCamera.up = new THREE.Vector3( 0, 0, 1) ;
orthographicCamera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2,
window.innerHeight / 2, window.innerHeight / - 2,
-300000, 300000) ;
//orthographicCamera.up = new THREE.Vector3( 0, 0, 1) ;
if ( ! m_bIsOrtographic)
activeCamera = perspectiveCamera ;
else
activeCamera = orthographicCamera ;
activeCamera.position.set( 2 * vtBoxDim.x, 2 * vtBoxDim.y, 2 * vtBoxDim.z) ;
activeCamera.lookAt( vtCenter.x, vtCenter.y, vtCenter.z) ;
scene.add( activeCamera) ;
const hemiLight = new THREE.HemisphereLight(0xffffff, 0x8d8d8d);
hemiLight.position.set(vtCenter.x, vtCenter.y + 2 * vtBoxDim.y, vtCenter.z);
scene.add(hemiLight);
var HemisphereLightHelper = new THREE.Mesh(new THREE.SphereGeometry(15, 30, 15),
new THREE.MeshStandardMaterial({ color: 0xffffff, emissive: 0x404040 }));
HemisphereLightHelper.position.set(vtCenter.x, vtCenter.y + 2 * vtBoxDim.y, vtCenter.z);
const dirLight = new THREE.DirectionalLight(0xffffff);
dirLight.position.set(vtPosition.x, vtPosition.y, vtPosition.z);
dirLight.castShadow = true;
dirLight.shadow.camera.top = 50;
dirLight.shadow.camera.bottom = - 25;
dirLight.shadow.camera.left = - 25;
dirLight.shadow.camera.right = 25;
dirLight.shadow.camera.near = 0.1;
dirLight.shadow.camera.far = 200;
dirLight.shadow.mapSize.set(1024, 1024);
scene.add(dirLight);
const DirLighthelper = new THREE.DirectionalLightHelper(dirLight, 100);
const ground = new THREE.Mesh(new THREE.PlaneGeometry(10000, 10000),
new THREE.MeshPhongMaterial({ color: 0x36454F, depthWrite: true, }));
ground.rotation.x = - Math.PI / 2;
ground.position.y = -0.5;
ground.receiveShadow = true;
ground.material.opacity = 0.25;
ground.material.transparent = true;
ground.material.side = THREE.DoubleSide;
//scene.add( ground);
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
var container = document.getElementById('WebGL-3mfExport');
container.style.height = '100%';
container.style.width = '100%';
renderer.setSize(m_divStartDimX, m_divStartDimY);
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
container.appendChild(renderer.domElement);
var cont = document.getElementById('spinContainer');
container.removeChild(cont);
controls = new OrbitControls(activeCamera, renderer.domElement);
controls.addEventListener('change', render);
controls.update();
window.addEventListener('resize', onWindowResize);
// calcolo origine
const points_array = [ new THREE.Vector3( 0, 0, 0)] ;
var ORIG_Geometry = new THREE.BufferGeometry() ;
ORIG_Geometry.setFromPoints( points_array) ;
var ORIG_Material = new THREE.PointsMaterial({ size: 5, sizeAttenuation : true, color : new THREE.Color( 0x000000)});
ORIG = new THREE.Points( ORIG_Geometry, ORIG_Material) ;
SetOrig( ORIG) ;
// creazione sistema di riferimento nell'origine
const axesHelper = new THREE.AxesHelper( 75 ) ;
axesHelper.rotation.set( -Math.PI/2, 0 ,0) ;
axesHelper.position.set( ORIG.position.x, ORIG.position.y, ORIG.position.z) ;
scene.add( axesHelper );
// creazione della griglia (V1 = finita, V2 = infinita)
const size = 1000000 ;
const divisions = 10000 ;
if ( ! m_bGrid_v1) {
// GRIGLIA INFINITA
const gridHelper = new THREE.GridHelper( size, divisions) ;
gridHelper.position.set( ORIG.position.x, ORIG.position.y, ORIG.position.z) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.25 ;
setFog() ;
scene.add( gridHelper) ;
}
else {
// GRIGLIA FINITA
// prendo dimensione del Box
var dDimX = Math.abs( GLBox3D.max.x - GLBox3D.min.x) ;
var dDimY = Math.abs( GLBox3D.max.y - GLBox3D.min.y) ;
var dDimZ = Math.abs( GLBox3D.max.z - GLBox3D.min.z) ;
var dDim = 1.5 * Math.sqrt( dDimX * dDimX + dDimY * dDimY + dDimZ * dDimZ) ;
const gridHelper = new THREE.GridHelper( dDim, Math.ceil( 0.1 * dDim)) ;
gridHelper.position.set( ORIG.position.x + 0.5 * dDim , ORIG.position.y, ORIG.position.z - 0.5 * dDim) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.45 ;
scene.add( gridHelper) ;
function init3dm(){
return new Promise(() => {
setTimeout(() => {
loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/rhino3dm@7.15.0/' ) ;
loader.load( './models/3dm/Ex' + FileNumber + '.3dm', m_nApproxIndex, function ( object ) {
object.traverse( function( child) {
child.castShadow = true ;
}) ;
}
// Ref systems
const Mat_GlobToLoc = new THREE.Matrix4() ; //<---- rotations for XY plane from Extrusion
const Mat_LocToGlob = new THREE.Matrix4() ; //<---- rotations for Extrusion from XY plane
const Mat_ThreeJs_Frame = new THREE.Matrix4() ; // <----- rotations from XYZ ref system to ThreeJS system
Mat_ThreeJs_Frame.set( 1, 0, 0, 0,
0, 0, 1, 0,
0, -1, 0, 0,
0, 0, 0, 1) ;
var Mat_ToScene = new THREE.Matrix4() ;
// Extrusion settings for curves
const extrudeSettings = {
steps: 1,
depth: 0,
bevelEnabled: false,
bevelThickness: 1,
bevelSize: 1,
bevelOffset: 0,
bevelSegments: 1
} ;
// loading entities...
for ( var i = 0 ; i < object.children.length ; ++ i) {
// getting i-th object
var child = object.children[i] ;
//console.log( child);
render();
// READING A POINT TYPE -----------------------------------------------------------------
if ( child.type == 'Points') {
try {
if ( child.name != 'Orig') {
console.log( 'Not a valid origin') ;
return false ;
}
// start layer
nStartLayer = parseInt( child.userData.attributes.layerIndex) ;
// ORIGIN ------------------------
var coord = child.userData.attributes.geometry.location ;
var orig_x = parseFloat( coord[0]) ;
var orig_y = parseFloat( coord[2]) ;
var orig_z = - parseFloat( coord[1]) ;
ORIG = new THREE.Vector3( orig_x, orig_y, orig_z) ;
// EXTRUSION ---------------------
var bOk_ext = false ;
if ( child.userData.attributes.userStrings[1][0] == 'SlicingDir') {
var sExtr = child.userData.attributes.userStrings[1][1] ;
if ( sExtr != "" ) {
let sExtr_arr = sExtr.split(',') ;
if ( sExtr_arr.length == 3) {
var dExtr_x = parseFloat( sExtr_arr[0]) ;
var dExtr_y = parseFloat( sExtr_arr[1]) ;
var dExtr_z = parseFloat( sExtr_arr[2]) ;
vtExtr = new THREE.Vector3( dExtr_x, dExtr_y, dExtr_z) ;
bOk_ext = true ;
}
}
}
if ( ! bOk_ext) {
console.log( ' Not a valid Extrusion') ;
return false ;
}
var Z_AX = new THREE.Vector3( vtExtr.x, vtExtr.y, vtExtr.z) ;
var X_AX = new THREE.Vector3() ;
var Y_AX = new THREE.Vector3() ;
if ( ! Z_AX.equals( new THREE.Vector3( 0, 0, 1))) {
X_AX.crossVectors( new THREE.Vector3( 0, 0, 1), Z_AX) ;
Y_AX.crossVectors( Z_AX, X_AX) ;
}
else {
X_AX = new THREE.Vector3( 1, 0, 0) ;
Y_AX = new THREE.Vector3( 0, 1, 0) ;
}
Mat_GlobToLoc.set( X_AX.x, X_AX.y, X_AX.z, 0,
Y_AX.x, Y_AX.y, Y_AX.z, 0,
Z_AX.x, Z_AX.y, Z_AX.z, 0,
0, 0, 0, 1) ;
Mat_LocToGlob.copy( Mat_GlobToLoc) ;
Mat_LocToGlob.invert() ;
Mat_ToScene.multiplyMatrices( Mat_ThreeJs_Frame, Mat_LocToGlob) ;
// STRAND -------------------------
if ( child.userData.attributes.userStrings[0][0] == 'StrandH') {
dStrand = - parseFloat( child.userData.attributes.userStrings[0][1]) ;
extrudeSettings.depth = dStrand ;
}
else {
console.log( ' Not a valid Strand') ;
return false ;
}
}
catch( error) {
console.log( 'Orig, Extrusion or Strand missing or not implemented') ;
return false ;
}
}
// READING A LINE -----------------------------------------------------------------------
else if ( child.type == 'Line') {
// Parsing the extrusion and the Layer of the curve
try {
var nLayer = parseInt( child.userData.attributes.layerIndex) - nStartLayer ;
if ( nLayer < 0)
return false ;
var points_array = child.geometry.attributes.position.array ;
//var ptPrec ;
const shape = new THREE.Shape() ;
for ( var v = 0 ; v < points_array.length ; v += 3) {
var Zact ;
var vtCoord = new THREE.Vector4( points_array[v], points_array[v+1], points_array[v+2], 1) ;
vtCoord.applyMatrix4( Mat_GlobToLoc) ;
//if ( v != 0 && v < points_array.length - 3 &&
// (( vtCoord.x - ptPrec.x) * ( vtCoord.x - ptPrec.x) +
// ( vtCoord.y - ptPrec.y) * ( vtCoord.y - ptPrec.y) +
// ( vtCoord.z - ptPrec.z) * ( vtCoord.z - ptPrec.z)) < 10)
// continue ;
if ( v == 0) {
shape.moveTo( vtCoord.x, vtCoord.y) ;
Zact = vtCoord.z ;
}
else
shape.lineTo( vtCoord.x, vtCoord.y) ;
//ptPrec = new THREE.Vector4( vtCoord.x, vtCoord.y, vtCoord.z, 1) ;
}
var cCol = child.material.color.clone() ;
if ( nLayer%2 == 0) {
cCol.lerp( new THREE.Color( 0x000000 ), 0.25) ;
}
const geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings) ;
const material = new THREE.MeshLambertMaterial({ color: cCol,
wireframe : false,
shadowSide : THREE.DoubleSide}) ;
const mesh = new THREE.Mesh( geometry, material) ;
mesh.translateZ( Zact) ;
//mesh.applyMatrix4( Mat_LocToGlob) ;
//mesh.applyMatrix4( Mat_ThreeJs_Frame) ;
mesh.applyMatrix4( Mat_ToScene) ;
mesh.nLayer = nLayer ;
mesh.isArrow = false ;
layer_list.push( mesh) ;
} catch( err) {
console.log( ' Not a valid Layer for paths') ;
return false ;
}
}
// READING ARROW'S MESH
else if ( child.type == 'Mesh') {
try {
if ( child.name != 'Arrow') {
//console.log( 'Not a valid Arrow direction') ;
//return false ;
child.nLayer = 1 ;
layer_list.push( child) ;
continue ;
}
var nLayer = parseInt( child.userData.attributes.layerIndex) - nStartLayer ;
if ( nLayer < 0)
return false ;
child.isArrow = true ;
child.applyMatrix4( Mat_ThreeJs_Frame) ;
child.nLayer = nLayer ;
child.material.color = new THREE.Color( 0xff0000) ;
layer_list.push( child) ;
} catch( e) {
console.log( 'Not a valid Arrow direction') ;
return false ;
}
}
// READING OTHER ENTITY --------------------
else
continue ;
// TEST ===================================
setCameraZoom(m_bZoom);
setCameraPan(m_bPan);
setCameraRot(m_bRot);
setCameraAutoRot(m_bAutoRot);
SetCameraPos( m_nCameraStartPos, ORIG) ;
// =========================================
//console.log('aggiunto 1');
}
AdaptSeceneToContest() ;
console.log(new Date()) ;
}) ;
}, 0)
})
}
function refreshElement(nStart, nEnd) {
@@ -478,8 +540,124 @@ function SetOrig( ORIG) {
// -----------------------
//scene.add( ORIG) ;
}
function setFog() {
var dNear = GLBox3D.max.x + 3 * ( GLBox3D.max.x - GLBox3D.min.x) ;
var dFar = 10000 ;
scene.fog = new THREE.Fog( 0xa0a0a0, 20000, 30000);
}
// var dNear = GLBox3D.max.x + 3 * ( GLBox3D.max.x - GLBox3D.min.x) ;
// var dFar = 10000 ;
// scene.fog = new THREE.Fog( 0xa0a0a0, 20000, 30000);
}
function AddFrame( ptORIG) {
if ( ! m_bShowFrame)
return ;
if ( m_bFrameType == 0) {
const axesHelper = new THREE.AxesHelper( m_lFrameLen) ;
axesHelper.rotation.set( -Math.PI/2, 0 , 0) ;
axesHelper.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
scene.add( axesHelper ) ;
}
else if ( m_bFrameType == 1) {
var vtDirs = [ new THREE.Vector3( 1, 0, 0), new THREE.Vector3( 0, 0, -1), new THREE.Vector3( 0, 1, 0)] ;
var vtCols = [ new THREE.Color( 0xff0000), new THREE.Color( 0x00ff00), new THREE.Color( 0x0000ff)] ;
var vtORIG = new THREE.Vector3( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
for ( var i = 0 ; i < 3 ; ++ i) {
const arrowHelper = new THREE.ArrowHelper( vtDirs[i], vtORIG, m_lFrameLen, vtCols[i]) ;
scene.add( arrowHelper ) ;
}
}
else if ( m_bFrameType == 2) {
var vtCols = [ new THREE.Color( 0x0000ff), new THREE.Color( 0xff0000), new THREE.Color( 0x00ff00)] ;
for ( var i = 0 ; i < 3 ; ++ i) {
// cylinder ----
const fr_geometry_cyl = new THREE.CylinderGeometry( m_dFrameFat, m_dFrameFat, 0.8 * m_lFrameLen, 32) ;
const fr_material = new THREE.MeshBasicMaterial({color: vtCols[i]}) ;
const fr_cylinder = new THREE.Mesh( fr_geometry_cyl, fr_material) ;
fr_cylinder.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
if ( i == 1)
fr_cylinder.rotation.set( 0, 0, -Math.PI/2) ;
if ( i == 2)
fr_cylinder.rotation.set( -Math.PI/2, 0, 0) ;
scene.add( fr_cylinder) ;
fr_cylinder.translateY( 0.4 * m_lFrameLen) ;
// pyramid
const fr_geometry_cone = new THREE.CylinderGeometry( 0, 2 * m_dFrameFat, 0.2 * m_lFrameLen, 32) ;
const fr_cone = new THREE.Mesh( fr_geometry_cone, fr_material) ;
fr_cone.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
if ( i == 1)
fr_cone.rotation.set( 0, 0, -Math.PI/2) ;
if ( i == 2)
fr_cone.rotation.set( -Math.PI/2, 0, 0) ;
scene.add( fr_cone) ;
fr_cone.translateY( 0.9 * m_lFrameLen) ;
}
// Origin
const fr_orig_geometry = new THREE.SphereGeometry( 2 * m_dFrameFat, 32, 16) ;
const fr_orig_material = new THREE.MeshBasicMaterial( {color: 0x00000}) ;
const fr_sphere = new THREE.Mesh( fr_orig_geometry, fr_orig_material) ;
fr_sphere.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
scene.add( fr_sphere) ;
}
else
console.log( 'Frame type not defined') ;
}
function AddGrid( ptORIG) {
if ( ! m_bShowGrid)
return ;
const size = 1000000 ;
const divisions = 10000 ;
if ( m_bInfGrid) {
const gridHelper = new THREE.GridHelper( size, divisions) ;
gridHelper.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.25 ;
setFog() ;
scene.add( gridHelper) ;
}
else {
var dDimX = Math.abs( GLBox3D.max.x - GLBox3D.min.x) ;
var dDimY = Math.abs( GLBox3D.max.y - GLBox3D.min.y) ;
var dDimZ = Math.abs( GLBox3D.max.z - GLBox3D.min.z) ;
var dDim = 1.5 * Math.sqrt( dDimX * dDimX + dDimY * dDimY + dDimZ * dDimZ) ;
const gridHelper = new THREE.GridHelper( dDim, Math.ceil( 0.1 * dDim)) ;
gridHelper.position.set( ptORIG.position.x + 0.5 * dDim , ptORIG.position.y, ptORIG.position.z - 0.5 * dDim) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.45 ;
scene.add( gridHelper) ;
}
}
function ManageSceneElements( e) {
if ( e.srcElement.id == 'bt_refresh') {
nLayerStart = parseInt( document.getElementById('Layer_Start').value) ;
nLayerEnd = parseInt( document.getElementById('Layer_End').value) ;
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( parseInt( layer_list[i].nLayer) >= nLayerStart &&
parseInt( layer_list[i].nLayer) <= nLayerEnd) {
if ( layer_list[i].isArrow)
layer_list[i].visible = document.getElementById( 'ck_dir').checked ;
else
layer_list[i].visible = true ;
}
else {
layer_list[i].visible = false ;
}
}
}
else if ( e.srcElement.id = 'ck_dir') {
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( layer_list[i].isArrow) {
if ( layer_list[i].nLayer >= nLayerStart &&
layer_list[i].nLayer <= nLayerEnd)
layer_list[i].visible = document.getElementById( 'ck_dir').checked ;
else
layer_list[i].visible = false ;
}
}
}
render() ;
}
+576 -248
View File
@@ -1,41 +1,75 @@
import * as THREE from '../threeJsLib/three.module.js';
import { OrbitControls } from '../jsm/controls/OrbitControls.js';
import { ThreeMFLoader } from '../jsm/loaders/3MFLoader.js';
import { Rhino3dmLoader } from '../jsm/loaders/3DMLoader.js';
// VARIABILI DI CONTROLLO
// *** div dimensions ***
var m_divStartDimX = 500;
var m_divStartDimY = 400;
var fName = "Cubo.3mf";
var m_fileSource = '';
var fName = "";
//var fileType = "3MF";
var fileType = '3DM';
var m_nApproxIndex = 5;
var m_bShowDir = true;
// *** camera settings ***
var m_bZoom = true;
var m_bPan = true;
var m_bRot = true;
var m_bAutoRot = false;
var m_bGrid_v1 = true;
var m_nCameraStartPos = 8;
//var useInSlider = false;
var m_nCamPos = 0;
var m_nStartL = 0;
var m_nEndL = 0;
var m_nCameraStartPos = 8 ;
var m_bIsOrtographic = true ;
// *** index blender ***
var m_nStartL = 0;
var m_nEndL = 1000000;
// *** frame settings ***
var m_bShowFrame = true ;
var m_lFrameLen = 100 ;
var m_dFrameFat = 2; // raggio del cilindro
var m_bFrameType = 2 ;
var m_bAutoRot = false;
// *** grid settings ***
var m_bShowGrid = true ;
var m_bInfGrid = true ;
// *** Direction Arrows ***
var m_bShowPrintDir = true ;
var modelsDir = '' ;
//var useInSlider = false;
var counter = 0;
var modelsDir = "";
var nStartLayer = -100000 ;
var ORIG = new THREE.Vector3( 0, 0, 0), vtExtr = new THREE.Vector3( 0, 1, 0), dStrand ;
let activeCamera, scene, renderer, controls, ORIG, perspectiveCamera, orthographicCamera;
let activeCamera, scene, renderer, controls, perspectiveCamera, orthographicCamera;
var layer_list = [];
const GLBox3D = new THREE.Box3(); // Box3D globale delle geometrie
//init();
class webgl_original {
async initcall({ _dimX, _dimY, _fileName, _showLimitedGrid, _isOrtographic, _modelsDir}) {
async initcall({ _dimX, _dimY, _fileName, _showInfiniteGrid, _fileType, _modelsDir, _showGrid, _showFrame, _frameType, _frameLen, _frameFat}) {
m_divStartDimX = _dimX;
m_divStartDimY = _dimY;
m_bShowGrid = _showGrid;
fName = _fileName;
m_bGrid_v1 = _showLimitedGrid;
m_bIsOrtographic = _isOrtographic;
m_bInfGrid = _showInfiniteGrid;
modelsDir = _modelsDir;
fileType = _fileType;
m_bShowFrame = _showFrame;
m_bFrameType = _frameType;
m_lFrameLen = _frameLen;
m_dFrameFat = _frameFat;
//console.log(fName)
//setLoaders();
setLoaders();
await init();
}
@@ -50,41 +84,23 @@ class webgl_original {
resetCamera() {
SetCameraPos( m_nCameraStartPos, ORIG) ;
}
showPrintDirection(showDir) {
ShowPrintDir(showDir) ;
}
}
export { webgl_original }
function toggleCamera( perspectiveCamera, orthographicCamera) { // <-----------------
var cameraPosition = activeCamera.position.clone() ;
var cameraMatrix = activeCamera.matrix.clone() ;
var ControlsTarget = controls.target.clone() ;
var ControlsPosition = controls.position0.clone() ;
if ( m_bIsOrtographic == true) {
m_bIsOrtographic = false ;
activeCamera = perspectiveCamera ;
activeCamera.position.copy( cameraPosition) ;
activeCamera.matrix.copy( cameraMatrix) ;
} else {
m_bIsOrtographic = true ;
activeCamera = orthographicCamera ;
activeCamera.position.copy( cameraPosition) ;
activeCamera.matrix.copy( cameraMatrix) ;
}
activeCamera.updateProjectionMatrix() ;
controls.object = activeCamera ;
controls.target = ControlsTarget ;
controls.position0 = ControlsPosition ;
controls.update() ;
render() ;
}
function setLoaders() {
//<input type="range" class="form-range" id="customRange1">
const mother = document.getElementById('WebGL-3mfExport');
let mother = document.getElementById('WebGL-Export');
if(fileType.toUpperCase() == '3DM')
{
mother = document.getElementById('WebGL-Export')
}
const spinContainer = document.createElement('div');
const sliderInput = document.createElement('input');
@@ -99,11 +115,11 @@ function setLoaders() {
//if (useInSlider) {
//mother.appendChild(sliderInput);
//sliderInput.setAttribute('id', 'refre_slider');
//sliderInput.setAttribute('hidden', true);
//sliderInput.type = 'range';
//sliderInput.min = '0';
mother.appendChild(sliderInput);
sliderInput.setAttribute('id', 'refre_slider');
sliderInput.setAttribute('hidden', true);
sliderInput.type = 'range';
sliderInput.min = '0';
//}
mother.appendChild(spinContainer);
//document.body.appendChild(spinContainer);
@@ -168,6 +184,7 @@ function setLoaders() {
cDiv[i].style.width = '100%';
cDiv[i].style.border = '#afc5d6';
cDiv[i].style.backgroundSize = 'contain';
// cDiv[i].style.backgroundColor = '#000';
cDiv[i].style.backgroundImage = 'url(../node_modules/webgl-visualizer/styles/LogoClassic_NoText.png)'
}
@@ -187,73 +204,310 @@ function setLoaders() {
}
function init() {
const manager = new THREE.LoadingManager();
const loader = new ThreeMFLoader(manager);
let startTime = performance.now();
function init3mf() {
const manager = new THREE.LoadingManager() ;
const loader = new ThreeMFLoader( manager) ;
let startTime = performance.now();
return new Promise(() => {
setTimeout(() => {
loader.load(modelsDir + fName, function (object) {
object.rotation.set(-Math.PI / 2, 0, 0);
object.traverse(function (child) {
child.castShadow = true;
});
for (var i = 0; i < object.children.length; ++i) {
var child = object.children[i];
child.rotation.set(-Math.PI / 2, 0, 0);
layer_list.push(child);
loader.load( modelsDir + fName, function ( object) {
object.rotation.set( -Math.PI / 2, 0, 0) ;
console.log( object) ;
for ( var i = 0 ; i < object.children.length ; ++ i) {
var child = object.children[i] ;
child.rotation.set( -Math.PI/2, 0 ,0) ;
layer_list.push( child) ;
}
//console.log(layer_list);
AdaptSceneToContest();
// Adapting Scene to contest
// Adapting Scene to contest
AdaptSeceneToContest() ;
let endTime = performance.now();
let timeElapsed = endTime - startTime;
console.log('init in : ' + timeElapsed)
});
console.log('init3mf in : ' + timeElapsed)
console.log( new Date()) ;
}) ;
}, 0);
});
}
function AdaptSceneToContest() {
scene = new THREE.Scene();
scene.background = new THREE.Color(0xa0a0a0);
//if (useInSlider) {
function init3dm(){
const loader = new Rhino3dmLoader() ;
let startTime = performance.now();
return new Promise(() => {
setTimeout(() => {
loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/rhino3dm@7.15.0/' ) ;
loader.load( modelsDir + fName, m_nApproxIndex, function ( object ) {
object.traverse( function( child) {
child.castShadow = true ;
}) ;
// Ref systems
const Mat_GlobToLoc = new THREE.Matrix4() ; //<---- rotations for XY plane from Extrusion
const Mat_LocToGlob = new THREE.Matrix4() ; //<---- rotations for Extrusion from XY plane
const Mat_ThreeJs_Frame = new THREE.Matrix4() ; // <----- rotations from XYZ ref system to ThreeJS system
Mat_ThreeJs_Frame.set( 1, 0, 0, 0,
0, 0, 1, 0,
0, -1, 0, 0,
0, 0, 0, 1) ;
var Mat_ToScene = new THREE.Matrix4() ;
// Extrusion settings for curves
const extrudeSettings = {
steps: 1,
depth: 0,
bevelEnabled: false,
bevelThickness: 1,
bevelSize: 1,
bevelOffset: 0,
bevelSegments: 1
} ;
// loading entities...
for ( var i = 0 ; i < object.children.length ; ++ i) {
// getting i-th object
var child = object.children[i] ;
//console.log( child);
//document.getElementById("refre_slider").max = layer_list[layer_list.length - 1].children[0].nLayer;
//document.getElementById("refre_slider").value = layer_list[layer_list.length - 1].children[0].nLayer;
//document.getElementById("refre_slider").removeAttribute('hidden');
//}
// READING A POINT TYPE -----------------------------------------------------------------
if ( child.type == 'Points') {
try {
if ( child.name != 'Orig') {
console.log( 'Not a valid origin') ;
return false ;
}
// start layer
nStartLayer = parseInt( child.userData.attributes.layerIndex) ;
// ORIGIN ------------------------
var coord = child.userData.attributes.geometry.location ;
var orig_x = parseFloat( coord[0]) ;
var orig_y = parseFloat( coord[2]) ;
var orig_z = - parseFloat( coord[1]) ;
ORIG = new THREE.Vector3( orig_x, orig_y, orig_z) ;
// EXTRUSION ---------------------
var bOk_ext = false ;
if ( child.userData.attributes.userStrings[1][0] == 'SlicingDir') {
var sExtr = child.userData.attributes.userStrings[1][1] ;
if ( sExtr != "" ) {
let sExtr_arr = sExtr.split(',') ;
if ( sExtr_arr.length == 3) {
var dExtr_x = parseFloat( sExtr_arr[0]) ;
var dExtr_y = parseFloat( sExtr_arr[1]) ;
var dExtr_z = parseFloat( sExtr_arr[2]) ;
vtExtr = new THREE.Vector3( dExtr_x, dExtr_y, dExtr_z) ;
bOk_ext = true ;
}
}
}
if ( ! bOk_ext) {
console.log( ' Not a valid Extrusion') ;
return false ;
}
var Z_AX = new THREE.Vector3( vtExtr.x, vtExtr.y, vtExtr.z) ;
var X_AX = new THREE.Vector3() ;
var Y_AX = new THREE.Vector3() ;
if ( ! Z_AX.equals( new THREE.Vector3( 0, 0, 1))) {
X_AX.crossVectors( new THREE.Vector3( 0, 0, 1), Z_AX) ;
Y_AX.crossVectors( Z_AX, X_AX) ;
}
else {
X_AX = new THREE.Vector3( 1, 0, 0) ;
Y_AX = new THREE.Vector3( 0, 1, 0) ;
}
Mat_GlobToLoc.set( X_AX.x, X_AX.y, X_AX.z, 0,
Y_AX.x, Y_AX.y, Y_AX.z, 0,
Z_AX.x, Z_AX.y, Z_AX.z, 0,
0, 0, 0, 1) ;
Mat_LocToGlob.copy( Mat_GlobToLoc) ;
Mat_LocToGlob.invert() ;
Mat_ToScene.multiplyMatrices( Mat_ThreeJs_Frame, Mat_LocToGlob) ;
// STRAND -------------------------
if ( child.userData.attributes.userStrings[0][0] == 'StrandH') {
dStrand = - parseFloat( child.userData.attributes.userStrings[0][1]) ;
extrudeSettings.depth = dStrand ;
}
else {
console.log( ' Not a valid Strand') ;
return false ;
}
}
catch( error) {
console.log( 'Orig, Extrusion or Strand missing or not implemented') ;
return false ;
}
}
// READING A LINE -----------------------------------------------------------------------
else if ( child.type == 'Line') {
// Parsing the extrusion and the Layer of the curve
try {
var nLayer = parseInt( child.userData.attributes.layerIndex) - nStartLayer ;
if ( nLayer < 0)
return false ;
var points_array = child.geometry.attributes.position.array ;
//var ptPrec ;
const shape = new THREE.Shape() ;
for ( var v = 0 ; v < points_array.length ; v += 3) {
var Zact ;
var vtCoord = new THREE.Vector4( points_array[v], points_array[v+1], points_array[v+2], 1) ;
vtCoord.applyMatrix4( Mat_GlobToLoc) ;
//if ( v != 0 && v < points_array.length - 3 &&
// (( vtCoord.x - ptPrec.x) * ( vtCoord.x - ptPrec.x) +
// ( vtCoord.y - ptPrec.y) * ( vtCoord.y - ptPrec.y) +
// ( vtCoord.z - ptPrec.z) * ( vtCoord.z - ptPrec.z)) < 10)
// continue ;
if ( v == 0) {
shape.moveTo( vtCoord.x, vtCoord.y) ;
Zact = vtCoord.z ;
}
else
shape.lineTo( vtCoord.x, vtCoord.y) ;
//ptPrec = new THREE.Vector4( vtCoord.x, vtCoord.y, vtCoord.z, 1) ;
}
var cCol = child.material.color.clone() ;
if ( nLayer%2 == 0) {
cCol.lerp( new THREE.Color( 0x000000 ), 0.25) ;
}
const geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings) ;
const material = new THREE.MeshLambertMaterial({ color: cCol,
wireframe : false,
shadowSide : THREE.DoubleSide}) ;
const mesh = new THREE.Mesh( geometry, material) ;
mesh.translateZ( Zact) ;
//mesh.applyMatrix4( Mat_LocToGlob) ;
//mesh.applyMatrix4( Mat_ThreeJs_Frame) ;
mesh.applyMatrix4( Mat_ToScene) ;
mesh.nLayer = nLayer ;
mesh.isArrow = false ;
layer_list.push( mesh) ;
} catch( err) {
console.log( ' Not a valid Layer for paths') ;
return false ;
}
}
// READING ARROW'S MESH
else if ( child.type == 'Mesh') {
try {
if ( child.name != 'Arrow') {
//console.log( 'Not a valid Arrow direction') ;
//return false ;
child.nLayer = 1 ;
layer_list.push( child) ;
continue ;
}
var nLayer = parseInt( child.userData.attributes.layerIndex) - nStartLayer ;
if ( nLayer < 0)
return false ;
child.isArrow = true ;
child.applyMatrix4( Mat_ThreeJs_Frame) ;
child.nLayer = nLayer ;
child.material.color = new THREE.Color( 0xff0000) ;
layer_list.push( child) ;
} catch( e) {
console.log( 'Not a valid Arrow direction') ;
return false ;
}
}
// READING OTHER ENTITY --------------------
else
continue ;
for (var i = 0; i < layer_list.length; ++i) {
const Objbox = new THREE.Box3().setFromObject(layer_list[i]);
GLBox3D.union(Objbox);
layer_list[i].children[0].material.side = THREE.DoubleSide;
if (typeof layer_list[i].children[0].nLayer !== "undefined") {
scene.add(layer_list[i]);
}
AdaptSeceneToContest() ;
console.log(new Date()) ;
}) ;
let endTime = performance.now();
let timeElapsed = endTime - startTime;
console.log('init3dm in : ' + timeElapsed)
}, 0)
})
}
function refreshElement(nStart, nEnd) {
//console.log(parseInt(nStart));
m_nStartL = nStart;
m_nEndL = nEnd;
if(fileType == "3DM"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( parseInt( layer_list[i].nLayer) >= nStart &&
parseInt( layer_list[i].nLayer) <= nEnd) {
if ( layer_list[i].isArrow)
layer_list[i].visible = m_bShowDir ;
else
layer_list[i].visible = true ;
}
else {
layer_list[i].visible = false ;
}
}
}
else if (fileType == "3MF"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( parseInt( layer_list[i].children[0].nLayer) >= nStart &&
parseInt( layer_list[i].children[0].nLayer) <= nEnd) {
if ( layer_list[i].children[0].isArrow)
layer_list[i].visible = m_bShowDir ;
else
layer_list[i].visible = true ;
}
else {
layer_list[i].visible = false ;
}
}
}
const BoxHelper = new THREE.Box3Helper(GLBox3D, 0xffff00);
// setting camera position
const vtCenter = new THREE.Vector3(0, 0, 0);
GLBox3D.getCenter(vtCenter);
const vtPosition = vtCenter.clone().multiplyScalar(5);
const vtBoxDim = new THREE.Vector3(0, 0, 0);
GLBox3D.getSize(vtBoxDim);
render();
}
function AdaptSeceneToContest() {
scene = new THREE.Scene();
scene.background = new THREE.Color( 0xa0a0a0) ;
// Global Box ----------
if(fileType == "3DM"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
const Objbox = new THREE.Box3().setFromObject( layer_list[i]);
GLBox3D.union( Objbox) ;
layer_list[i].material.side = THREE.DoubleSide ;
layer_list[i].castShadow = true
if ( ! layer_list[i].isArrow || m_bShowPrintDir)
scene.add( layer_list[i]) ;
}
}
else if(fileType == "3MF"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( layer_list[i].children[0].type == 'Mesh') {
const Objbox = new THREE.Box3().setFromObject( layer_list[i]);
GLBox3D.union( Objbox) ;
layer_list[i].children[0].material.side = THREE.DoubleSide ;
if ( typeof layer_list[i].children[0].nLayer !== "undefined") {
if ( parseInt( layer_list[i].children[0].nLayer)%2 == 0)
layer_list[i].children[0].material.color.lerp( new THREE.Color( 0x000000 ), 0.25) ;
layer_list[i].children[0].isArrow = ( layer_list[i].children[0].name == 'Arrow')
scene.add( layer_list[i]) ;
}
}
else if ( layer_list[i].type == 'Vector3')
ORIG = layer_list[i].children[0].clone() ;
}
}
const vtCenter = new THREE.Vector3( 0, 0, 0) ;
GLBox3D.getCenter( vtCenter) ;
const vtPosition = vtCenter.clone().multiplyScalar( 5) ;
const vtBoxDim = new THREE.Vector3( 0, 0, 0) ;
// camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 30000);
// camera.position.set(2 * vtBoxDim.x, 2 * vtBoxDim.y, 2 * vtBoxDim.z);
// camera.lookAt(vtCenter.x, vtCenter.y, vtCenter.z);
// scene.add(camera);
perspectiveCamera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 300000 );
//perspectiveCamera.up = new THREE.Vector3( 0, 0, 1) ;
// orthographic and perspective camera ------
perspectiveCamera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 10, 300000 ) ;
orthographicCamera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2,
window.innerHeight / 2, window.innerHeight / - 2,
-300000, 300000) ;
//orthographicCamera.up = new THREE.Vector3( 0, 0, 1) ;
-300000, 300000) ;
if ( ! m_bIsOrtographic)
activeCamera = perspectiveCamera ;
else
@@ -261,17 +515,15 @@ function AdaptSceneToContest() {
activeCamera.position.set( 2 * vtBoxDim.x, 2 * vtBoxDim.y, 2 * vtBoxDim.z) ;
activeCamera.lookAt( vtCenter.x, vtCenter.y, vtCenter.z) ;
scene.add( activeCamera) ;
const hemiLight = new THREE.HemisphereLight(0xffffff, 0x8d8d8d);
hemiLight.position.set(vtCenter.x, vtCenter.y + 2 * vtBoxDim.y, vtCenter.z);
scene.add(hemiLight);
var HemisphereLightHelper = new THREE.Mesh(new THREE.SphereGeometry(15, 30, 15),
new THREE.MeshStandardMaterial({ color: 0xffffff, emissive: 0x404040 }));
HemisphereLightHelper.position.set(vtCenter.x, vtCenter.y + 2 * vtBoxDim.y, vtCenter.z);
const dirLight = new THREE.DirectionalLight(0xffffff);
dirLight.position.set(vtPosition.x, vtPosition.y, vtPosition.z);
// Hemisphere light --------
const hemiLight = new THREE.HemisphereLight( 0xffffff, 0x8d8d8d );
hemiLight.position.set( vtCenter.x, vtCenter.y + 2 * vtBoxDim.y, vtCenter.z);
scene.add( hemiLight );
// direction light --------
const dirLight = new THREE.DirectionalLight( 0xffffff );
dirLight.position.set( vtPosition.x, vtPosition.y, vtPosition.z);
dirLight.castShadow = true;
dirLight.shadow.camera.top = 50;
dirLight.shadow.camera.bottom = - 25;
@@ -279,140 +531,99 @@ function AdaptSceneToContest() {
dirLight.shadow.camera.right = 25;
dirLight.shadow.camera.near = 0.1;
dirLight.shadow.camera.far = 200;
dirLight.shadow.mapSize.set(1024, 1024);
scene.add(dirLight);
const DirLighthelper = new THREE.DirectionalLightHelper(dirLight, 100);
const ground = new THREE.Mesh(new THREE.PlaneGeometry(10000, 10000),
new THREE.MeshPhongMaterial({ color: 0x36454F, depthWrite: true, }));
ground.rotation.x = - Math.PI / 2;
ground.position.y = -0.5;
ground.receiveShadow = true;
ground.material.opacity = 0.25;
ground.material.transparent = true;
ground.material.side = THREE.DoubleSide;
//scene.add( ground);
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
var container = document.getElementById('WebGL-3mfExport');
container.style.height = '100%';
container.style.width = '100%';
renderer.setSize(m_divStartDimX, m_divStartDimY);
dirLight.shadow.mapSize.set( 1024, 1024 );
scene.add( dirLight );
// render settings ---------
renderer = new THREE.WebGLRenderer( { antialias: true });
renderer.setPixelRatio( window.devicePixelRatio );
var container = document.getElementById( 'WebGL-Export') ;
container.style.height = m_divStartDimY + "px";
container.style.width = m_divStartDimX + "px";
document.body.appendChild( container );
renderer.setSize( m_divStartDimX, m_divStartDimY) ;
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.shadowMap.type = THREE.PCFSoftShadowMap ;
container.appendChild( renderer.domElement) ;
var cont = document.getElementById('spinContainer');
container.removeChild(cont);
container.appendChild(renderer.domElement);
// orbit controls -------
controls = new OrbitControls( activeCamera, renderer.domElement );
controls.addEventListener( 'change', render );
controls.update() ;
//var cont = document.getElementById('spinContainer');
//container.removeChild(cont);
// Orig conversion -----
if(fileType == "3DM"){
controls = new OrbitControls(activeCamera, renderer.domElement);
controls.addEventListener('change', render);
controls.update();
window.addEventListener('resize', onWindowResize);
// calcolo origine
const points_array = [ new THREE.Vector3( 0, 0, 0)] ;
var ORIG_Geometry = new THREE.BufferGeometry() ;
ORIG_Geometry.setFromPoints( points_array) ;
var ORIG_Material = new THREE.PointsMaterial({ size: 5, sizeAttenuation : true, color : new THREE.Color( 0x000000)});
ORIG = new THREE.Points( ORIG_Geometry, ORIG_Material) ;
SetOrig( ORIG) ;
// creazione sistema di riferimento nell'origine
const axesHelper = new THREE.AxesHelper( 75 ) ;
axesHelper.rotation.set( -Math.PI/2, 0 ,0) ;
axesHelper.position.set( ORIG.position.x, ORIG.position.y, ORIG.position.z) ;
scene.add( axesHelper );
// creazione della griglia (V1 = finita, V2 = infinita)
const size = 1000000 ;
const divisions = 10000 ;
if ( ! m_bGrid_v1) {
// GRIGLIA INFINITA
const gridHelper = new THREE.GridHelper( size, divisions) ;
gridHelper.position.set( ORIG.position.x, ORIG.position.y, ORIG.position.z) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.25 ;
setFog() ;
scene.add( gridHelper) ;
}
else {
// GRIGLIA FINITA
// prendo dimensione del Box
var dDimX = Math.abs( GLBox3D.max.x - GLBox3D.min.x) ;
var dDimY = Math.abs( GLBox3D.max.y - GLBox3D.min.y) ;
var dDimZ = Math.abs( GLBox3D.max.z - GLBox3D.min.z) ;
var dDim = 1.5 * Math.sqrt( dDimX * dDimX + dDimY * dDimY + dDimZ * dDimZ) ;
const gridHelper = new THREE.GridHelper( dDim, Math.ceil( 0.1 * dDim)) ;
gridHelper.position.set( ORIG.position.x + 0.5 * dDim , ORIG.position.y, ORIG.position.z - 0.5 * dDim) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.45 ;
scene.add( gridHelper) ;
}
render();
// TEST ===================================
setCameraZoom(m_bZoom);
setCameraPan(m_bPan);
setCameraRot(m_bRot);
setCameraAutoRot(m_bAutoRot);
SetCameraPos( m_nCameraStartPos, ORIG) ;
// =========================================
//console.log('aggiunto 1');
}
function refreshElement(nStart, nEnd) {
//console.log(parseInt(nStart));
for (var i = 0; i < layer_list.length; ++i) {
if (parseInt(layer_list[i].children[0].nLayer) >= parseInt(nStart) &&
parseInt(layer_list[i].children[0].nLayer) <= parseInt(nEnd)) {
layer_list[i].visible = true;
}
else {
layer_list[i].visible = false;
}
const points_array = [ new THREE.Vector3( ORIG.x, ORIG.y, ORIG.z)] ;
var ORIG_Geometry = new THREE.BufferGeometry() ;
ORIG_Geometry.setFromPoints( points_array) ;
var ORIG_Material = new THREE.PointsMaterial({ size: 5, sizeAttenuation : true, color : new THREE.Color( 0x000000)}) ;
var ptORIG = new THREE.Points( ORIG_Geometry, ORIG_Material) ;
ptORIG.position.x = ORIG.x ;
ptORIG.position.y = ORIG.y ;
ptORIG.position.z = ORIG.z ;
}
render();
else if(fileType == "3MF"){
const points_array = [ new THREE.Vector3( 0, 0, 0)] ;
var ORIG_Geometry = new THREE.BufferGeometry() ;
ORIG_Geometry.setFromPoints( points_array) ;
var ORIG_Material = new THREE.PointsMaterial({ size: 5, sizeAttenuation : true, color : new THREE.Color( 0x000000)});
var ptORIG = new THREE.Points( ORIG_Geometry, ORIG_Material) ;
ptORIG.position.x = ORIG.x ;
ptORIG.position.y = ORIG.z ;
ptORIG.position.z = - ORIG.y ;
}
// inputs --------------
setCameraZoom( m_bZoom) ;
setCameraPan( m_bPan) ;
setCameraRot( m_bRot) ;
SetCameraPos( m_nCameraStartPos, ORIG) ;
// Frame
AddFrame( ptORIG) ;
// Grid
AddGrid( ptORIG) ;
// render
render() ;
}
// Utility functions
function onWindowResize() {
}
function render() {
renderer.render(scene, activeCamera);
renderer.render( scene, activeCamera) ;
}
function SetOrig( ORIG) {
// qui in qualche modo imposto l'origine, ora impostata secondo il BozHelper
// ---- codice da cambiare
var posX = GLBox3D.min.x - 0.3 * ( GLBox3D.max.x - GLBox3D.min.x) ;
var posY = 0 ;
var posZ = GLBox3D.min.z + 1.3 * ( GLBox3D.max.z - GLBox3D.min.z) ;
//ORIG.geometry.translate( posX, posY, posZ) ;
ORIG.position.set( posX, posY, posZ) ;
// -----------------------
//scene.add( ORIG) ;
}
function setCameraZoom( bZoom) {
controls.enableZoom = bZoom ;
}
function setCameraZoom(bZoom) {
controls.enableZoom = bZoom;
function setCameraPan( bPan) {
controls.enablePan = bPan ;
}
function setCameraPan(bPan) {
controls.enablePan = bPan;
function setCameraRot( bRot) {
controls.enableRotate = bRot ;
}
function setCameraRot(bRot) {
controls.enableRotate = bRot;
}
function setCameraAutoRot(bAutoRot) {
controls.autoRotate = bAutoRot;
}
function SetCameraPos( nPos, ORIG) {
var nTraslFactor = 3.5 ;
function SetCameraPos( nPos, ptORIG) {
var nTraslFactor = 20 ;
var x ; var y ; var z ;
y = GLBox3D.max.y ; // fixed
switch( nPos) {
@@ -449,8 +660,8 @@ function SetCameraPos( nPos, ORIG) {
z = GLBox3D.min.z ;
break ;
case 8 : // optimal
x = ( ORIG.position.x + 1.0 * Math.abs( GLBox3D.max.x - GLBox3D.min.x)) ;
z = ( ORIG.position.z + 1.0 * Math.abs( GLBox3D.max.z - GLBox3D.min.z)) ;
x = ( ORIG.x + 1.0 * Math.abs( GLBox3D.max.x - GLBox3D.min.x)) ;
z = ( ORIG.z + 1.0 * Math.abs( GLBox3D.max.z - GLBox3D.min.z)) ;
break ;
default :
return ;
@@ -460,29 +671,146 @@ function SetCameraPos( nPos, ORIG) {
const vtCenter = new THREE.Vector3( 0, 0, 0) ; GLBox3D.getCenter( vtCenter) ;
var vtDirOut = new THREE.Vector3( vtPos.x - vtCenter.x, vtPos.y - vtCenter.y, vtPos.z - vtCenter.z) ;
vtDirOut.x *= nTraslFactor ; vtDirOut.y *= nTraslFactor ; vtDirOut.z *= nTraslFactor ;
//vtDirOut *= nTraslFactor ;
//x *= nTraslFactor ;
//y *= nTraslFactor ;
//z *= nTraslFactor ;
activeCamera.position.set( x + vtDirOut.x, y + vtDirOut.y, z + vtDirOut.z) ;
controls.target.set( vtCenter.x, vtCenter.y, vtCenter.z) ;
console.log( controls) ;
controls.minZoom = 0.25 ;
controls.maxDistance = 1.1 * activeCamera.position.distanceTo( controls.target) ;
controls.update() ;
}
function SetOrig( ORIG) {
// qui in qualche modo imposto l'origine, ora impostata secondo il BozHelper
// ---- codice da cambiare
var posX = GLBox3D.min.x - 0.3 * ( GLBox3D.max.x - GLBox3D.min.x) ;
var posY = 0 ;
var posZ = GLBox3D.min.z + 1.3 * ( GLBox3D.max.z - GLBox3D.min.z) ;
//ORIG.geometry.translate( posX, posY, posZ) ;
ORIG.position.set( posX, posY, posZ) ;
// -----------------------
//scene.add( ORIG) ;
function toggleCamera( perspectiveCamera, orthographicCamera) {
var cameraPosition = activeCamera.position.clone() ;
var cameraMatrix = activeCamera.matrix.clone() ;
var ControlsTarget = controls.target.clone() ;
var ControlsPosition = controls.position0.clone() ;
if ( m_bIsOrtographic == true) {
m_bIsOrtographic = false ;
activeCamera = perspectiveCamera ;
activeCamera.position.copy( cameraPosition) ;
activeCamera.matrix.copy( cameraMatrix) ;
} else {
m_bIsOrtographic = true ;
activeCamera = orthographicCamera ;
activeCamera.position.copy( cameraPosition) ;
activeCamera.matrix.copy( cameraMatrix) ;
}
activeCamera.updateProjectionMatrix() ;
controls.object = activeCamera ;
controls.target = ControlsTarget ;
controls.position0 = ControlsPosition ;
controls.update() ;
render() ;
}
function AddFrame( ptORIG) {
if ( ! m_bShowFrame)
return ;
if ( m_bFrameType == 0) {
const axesHelper = new THREE.AxesHelper( m_lFrameLen) ;
axesHelper.rotation.set( -Math.PI/2, 0 , 0) ;
axesHelper.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
scene.add( axesHelper ) ;
}
else if ( m_bFrameType == 1) {
var vtDirs = [ new THREE.Vector3( 1, 0, 0), new THREE.Vector3( 0, 0, -1), new THREE.Vector3( 0, 1, 0)] ;
var vtCols = [ new THREE.Color( 0xff0000), new THREE.Color( 0x00ff00), new THREE.Color( 0x0000ff)] ;
var vtORIG = new THREE.Vector3( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
for ( var i = 0 ; i < 3 ; ++ i) {
const arrowHelper = new THREE.ArrowHelper( vtDirs[i], vtORIG, m_lFrameLen, vtCols[i]) ;
scene.add( arrowHelper ) ;
}
}
else if ( m_bFrameType == 2) {
var vtCols = [ new THREE.Color( 0x0000ff), new THREE.Color( 0xff0000), new THREE.Color( 0x00ff00)] ;
for ( var i = 0 ; i < 3 ; ++ i) {
// cylinder ----
const fr_geometry_cyl = new THREE.CylinderGeometry( m_dFrameFat, m_dFrameFat, 0.8 * m_lFrameLen, 32) ;
const fr_material = new THREE.MeshBasicMaterial({color: vtCols[i]}) ;
const fr_cylinder = new THREE.Mesh( fr_geometry_cyl, fr_material) ;
fr_cylinder.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
if ( i == 1)
fr_cylinder.rotation.set( 0, 0, -Math.PI/2) ;
if ( i == 2)
fr_cylinder.rotation.set( -Math.PI/2, 0, 0) ;
scene.add( fr_cylinder) ;
fr_cylinder.translateY( 0.4 * m_lFrameLen) ;
// pyramid
const fr_geometry_cone = new THREE.CylinderGeometry( 0, 2 * m_dFrameFat, 0.2 * m_lFrameLen, 32) ;
const fr_cone = new THREE.Mesh( fr_geometry_cone, fr_material) ;
fr_cone.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
if ( i == 1)
fr_cone.rotation.set( 0, 0, -Math.PI/2) ;
if ( i == 2)
fr_cone.rotation.set( -Math.PI/2, 0, 0) ;
scene.add( fr_cone) ;
fr_cone.translateY( 0.9 * m_lFrameLen) ;
}
// Origin
const fr_orig_geometry = new THREE.SphereGeometry( 2 * m_dFrameFat, 32, 16) ;
const fr_orig_material = new THREE.MeshBasicMaterial( {color: 0x00000}) ;
const fr_sphere = new THREE.Mesh( fr_orig_geometry, fr_orig_material) ;
fr_sphere.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
scene.add( fr_sphere) ;
}
else
console.log( 'Frame type not defined') ;
}
function AddGrid( ptORIG) {
if ( ! m_bShowGrid)
return ;
const size = 1000000 ;
const divisions = 10000 ;
if ( m_bInfGrid) {
const gridHelper = new THREE.GridHelper( size, divisions) ;
gridHelper.position.set( ptORIG.position.x, ptORIG.position.y, ptORIG.position.z) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.25 ;
setFog() ;
scene.add( gridHelper) ;
}
else {
var dDimX = Math.abs( GLBox3D.max.x - GLBox3D.min.x) ;
var dDimY = Math.abs( GLBox3D.max.y - GLBox3D.min.y) ;
var dDimZ = Math.abs( GLBox3D.max.z - GLBox3D.min.z) ;
var dDim = 1.5 * Math.sqrt( dDimX * dDimX + dDimY * dDimY + dDimZ * dDimZ) ;
const gridHelper = new THREE.GridHelper( dDim, Math.ceil( 0.1 * dDim)) ;
gridHelper.position.set( ptORIG.position.x + 0.5 * dDim , ptORIG.position.y, ptORIG.position.z - 0.5 * dDim) ;
gridHelper.material.transparent = true ;
gridHelper.material.opacity = 0.45 ;
scene.add( gridHelper) ;
}
}
function ShowPrintDir(showDir){
console.log(showDir);
m_bShowDir = showDir;
if(fileType == "3DM"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( layer_list[i].isArrow) {
if ( layer_list[i].nLayer >= m_nStartL &&
layer_list[i].nLayer <= m_nEndL)
layer_list[i].visible = m_bShowDir ;
else
layer_list[i].visible = false ;
}
}
}
else if(fileType == "3MF"){
for ( var i = 0 ; i < layer_list.length ; ++ i) {
if ( layer_list[i].children[0].isArrow) {
if ( parseInt( layer_list[i].children[0].nLayer) >= m_nStartL &&
parseInt( layer_list[i].children[0].nLayer) <= m_nEndL)
layer_list[i].visible = m_bShowDir ;
else
layer_list[i].visible = false ;
}
}
}
render() ;
}
function setFog() {
var dNear = GLBox3D.max.x + 3 * ( GLBox3D.max.x - GLBox3D.min.x) ;
var dFar = 10000 ;
scene.fog = new THREE.Fog( 0xa0a0a0, 20000, 30000);
}
File diff suppressed because it is too large Load Diff
+83 -6
View File
@@ -11,6 +11,8 @@ import {
Loader,
Matrix4,
Mesh,
Vector3,
Object3D,
MeshPhongMaterial,
MeshStandardMaterial,
MirroredRepeatWrapping,
@@ -264,12 +266,15 @@ class ThreeMFLoader extends Loader {
'LicenseTerms',
'Rating',
'CreationDate',
'ModificationDate'
'ModificationDate',
'customXMLNS0:Orig'
];
if ( 0 <= validNames.indexOf( name ) ) {
metadataData[ name ] = metadataNode.textContent;
if ( validNames.indexOf( name ) != 8)
metadataData[ name ] = metadataNode.textContent;
else
metadataData['Orig'] = metadataNode.textContent;
}
@@ -514,6 +519,49 @@ class ThreeMFLoader extends Loader {
return components;
}
function parsemetadatagroupNode( componentsNode ) {
const componentNodes = componentsNode.querySelectorAll( 'metadata' ) ;
var sSliceNumber = '' ;
if ( componentNodes ) {
for ( var i = 0 ; i < componentNodes.length ; ++ i) {
const singleComponentNode = componentNodes[i] ;
if ( singleComponentNode ) {
const singleComponentNodeouterHTML = singleComponentNode['outerHTML'] ;
if ( singleComponentNodeouterHTML) {
if ( singleComponentNodeouterHTML.includes( 'SliceNbr')) {
sSliceNumber = singleComponentNode['textContent'] ;
if ( sSliceNumber ) {
return sSliceNumber ;
}
}
}
}
}
}
}
function parseComponentNode( componentNode ) {
@@ -615,6 +663,14 @@ class ThreeMFLoader extends Loader {
objectData[ 'mesh' ] = parseMeshNode( meshNode );
}
const metadatagroupNode = objectNode.querySelector( 'metadatagroup' ) ;
if ( metadatagroupNode ) {
objectData[ 'SliceNbr' ] = parsemetadatagroupNode( metadatagroupNode );
}
const componentsNode = objectNode.querySelector( 'components' );
@@ -1056,7 +1112,7 @@ class ThreeMFLoader extends Loader {
// mesh
const mesh = new Mesh( geometry, material );
mesh.nLayer = objectData.partnumber ;
mesh.nLayer = objectData.SliceNbr ;
return mesh;
@@ -1131,8 +1187,7 @@ class ThreeMFLoader extends Loader {
for ( let i = 0; i < meshes.length; i ++ ) {
meshes[ i ].name = objectData.name;
meshes[ i ].nLayer = objectData.partnumber ;
meshes[ i ].nLayer = objectData.SliceNbr ;
}
}
@@ -1457,6 +1512,28 @@ class ThreeMFLoader extends Loader {
group.add( object3D );
}
// parsing orig point
try {
const sPoint = Object.entries( data3mf.model)[0][1].metadata.Orig ;
if ( sPoint != "" ) {
let sPoint_arr = sPoint.split(',') ;
if ( sPoint_arr.length == 3) {
var dPoint_x = parseFloat( sPoint_arr[0]) ;
var dPoint_y = parseFloat( sPoint_arr[1]) ;
var dPoint_z = parseFloat( sPoint_arr[2]) ;
var vtORIG = new Vector3( dPoint_x, dPoint_y, dPoint_z) ;
var Orig_group = new Group() ;
Orig_group.name = 'ORIG' ;
Orig_group.type = 'Vector3' ;
Orig_group.children.push( vtORIG) ;
group.add( Orig_group) ;
}
}
}
catch( e) {
console.log( 'Missing origin') ;
}
return group;