Files
EgtExchange/ExportThreeJS.cpp
T
riccardo.elitropi b2e6005700 EgtExchange :
- esportazione con menu e file geometrie separati
2022-08-25 09:26:24 +02:00

1510 lines
86 KiB
C++

//----------------------------------------------------------------------------
// EgalWare 2022-2022
//----------------------------------------------------------------------------
// File : ExportThreeJS.cpp Data : 05.07.22 Versione : 1.5h2
// Contenuto : Implementazione della classe per l'esportazione in formato html (javascript).
//
//
//
// Modifiche : 21.07.22 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "ExportThreeJS.h"
#include "DllMain.h"
#include "/EgtDev/Include/EExDllMain.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkGdbIterator.h"
#include "/EgtDev/Include/EGnStringUtils.h"
#include "/EgtDev/Include/SELkKeyProc.h"
#include "/EgtDev/Include/EgtKeyCodes.h"
#include "/EgtDev/Include/EgtStringConverter.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
#include <fstream>
#include "/EgtDev/Include/EGkGeoVector3d.h"
#include "/EgtDev/Include/EGkCurveLine.h"
#include "/EgtDev/Include/EGkGeoPoint3d.h"
#include "/EgtDev/Include/EGKCurve.h"
#include "/EgtDev/Include/EGkGeoConst.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EGkSurfBezier.h"
#include "/EgtDev/Include/EGkGeoFrame3d.h"
#include "/EgtDev/Include/EGkFrame3d.h"
#include "/EgtDev/Include/EGkExtDimension.h"
#include "/EgtDev/Include/EGrScene.h"
#include "/EgtDev/Include/EGkCurveComposite.h"
using namespace std ;
//----------------------------------------------------------------------------
IExportThreeJS*
CreateExportThreeJS( void)
{
// verifico la chiave e le opzioni
if ( ! GetEExNetHwKey() && ! TestKeyForEEx( GetEExKey(), KEYOPT_EEX_EXPBASE, GetEExLogger()))
return nullptr ;
// creo l'oggetto
return static_cast<IExportThreeJS*> ( new( nothrow) ExportThreeJS) ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::SetOptions( int nFilter)
{
m_nFilter = nFilter ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, const string& sFileM, IEGrScene* pScene)
{
// verifico il DB geometrico
if ( pGDB == nullptr) {
LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on GeomDB")
return false ;
}
// verifico l'Id dell'oggetto da esportare
if ( ! pGDB->ExistsObj( nId)) {
LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on Id")
return false ;
}
// creo il frame
m_frTHREEJSFrame.Set( ORIG, Y_AX, Z_AX, X_AX) ;
// apro il file di testo in scrittura
m_Writer.Close() ;
if ( ! m_Writer.Init( sFile)) {
LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on open file")
return false ;
}
// apro il file di testo in scrittura
m_WriterM.Close() ;
if ( ! m_WriterM.Init( sFileM)) {
LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on open file")
return false ;
}
// prelevo il Box3D globale (per ingombro e punto luce)
BBox3d b3Globbox ;
pGDB->GetGlobalBBox( nId, b3Globbox, BBF_ONLY_VISIBLE) ;
b3Globbox.GetMinDim( m_ptMin, m_dimX, m_dimY, m_dimZ) ;
// m_dScala = max( m_dimX, m_dimY, m_dimZ) / 200 ;
m_ptMin.ToLoc( m_frTHREEJSFrame) ;
// creazione parte iniziale della pagina html
bool bOk = HeadAmbient( pScene, pGDB, nId) ;
// creo un iteratore
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( pGDB)) ;
if ( IsNull( pIter))
return false ;
pIter->GoTo( nId) ;
// esporto l'oggetto e i suoi eventuali figli
bOk = ExportObject( *pIter, pGDB, m_nGroupCount) ;
// fine creazione menù con elementi globali
m_Writer.OutText( " groupRoot.add(group0)");
// creazione parte finale della pagina html
bOk = FinishAmbient() ;
// chiudo il file
if ( ! m_Writer.Close())
bOk = false ;
if (! m_WriterM.Close())
bOk = false ;
return bOk;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
{
// ================================================================
// CREAZIONE PARTE INIZIALE DELLA SCENA ===========================
// ================================================================
// prelevo le impostazioni della camera da EGTCAM5
pScene->GetOrthoCamParam( &m_dHalfWidth, &m_dHalfHeight, &m_ZNear, &m_ZFar) ;
m_ptCenter = pScene->GetCenter() ;
double dAngVertDeg, dAngOrizzDeg, dDist ;
pScene->GetCamera( &dAngVertDeg, &dAngOrizzDeg, &dDist) ;
Vector3d vtDirCamera = FromSpherical( 1, dAngVertDeg, dAngOrizzDeg) ;
m_ptCamera = m_ptCenter + dDist * vtDirCamera;
m_dDistance = dDist ;
// prelevo i parametri della griglia
double dSnapStep ;
int nExtStep ;
pScene->GetGridParam( &dSnapStep, &nExtStep) ;
// scrittura parte iniziale del codice e librerie
m_Writer.OutText( "<!DOCTYPE html>") ;
m_Writer.OutText( "<html>") ;
m_Writer.OutText( " <head>") ;
// librerie
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/three.js'></script>") ; <---- original
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/OrbitControls.js'></script>") ; <--- original
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/dat.gui.js'></script>") ; <--- original
// stile
m_Writer.OutText( " <style>") ;
m_Writer.OutText( " body{") ;
m_Writer.OutText( " margin : 0;") ;
m_Writer.OutText( " overflow: hidden;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " .obit-controls-gizmo{") ;
m_Writer.OutText( " position: absolute;") ;
m_Writer.OutText( " bottom: 2em;") ;
m_Writer.OutText( " right: 2em;") ;
m_Writer.OutText( " z-index: 1000;") ;
m_Writer.OutText( " background-color: #FFF0;") ;
m_Writer.OutText( " border-radius: 100%;") ;
m_Writer.OutText( " transition: background-color .15s linear;") ;
m_Writer.OutText( " cursor: pointer;") ;
m_Writer.OutText( " touch-action: none;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " .obit-controls-gizmo.dragging, .obit-controls-gizmo:hover{") ;
m_Writer.OutText( " background-color: #FFF3;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " .obit-controls-gizmo.inactive{") ;
m_Writer.OutText( " pointer-events: none;") ;
m_Writer.OutText( " background-color: #FFF0 !important;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " </style>") ;
// librerie (non moduli)
m_Writer.OutText( " <script type = 'text/javascript' src = './Lib/jquery.js'></script>") ; //jquery
m_Writer.OutText( " <script type = 'text/javascript' src = './Lib/Controls/dat.gui.js'></script>") ; //datGui
m_Writer.OutText( " </head>") ;
// body
m_Writer.OutText( " <body>") ;
m_Writer.OutText( " <div id='WebGL-output'>") ;
//m_Writer.OutText( "<div syle='position:absolute' id='zoom_test'></div>"); // div di aiuto per controllo parametri telecamera, zoom
m_Writer.OutText( " </div>") ;
// --- m_Writer.OutText( " <script type='text/javascript'>") ; <----------- original
m_Writer.OutText( " <script type='module'>");
m_Writer.OutText( " import * as THREE from './Lib/three.module.js';") ; // modulo THREEJS
m_Writer.OutText( " import { OrbitControls } from './Lib/Controls/orbitControlsM.js';") ; // modulo Controllo telecamera
m_Writer.OutText( " import { OrbitControlsGizmo } from './Lib/Controls/OrbitControlsGizmo.js';") ; // modulo Controllo assi GIZMO
// variabili globali per script javascript
m_Writer.OutText( " var camera;") ;
m_Writer.OutText( " var scene;") ;
m_Writer.OutText( " var renderer;") ;
m_Writer.OutText( " var zoom = 1;") ;
m_Writer.OutText( " var groupRoot = new THREE.Group();");
m_Writer.OutText( " var list_of_groups = [];") ;
m_Writer.OutText( " var first = true;") ;
m_Writer.OutText( " var LastGroupSelected = null;") ;
m_Writer.OutText( " var trovato = false;") ;
// funzione init() -> funzione principale che viene richiamata per la creazione della scena e dei suoi oggetti
m_Writer.OutText( " function init() { ") ;
// codice per scena, telecamera e render
m_Writer.OutText( " scene = new THREE.Scene();") ;
// imposto telecamera ortografica (posizione, punto di focus, posizione piani di clipping e definizione della zona di viewing frustum
m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_ZNear) + ", " + ToString( m_ZFar) + ");") ;
m_Writer.OutText( " camera.position.x = " + ToString( m_ptCamera.y) + "; camera.position.y = " + ToString( m_ptCamera.z) + "; camera.position.z = " + ToString( m_ptCamera.x) + "; ") ;
m_Writer.OutText( " var dist = camera.position.distanceTo(new THREE.Vector3(0,0,0)); // per Gizmo") ; // per Gizmo
m_Writer.OutText( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ;
m_Writer.OutText( " scene.add(camera)") ;
// impostazioni del render della scena
m_Writer.OutText( " renderer = new THREE.WebGLRenderer({ antialias: true, alpha:true, transparent: true });") ;
m_Writer.OutText( " renderer.setClearColor(new THREE.Color(0xD3D3D3));") ;
m_Writer.OutText( " renderer.setPixelRatio( window.devicePixelRatio );") ;
m_Writer.OutText( " renderer.toneMapping = THREE.ACESFilmicToneMapping;") ;
m_Writer.OutText( " if (window.screen.width > window.screen.height) {") ;
m_Writer.OutText( " renderer.setSize(window.screen.width, window.screen.height);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else {") ;
m_Writer.OutText( " renderer.setSize(window.screen.height, window.screen.width);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " renderer.shadowMapEnabled = true;") ;
m_Writer.OutText( " renderer.sortObjects = false;") ;
// punti luce
double dResult = sqrt(( m_ptMin.x + ( m_dimX * 2)) * ( m_ptMin.x + ( m_dimX * 2)) + ( m_ptMin.y + ( m_dimY * 2)) * ( m_ptMin.y + ( m_dimY * 2)) + ( m_ptMin.z + ( m_dimZ * 2)) * ( m_ptMin.z + ( m_dimZ * 2))) ;
m_Writer.OutText( " var spotLight1 = new THREE.SpotLight(0xFFFFFF);") ;
m_Writer.OutText( " spotLight1.position.set(" + ToString( m_ptMin.x + ( m_dimX * 2)) + ", " + ToString( m_ptMin.y + ( m_dimY * 2)) + ", " + ToString(( m_ptMin.z + ( m_dimZ*2))) + ");") ;
m_Writer.OutText( " spotLight1.intensity = 0.6;") ;
m_Writer.OutText( " spotLight1.angle = Math.PI/4;") ;
m_Writer.OutText( " spotLight1.distance = " + ToString( dResult) + "*2.5;") ;
m_Writer.OutText( " spotLight1.castShadow = true;") ;
m_Writer.OutText( " scene.add(spotLight1);") ;
// punto luce helper
// m_Writer.OutText( "const spotLightHelper1 = new THREE.SpotLightHelper( spotLight1 );") ;
// m_Writer.OutText( "scene.add( spotLightHelper1 );") ;
// ambiente
m_Writer.OutText( " var ambientLight = new THREE.AmbientLight(0x4d4d4d);") ;
m_Writer.OutText( " ambientLight.intensity = 1.25;") ;
m_Writer.OutText( " scene.add(ambientLight); ") ;
// codice per disegno griglia
m_Writer.OutText( " var size = " + ToString( nExtStep * dSnapStep) + ";") ;
m_Writer.OutText( " var divisions = " + ToString( dSnapStep) + ";");
// m_Writer.OutText("var divisions = 10;");
// ---- m_Writer.OutText( " var gridHelper = new THREE.GridHelper(size, divisions, new THREE.Color(1,0,0), new THREE.Color(0,1,0));");
// ---- m_Writer.OutText( " scene.add(gridHelper);");
// codice per disegnare le linee per la griglia scura
m_Writer.OutText( " var LineMaterial;") ;
m_Writer.OutText( " var LineGeometry;") ;
m_Writer.OutText( " var line;") ;
m_Writer.OutText( " for (var i = -10; i <= 10; i++)") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " LineMaterial = new THREE.LineBasicMaterial({ color: 0x444444 });") ;
m_Writer.OutText( " LineGeometry = new THREE.Geometry();") ;
m_Writer.OutText( " LineGeometry.vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3( " + ToString( nExtStep * dSnapStep) + ", 0, " + ToString( -nExtStep * dSnapStep) + "+ (" + ToString( nExtStep * dSnapStep / 10) + ") * ( i + 10 )),") ;
m_Writer.OutText( " new THREE.Vector3( " + ToString( -nExtStep * dSnapStep) + ", 0, " + ToString( -nExtStep * dSnapStep) + "+ (" + ToString( nExtStep * dSnapStep / 10) + ") * ( i + 10 ))") ;
m_Writer.OutText( " );") ;
m_Writer.OutText( " line = new THREE.Line(LineGeometry, LineMaterial);") ;
m_Writer.OutText( " scene.add(line);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " for (var i = -10; i <= 10; i++)") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " LineMaterial = new THREE.LineBasicMaterial({ color: 0x444444 });") ;
m_Writer.OutText( " LineGeometry = new THREE.Geometry();") ;
m_Writer.OutText( " LineGeometry.vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( nExtStep * dSnapStep) + " - ( " + ToString( nExtStep * dSnapStep / 10) + " ) * ( i + 10), 0, -" + ToString( nExtStep * dSnapStep) + "),") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( nExtStep * dSnapStep) + " - ( " + ToString( nExtStep * dSnapStep / 10) + " ) * ( i + 10), 0, " + ToString( nExtStep * dSnapStep) + ")") ;
m_Writer.OutText( " );") ;
m_Writer.OutText( " line = new THREE.Line(LineGeometry, LineMaterial);") ;
m_Writer.OutText( " scene.add(line);") ;
m_Writer.OutText( " }") ;
// codice per sistema di riferimento
m_Writer.OutText( " var xdir = new THREE.Vector3(0,0,1);");
m_Writer.OutText( " xdir.normalize()") ;
m_Writer.OutText( " var origin = new THREE.Vector3(0,0,0);") ;
m_Writer.OutText( " var length = " + ToString( nExtStep * dSnapStep) + ";") ;
m_Writer.OutText( " var hex = 0xff0000;") ;
m_Writer.OutText( " var arrowHelper = new THREE.ArrowHelper(xdir, origin, length, hex, 0, 0);") ;
m_Writer.OutText( " scene.add(arrowHelper);") ;
m_Writer.OutText( " var ydir = new THREE.Vector3(1,0,0);") ;
m_Writer.OutText( " ydir.normalize()") ;
m_Writer.OutText( " var origin = new THREE.Vector3(0,0,0);") ;
m_Writer.OutText( " var length = " + ToString( nExtStep * dSnapStep) + ";") ;
m_Writer.OutText( " var hex = 0x006600;") ;
m_Writer.OutText( " var arrowHelper = new THREE.ArrowHelper(ydir, origin, length, hex, 0, 0);") ;
m_Writer.OutText( " scene.add(arrowHelper);") ;
m_Writer.OutText( " var zdir = new THREE.Vector3(0,1,0);") ;
m_Writer.OutText( " zdir.normalize()") ;
m_Writer.OutText( " var origin = new THREE.Vector3(0,0,0);") ;
m_Writer.OutText( " var length = " + ToString( nExtStep * dSnapStep / 100) + ";") ;
m_Writer.OutText( " var hex = 0x0000ff;") ;
m_Writer.OutText( " var arrowHelper = new THREE.ArrowHelper(zdir, origin, length, hex, 0, 0);") ;
m_Writer.OutText( " scene.add(arrowHelper);") ;
// codice per telecamera
// --- m_Writer.OutText( " var orbitControls = new THREE.OrbitControls(camera, document.getElementById('WebGL-output'), " + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + ", zoom);") ; <---- original
m_Writer.OutText( " var orbitControls = new OrbitControls(camera, document.getElementById('WebGL-output'));") ;
// --- m_Writer.OutText( " orbitControls.autoRotate = false;") ; <---- original
m_Writer.OutText( " orbitControls.autoRotate = true;") ;
m_Writer.OutText(" var controlsGizmo = new OrbitControlsGizmo(orbitControls, {size: 100, padding : 8, distance: dist});") ;
m_Writer.OutText( " var clock = new THREE.Clock();") ;
m_Writer.OutText( " var planeGeometry = new THREE.PlaneGeometry(200, 200, 1, 1);") ;
m_Writer.OutText( " var planeMaterial = new THREE.MeshLambertMaterial({ color: 0xFDFEFE, transparent : true, opacity : 0.4 });") ;
m_Writer.OutText( " var plane = new THREE.Mesh(planeGeometry, planeMaterial);") ;
m_Writer.OutText( " plane.rotation.x = -0.5 * Math.PI; plane.position.x = 0; plane.position.y = -0.1; plane.position.z = 0;") ;
m_Writer.OutText( " plane.receiveShadow = false;");
m_Writer.OutText( " spotLight1.target = plane;") ;
m_Writer.OutText( " var list_of_objects = [];") ;
// ================================================================
// CREAZIONE PARTE INIZIALE DEL MENU ==============================
// ================================================================
m_WriterM.OutText( "<!DOCTYPE html>") ;
m_WriterM.OutText( "<html>") ;
m_WriterM.OutText( " <head>" ) ;
// libreria per Bootstrap
m_WriterM.OutText( " <link rel = 'stylesheet' href = 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css'/>") ;
m_WriterM.OutText( " <link rel = 'stylesheet' href = 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css'/>") ;
m_WriterM.OutText( " <link href = 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel = 'stylesheet'>") ;
m_WriterM.OutText( " <script src = 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js'></script>") ;
m_WriterM.OutText( " <script src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js'></script>") ;
m_WriterM.OutText( " <style>") ;
m_WriterM.OutText( " .list-group-item-action:hover{") ;
m_WriterM.OutText( " background-color: white;") ;
m_WriterM.OutText( " }") ;
m_WriterM.OutText( " .list-group-item{") ;
m_WriterM.OutText( " background-color: white;") ;
m_WriterM.OutText( " }") ;
m_WriterM.OutText( " </style>") ;
m_WriterM.OutText( " <script type = 'text/Javascript'>") ;
m_WriterM.OutText( " $(document).ready(function() {") ;
m_WriterM.OutText( " $('#listSearch').on('keyup', function() {") ;
m_WriterM.OutText( " var value = $(this).val().toLowerCase();") ;
m_WriterM.OutText( " $('ol').filter(function() {") ;
m_WriterM.OutText( " $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)") ;
m_WriterM.OutText( " });") ;
m_WriterM.OutText( " });") ;
m_WriterM.OutText( " });") ;
m_WriterM.OutText( " </script>") ;
m_WriterM.OutText( " </head>") ;
m_WriterM.OutText( " <body class = 'bg-light'>") ;
m_WriterM.OutText( "") ;
m_WriterM.OutText( " <div class = 'container mt-3 border-0 bg-light'>") ;
m_WriterM.OutText( "") ;
m_WriterM.OutText( " <div class = 'input-group mb-3'>") ;
m_WriterM.OutText( " <div class = 'input-group-prepend'>") ;
m_WriterM.OutText( " <span class = 'input-group-text' id = 'basic-addon1'>") ;
m_WriterM.OutText( " <i class = 'bi bi-search fas fa-search'></i>") ;
m_WriterM.OutText( " </span>") ;
m_WriterM.OutText( " </div>") ;
m_WriterM.OutText( " <input type = 'text' class = 'form-control' placeholder = 'Search...' aria-label = 'Username' aria-describedby = 'basic-addon1' id='listSearch'>") ;
m_WriterM.OutText( " </div>") ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::FinishAmbient()
{
/*
ORGANIZZAZIONE DELLA SCENA
- renderizzo prima le mesh trasparenti ordinate per distanza decrescente
- renderizzo tutti gli altri oggetti
*/
// aggiungo alla lista di oggetti le mesh trasparenti riordinandole per distanza
// renderizzo prima le mesh (facce) lontane
m_lTranspSurf.sort([]( const sSurfDist& a, const sSurfDist& b) { return a.dDistance > b.dDistance; }) ;
//scorro le superfici trasparenti
for ( sSurfDist sCurrSurvDist : m_lTranspSurf)
{
m_Writer.OutText( " // ---------------------------------------------------------------------") ;
// aggiungo le mesh trasparenti alla mia lista di oggetti e alla scena (front e back)
m_Writer.OutText( " list_of_objects.push(front_surf_mesh" + sCurrSurvDist.sName + ");") ;
m_Writer.OutText( " list_of_objects.push(back_surf_mesh" + sCurrSurvDist.sName + ");") ;
}
// carico il gruppo radice
// carico nella scena tutti gli oggetti
m_Writer.OutText( " for (var i = 0; i < list_of_objects.length; i++)") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " scene.add(list_of_objects[i])") ;
m_Writer.OutText( " };");
// controllo menu Gui
m_Writer.OutText( " var center;") ;
m_Writer.OutText( " var boxCreated = false;") ;
m_Writer.OutText( " var box;") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " /*") ;
m_Writer.OutText( " const helper = new THREE.CameraHelper( camera );") ;
m_Writer.OutText( " scene.add( helper );") ;
m_Writer.OutText( " */") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " var controls = {") ;
m_Writer.OutText( " element: null,") ;
m_Writer.OutText( " motion : true,") ;
m_Writer.OutText( " tar : orbitControls.target,") ;
m_Writer.OutText( " reset : function() {") ;
m_Writer.OutText( " zoom = 1;") ;
m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_ZNear) + ", " + ToString( m_ZFar) + ");") ;
m_Writer.OutText( " camera.position.x = " + ToString( m_ptCamera.y) + ";") ;
m_Writer.OutText( " camera.position.y = " + ToString( m_ptCamera.z) + ";") ;
m_Writer.OutText( " camera.position.z = " + ToString( m_ptCamera.x) + ";") ;
m_Writer.OutText( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ;
m_Writer.OutText( " orbitControls = new OrbitControls(camera, document.getElementById('WebGL-output'));") ;
m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " document.getElementsByClassName('obit-controls-gizmo')[0].remove();") ;
m_Writer.OutText( " controlsGizmo = new OrbitControlsGizmo(orbitControls, { size: 100, padding : 8 });") ;
m_Writer.OutText( " document.body.appendChild(controlsGizmo.domElement);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchmove', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchstart', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchend', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchcancel', false);") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " if (boxCreated) {") ;
m_Writer.OutText( " box = new THREE.BoxHelper(controls.element, 0xff0000);") ;
m_Writer.OutText( " camera.position.y = " + ToString( m_ptMin.y + ( m_dimZ * 1.1)) + ";") ; //115%
m_Writer.OutText( " var center = box.geometry.boundingSphere.center;") ;
m_Writer.OutText( " orbitControls.target = center;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " },") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " }") ;
// Cerco il parametro dall'url del gruppo da selezionare
m_Writer.OutText( "") ;
m_Writer.OutText( " // Lettura Parametri -------------- url -------") ;
m_Writer.OutText( " const queryString = window.location.search;") ;
m_Writer.OutText( " if (queryString != '') {") ;
m_Writer.OutText( " const urlParams = new URLSearchParams(queryString);") ;
m_Writer.OutText( " const element = urlParams.get('id')") ;
//m_Writer.OutText( " element = element.normalize('NFD').replace(/[\u0300-\u036f]/g, '') ") ;
m_Writer.OutText( " findGroupByNameAndId(groupRoot, element);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " // --------------------------------------------") ;
// funzione per ricavare un gruppo dato l'ID (name + ID)
m_Writer.OutText( "" );
m_Writer.OutText( " function findGroupByNameAndId(CurrentGroup, Id) {") ;
m_Writer.OutText( " CurrentGroup.children.forEach(element => {") ;
m_Writer.OutText( " if (element.name == Id) {") ;
// --- m_Writer.OutText( " ScanElements(element, true);") ; <---- original
m_Writer.OutText( " // creo il box per telecamera -----") ;
m_Writer.OutText( " controls.element = element;") ;
m_Writer.OutText( " createBox(element);") ;
m_Writer.OutText( " // ----------------------------------") ;
m_Writer.OutText( " EvidenziaLoadPage(element);") ;
m_Writer.OutText( " trovato = true;");
m_Writer.OutText( " }") ;
m_Writer.OutText( " if (element.children.length != 0) {") ;
m_Writer.OutText( " findGroupByNameAndId(element, Id);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " });") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " // --------------------------------------------") ;
m_Writer.OutText( "") ;
// funzione per ricavare il gruppo selezionato dal menu
// --- m_Writer.OutText( " selectElement = function(val) {") ;
// --- m_Writer.OutText(" ScanElements(val, true);");
// --- m_Writer.OutText( " }") ;
// funzione per creare il box al gruppo selezionato
m_Writer.OutText( "") ;
m_Writer.OutText( " function createBox(element) {") ;
m_Writer.OutText( " var box = new THREE.BoxHelper(element, 0xff0000);") ;
m_Writer.OutText( " camera.position.y = " + ToString(m_ptMin.y + (m_dimZ * 1.1))+ ";") ; //115%
m_Writer.OutText( " var center = box.geometry.boundingSphere.center;") ;
m_Writer.OutText( " orbitControls.target = center;") ;
m_Writer.OutText(" controls.tar.x = center.x;") ;
m_Writer.OutText(" controls.tar.y = center.y;") ;
m_Writer.OutText(" controls.tar.z = center.z;") ;
m_Writer.OutText(" boxCreated = true;") ;
m_Writer.OutText(" }");
m_Writer.OutText(" // --------------------------------------------");
m_Writer.OutText( "") ;
// creazione del menu Gui
m_Writer.OutText( " var gui = new dat.GUI({ width: 200 });") ;
m_Writer.OutText( " gui.add(controls, 'motion').name('Rotation');") ;
m_Writer.OutText( " gui.add(controls, 'reset').name('Reset camera');") ;
m_Writer.OutText( " document.getElementsByClassName('dg main a')[0].style.marginRight = '0px';") ;
m_Writer.OutText(" // --------------------------------------------") ;
// funzione per evidenziare un gruppo selezionato (per timer) 0xFBF719
m_Writer.OutText( "") ;
m_Writer.OutText( " function EnlightGroup(SelGroup) {") ;
m_Writer.OutText( " if (SelGroup !== null) {");
m_Writer.OutText( " SelGroup.children.forEach(element => {") ;
m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ;
m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ;
m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ;
m_Writer.OutText( " element.material.color = new THREE.Color(0x00ff00);") ;
m_Writer.OutText( " element.material.emissive = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " element.material.emissiveIntensity = 1.2;") ;
m_Writer.OutText( " element.material.transparent = false;") ;
m_Writer.OutText( " element.material.opacity = 1;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ;
m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ;
m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ;
m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else {") ;
m_Writer.OutText( " EnlightGroup(element);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " });") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " // --------------------------------------------") ;
m_Writer.OutText( "") ;
// funzione per riportare il colore del gruppo selezionato a quello originale (per timer)
m_Writer.OutText( "") ;
m_Writer.OutText( " function GetColorBack(SelGroup) {") ;
m_Writer.OutText( " if (SelGroup !== null) {") ;
m_Writer.OutText( " SelGroup.children.forEach(element => {") ;
m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ;
m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ;
m_Writer.OutText( " element.material.color = element.material.oldColor;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ;
m_Writer.OutText( " element.material.color = element.material.oldColor;") ;
m_Writer.OutText( " element.material.emissive = new THREE.Color(0x000000);") ;
m_Writer.OutText( " element.material.emissiveIntensity = 1;") ;
m_Writer.OutText( " if (element.material.wasTransparent) {") ;
m_Writer.OutText( " element.material.transparent = true;") ;
m_Writer.OutText( " element.material.opacity = element.material.hadOpacity;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ;
m_Writer.OutText( " element.material.color = element.material.oldColor;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ;
m_Writer.OutText( " element.line.material.color = element.oldColor;") ;
m_Writer.OutText( " element.cone.material.color = element.oldColor; ") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ;
m_Writer.OutText( " element.line.material.color = element.oldColor;") ;
m_Writer.OutText( " element.cone.material.color = element.oldColor;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else {") ;
m_Writer.OutText( " GetColorBack(element);") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " });") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " // --------------------------------------------") ;
m_Writer.OutText( "") ;
// funzione per tenere evidenziato il gruppo selezionato (funzione con il timer)
m_Writer.OutText( "") ;
m_Writer.OutText( " function EvidenziaLoadPage(ChoosenGroup) {") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " if (ChoosenGroup === null) {") ;
m_Writer.OutText( " return;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " var i = 0;") ;
m_Writer.OutText( " var YellowSet = false;") ;
m_Writer.OutText( " var OrigColSet = false;") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " function animation() {") ;
m_Writer.OutText( " var timer = setTimeout(function() {") ;
m_Writer.OutText( " i++;") ;
m_Writer.OutText( " //console.log(i); //delete it") ;
m_Writer.OutText( " if (!YellowSet && i < 10)") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " // coloro di giallo !!!") ;
m_Writer.OutText( " EnlightGroup(ChoosenGroup);") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " YellowSet = true;") ;
m_Writer.OutText( " OrigColSet = false;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (!OrigColSet && (i >= 10 && i < 20))") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " // riporto i colori originali ") ;
m_Writer.OutText( " GetColorBack(ChoosenGroup);") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " YellowSet = false;") ;
m_Writer.OutText( " OrigColSet = true;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (i == 20)") ;
m_Writer.OutText( " {") ;
m_Writer.OutText( " i = 0;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " animation();") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " }, 25); //1.5 seconds test") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " animation(); // prima chimata") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " // --------------------------------------------") ;
m_Writer.OutText( "") ;
// funzione per riportare il colore del gruppo selezionato a quello originale
// --- m_Writer.OutText(" GetColorBack = function(SelGroup) {") ;
// --- m_Writer.OutText(" if (SelGroup != = null) {") ;
// --- m_Writer.OutText(" SelGroup.children.forEach(element => {") ;
// --- m_Writer.OutText(" if (!(element instanceof THREE.Group)) {") ;
// --- m_Writer.OutText(" if (element instanceof THREE.Line) { //linea") ;
// --- m_Writer.OutText(" element.material.color = element.material.oldColor;") ;
// --- m_Writer.OutText(" }") ;
// --- m_Writer.OutText(" else if (element instanceof THREE.Mesh) { //mesh") ;
// --- m_Writer.OutText(" element.material.color = element.material.oldColor;");
// --- m_Writer.OutText(" }") ;
// --- m_Writer.OutText(" else if (element instanceof THREE.Points) { //punto");
// --- m_Writer.OutText(" element.material.color = element.material.oldColor;");
// --- m_Writer.OutText(" }");
// --- m_Writer.OutText(" else if (element instanceof THREE.Vector3) { //vettore");
// --- m_Writer.OutText(" element.line.material.color = element.oldColor;");
// --- m_Writer.OutText(" element.cone.material.color = element.oldColor;");
// --- m_Writer.OutText(" }");
// --- m_Writer.OutText(" else if (element instanceof THREE.Object3D) { //frame");
// --- m_Writer.OutText(" element.line.material.color = element.oldColor;");
// --- m_Writer.OutText(" element.cone.material.color = element.oldColor;");
// --- m_Writer.OutText(" }");
// --- m_Writer.OutText(" }");
// --- m_Writer.OutText(" else {");
// --- m_Writer.OutText(" GetColorBack(element);");
// --- m_Writer.OutText(" }");
// --- m_Writer.OutText(" });");
// --- m_Writer.OutText(" };");
// --- m_Writer.OutText(" }");
// funzione per evidenziare gli elementi dei un gruppo
// ---m_Writer.OutText( " ScanElements = function(SelGroup, c) {") ;
// ---m_Writer.OutText( " if(c){") ;
// ---m_Writer.OutText( " if (!first) {") ;
// ---m_Writer.OutText( " GetColorBack(LastGroupSelected);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " first = false;") ;
// ---m_Writer.OutText( " LastGroupSelected = SelGroup;") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " SelGroup.children.forEach(element => {") ;
// ---m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ;
// ---m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ;
// ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ;
// ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ;
// ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " }");
// ---m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ;
// ---m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ;
// ---m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " else {") ;
// ---m_Writer.OutText( " ScanElements(element, false);") ;
// ---m_Writer.OutText( " }") ;
// ---m_Writer.OutText( " });") ;
// ---m_Writer.OutText( " }") ;
// funzione render per la scena
m_Writer.OutText( " function renderScene() {") ;
//m_Writer.OutText( "const div = document.getElementById('zoom_test');"); // div per controllo parametri
//m_Writer.OutText( "div.textContent = " + ToString( m_dDistance) +";") ; // div per controllo parametri
m_Writer.OutText( " var delta = clock.get") ;
m_Writer.OutText( " orbitControls.update(zoom, " + ToString( m_dHalfWidth/2)+ ", " + ToString( m_dHalfHeight/2) + ");") ; // aggiornamento telecamera
// --- m_Writer.OutText( " camera.zoom = zoom;") ; <---- original
m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ;
m_Writer.OutText( " camera.zoom = zoom + orbitControls.ComputedZoom - 1;") ;
m_Writer.OutText( " camera.updateProjectionMatrix();") ; // aggiornamento matrice di proiezione su piano Near di clipping
m_Writer.OutText( " requestAnimationFrame(renderScene);") ;
m_Writer.OutText( " renderer.render(scene, camera);") ;
m_Writer.OutText( " }") ;
// aggiungo il canvas alla pagina html con la mia scena
m_Writer.OutText( " document.getElementById('WebGL-output').appendChild(renderer.domElement);") ;
m_Writer.OutText( " document.body.appendChild(controlsGizmo.domElement);") ;
m_Writer.OutText( " renderScene();") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchmove', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchstart', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchend', false);") ;
m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchcancel', false);") ;
m_Writer.OutText( " }") ;
// funzione resize della pagina
m_Writer.OutText( " function onResize() {") ;
m_Writer.OutText( " camera.aspect = window.innerWidth / window.innerHeight;") ;
m_Writer.OutText( " camera.updateProjectionMatrix();") ;
m_Writer.OutText( " renderer.setSize(window.innerWidth, window.innerHeight);") ;
m_Writer.OutText( " }") ;
//funzione per lo zoom della pagina
m_Writer.OutText( " function zoomView(){") ;
m_Writer.OutText( " zoom += event.wheelDeltaY * 0.00025;") ;
m_Writer.OutText( " zoom = Math.max( Math.min( zoom, 10000000 ), 0.00000001);") ;
m_Writer.OutText( " };") ;
// richiamo della funzione init() e dichiarazione degli eventi in javascript per controllo della scena
m_Writer.OutText( " window.onload = init") ;
// m_Writer.OutText( " window.addEventListener('resize', onResize, false);") ;
m_Writer.OutText( " window.addEventListener('wheel', zoomView, false);") ;
m_Writer.OutText( " </script>") ;
m_Writer.OutText( " </body>") ;
m_Writer.OutText( "</html>") ;
// Termino scrittura del File del Menu
m_WriterM.OutText( " </body>") ;
m_WriterM.OutText( "</html>") ;
return true ;
}
//----------------------------------------------------------------------------
bool
GetColor( const Color& Ccol, string& sHexCol)
{
// ottengo i codici R,G e B dei materiali
int iRedColor = Ccol.GetIntRed() ;
int iGreenColor = Ccol.GetIntGreen() ;
int iBlueColor = Ccol.GetIntBlue() ;
char chexColor[9] ;
// imposto il colore di Default o ricavo il corrispondente codice in esadecimale
std::snprintf( chexColor, sizeof chexColor, "0x%02x%02x%02x", iRedColor, iGreenColor, iBlueColor) ;
sHexCol = chexColor ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportObject( const IGdbIterator& iIter, IGeomDB* pGDB, const int nGroupCount)
{
// recupero il livello dell'oggetto
int nLev = GDB_LV_USER;
iIter.GetCalcLevel(nLev);
// recupero il modo dell'oggetto
int nMode = GDB_MD_STD;
iIter.GetCalcMode(nMode);
// recupero lo stato dell'oggetto
int nStat = GDB_ST_ON;
iIter.GetCalcStatus(nStat);
if (TestFilter(nLev, nMode, nStat)) {
switch (iIter.GetGdbType()) {
case GDB_TY_GEO:
{
// recupero l'oggetto geometrico
const IGeoObj* pGeoObj = iIter.GetGeoObj();
if (pGeoObj == nullptr)
return true;
// recupero il riferimento globale dell'oggetto
Frame3d frFrame;
if (!iIter.GetGlobFrame(frFrame))
return false;
// se il filtro lo abilita
//if (TestFilter(nLev, nMode, nStat))
//{
// recupero eventuale nome
string sName;
if (!iIter.GetName(sName))
sName = ToString(iIter.GetId());
// colore oggetto
if (sName != "Box" && sName != "box")
{
Color cCol;
int nIndex;
bool bColorSpot = false;
iIter.GetMaterial(nIndex);
if (nIndex == GDB_MT_COLOR)
iIter.GetMaterial(cCol);
else
{
PtrOwner<IGdbIterator> iIterNew(CreateGdbIterator(pGDB));
int nParendID = iIter.GetParentId();
int nMaterialID;
while (!bColorSpot)
{
iIterNew->GoTo(nParendID);
if (iIterNew->GetMaterial(nMaterialID) && nMaterialID == GDB_MT_COLOR)
{
iIterNew->GetMaterial(cCol);
bColorSpot = true;
}
nParendID = iIterNew->GetParentId();
}
}
// emetto l'oggetto
switch ( pGeoObj->GetType()) {
case GEO_VECT3D: // vettore
if ( ! ExportVector3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case GEO_PNT3D: // punto
if ( ! ExportPoint3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case GEO_FRAME3D: // frame 3D
if ( ! ExportFrame3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case CRV_LINE: // linee rette
if ( ! ExportLine3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case CRV_ARC: // archi
if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case CRV_COMPO: // curve composite
if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case CRV_BEZIER: // curve di Bezier
if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case SRF_TRIMESH: // superfici trimesh
if ( ! ExportSTM( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case SRF_FLATRGN: // flat region
if ( ! ExportSFR( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case SRF_BEZIER: // superfici di Bezier
if ( ! ExportSBezier( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case EXT_TEXT: // testi
if ( ! ExportText( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
case EXT_DIMENSION: // dimensione oggetti
if ( ! ExportDimension( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount))
return false ;
break ;
default:
break ;
}
}
//}
}
return true ;
case GDB_TY_GROUP:
// esploro il gruppo
return ScanGroup( iIter, pGDB, nGroupCount);
default:
return false ;
}
}
return true;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportVector3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// prelevo il vettore (vettore stesso e punto di applicazione) e il suo colore
const IGeoVector3d* pVEC = GetGeoVector3d( pGeoObj) ;
if ( pVEC == nullptr)
return false ;
Vector3d vVec = pVEC->GetVector() ;
Point3d ptVec = pVEC->GetBase() ;
string sHexCol ;
GetColor( Ccol, sHexCol) ;
// porto il vettore in coordinate ThreeJS
vVec.ToGlob( frFrame) ;
ptVec.LocToLoc( frFrame, m_frTHREEJSFrame) ;
// scrivo il vettore
m_Writer.OutText( " var vettore" + sName + " = new THREE.Vector3(" + ToString(vVec.y) + ", " + ToString(vVec.z) + ", " + ToString(vVec.x) + ")") ;
m_Writer.OutText( " vettore" + sName + ".normalize();") ;
m_Writer.OutText( " var origin = new THREE.Vector3(" + ToString(ptVec.x) + ", " + ToString(ptVec.y) + ", " + ToString(ptVec.z) + ")") ;
m_Writer.OutText( " var length = " + ToString(vVec.Len()) + ";") ;
m_Writer.OutText( " var hex = " + sHexCol +";") ;
m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(vettore" + sName + ", origin, length, hex);") ;
m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);") ; //salvataggio colore per selezione
m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ;
// aggiungo il vettore al suo gruppo di appartenenza
if ( nGroupCount != -1)
m_Writer.OutText( " group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")") ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportLine3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// prelevo la Linea retta (punto iniziale e punto finale) e il suo colore
const ICurveLine* pLINE = GetCurveLine( pGeoObj) ;
if ( pLINE == nullptr)
return false ;
Point3d pStartP = pLINE->GetStart() ;
Point3d pEndP = pLINE->GetEnd() ;
// porto i punti in coordinate ThreeJS
pStartP.LocToLoc(frFrame, m_frTHREEJSFrame) ;
pEndP.LocToLoc( frFrame, m_frTHREEJSFrame) ;
string sHexCol ;
GetColor( Ccol, sHexCol) ;
// scrivo la linea
m_Writer.OutText( " const line_material" + sName + " = new THREE.LineBasicMaterial({ color: " + sHexCol + " });") ;
m_Writer.OutText( " line_material" + sName + ".oldColor = new THREE.Color(" + sHexCol + ")") ;
m_Writer.OutText( " var line_geometry" + sName + " = new THREE.Geometry();") ;
m_Writer.OutText( " line_geometry" + sName +".vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString(pStartP.x) + "," + ToString(pStartP.y) + "," + ToString(pStartP.z) + "),") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString(pEndP.x) + "," + ToString(pEndP.y) + "," + ToString(pEndP.z) + "));") ;
m_Writer.OutText( " var line" + sName + " = new THREE.Line(line_geometry" + sName +",line_material" + sName + ");") ;
m_Writer.OutText( " list_of_objects.push(line" + sName + ");") ;
// aggiungo la linea al suo gruppo di appartenenza
if ( nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(line" + sName + ")") ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportPoint3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// prelevo il punto e il suo colore
const IGeoPoint3d* pPoint = GetGeoPoint3d( pGeoObj) ;
if ( pPoint == nullptr)
return false ;
Point3d ptPoint = pPoint->GetPoint() ;
// porto il punto in coordinate ThreeJS
ptPoint.LocToLoc(frFrame, m_frTHREEJSFrame) ;
string sHexCol ;
GetColor( Ccol, sHexCol) ;
// scrivo il punto
m_Writer.OutText( " var dotGeometry" + sName + " = new THREE.Geometry();") ;
m_Writer.OutText( " dotGeometry" + sName + ".vertices.push(new THREE.Vector3( " + ToString(ptPoint.x) + ", " + ToString(ptPoint.y) + ", " + ToString(ptPoint.z) + "));") ;
m_Writer.OutText( " var dotMaterial" + sName +" = new THREE.PointsMaterial( { size: 5, sizeAttenuation: false, color: " + sHexCol +" } );") ;
m_Writer.OutText( " dotMaterial" + sName + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " var dot" + sName + " = new THREE.Points( dotGeometry" + sName +", dotMaterial" + sName +" );") ;
m_Writer.OutText( " list_of_objects.push(dot" + sName + ");") ;
// aggiungo il punto al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(dot" + sName + ")") ;
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportFrame3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// prelevo il frame (punto di applicazione e 3 versori) e i suoi colori
const IGeoFrame3d* pFrame = GetGeoFrame3d( pGeoObj);
if ( pFrame == nullptr)
return false ;
Frame3d frCurrentFrame = pFrame->GetFrame();
// porto il punto in coordinate ThreeJS
frCurrentFrame.ToGlob( frFrame) ;
string sHexCol;
GetColor( Ccol, sHexCol);
Point3d ptOrig = frCurrentFrame.Orig() ;
ptOrig.LocToLoc(frFrame, m_frTHREEJSFrame);
Vector3d vx = frCurrentFrame.VersZ() ;
Vector3d vy = frCurrentFrame.VersX() ;
Vector3d vz = frCurrentFrame.VersY() ;
// scrivo i 3 vettori
// x
m_Writer.OutText( " var xdir" + sName + " = new THREE.Vector3(" + ToString(vx.x) + ", " + ToString(vx.y) + ", " + ToString(vx.z) + ");") ;
m_Writer.OutText( " xdir" + sName + ".normalize()") ;
m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString(ptOrig.x) + ", " + ToString(ptOrig.y) + ", " + ToString(ptOrig.z)+ ");") ;
m_Writer.OutText( " var length = 25;") ;
m_Writer.OutText( " var hex = 0xff0000;") ;
m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(xdir" + sName + ", origin" + sName + ", length, hex);") ;
m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);") ;
m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ;
// aggiungo il vettore al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(arrowHelper" + sName + ")");
// y
m_Writer.OutText( " var ydir" + sName + " = new THREE.Vector3(" + ToString( vy.x) + ", " + ToString( vy.y) + ", " + ToString( vy.z) + ");") ;
m_Writer.OutText( " ydir" + sName + ".normalize()") ;
m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString( ptOrig.x) + ", " + ToString( ptOrig.y) + ", " + ToString( ptOrig.z) + ");") ;
m_Writer.OutText( " var length = 25;") ;
m_Writer.OutText( " var hex = 0x00ff00;") ;
m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(ydir" + sName + ", origin" + sName + ", length, hex);") ;
m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);");
m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ;
// aggiungo il vettore al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")");
// z
m_Writer.OutText( " var zdir" + sName + " = new THREE.Vector3(" + ToString( vz.x) + ", " + ToString( vz.y) + ", " + ToString( vz.z) + ");") ;
m_Writer.OutText( " zdir" + sName + ".normalize()") ;
m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString( ptOrig.x) + ", " + ToString( ptOrig.y) + ", " + ToString( ptOrig.z) + ");") ;
m_Writer.OutText( " var length = 25;") ;
m_Writer.OutText( " var hex = 0x0000ff;") ;
m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(zdir" + sName + ", origin" + sName + ", length, hex);") ;
m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);");
m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ;
// aggiungo il vettore al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")");
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportCurveComp3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// prelevo la curva composita e il suo colore
const ICurve* pCurve = GetCurve( pGeoObj) ;
if ( pCurve == nullptr)
return false ;
string sHexCol ;
GetColor( Ccol, sHexCol) ;
// approssimo la curva composita con delle linee
PolyLine pLine;
pCurve->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, ICurve::APL_STD, pLine) ;
// prelevo il primo punto della curva composita (quindi della prima retta)
Point3d ptCurrent ;
pLine.GetFirstPoint( ptCurrent) ;
// porto il punto in coordinate ThreeJS
Point3d ptCurrentThreeJS = ptCurrent ;
ptCurrentThreeJS.LocToLoc( frFrame, m_frTHREEJSFrame) ;
// inizializzo la creazione della linea in javascript
m_Writer.OutText( " const line_material" + sName + " = new THREE.LineBasicMaterial({ color: " + sHexCol +" });") ;
m_Writer.OutText( " line_material" + sName + ".oldColor = new THREE.Color(" + sHexCol + ")") ;
m_Writer.OutText( " var line_geometry" + sName + " = new THREE.Geometry();") ;
m_Writer.OutText( " line_geometry" + sName + ".vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrentThreeJS.x) + "," + ToString( ptCurrentThreeJS.y) + "," + ToString( ptCurrentThreeJS.z) + "),") ;
// scorro tutti i punti ottenuti dalla mia approssimazione e creo delle linee rette
while ( pLine.GetNextPoint( ptCurrent))
{
ptCurrentThreeJS = ptCurrent;
ptCurrentThreeJS.LocToLoc( frFrame, m_frTHREEJSFrame) ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrentThreeJS.x) + "," + ToString( ptCurrentThreeJS.y) + "," + ToString( ptCurrentThreeJS.z) + "),") ;
}
m_Writer.OutText( " );") ;
m_Writer.OutText( " var Compoline" + sName + " = new THREE.Line(line_geometry" + sName + ",line_material" + sName + ");") ;
m_Writer.OutText( " list_of_objects.push(Compoline" + sName + ");") ;
// aggiungo la curva composita al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(Compoline" + sName + ")");
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// verifico oggetto
const ISurfTriMesh* pSTM = GetSurfTriMesh( pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aumento il contatore generale per evitare nomi uguali su javascript
m_nCont++ ;
// ricavo il colore della faccia (R,G,B,A)
string sHexCol ;
GetColor( Ccol, sHexCol) ;
double dOpacity = Ccol.GetAlpha() ;
// controllo trasparenza e opacità
double dOpacityThreeJs = 1 ;
if ( dOpacity < 1)
{
// mesh trasparente
// calcolo distanza tra mesh e posizione delle telecamera (per riodinare l'ordine di visualizzazione)
BBox3d b3Localbox ;
pSTM->GetLocalBBox( b3Localbox) ;
b3Localbox.ToLoc( m_frTHREEJSFrame) ;
double dDistance = sqrt( b3Localbox.SqMaxDistFromPoint( m_ptCenter)) ;
sSurfDist sNewSurfDist ;
sNewSurfDist.SurvAlpha = pSTM ;
sNewSurfDist.dDistance = dDistance ;
sNewSurfDist.sName = ToString( m_nCont) ;
m_lTranspSurf.push_back( sNewSurfDist) ;
// --- dOpacityThreeJs = 0.1 * dOpacity * dOpacity + 0.25 * dOpacity + 0.5; // interpolazione quadratica per opacità (opacità ThreeJs diversa da opacità EGTCAM5)
dOpacityThreeJs = 0.7 + 0.2*dOpacity ;
// dOpacityThreeJs = dOpacity;
// creo il materiale
// front side
m_Writer.OutText( " var front_surf_materials" + ToString( m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: true , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.FrontSide});") ;
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".depthTest = true;"); // abilito test profondità
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".wasTransparent = true;") ; // nel caso sia selezionata
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".hadOpacity = " + ToString( dOpacityThreeJs) + ";") ; // nel caso sia selezionata
// back side
m_Writer.OutText( " var back_surf_materials" + ToString(m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: true , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.BackSide});") ;
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".depthTest = true;") ; // abilito test profondità
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".wasTransparent = true;") ; // nel caso sia selezionata
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".hadOpacity = " + ToString( dOpacityThreeJs) + ";") ; // nel caso sia selezionata
}
else
{
// mesh opaca
m_Writer.OutText( " var opaca_surf_materials" + ToString( m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: false , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.DoubleSide});") ;
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".depthTest = true;") ; // abilito test profondità
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
}
// creo vettore di vertici per i triangoli della mesh
m_Writer.OutText(" var vertices" + ToString( m_nCont) + " = [") ;
int iTotV = pSTM->GetVertexCount() ;
int iTotT = pSTM->GetTriangleCount() ;
Point3d ptCurrent ;
int iPtCurrentTria[3] ;
// scorro tutti i vertici e ne scrivo le coordinate
for ( int i = 0; i < iTotV; i++)
{
pSTM->GetVertex( i, ptCurrent);
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame);
m_Writer.OutText(" new THREE.Vector3(" + ToString( ptCurrent.x) + ", " + ToString( ptCurrent.y) + ", " + ToString( ptCurrent.z) + "),") ;
}
m_Writer.OutText( " ];") ;
// creo vettore delle facce dei triangoli
m_Writer.OutText( " var faces" + ToString(m_nCont) + " = [ ") ;
// scorro tutti i triangoli associandogli una faccia della mesh
for ( int i = 0; i < iTotT; i++)
{
pSTM->GetTriangle( i, iPtCurrentTria) ;
m_Writer.OutText( " new THREE.Face3(" + ToString( iPtCurrentTria[0]) + ", " + ToString( iPtCurrentTria[1]) + ", " + ToString( iPtCurrentTria[2]) + "),") ;
}
m_Writer.OutText( " ];") ;
// creo la geometria con i vertici e le facce
m_Writer.OutText( " var geom" + ToString( m_nCont) + " = new THREE.Geometry();") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".vertices = vertices" + ToString(m_nCont) + ";") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".faces = faces" + ToString(m_nCont) + ";") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".computeFaceNormals();") ; // per rendering effetto ombre e luce
// creo la mesh unendo geometria (vertici e facce) e materiale
if ( dOpacity < 1)
{
// mesh trasparente
// front side -----------------------------
m_Writer.OutText( " var front_surf_mesh" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", front_surf_materials" + ToString( m_nCont) + ");") ;
m_Writer.OutText( " front_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ;
// aggiungo la superficie al suo gruppo di appartenenza
if ( nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(front_surf_mesh" + ToString( m_nCont) + ")") ;
// back side -------------------------------
m_Writer.OutText( " var back_surf_mesh" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", back_surf_materials" + ToString(m_nCont) + ");") ;
m_Writer.OutText( " back_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ;
// aggiungo la superficie al suo gruppo di appartenenza
if( nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(back_surf_mesh" + ToString( m_nCont) + ")") ;
// non aggiungo la mesh alla lista degli oggetti della scena, prima le riordino nella funzione FinishAmbient()
}
else
{
// mesh opaca
m_Writer.OutText( " var opaca_mesh_" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", opaca_surf_materials" + ToString( m_nCont) + ");") ;
m_Writer.OutText( " opaca_mesh_" + ToString( m_nCont) + ".castShadow = true;") ;
m_Writer.OutText( " list_of_objects.push(opaca_mesh_" + ToString( m_nCont) + ");") ; // aggiungo la mesh alla lista degli oggetti della scena
// aggiungo al superficie al suo gruppo di appartenenza
if ( nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(opaca_mesh_" + ToString( m_nCont) + ")") ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportSFR( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nGroupCount)
{
// verifico oggetto
const ISurfFlatRegion* pSFR = GetSurfFlatRegion( pGeoObj) ;
if ( pSFR == nullptr)
return false ;
// ricavo la trimesh equivalente
const ISurfTriMesh* pStm = pSFR->GetAuxSurf() ;
return ExportSTM(sName, pStm, frFrame, cCol, nGroupCount) ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportSBezier( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nGroupCount)
{
// verifico oggetto
const ISurfBezier* sbez = GetSurfBezier( pGeoObj) ;
if ( sbez == nullptr)
return false ;
// ricavo la trimesh equivalente
const ISurfTriMesh* pStm = sbez->GetAuxSurf() ;
return ExportSTM(sName, pStm, frFrame, cCol, nGroupCount) ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportText( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// verifico l'oggetto
const IExtText* pText = GetExtText( pGeoObj) ;
if ( pText == nullptr)
return false ;
// approssimo il testo come un insieme di curve
POLYLINELIST lstPL ;
pText->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, lstPL) ;
Point3d ptCurrent ;
// ricavo il colore della scritta (R,G,B,A)
string sHexCol ;
GetColor(Ccol, sHexCol) ;
// scorro tutte le curve trovate
for ( PolyLine aLine : lstPL)
{
// prelevo il primo punto
aLine.GetFirstPoint( ptCurrent) ;
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ;
// aumento il contatore generale per evitare nomi uguali su javascript
m_nCont++ ;
m_Writer.OutText( " const text_line_material" + ToString( m_nCont) + " = new THREE.LineBasicMaterial({ color: " + sHexCol + ", linewidth: 1.2 });") ;
m_Writer.OutText( " text_line_material" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " var text_line_geometry" + ToString( m_nCont) +" = new THREE.Geometry();") ;
m_Writer.OutText( " text_line_geometry" + ToString( m_nCont) + ".vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ;
// scorro tutti i punti e approssimo con delle linee rette
while (aLine.GetNextPoint(ptCurrent))
{
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ;
}
m_Writer.OutText( " );") ;
m_Writer.OutText( " var text_Compoline" + ToString( m_nCont) + " = new THREE.Line(text_line_geometry" + ToString( m_nCont) + ",text_line_material" + ToString( m_nCont) + ");") ;
m_Writer.OutText( " text_Compoline" + ToString( m_nCont) + ".translateY(1);") ;
m_Writer.OutText( " list_of_objects.push(text_Compoline" + ToString( m_nCont) + ");") ;
// aggiungo la polyline al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(text_Compoline" + ToString( m_nCont) + ")") ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ExportDimension( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// verifico l'oggetto
const IExtDimension* pDim = GetExtDimension( pGeoObj);
if ( pDim == nullptr)
return false ;
// approssimo con delle curve
POLYLINELIST lstPL ;
pDim->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, lstPL) ;
Point3d ptCurrent ;
int iDiff = 0 ;
// prelevo il colore
string sHexCol ;
GetColor( Ccol, sHexCol) ;
// per ogni curva di approssimazione scorro i suoi punti e creo delle linee rette
for ( PolyLine aLine : lstPL)
{
aLine.GetFirstPoint( ptCurrent) ;
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ;
m_Writer.OutText( " const text_line_material" + sName + ToString( iDiff) + " = new THREE.LineBasicMaterial({ color: " + sHexCol + "});") ;
m_Writer.OutText( " text_line_material" + sName + ToString(iDiff) + ".oldColor = new THREE.Color(" + sHexCol + ")") ;
m_Writer.OutText( " var text_line_geometry" + sName + ToString( iDiff) + " = new THREE.Geometry();") ;
m_Writer.OutText( " text_line_geometry" + sName + ToString( iDiff) + ".vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ;
while ( aLine.GetNextPoint( ptCurrent))
{
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ;
}
m_Writer.OutText( " );") ;
m_Writer.OutText( " var text_Compoline" + sName + ToString(iDiff) + " = new THREE.Line(text_line_geometry" + sName + ToString(iDiff) + ",text_line_material" + sName + ToString(iDiff) + ");") ;
m_Writer.OutText( " list_of_objects.push(text_Compoline" + sName + ToString(iDiff) + ");") ;
iDiff++ ;
// aggiungo la distanza al suo gruppo di appartenenza
if (nGroupCount != -1)
m_Writer.OutText(" group" + ToString( nGroupCount) + ".children.push(text_Compoline" + sName + ToString( iDiff-1) + ")") ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::ScanGroup( const IGdbIterator& iIter, IGeomDB* pGDB, const int nGroupCount)
{
// creo un iteratore
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( iIter.GetGDB())) ;
if ( IsNull( pIter))
return false ;
// scandisco il gruppo
bool bOk = true ;
pIter->GoTo( iIter.GetId()) ;
m_nGroupCount++;
m_Writer.OutText( " const group" + ToString( m_nGroupCount) + " = new THREE.Group();") ;
if (nGroupCount != -1)
m_WriterM.OutText(" <ol class='list-group-item'>");
else
m_WriterM.OutText( " <ol class='list-group-item border-0 bg-light' style='background-color: white;'>") ;
//m_WriterM.OutText( " <div id = 'block_" + ToString(m_nGroupCount) + "' style = 'padding-left:40px'>") ; //<---
string sName ;
pIter->GetName(sName);
for ( int i = 0; sName[i] != '\0'; i++) // sostituisco gli spazi con underscore
{
if (sName[i] == ' ')
sName[i] = '_';
}
sName += "_" + ToString(pIter->GetId());
string sId = ToString(pIter->GetId()) ;
m_Writer.OutText( " group" + ToString( m_nGroupCount) + ".name = '" + sId + "'") ;
//m_Writer.OutText( " group" + ToString(m_nGroupCount) + ".name = group" + ToString(m_nGroupCount) + ".name.normalize('NFD').replace(/[\u0300-\u036f]/g, '')");
//m_WriterM.OutText(" <a id = 'a_block_" + ToString( m_nGroupCount) + "' href = 'https://iis01.egalware.com/test3D/Esempio99.html?id=" + sId + "'>" + sName + "</a>"); //<---
if (!sId.compare("0"))
{
m_WriterM.OutText( " <a class='list-group-item list-group-item-action list-group-flush list-group-item-primary' href = 'https://iis01.egalware.com/test3D/Esempio99.html?'> Basic </a>") ;
}
else
{
m_WriterM.OutText(" <a class='list-group-item list-group-item-action list-group-flush list-group-item-primary' href = 'https://iis01.egalware.com/test3D/Esempio99.html?id=" + sId + "'>" + sName + " </a>");
}
if (nGroupCount != -1 && m_nGroupCount != nGroupCount) {
// --- m_Writer.OutText(" var gui" + ToString(m_nGroupCount) + "= gui" + ToString(nGroupCount) + ".addFolder('" + sName + "');");
}
int nCurrentGroup = m_nGroupCount;
for (bool bNext = pIter->GoToFirstInGroup( iIter) ;
bNext ;
bNext = pIter->GoToNext()) {
if ( ! ExportObject( *pIter, pGDB, nCurrentGroup))
bOk = false ;
}
if (nGroupCount != -1) {
m_Writer.OutText( " group" + ToString(nGroupCount) + ".add(group" + ToString( nCurrentGroup) + ")");
//m_WriterM.OutText( " </div>") ;
m_WriterM.OutText( " </ol>") ; //<---
/*
if (!pIter->GetName(sName)) {
sName = "Layer" + ToString(pIter->GetId());
}
*/
/* <--- original
m_Writer.OutText( " var settings" + ToString( nCurrentGroup) + " = {") ;
m_Writer.OutText( " 'S_Group" + ToString( nCurrentGroup)+ "' : function() { selectElement(group" + ToString( nCurrentGroup) + ") }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " gui" + ToString( nGroupCount) + ".add(settings" + ToString( nCurrentGroup) + ", 'S_Group" + ToString( nCurrentGroup) + "').name('" + sName + "')") ;
*/
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
ExportThreeJS::TestFilter( int nLev, int nMode, int nStat)
{
/*
if (( nLev == GDB_LV_USER && (m_nFilter & EEXFLT_LEVUSER) == 0) ||
( nLev == GDB_LV_SYSTEM && (m_nFilter & EEXFLT_LEVSYSTEM) == 0) ||
( nLev == GDB_LV_TEMP && (m_nFilter & EEXFLT_LEVTEMP) == 0))
return false;
if (( nMode == GDB_MD_STD && (m_nFilter & EEXFLT_MODESTD) == 0) ||
( nMode == GDB_MD_LOCKED && (m_nFilter & EEXFLT_MODELOCKED) == 0) ||
( nMode == GDB_MD_HIDDEN && (m_nFilter & EEXFLT_MODEHIDDEN) == 0))
return false;
*/
if (( nStat == GDB_ST_OFF && (m_nFilter & EEXFLT_STAOFF) == 0) ||
( nStat == GDB_ST_ON && (m_nFilter & EEXFLT_STAON) == 0) ||
( nStat == GDB_ST_SEL && (m_nFilter & EEXFLT_STASEL) == 0))
return false ;
return true ;
}