//---------------------------------------------------------------------------- // 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 : 24.10.22 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "DllMain.h" #include "ExportThreeJS.h" #include "/EgtDev/Include/EExDllMain.h" #include "/EgtDev/Include/EGkGeoConst.h" #include "/EgtDev/Include/EGkFrame3d.h" #include "/EgtDev/Include/EGkGeomDB.h" #include "/EgtDev/Include/EGkGdbIterator.h" #include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGkGeoFrame3d.h" #include "/EgtDev/Include/EGKCurve.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkSurfFlatRegion.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkSurfBezier.h" #include "/EgtDev/Include/EGkExtText.h" #include "/EgtDev/Include/EGkExtDimension.h" #include "/EgtDev/Include/EGrScene.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGnFileUtils.h" #include "/EgtDev/Include/EgtStringConverter.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include "/EgtDev/Extern/libzip/Include/zip.h" #include "/EgtDev/Extern/libzip/Include/zipconf.h" using namespace std ; //---------------------------------------------------------------------------- const double ANG_TOL_STD_DEG = 15 ; //---------------------------------------------------------------------------- string ExportThreeJS::m_sThreeJSLibDir = "C:\\EgtData\\ThreeJSLib" ; //---------------------------------------------------------------------------- bool SetThreeJSLibDir( const string& sThreeJSLibDir) { ExportThreeJS::m_sThreeJSLibDir = sThreeJSLibDir ; return ExistsDirectory( sThreeJSLibDir ) ; } //---------------------------------------------------------------------------- IExportThreeJS* CreateExportThreeJS( void) { // verifico la chiave e le opzioni if ( ! VerifyKey( KEYOPT_EEX_EXPBASE)) return nullptr ; // creo l'oggetto return static_cast< IExportThreeJS*> ( new( nothrow) ExportThreeJS) ; } //---------------------------------------------------------------------------- bool ExportThreeJS::SetOptions( int nFilter) { m_nFilter = nFilter ; CalcGroupFilter() ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::CompressAll( const string& sFile) { string sDir = GetDirectory( sFile) ; string sFileName = GetFileName( sFile) ; //.html string sFileTitle = GetFileTitleEgt( sFile) ; // no .html // Preparo zip int errorp ; zip_t* pZipper = zip_open( (( sDir + "\\" + sFileTitle) + ".zip").c_str(), ZIP_CREATE | ZIP_TRUNCATE, &errorp) ; if ( pZipper == 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 ; } // Directory principale dentro lo zip if ( zip_dir_add( pZipper, ( sFileTitle).c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // File html zip_source_t * pSource = zip_source_file( pZipper, ( sFile ).c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\" + sFileName).c_str(), pSource, ZIP_FL_ENC_UTF_8 ) == -1) { EraseFile( sFile) ; return false ; } // Lib if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib").c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\jquery.js").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\jquery.js" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1 ) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\three.module.js").c_str(), 0, 0) ; if ( zip_file_add(pZipper, ( sFileTitle + "\\Lib\\three.module.js").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Controls if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Controls").c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Controls\\OrbitControlsM.js" ).c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Controls\\orbitControlsM.js").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Controls\\ViewCubeControls.js" ).c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Controls\\ViewCubeControls.js").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Css if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Css").c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\StileScena.css").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\StileScena.css").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Css -> Bootstrap if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Css\\Bootstrap" ).c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\Bootstrap\\bootstrap.min.css" ).c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\Bootstrap\\bootstrap.min.css" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\Bootstrap\\bootstrap-icons.css").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\Bootstrap\\bootstrap-icons.css" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\Bootstrap\\fontawesomeall.css").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\Bootstrap\\fontawesomeall.css" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Css -> fontawesome if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome" ).c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Css -> fontawesome -> css if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\css" ).c_str(), ZIP_FL_ENC_UTF_8) == -1 ) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\fontawesome\\css\\all.min.css").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\css\\all.min.css" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Css -> fontawesome -> webfonts if ( zip_dir_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\webfonts" ).c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\fontawesome\\webfonts\\fa-brands-400.ttf").c_str(), 0, 0) ; if ( zip_file_add(pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\webfonts\\fa-brands-400.ttf)" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\fontawesome\\webfonts\\fa-regular-400.ttf").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\webfonts\\fa-regular-400.ttf" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\fontawesome\\webfonts\\fa-solid-900.ttf").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\webfonts\\fa-solid-900.ttf" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf").c_str(), 0, 0) ; if ( zip_file_add(pZipper, ( sFileTitle + "\\Lib\\Css\\fontawesome\\webfonts\\fa-v4compatibility.ttf" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Immagini if ( zip_dir_add(pZipper, ( sFileTitle + "\\Lib\\Immagini" ).c_str(), ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Immagini\\LogoQ.png").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Immagini\\LogoQ.png" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Immagini\\LogoV.png").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Immagini\\LogoV.png" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // File info pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\info.txt").c_str(), 0, 0) ; if ( zip_file_add( pZipper, ( sFileTitle + "\\info.txt" ).c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } // Salvo il file zip if ( zip_close( pZipper) == -1) { zip_error_t* ziperror = zip_get_error( pZipper) ; LOG_ERROR( GetEExLogger(), ( "Failed to open output file " + sFileName + ": " + zip_error_strerror( ziperror)).c_str()) ; EraseFile( sFile) ; return false ; } // Cancello il file html EraseFile( sFile) ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::Export( IGeomDB* pGDB, int nId, IEGrScene* pScene, bool bUdm, const string& sFile) { // 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 ; } // determino le unità di misura m_bUdm_mm = bUdm ; m_sUdm = ( m_bUdm_mm ? "mm" : "in") ; // calcolo 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 if ( ! HeadAmbient( pScene, pGDB, nId)) return false ; // esporto l'oggetto e i suoi eventuali figli PtrOwner< IGdbIterator> pIter( CreateGdbIterator( pGDB)) ; if ( IsNull( pIter)) return false ; pIter->GoTo( nId) ; if ( ! ExportObject( *pIter, pGDB, m_nGroupCount)) return false ; // aggiungo tutto ciò che è nella scena nel nodo radice m_Writer.OutText( " groupRoot.add(group0)") ; // creazione parte finale della pagina html if ( ! FinishAmbient()) return false ; // chiudo il file if ( ! m_Writer.Close()) return false ; // comprimo la cartella if ( ! CompressAll( sFile)) return false ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) { // ================================================================ // CREAZIONE PARTE INIZIALE DELLA SCENA =========================== // ================================================================ double dAngVertDeg, dAngOrizzDeg, dDist ; // parametri della telecamera double dSnapStep ; // parametri della griglia int nExtStep ; // se esiste una scena associata al DB geometrico if ( pScene != nullptr) { // prelevo i parametri della camera pScene->GetOrthoCamParam( &m_dHalfWidth, &m_dHalfHeight, &m_dZNear, &m_dZFar) ; m_ptCenter = pScene->GetCenter() ; 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 ; // prelevo i parametri della griglia pScene->GetGridParam( dSnapStep, nExtStep) ; m_bShowGrid = ! pScene->GetShowGrid() ; } // altrimenti imposto dei parametri standard else { m_dHalfWidth = 559.67 ; m_dHalfHeight = 337.53 ; m_dZNear = -24000 ; m_dZFar = 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 ; } string 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) ; int nType = iIter.GetGdbType() ; // se il filtro lo abilita if ( TestFilter( nLev, nMode, nStat, nType == GDB_TY_GROUP)) { switch ( nType) { 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 ; // recupero eventuale nome string sName ; if ( ! iIter.GetName( sName)) sName = ToString( iIter.GetId()) ; // colore oggetto Color cCol ; int nIndex ; bool bColorSpot = false ; iIter.GetMaterial( nIndex) ; if ( nIndex == GDB_MT_COLOR) iIter.GetMaterial( cCol) ; else { PtrOwner< IGdbIterator> iIterNew( CreateGdbIterator( pGDB)) ; int nParendID = iIter.GetParentId() ; int nMaterialID ; while ( ! bColorSpot) { iIterNew->GoTo( nParendID) ; if ( iIterNew->GetMaterial( nMaterialID) && nMaterialID == GDB_MT_COLOR) { iIterNew->GetMaterial( cCol) ; bColorSpot = true ; } nParendID = iIterNew->GetParentId() ; } } // emetto l'oggetto switch ( pGeoObj->GetType()) { case GEO_VECT3D : if ( ! ExportVector3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case GEO_PNT3D : if ( ! ExportPoint3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case GEO_FRAME3D : if ( ! ExportFrame3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_LINE : if ( ! ExportLine3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_ARC : if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_COMPO : if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_BEZIER : if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_TRIMESH : if ( ! ExportSTM( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_FLATRGN : if ( ! ExportSFR( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_BEZIER : if ( ! ExportSBezier( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case EXT_TEXT : if ( ! ExportText( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case EXT_DIMENSION : 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 vlength" + sName + " = " + ToString( vVec.Len()) + ";") ; m_Writer.OutText( " var vhex" + sName + " = " + sHexCol +";") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(vettore" + sName + ", origin, vlength" + sName + ", vhex" + sName + ");") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(vhex" + sName + ");") ; //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) ; // porto i vettori in coordinate ThreeJS Vector3d vx = frCurrentFrame.VersX() ; Vector3d vy = frCurrentFrame.VersY() ; Vector3d vz = frCurrentFrame.VersZ() ; vx.LocToLoc( frFrame, m_frTHREEJSFrame) ; vy.LocToLoc(frFrame, m_frTHREEJSFrame) ; vz.LocToLoc(frFrame, m_frTHREEJSFrame) ; double dVecLen = sqrt( vx.x * vx.x + vx.y * vx.y + vx.z * vx.z) ; // riferimento al vettore lungo x (lunghezza vettori) // 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 xlength" + sName + " = " + ToString( dVecLen) + " * 10;") ; m_Writer.OutText( " var xhex" + sName + " = 0xff0000;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(xdir" + sName + ", origin" + sName + ", xlength" + sName +", xhex" + sName + ", " + ToString( dVecLen) + " * 2);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(xhex" + sName + ");") ; 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 ylength" + sName + " = " + ToString( dVecLen) + " * 10;") ; m_Writer.OutText( " var yhex" + sName + " = 0x00ff00;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(ydir" + sName + ", origin" + sName + ", ylength" + sName +", yhex" + sName + ", " + ToString( dVecLen) + " * 2);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(yhex" + sName + ");") ; 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 zlength" + sName + " = " + ToString( dVecLen) + " * 10;") ; m_Writer.OutText( " var zhex" + sName + " = 0x0000ff;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(zdir" + sName + ", origin" + sName + ", zlength" + sName + ", zhex" + sName + ", " + ToString( dVecLen) + " * 2);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(zhex" + sName + ");") ; 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, 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* pSTMtc = GetSurfTriMesh( pGeoObj) ; if ( pSTMtc == nullptr) return false ; PtrOwner pSTM( pSTMtc->Clone()) ; pSTM->DoCompacting() ; // 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_vTranspSurf.push_back( sNewSurfDist) ; dOpacityThreeJs = 0.7 + 0.2*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, 15) + ", " + ToString( ptCurrent.y, 15) + ", " + ToString( ptCurrent.z, 15) + "),", 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('computeFaceNormals error in " + ToString( m_nCont) + "'); console.log(err); console.log('---')}") ; // 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, 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);") ; // traslazione del testo 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, 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()) ; 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 + "'") ; // aggiungo l'EventListner per il menu 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_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)});") ; 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, bool bGroup) { int nFilter = bGroup ? m_nGroupFilter : m_nFilter ; if ( ( nLev == GDB_LV_USER && ( nFilter & EEXFLT_LEVUSER) == 0) || ( nLev == GDB_LV_SYSTEM && ( nFilter & EEXFLT_LEVSYSTEM) == 0) || ( nLev == GDB_LV_TEMP && ( nFilter & EEXFLT_LEVTEMP) == 0)) return false ; if ( ( nMode == GDB_MD_STD && ( nFilter & EEXFLT_MODESTD) == 0) || ( nMode == GDB_MD_LOCKED && ( nFilter & EEXFLT_MODELOCKED) == 0) || ( nMode == GDB_MD_HIDDEN && ( nFilter & EEXFLT_MODEHIDDEN) == 0)) return false ; if ( ( nStat == GDB_ST_OFF && ( nFilter & EEXFLT_STAOFF) == 0) || ( nStat == GDB_ST_ON && ( nFilter & EEXFLT_STAON) == 0) || ( nStat == GDB_ST_SEL && ( nFilter & EEXFLT_STASEL) == 0)) return false ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::CalcGroupFilter( void) { m_nGroupFilter = 0 ; // Status if ( ( m_nFilter & EEXFLT_STASEL) != 0) m_nGroupFilter += EEXFLT_STASEL + EEXFLT_STAOFF + EEXFLT_STAON ; else if ( ( m_nFilter & EEXFLT_STAOFF) != 0) m_nGroupFilter += EEXFLT_STAOFF + EEXFLT_STAON ; else m_nGroupFilter += EEXFLT_STAON ; // Mode if ( ( m_nFilter & EEXFLT_MODELOCKED) != 0) m_nGroupFilter += EEXFLT_MODELOCKED + EEXFLT_MODEHIDDEN + EEXFLT_MODESTD ; else if ( ( m_nFilter & EEXFLT_MODEHIDDEN) != 0) m_nGroupFilter += EEXFLT_MODEHIDDEN + EEXFLT_MODESTD ; else m_nGroupFilter += EEXFLT_MODESTD ; // Level if ( ( m_nFilter & EEXFLT_LEVSYSTEM) != 0) m_nGroupFilter += EEXFLT_LEVSYSTEM + EEXFLT_LEVTEMP + EEXFLT_LEVUSER ; else if ( ( m_nFilter & EEXFLT_LEVTEMP) != 0) m_nGroupFilter += EEXFLT_LEVTEMP + EEXFLT_LEVUSER ; else m_nGroupFilter += EEXFLT_LEVUSER ; return true ; }