diff --git a/EgtExchange.rc b/EgtExchange.rc index 15fa6b7..8eac978 100644 Binary files a/EgtExchange.rc and b/EgtExchange.rc differ diff --git a/ExportThreeJS.cpp b/ExportThreeJS.cpp index 994557a..e239ae7 100644 --- a/ExportThreeJS.cpp +++ b/ExportThreeJS.cpp @@ -1,12 +1,12 @@ //---------------------------------------------------------------------------- // EgalWare 2022-2022 //---------------------------------------------------------------------------- -// File : ExportThreeJS.cpp Data : 05.07.22 Versione : 1.5h2 +// File : ExportThreeJS.cpp Data : 05.07.22 Versione : 2.4j1 // Contenuto : Implementazione della classe per l'esportazione in formato html (javascript). // // // -// Modifiche : 21.07.22 DS Creazione modulo. +// Modifiche : 19.10.22 DS Creazione modulo. // // //---------------------------------------------------------------------------- @@ -38,10 +38,26 @@ #include "/EgtDev/Include/EGkExtDimension.h" #include "/EgtDev/Include/EGrScene.h" #include "/EgtDev/Include/EGkCurveComposite.h" +#include "/EgtDev/Include/EGnFileUtils.h" +#include "/EgtDev/Extern/libzip/Include/zip.h" +#include "/EgtDev/Extern/libzip/Include/zipconf.h" using namespace std ; +//---------------------------------------------------------------------------- +string ExportThreeJS::m_sThreeJSAuxDir = "C:\\EgtData\\ThreeJSLib"; + + +//---------------------------------------------------------------------------- +bool +SetThreeJSAuxDir( const string& sThreeJSAuxDir) +{ + ExportThreeJS::m_sThreeJSAuxDir = sThreeJSAuxDir ; + return ExistsDirectory( sThreeJSAuxDir ) ; +} + + //---------------------------------------------------------------------------- IExportThreeJS* CreateExportThreeJS( void) @@ -50,7 +66,7 @@ CreateExportThreeJS( void) if ( ! GetEExNetHwKey() && ! TestKeyForEEx( GetEExKey(), KEYOPT_EEX_EXPBASE, GetEExLogger())) return nullptr ; // creo l'oggetto - return static_cast ( new( nothrow) ExportThreeJS) ; + return static_cast< IExportThreeJS*> ( new( nothrow) ExportThreeJS) ; } //---------------------------------------------------------------------------- @@ -61,6 +77,180 @@ ExportThreeJS::SetOptions( int nFilter) return true ; } +//---------------------------------------------------------------------------- +bool +ExportThreeJS::CreateFolderSpace( const string& SFileName, const string& sUserPath, const string& sLibPath) +{ + // dichiarazione percorsi + string sDir = sUserPath + SFileName ; + string sDirLib = sDir + "\\Lib" ; + + // creo la directory dove salvare il file e le librerie + if ( ! CreateDirectoryEgt( sDir)) + return false ; + if ( ! CreateDirectoryEgt( sDir + "\\Lib")) + return false ; + + // *** Controls, Css, Immagini + if ( ! CreateDirectoryEgt( sDirLib + "\\Controls")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\Css")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\Css\\Bootstrap")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\Css\\fontawesome")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\Css\\fontawesome\\css")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\Css\\fontawesome\\webfonts")) + return false ; + if ( ! CreateDirectoryEgt( sDirLib + "\\immagini")) + return false ; + + // *** files + if ( ! CopyFileEgt( sLibPath + "Controls\\OrbitControlsM.js", sDirLib + "\\Controls\\OrbitControlsM.js")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Controls\\ViewCubeControls.js", sDirLib + "\\Controls\\ViewCubeControls.js")) + return false ; + + + if ( ! CopyFileEgt( sLibPath + "Css\\Bootstrap\\bootstrap.min.css", sDirLib + "\\Css\\Bootstrap\\bootstrap.min.css")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\Bootstrap\\bootstrap-icons.css", sDirLib + "\\Css\\Bootstrap\\bootstrap-icons.css")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\Bootstrap\\fontawesomeall.css", sDirLib + "\\Css\\Bootstrap\\fontawesomeall.css")) + return false ; + + if ( ! CopyFileEgt( sLibPath + "Css\\fontawesome\\css\\all.min.css", sDirLib + "\\Css\\fontawesome\\css\\all.min.css")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\fontawesome\\webfonts\\fa-brands-400.ttf", sDirLib + "\\Css\\fontawesome\\webfonts\\fa-brands-400.ttf")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\fontawesome\\webfonts\\fa-regular-400.ttf", sDirLib + "\\Css\\fontawesome\\webfonts\\fa-regular-400.ttf")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\fontawesome\\webfonts\\fa-solid-900.ttf", sDirLib + "\\Css\\fontawesome\\webfonts\\fa-solid-900.ttf")) + return false ; + if ( ! CopyFileEgt( sLibPath + "Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf", sDirLib + "\\Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf")) + return false ; + + if ( ! CopyFileEgt( sLibPath + "Css\\StileScena.css", sDirLib + "\\Css\\StileScena.css")) + return false ; + + if ( ! CopyFileEgt( sLibPath + "immagini\\LogoQ.png", sDirLib + "\\immagini\\LogoQ.png")) + return false ; + if ( ! CopyFileEgt( sLibPath + "immagini\\LogoV.png", sDirLib + "\\immagini\\LogoV.png")) + return false ; + + if ( ! CopyFileEgt( sLibPath + "jquery.js", sDirLib + "\\jquery.js")) + return false ; + if ( ! CopyFileEgt( sLibPath + "three.module.js", sDirLib + "\\three.module.js")) + return false ; + + + if ( ! CopyFileEgt( sLibPath + "info.txt", sUserPath + "\\info.txt")) + return false ; + + return true ; +} + + +//---------------------------------------------------------------------------- +bool +ExportThreeJS::CompressAll( const string& sFile) +{ + string sDir = GetDirectory( sFile) ; + string sFileName = GetFileName( sFile) ; //.html + string sFileTitle = GetFileTitleEgt( sFile) ; // no .html + + int errorp ; + zip_t * zipper = zip_open((( sDir + "\\" + sFileTitle) + ".zip").c_str(), ZIP_CREATE | ZIP_EXCL, &errorp) ; + if ( zipper == nullptr) { + zip_error_t ziperror ; + zip_error_init_with_code( &ziperror, errorp) ; + LOG_ERROR( GetEExLogger(), ( "Failed to open output file " + sFileName + " or found a file with the same name: " + zip_error_strerror( &ziperror)).c_str()) ; + EraseFile( sFile) ; + return false ; + } + + zip_source_t * source = zip_source_file( zipper, ( sFile).c_str(), 0, 0) ; + if ( zip_file_add( zipper, sFileName.c_str(), source, ZIP_FL_ENC_UTF_8) < 0) + return false ; + + int nLibIndex = zip_dir_add( zipper, "Lib", ZIP_FL_ENC_UTF_8) ; + + // Lib + + int nControlIndex = zip_dir_add( zipper, "Lib\\Controls", ZIP_FL_ENC_UTF_8) ; + int nCssIndex = zip_dir_add( zipper, "Lib\\Css", ZIP_FL_ENC_UTF_8) ; + int nImmIndex = zip_dir_add( zipper, "Lib\\Immagini", ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\jquery.js").c_str(), 0, 0) ; + int nJQndex = zip_file_add( zipper, "Lib\\jquery.js", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\three.module.js").c_str(), 0, 0) ; + int nThreeIndex = zip_file_add( zipper, "Lib\\three.module.js", source, ZIP_FL_ENC_UTF_8) ; + + // Controls + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Controls\\OrbitControlsM.js" ).c_str(), 0, 0) ; + int nOBIndex = zip_file_add( zipper, "Lib\\Controls\\OrbitControlsM.js", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Controls\\ViewCubeControls.js" ).c_str(), 0, 0) ; + int nVCCIndex = zip_file_add( zipper, "Lib\\Controls\\ViewCubeControls.js", source, ZIP_FL_ENC_UTF_8) ; + + // Css + int nCssBIndex = zip_dir_add( zipper, "Lib\\Css\\Bootstrap", ZIP_FL_ENC_UTF_8) ; + int nCssfIndex = zip_dir_add( zipper, "Lib\\Css\\fontawesome", ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\StileScena.css").c_str(), 0, 0) ; + int nSCIndex = zip_file_add( zipper, "Lib\\Css\\StileScena.css", source, ZIP_FL_ENC_UTF_8) ; + + // Bootstrap + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\Bootstrap\\bootstrap.min.css" ).c_str(), 0, 0) ; + int nBMIndex = zip_file_add( zipper, "Lib\\Css\\Bootstrap\\bootstrap.min.css", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\Bootstrap\\bootstrap-icons.css").c_str(), 0, 0) ; + int nBIIndex = zip_file_add( zipper, "Lib\\Css\\Bootstrap\\bootstrap-icons.css", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\Bootstrap\\fontawesomeall.css").c_str(), 0, 0) ; + int nfaIndex = zip_file_add( zipper, "Lib\\Css\\Bootstrap\\fontawesomeall.css", source, ZIP_FL_ENC_UTF_8) ; + + + //fontawesome + int nfaCIndex = zip_dir_add( zipper, "Lib\\Css\\fontawesome\\css", ZIP_FL_ENC_UTF_8) ; + int nfaWIndex = zip_dir_add( zipper, "Lib\\Css\\fontawesome\\webfonts", ZIP_FL_ENC_UTF_8) ; + + //fontawesome -> css + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\fontawesome\\css\\all.min.css").c_str(), 0, 0) ; + int nfaAMIndex = zip_file_add( zipper, "Lib\\Css\\fontawesome\\css\\all.min.css", source, ZIP_FL_ENC_UTF_8) ; + + //fontawesome -> webfonts + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\fontawesome\\webfonts\\fa-brands-400.ttf").c_str(), 0, 0) ; + int nfafbIndex = zip_file_add( zipper, "Lib\\Css\\fontawesome\\webfonts\\fa-brands-400.ttf", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\fontawesome\\webfonts\\fa-regular-400.ttf").c_str(), 0, 0) ; + int nfafrIndex = zip_file_add( zipper, "Lib\\Css\\fontawesome\\webfonts\\fa-regular-400.ttf", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\fontawesome\\webfonts\\fa-solid-900.ttf").c_str(), 0, 0) ; + int nfafsIndex = zip_file_add( zipper, "Lib\\Css\\fontawesome\\webfonts\\fa-solid-900.ttf", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf").c_str(), 0, 0) ; + int nfafvIndex = zip_file_add( zipper, "Lib\\Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf", source, ZIP_FL_ENC_UTF_8) ; + + //Immagini + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Immagini\\LogoQ.png").c_str(), 0, 0) ; + int nIQIndex = zip_file_add( zipper, "Lib\\Immagini\\LogoQ.png", source, ZIP_FL_ENC_UTF_8) ; + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\Immagini\\LogoV.png").c_str(), 0, 0) ; + int nIVIndex = zip_file_add( zipper, "Lib\\Immagini\\LogoV.png", source, ZIP_FL_ENC_UTF_8) ; + + //file info + source = zip_source_file( zipper, ( m_sThreeJSAuxDir + "\\info.txt").c_str(), 0, 0) ; + int nInfoIndex = zip_file_add( zipper, "info.txt", source, ZIP_FL_ENC_UTF_8) ; + + + + int nFin = zip_close( zipper) ; + if ( nFin == -1) { + zip_error_t* ziperror = zip_get_error( zipper) ; + LOG_ERROR( GetEExLogger(), ( "Failed to open output file " + sFileName + ": " + zip_error_strerror( ziperror)).c_str()) ; + EraseFile( sFile) ; + return false ; + } + EraseFile( sFile) ; + + return true ; +} + + //---------------------------------------------------------------------------- bool ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, IEGrScene* pScene, bool bUdm) @@ -77,6 +267,10 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, IEGrScene* return false ; } + // creo la cartella contenente le librerie e i file + //if ( ! CreateFolderSpace( "ProvaProvaProva", "C:\\Users\\riccardo.elitropi\\Desktop\\", "C:\\Users\\riccardo.elitropi\\Desktop\\Lib\\")) //<========================= = MODIFICARE + // return false ; + // creo il frame m_frTHREEJSFrame.Set( ORIG, Y_AX, Z_AX, X_AX) ; @@ -88,22 +282,18 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, IEGrScene* } // prelevo le unità di misura - m_bUdm_mm = bUdm; - m_sUdm = "in"; - if (m_bUdm_mm) { - m_sUdm = "mm"; + m_bUdm_mm = bUdm ; + m_sUdm = "in" ; + if ( m_bUdm_mm) { + m_sUdm = "mm" ; } // 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) ; - // setto i filter - // m_nFilter = nFilter; - // creazione parte iniziale della pagina html bool bOk = HeadAmbient( pScene, pGDB, nId) ; @@ -115,7 +305,9 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, IEGrScene* // 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)"); + + // aggiungo tutto ciò che è nella scena nel nodo radice + m_Writer.OutText( " groupRoot.add(group0)") ; // creazione parte finale della pagina html bOk = FinishAmbient() ; @@ -124,6 +316,10 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, IEGrScene* if ( ! m_Writer.Close()) bOk = false ; + // comprimo la cartella + if ( ! CompressAll( sFile)) + bOk = false ; + return bOk; } @@ -136,35 +332,54 @@ 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 ; - m_dCameraPhi = dAngVertDeg; - m_dCameraTheta = dAngOrizzDeg; + double dAngVertDeg, dAngOrizzDeg, dDist ; // parametri della telecamera + Vector3d vtDirCamera ; + double dSnapStep ; // parametri della griglia + int nExtStep ; - // prelevo i parametri della griglia - double dSnapStep ; - int nExtStep ; - pScene->GetGridParam( dSnapStep, nExtStep) ; + // controllo che il puntatore alla Scena non sia nullo + if ( pScene != nullptr) { + // prelevo i parametri della camera da EGTCAM5 + pScene->GetOrthoCamParam( &m_dHalfWidth, &m_dHalfHeight, &m_ZNear, &m_ZFar) ; + m_ptCenter = pScene->GetCenter() ; + pScene->GetCamera( &dAngVertDeg, &dAngOrizzDeg, &dDist) ; + vtDirCamera = FromSpherical( 1, dAngVertDeg, dAngOrizzDeg) ; + m_ptCamera = m_ptCenter + dDist * vtDirCamera ; + m_dDistance = dDist ; + m_dCameraPhi = dAngVertDeg ; + m_dCameraTheta = dAngOrizzDeg ; - m_spath = ""; // <----- da far scegliere all'utente + // prelevo i parametri della griglia + pScene->GetGridParam( dSnapStep, nExtStep) ; + m_bShowGrid = ! pScene->GetShowGrid() ; + } + else { + // se non ho una Scena allora imposto dei parametri di Default (per griglia e telecamera) + m_dHalfWidth = 559.67 ; + m_dHalfHeight = 337.53 ; + m_ZNear = -24000 ; + m_ZFar = 26000 ; + m_ptCenter = Point3d( 0, 0, 0 ) ; + m_ptCamera = m_ptCenter + 1000 * FromSpherical( 1, 72.3684, 185.9832 ) ; + m_dCameraPhi = 72.3684 ; + m_dCameraTheta = 185.9832 ; + m_dDistance = 1000 ; + dSnapStep = 10 ; + nExtStep = 100 ; + } + + m_sPath = "" ; // percorso relativo all'interno delle cartelle (modificabile per future implementazioni) // scrittura parte iniziale del codice e librerie m_Writer.OutText( "") ; m_Writer.OutText( "") ; m_Writer.OutText( " ") ; // - m_Writer.OutText( " ") ; - m_Writer.OutText( " ") ; - m_Writer.OutText( " "); - m_Writer.OutText( " ") ; - m_Writer.OutText( " ") ; - //m_Writer.OutText( " ") ; + m_Writer.OutText( " ") ; + m_Writer.OutText( " ") ; + m_Writer.OutText( " "); + m_Writer.OutText( " ") ; + m_Writer.OutText( " ") ; m_Writer.OutText( " "); + m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; // - // body m_Writer.OutText( " ") ; // - m_Writer.OutText( "
") ; // div che contiene il caricamento della pagina + + // --- Div che contiene il caricamento della pagina + + m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; @@ -196,7 +413,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; - m_Writer.OutText( " ") ; + m_Writer.OutText( " ") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; @@ -213,8 +430,14 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; - m_Writer.OutText( "
") ; // div che contiene il canvas per la scena di THREEJS - m_Writer.OutText( "