EgtGeomKernel 1.5f2 :

- aggiunta gestione testi multilinea
- migliorie e correzioni varie sui testi.
This commit is contained in:
Dario Sassi
2014-06-06 08:53:14 +00:00
parent 41a38fef3b
commit bf2eb6648e
14 changed files with 569 additions and 160 deletions
+183 -48
View File
@@ -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 ;
}