//---------------------------------------------------------------------------- // EgalWare 2022-2022 //---------------------------------------------------------------------------- // File : ExportThreeJS.cpp Data : 05.07.22 Versione : 2.4j1 // Contenuto : Implementazione della classe per l'esportazione in formato html (javascript). // // // // Modifiche : 19.10.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" #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) { // 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::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) { // 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 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) ; // 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 ; } // prelevo le unità di misura 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_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 // aggiungo tutto ciò che è nella scena nel nodo radice m_Writer.OutText( " groupRoot.add(group0)") ; // creazione parte finale della pagina html bOk = FinishAmbient() ; // chiudo il file if ( ! m_Writer.Close()) bOk = false ; // comprimo la cartella if ( ! CompressAll( sFile)) bOk = false ; return bOk; } //---------------------------------------------------------------------------- bool ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) { // ================================================================ // CREAZIONE PARTE INIZIALE DELLA SCENA =========================== // ================================================================ double dAngVertDeg, dAngOrizzDeg, dDist ; // parametri della telecamera Vector3d vtDirCamera ; double dSnapStep ; // parametri della griglia int 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 ; // 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( " ") ; // // --- Div che contiene il caricamento della pagina 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( "
EGALWARE
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
'A new way to create between hardware and software'
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
"); m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; m_Writer.OutText( "
") ; // --- Div che contiene il canvas per la scena m_Writer.OutText( "
") ; // --- bottone laterale sinistro del menu (overlapping) m_Writer.OutText( " ") ; // --- Menu in basso con misure, ingombri e selezione m_Writer.OutText( " ") ; // --- Contenitore del Logo m_Writer.OutText( " ") ; // --- Menu a destra con i controlli m_Writer.OutText( " ") ; // --- Contenitore del Cubetto m_Writer.OutText( "
") ; // script type module per THREEJS (inclusione delle librerie) ===== m_Writer.OutText( " ") ; // script per pulsante del menu laterale m_Writer.OutText( " ") ; m_Writer.OutText( "") ; // codice html per la creazione del menu laterale m_Writer.OutText( " ") ; // codice html per la creazione del menu contestuale al click del mouse m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; m_Writer.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 ; } //} 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) + "),", false) ; // 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) + "),", false) ; } m_Writer.OutText( " );", false) ; 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 ; //m_Writer.OutText(" try {"); 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) + "),", false) ; } m_Writer.OutText( " ];", false) ; // 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]) + "),", false) ; } 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( " try{") ; m_Writer.OutText( " geom" + ToString( m_nCont) + ".computeFaceNormals();") ; // per rendering effetto ombre e luce m_Writer.OutText( " } catch(err){ console.log(err);};") ; // 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) + ")") ; } //m_Writer.OutText(" }"); //m_Writer.OutText(" catch(err){ console.log(err); }"); 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) + "),", false) ; } 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) + "),", false) ; while ( aLine.GetNextPoint( ptCurrent)) { ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ; m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),", false) ; } 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()) ; //================================================================================================ // 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)) { m_nGroupCount++ ; m_Writer.OutText(" const group" + ToString( m_nGroupCount) + " = new THREE.Group();") ; if ( nGroupCount != -1) m_sCodMenu += "
    " ; string sName ; pIter->GetName(sName); string sId = ToString(pIter->GetId()); m_Writer.OutText( " group" + ToString( m_nGroupCount) + ".name = '" + sId + "'") ; // aggiung l'EventListner per il menù laterale sinistro m_Writer.OutText( " document.getElementById('p_id_" + sId + "').addEventListener('click', function(){ if(!booked) { findGroupByNameAndId(groupRoot, " + sId + ", 1); }});") ; m_Writer.OutText( " document.getElementById('lb_" + sId + "').addEventListener('click', function(){ lightbulb('lb_" + sId + "', 0)});") ; if ( ! sId.compare( "0")) { m_sCodMenu += "
    " ; m_sCodMenu += "" ; m_sCodMenu += "" ; m_sCodMenu += "
    " ; } else { m_sCodMenu += "
    " ; m_sCodMenu += "" ; m_sCodMenu += "" ; m_sCodMenu += "
    " ; } 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_sCodMenu += "
" ; } 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 ; }