From 1c8da69f63d86b0110c01f4465f3044dd374b475 Mon Sep 17 00:00:00 2001 From: "riccardo.elitropi" Date: Mon, 22 Aug 2022 17:36:47 +0200 Subject: [PATCH] EgtExchange : - aggiunta export threejs (primi test in locale sulla mia macchina). --- EgtExchange.vcxproj | 2 + EgtExchange.vcxproj.filters | 6 + ExportThreeJS.cpp | 1603 +++++++++++++++++++++++++++++++++++ ExportThreeJS.h | 80 ++ 4 files changed, 1691 insertions(+) create mode 100644 ExportThreeJS.cpp create mode 100644 ExportThreeJS.h diff --git a/EgtExchange.vcxproj b/EgtExchange.vcxproj index 9b5ff0f..2105f9f 100644 --- a/EgtExchange.vcxproj +++ b/EgtExchange.vcxproj @@ -241,6 +241,7 @@ copy $(TargetPath) \EgtProg\Dll64 + @@ -277,6 +278,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtExchange.vcxproj.filters b/EgtExchange.vcxproj.filters index fc66b2b..1a29e3f 100644 --- a/EgtExchange.vcxproj.filters +++ b/EgtExchange.vcxproj.filters @@ -126,6 +126,9 @@ File di intestazione + + File di intestazione + @@ -203,6 +206,9 @@ File di origine + + File di origine + diff --git a/ExportThreeJS.cpp b/ExportThreeJS.cpp new file mode 100644 index 0000000..b71edc6 --- /dev/null +++ b/ExportThreeJS.cpp @@ -0,0 +1,1603 @@ +//---------------------------------------------------------------------------- +// 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 +#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 ( 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) +{ + /* + m_Writer.Close(); + if (!m_Writer.Init(sFile)) { + LOG_ERROR(GetEExLogger(), "ExportThreeJS : Error on open file") + return false; + } + + ISurfTriMesh* miaSurf = GetSurfTriMesh(pGDB->GetGeoObj(1117)); + ICurveComposite* miaCurvaSotto = GetCurveComposite(pGDB->GetGeoObj(1332)); + double Bi, Bf; + miaCurvaSotto->GetDomain(Bi, Bf); + ICurveComposite* miaCurvaSopra = GetCurveComposite(pGDB->GetGeoObj(1333)); + double Ti, Tf; + miaCurvaSopra->GetDomain(Ti, Tf); + ICurveComposite* miaCurvaSinistra = GetCurveComposite(pGDB->GetGeoObj(1334)); + double Li, Lf; + miaCurvaSinistra->GetDomain(Li, Lf); + ICurveComposite* miaCurvaDestra = GetCurveComposite(pGDB->GetGeoObj(1335)); + double Ri, Rf; + miaCurvaDestra->GetDomain(Ri, Rf); + + int iTotT = miaSurf->GetTriangleCount(); + int nIdVert[3]; + Point3d punto; + double par; + string str; + for (int i = 0; i < iTotT; i++) + { + miaSurf->GetTriangle(i, nIdVert); + str = "["; + for (int j = 0; j < 3; j++) + { + str += "new THREE.Vector2"; + miaSurf->GetVertex(nIdVert[j], punto); + if (miaCurvaSotto->GetParamAtPoint(punto, par, 100*EPS_SMALL)) + { + par = par / Bf; + str += "(" + ToString(par) + ",0),"; + } + else if (miaCurvaSopra->GetParamAtPoint(punto, par, 100*EPS_SMALL)) + { + par = par / Tf; + str += "(" + ToString(par) + ",1),"; + } + else if (miaCurvaSinistra->GetParamAtPoint(punto, par, 100*EPS_SMALL)) + { + par = par / Lf; + str += "(0, " + ToString(par) + "),"; + } + else if (miaCurvaDestra->GetParamAtPoint(punto, par, 100*EPS_SMALL)) + { + par = par / Rf; + str += "(1," + ToString(par) + "),"; + } + else + { + m_Writer.OutText("Pizza"); + IGeoPoint3d* pt = CreateGeoPoint3d(); + pt->Set(punto); + pGDB->AddGeoObj(GDB_ID_NULL, GDB_ID_ROOT, pt->Clone()); + } + } + m_Writer.OutText(str + "],"); + } + + + if (!m_Writer.Close()) + return true; + + */ + + + // 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 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)"); + // --- m_Writer.OutText( " var reset = {") ; + // --- m_Writer.OutText( " 'Reset': function() {") ; + // --- m_Writer.OutText( " if (!first) {") ; + // --- m_Writer.OutText( " GetColorBack(LastGroupSelected)") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " gui.add(reset, 'Reset').name('Deselect all');") ; + // --- m_Writer.OutText( " const params = {" ) ; + // --- m_Writer.OutText( " textField: 'Type Name_Id'") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " gui.add(params, 'textField').onFinishChange(function(value) {") ; + // --- m_Writer.OutText( " if (value != '') {") ; + // --- m_Writer.OutText( " findGroupByNameAndId(groupRoot, value);") ; + // --- m_Writer.OutText( " if (!trovato) {") ; + // --- m_Writer.OutText( " GetColorBack(LastGroupSelected);") ; + // --- m_Writer.OutText( " window.alert('Element not found :(');") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " }") ; + // --- m_Writer.OutText( " trovato = false;"); + // --- m_Writer.OutText( " }).name('Code');") ; + + // 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( "") ; + m_Writer.OutText( "") ; + m_Writer.OutText( " ") ; + // librerie + // --- m_Writer.OutText( " ") ; <---- original + // --- m_Writer.OutText( " ") ; <--- original + // --- m_Writer.OutText( " ") ; + // stile + m_Writer.OutText( " ") ; + + m_Writer.OutText( " ") ; + m_Writer.OutText( " ") ; + + m_Writer.OutText( " ") ; + // body + m_Writer.OutText( " ") ; + m_Writer.OutText( "
") ; + //m_Writer.OutText( "
"); // div di aiuto per controllo parametri telecamera, zoom + m_Writer.OutText( "
") ; + // --- m_Writer.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( "") ; + m_WriterM.OutText( "
") ; + m_WriterM.OutText( "") ; + m_WriterM.OutText( "
") ; + m_WriterM.OutText( "
") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( "
") ; + m_WriterM.OutText( " ") ; + m_WriterM.OutText( "
") ; + + 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( " }") ; + 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( " }"); + 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( " ") ; + m_Writer.OutText( " ") ; + m_Writer.OutText( "") ; + + + + // Termino scrittura del File del Menu + m_WriterM.OutText( " ") ; + m_WriterM.OutText( "") ; + + 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 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 ; + } + } +} + + +//---------------------------------------------------------------------------- +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) + + // 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) + } + 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 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("
    "); + else + m_WriterM.OutText( "
      ") ; + //m_WriterM.OutText( "
      ") ; //<--- + + 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(" " + sName + ""); //<--- + + if (!sId.compare("0")) + { + m_WriterM.OutText( " Basic ") ; + } + else + { + m_WriterM.OutText(" " + sName + " "); + } + + 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( "
      ") ; + m_WriterM.OutText( "
    ") ; //<--- + + /* + 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 ; +} + + + + + + + + + + + diff --git a/ExportThreeJS.h b/ExportThreeJS.h new file mode 100644 index 0000000..aae95d1 --- /dev/null +++ b/ExportThreeJS.h @@ -0,0 +1,80 @@ +//---------------------------------------------------------------------------- +// EgalWare 2022-2022 +//---------------------------------------------------------------------------- +// File : ExportThreeJS.h Data : 05.07.22 Versione : 1.5h2 +// Contenuto : Dichiarazione della classe ExportThreeJS. +// +// +// +// Modifiche : 08.07.22 +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "/EgtDev/Include/EExExportThreeJS.h" +#include "/EgtDev/Include/EGnWriter.h" +#include "/EgtDev/Include/EGkColor.h" +#include "/EgtDev/Include/EGkIntersSurfTmSurfTm.h" + +class IGdbIterator; +class IGeoObj; +class Frame3d; + + +struct sSurfDist { + const ISurfTriMesh* SurvAlpha; + double dDistance = 0; + std::string sName; +}; + + +//---------------------------------------------------------------------------- +class ExportThreeJS : public IExportThreeJS +{ +public: + virtual bool SetOptions(int nFilter); + virtual bool Export(IGeomDB* pGDB, int nId, const std::string& sFile, const std::string& sFileM, IEGrScene* pScene); + +public: + ExportThreeJS(void) : m_nFilter(EEXFLT_DEFAULT) {} + +private: + bool HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) ; + bool FinishAmbient() ; + bool ExportVector3D( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportPoint3D( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportFrame3D( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportLine3D( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportCurveComp3D( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; //archi e curve composite + bool ExportSTM( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportSFR( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportSBezier(const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportText( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ExportDimension( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nIdGroup) ; + bool ScanGroup( const IGdbIterator& iIter, IGeomDB* pGDB, const int nIdGroup) ; + bool ExportObject( const IGdbIterator& iIter, IGeomDB* pGDB, const int nIdGroup) ; + bool TestFilter( int nLev, int nMode, int nStat) ; + +private: + int m_nFilter; // filtro su livello, modo e stato + Writer m_Writer; // scrittore di file di testo oggetto + Writer m_WriterM; // scritto di file di testo menu + Point3d m_ptMin; // punto minimo del box3d + double m_dimX; // dimX Box3d Global + double m_dimY; // dimY Box3d Global + double m_dimZ; // dimZ Box3d Global + double m_dDistance; // scala per pan e zoom + int m_nCont = 0; // contatore per linee interne ai testi + Point3d m_ptCamera; // Camera look at + Point3d m_ptCenter; // Camera center + double m_dHalfWidth; // Lunghezza/2 piano di proiezione (culling) + double m_dHalfHeight; // Altezza/2 piano di proiezione (culling) + double m_ZNear; // Distanza (lungo Z) piano di proiezione da origine (culling) + double m_ZFar; // Distanza (lungo Z) piano di culling da origine (culling) + int m_ANG_TOL_STD_DEG = 15; // Interpolazione testo + Frame3d m_frTHREEJSFrame; // frame di ThreeJS + std::list< sSurfDist> m_lTranspSurf; // Lista di superfici trasparenti + int m_nGroupCount = -1; // Contatore del gruppo +};