Merge branch 'develop'
This commit is contained in:
@@ -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
@@ -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": {
|
||||
|
||||
@@ -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%",
|
||||
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
+347
-169
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user