diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 5c59b2d..de80ff9 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/ExtText.cpp b/ExtText.cpp index 7479f02..007d9c9 100644 --- a/ExtText.cpp +++ b/ExtText.cpp @@ -34,7 +34,7 @@ GEOOBJ_REGISTER( EXT_TEXT, NGE_E_TXT, ExtText) ; //---------------------------------------------------------------------------- ExtText::ExtText( void) - : m_pSTM( nullptr), m_ptP(), m_vtN( 0, 0, 1), m_vtD( 1, 0, 0), m_sFont(), + : m_pSTM( nullptr), m_bNoSTM( false), m_ptP(), m_vtN( 0, 0, 1), m_vtD( 1, 0, 0), m_sFont(), m_nWeight( 400), m_bItalic( false), m_dHeight( 10), m_dRatio( 1), m_dAddAdvance( 0), m_nTempProp() { } @@ -813,34 +813,43 @@ ExtText::ApproxWithArcs( double dLinTol, double dAngTolDeg, POLYARCLIST& lstPA) const ISurfTriMesh* ExtText::GetAuxSurf( void) const { - // imposto il font corrente e i suoi dati - FontManager& fntMgr = FontManager::GetFontManager() ; - if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance)) + // se impossibile (font unifilare), esco subito + if ( m_bNoSTM) return nullptr ; // se già calcolata, la restituisco if ( m_pSTM != nullptr) return m_pSTM ; + // imposto il font corrente e i suoi dati + FontManager& fntMgr = FontManager::GetFontManager() ; + if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance)) + return nullptr ; + // calcolo la trasformazione Frame3d frRef ; if ( ! frRef.Set( m_ptP, m_vtN, m_vtD)) return nullptr ; - // preparo il generatore della superficie - StmFromTriangleSoup StmFts ; - if ( ! StmFts.Start()) - return nullptr ; - // richiedo la lista delle regioni ISURFFRPLIST lstSfr ; - if ( ! fntMgr.GetRegion( m_sText, m_nInsPos, lstSfr)) + if ( ! fntMgr.GetRegion( m_sText, m_nInsPos, lstSfr)) { + m_bNoSTM = true ; return nullptr ; + } + + // preparo il generatore della superficie + StmFromTriangleSoup StmFts ; + if ( ! StmFts.Start()) { + for ( const auto& pSfr : lstSfr) + delete pSfr ; + return nullptr ; + } // per ogni regione richiedo la superficie ausiliaria e la aggiungo a quella generale for ( const auto& pSfr : lstSfr) { // recupero la superficie trimesh - const ISurfTriMesh* pStm = pSfr->GetAuxSurf() ; + PtrOwner pStm( GetBasicSurfFlatRegion( pSfr)->CalcAuxSurf( LIN_TOL_STD, ANG_TOL_STD_DEG)) ; if ( pStm != nullptr) { Triangle3d Tria ; int nT = pStm->GetFirstTriangle( Tria) ; @@ -871,6 +880,7 @@ ExtText::ResetAuxSurf( void) const if ( m_pSTM != nullptr) delete( m_pSTM) ; m_pSTM = nullptr ; + m_bNoSTM = false ; } //---------------------------------------------------------------------------- diff --git a/ExtText.h b/ExtText.h index 2c5b403..2da3d7e 100644 --- a/ExtText.h +++ b/ExtText.h @@ -131,6 +131,7 @@ class ExtText : public IExtText, public IGeoObjRW private : ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto mutable SurfTriMesh* m_pSTM ; // superficie trimesh ausiliaria + mutable bool m_bNoSTM ; // flag per indicare che STM non può esistere per questo testo Point3d m_ptP ; // punto di inserimento Vector3d m_vtN ; // versore normale Vector3d m_vtD ; // versore di direzione