EgtGeomKernel 1.5f2 :
- aggiunta gestione testi multilinea - migliorie e correzioni varie sui testi.
This commit is contained in:
+183
-48
@@ -44,6 +44,9 @@ ExtText::~ExtText( void)
|
||||
bool
|
||||
ExtText::Set( const string& sText, const Point3d& ptP, double dAngDeg, double dH)
|
||||
{
|
||||
// controllo testo
|
||||
if ( sText.empty())
|
||||
return false ;
|
||||
// assegno i dati
|
||||
m_ptP = ptP ;
|
||||
m_vtN = Z_AX ;
|
||||
@@ -55,6 +58,7 @@ ExtText::Set( const string& sText, const Point3d& ptP, double dAngDeg, double dH
|
||||
m_dHeight = dH ;
|
||||
m_dRatio = 1 ;
|
||||
m_dAddAdvance = 0 ;
|
||||
m_nInsPos = ETXT_IPBL ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
@@ -65,8 +69,12 @@ ExtText::Set( const string& sText, const Point3d& ptP, double dAngDeg, double dH
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::Set( const string& sText, const Point3d& ptP, double dAngDeg,
|
||||
const string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv)
|
||||
const string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv,
|
||||
int nInsPos)
|
||||
{
|
||||
// controllo testo
|
||||
if ( sText.empty())
|
||||
return false ;
|
||||
// assegno i dati
|
||||
m_ptP = ptP ;
|
||||
m_vtN = Z_AX ;
|
||||
@@ -78,6 +86,39 @@ ExtText::Set( const string& sText, const Point3d& ptP, double dAngDeg,
|
||||
m_dHeight = dH ;
|
||||
m_dRatio = dRat ;
|
||||
m_dAddAdvance = dAddAdv ;
|
||||
m_nInsPos = (( nInsPos >= ETXT_IPTL && nInsPos <= ETXT_IPBR) ? nInsPos : ETXT_IPBL) ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::Set( const string& sText, const Point3d& ptP, const Vector3d& vtN, const Vector3d& vtD,
|
||||
const string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv,
|
||||
int nInsPos)
|
||||
{
|
||||
// controllo testo
|
||||
if ( sText.empty())
|
||||
return false ;
|
||||
// assegno i dati
|
||||
m_ptP = ptP ;
|
||||
m_vtN = vtN ;
|
||||
if ( ! m_vtN.Normalize())
|
||||
return false ;
|
||||
m_vtD = vtD - m_vtN * ( vtD * m_vtN) ;
|
||||
if ( ! m_vtD.Normalize())
|
||||
return false ;
|
||||
m_sText = sText ;
|
||||
m_sFont = sFont ;
|
||||
m_nWeight = nW ;
|
||||
m_bItalic = bItl ;
|
||||
m_dHeight = dH ;
|
||||
m_dRatio = dRat ;
|
||||
m_dAddAdvance = dAddAdv ;
|
||||
m_nInsPos = (( nInsPos >= ETXT_IPTL && nInsPos <= ETXT_IPBR) ? nInsPos : ETXT_IPBL) ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
@@ -128,6 +169,7 @@ ExtText::Copy( const ExtText& clSrc)
|
||||
m_dHeight = clSrc.m_dHeight ;
|
||||
m_dRatio = clSrc.m_dRatio ;
|
||||
m_dAddAdvance = clSrc.m_dAddAdvance ;
|
||||
m_nInsPos = clSrc.m_nInsPos ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -150,8 +192,9 @@ ExtText::GetTitle( void) const
|
||||
bool
|
||||
ExtText::Dump( string& sOut, const char* szNewLine) const
|
||||
{
|
||||
// parametri : PtIns, Normale, DirStart, Rad, AngCenDeg, DeltaN
|
||||
sOut += "P(" + ToString( m_ptP, 3) + ") " + szNewLine ;
|
||||
// parametri
|
||||
sOut += "P(" + ToString( m_ptP, 3) + ") " ;
|
||||
sOut += " IP=" + ToString( m_nInsPos) + szNewLine ;
|
||||
sOut += "VN(" + ToString( m_vtN, 6) + ") " + szNewLine ;
|
||||
sOut += "VS(" + ToString( m_vtD, 6) + ") " + szNewLine ;
|
||||
sOut += "Txt=" + m_sText + szNewLine ;
|
||||
@@ -178,6 +221,8 @@ ExtText::Save( NgeWriter& ngeOut) const
|
||||
{
|
||||
// punto di inserimento
|
||||
ngeOut.WritePoint( m_ptP, ";") ;
|
||||
// flag posizione inserimento
|
||||
ngeOut.WriteInt( m_nInsPos, ";") ;
|
||||
// versore normale
|
||||
ngeOut.WriteVector( m_vtN, ";") ;
|
||||
// versore di direzione
|
||||
@@ -206,9 +251,11 @@ ExtText::Load( NgeReader& ngeIn)
|
||||
{
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
// leggo la prossima linea : punto, normale, direzione
|
||||
// leggo la prossima linea : punto, posiz. inserimento, normale, direzione
|
||||
if ( ! ngeIn.ReadPoint( m_ptP, ";"))
|
||||
return false ;
|
||||
if ( ! ngeIn.ReadInt( m_nInsPos, ";"))
|
||||
return false ;
|
||||
if ( ! ngeIn.ReadVector( m_vtN, ";"))
|
||||
return false ;
|
||||
if ( ! ngeIn.ReadVector( m_vtD, ";", true))
|
||||
@@ -245,7 +292,7 @@ ExtText::GetLocalBBox( BBox3d& b3Loc) const
|
||||
return false ;
|
||||
|
||||
// richiedo il box
|
||||
if ( ! fntMgr.GetBBox( m_sText, b3Loc))
|
||||
if ( ! fntMgr.GetBBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione
|
||||
@@ -273,7 +320,7 @@ ExtText::GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const
|
||||
return false ;
|
||||
|
||||
// richiedo il box
|
||||
if ( ! fntMgr.GetBBox( m_sText, b3Ref))
|
||||
if ( ! fntMgr.GetBBox( m_sText, m_nInsPos, b3Ref))
|
||||
return false ;
|
||||
|
||||
// calcolo ed eseguo la prima trasformazione (per tener conto dell'orientamento del testo)
|
||||
@@ -454,12 +501,62 @@ ExtText::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
|
||||
m_vtD.ToGlob( frOri) && m_vtD.ToLoc( frDest)) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::GetHeightVersor( Vector3d& vtH) const
|
||||
{
|
||||
vtH = m_vtN ^ m_vtD ;
|
||||
return ( vtH.Normalize()) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::GetStartPoint( Point3d& ptStart) const
|
||||
{
|
||||
// assegno il punto
|
||||
ptStart = m_ptP ;
|
||||
// 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 false ;
|
||||
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// ricavo il punto di inizio
|
||||
ptStart = b3Loc.GetMin() ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptStart.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::GetOverStartPoint( Point3d& ptStart) 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))
|
||||
return false ;
|
||||
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// ricavo il punto sopra l'inizio
|
||||
ptStart.Set( b3Loc.GetMin().x, b3Loc.GetMax().y, 0) ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptStart.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -473,13 +570,45 @@ ExtText::GetEndPoint( Point3d& ptEnd) const
|
||||
if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance))
|
||||
return false ;
|
||||
|
||||
// richiedo la lunghezza
|
||||
double dLen ;
|
||||
if ( ! fntMgr.GetLength( m_sText, dLen))
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// calcolo il punto
|
||||
ptEnd = m_ptP + m_vtD * dLen ;
|
||||
// ricavo il punto di fine
|
||||
ptEnd.Set( b3Loc.GetMax().x, b3Loc.GetMin().y, 0) ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptEnd.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtText::GetOverEndPoint( Point3d& ptEnd) 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))
|
||||
return false ;
|
||||
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// ricavo il punto sopra la fine
|
||||
ptEnd = b3Loc.GetMax() ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptEnd.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -493,13 +622,19 @@ ExtText::GetMidPoint( Point3d& ptMid) const
|
||||
if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance))
|
||||
return false ;
|
||||
|
||||
// richiedo la lunghezza
|
||||
double dLen ;
|
||||
if ( ! fntMgr.GetLength( m_sText, dLen))
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// calcolo il punto
|
||||
ptMid = m_ptP + m_vtD * ( 0.5 * dLen) ;
|
||||
// assegno il medio
|
||||
ptMid.Set( 0.5 * ( b3Loc.GetMin().x + b3Loc.GetMax().x), b3Loc.GetMin().y, 0) ;
|
||||
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptMid.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -513,21 +648,19 @@ ExtText::GetCenterPoint( Point3d& ptCen) const
|
||||
if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance))
|
||||
return false ;
|
||||
|
||||
// richiedo lunghezza e altezza delle maiuscole
|
||||
double dLen ;
|
||||
if ( ! fntMgr.GetLength( m_sText, dLen))
|
||||
return false ;
|
||||
double dCapH ;
|
||||
if ( ! fntMgr.GetCapHeight( dCapH))
|
||||
// richiedo il box delle maiuscole
|
||||
BBox3d b3Loc ;
|
||||
if ( ! fntMgr.GetCapBox( m_sText, m_nInsPos, b3Loc))
|
||||
return false ;
|
||||
|
||||
// vettore diretto come l'altezza
|
||||
Vector3d vtH = m_vtN ^ m_vtD ;
|
||||
if ( ! vtH.Normalize())
|
||||
return false ;
|
||||
// ricavo il centro
|
||||
ptCen = Media( b3Loc.GetMin(), b3Loc.GetMax(), 0.5) ;
|
||||
|
||||
// calcolo il punto
|
||||
ptCen = m_ptP + m_vtD * ( 0.5 * dLen) + vtH * ( 0.5 * dCapH) ;
|
||||
// calcolo ed eseguo la trasformazione (da riferimento canonico font alla entità)
|
||||
Frame3d frRef ;
|
||||
if ( ! frRef.Set( m_ptP, m_vtN, m_vtD))
|
||||
return false ;
|
||||
ptCen.ToGlob( frRef) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -542,7 +675,7 @@ ExtText::GetOutline( ICURVEPLIST& lstPC) const
|
||||
return false ;
|
||||
|
||||
// richiedo l'outline
|
||||
if ( ! fntMgr.GetOutline( m_sText, lstPC))
|
||||
if ( ! fntMgr.GetOutline( m_sText, m_nInsPos, lstPC))
|
||||
return false ;
|
||||
|
||||
// calcolo la trasformazione
|
||||
@@ -568,7 +701,7 @@ ExtText::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL
|
||||
return false ;
|
||||
|
||||
// richiedo l'outline
|
||||
if ( ! fntMgr.ApproxWithLines( m_sText, dLinTol, dAngTolDeg, lstPL))
|
||||
if ( ! fntMgr.ApproxWithLines( m_sText, m_nInsPos, dLinTol, dAngTolDeg, lstPL))
|
||||
return false ;
|
||||
|
||||
// calcolo la trasformazione
|
||||
@@ -610,28 +743,30 @@ ExtText::Mir( bool bOnLen)
|
||||
|
||||
// se auto-mirror sulla lunghezza del testo
|
||||
if ( bOnLen) {
|
||||
// richiedo lunghezza
|
||||
double dLen ;
|
||||
if ( ! fntMgr.GetLength( m_sText, dLen))
|
||||
return false ;
|
||||
// calcolo il punto
|
||||
m_ptP += m_vtD * dLen ;
|
||||
// faccio mirror sulla lunghezza della posizione di inserimento
|
||||
switch ( m_nInsPos) {
|
||||
case ETXT_IPTL : m_nInsPos = ETXT_IPTR ; break ;
|
||||
case ETXT_IPTR : m_nInsPos = ETXT_IPTL ; break ;
|
||||
case ETXT_IPML : m_nInsPos = ETXT_IPMR ; break ;
|
||||
case ETXT_IPMR : m_nInsPos = ETXT_IPML ; break ;
|
||||
case ETXT_IPBL : m_nInsPos = ETXT_IPBR ; break ;
|
||||
case ETXT_IPBR : m_nInsPos = ETXT_IPBL ; break ;
|
||||
}
|
||||
// inverto i versori
|
||||
m_vtN *= - 1 ;
|
||||
m_vtD *= - 1 ;
|
||||
}
|
||||
// altrimenti auto-mirror su altezza del testo
|
||||
else {
|
||||
// richiedo altezza delle maiuscole
|
||||
double dCapH ;
|
||||
if ( ! fntMgr.GetCapHeight( dCapH))
|
||||
return false ;
|
||||
// vettore diretto come l'altezza
|
||||
Vector3d vtH = m_vtN ^ m_vtD ;
|
||||
if ( ! vtH.Normalize())
|
||||
return false ;
|
||||
// calcolo il punto
|
||||
m_ptP += vtH * dCapH ;
|
||||
// faccio mirror sulla altezza della posizione di inserimento
|
||||
switch ( m_nInsPos) {
|
||||
case ETXT_IPTL : m_nInsPos = ETXT_IPBL ; break ;
|
||||
case ETXT_IPTC : m_nInsPos = ETXT_IPBC ; break ;
|
||||
case ETXT_IPTR : m_nInsPos = ETXT_IPBR ; break ;
|
||||
case ETXT_IPBL : m_nInsPos = ETXT_IPTL ; break ;
|
||||
case ETXT_IPBC : m_nInsPos = ETXT_IPTC ; break ;
|
||||
case ETXT_IPBR : m_nInsPos = ETXT_IPTR ; break ;
|
||||
}
|
||||
// inverto il versore normale
|
||||
m_vtN *= - 1 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user