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
BIN
View File
Binary file not shown.
+6 -4
View File
@@ -235,6 +235,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="DistPointCurve.cpp" />
<ClCompile Include="DistPointLine.cpp" />
<ClCompile Include="ExtText.cpp" />
<ClCompile Include="FontAux.cpp" />
<ClCompile Include="FontManager.cpp" />
<ClCompile Include="GdbExecutor.cpp" />
<ClCompile Include="CurveArc.cpp" />
@@ -256,9 +257,9 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="GeoVector3d.cpp" />
<ClCompile Include="IterManager.cpp" />
<ClCompile Include="Material.cpp" />
<ClCompile Include="NfeFont.cpp" />
<ClCompile Include="FontNfe.cpp" />
<ClCompile Include="NgeReader.cpp" />
<ClCompile Include="OsFont.cpp" />
<ClCompile Include="FontOs.cpp" />
<ClCompile Include="OutTsc.cpp" />
<ClCompile Include="Point3d.cpp" />
<ClCompile Include="PointGrid3d.cpp" />
@@ -328,6 +329,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClInclude Include="DistPointLine.h" />
<ClInclude Include="DllMain.h" />
<ClInclude Include="ExtText.h" />
<ClInclude Include="FontAux.h" />
<ClInclude Include="FontManager.h" />
<ClInclude Include="GdbExecutor.h" />
<ClInclude Include="CurveArc.h" />
@@ -351,12 +353,12 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClInclude Include="IdManager.h" />
<ClInclude Include="IterManager.h" />
<ClInclude Include="Material.h" />
<ClInclude Include="NfeFont.h" />
<ClInclude Include="FontNfe.h" />
<ClInclude Include="NgeConst.h" />
<ClInclude Include="NgeKeyW.h" />
<ClInclude Include="NgeReader.h" />
<ClInclude Include="ObjGraphicsMgr.h" />
<ClInclude Include="OsFont.h" />
<ClInclude Include="FontOs.h" />
<ClInclude Include="OutTsc.h" />
<ClInclude Include="PolynomialPoint3d.h" />
<ClInclude Include="Resource.h" />
+10 -4
View File
@@ -168,10 +168,13 @@
<ClCompile Include="FontManager.cpp">
<Filter>File di origine\Gdb</Filter>
</ClCompile>
<ClCompile Include="NfeFont.cpp">
<ClCompile Include="FontNfe.cpp">
<Filter>File di origine\Gdb</Filter>
</ClCompile>
<ClCompile Include="OsFont.cpp">
<ClCompile Include="FontOs.cpp">
<Filter>File di origine\Gdb</Filter>
</ClCompile>
<ClCompile Include="FontAux.cpp">
<Filter>File di origine\Gdb</Filter>
</ClCompile>
</ItemGroup>
@@ -431,10 +434,13 @@
<ClInclude Include="FontManager.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="NfeFont.h">
<ClInclude Include="FontNfe.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="OsFont.h">
<ClInclude Include="FontOs.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="FontAux.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup>
+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 ;
}
+11 -1
View File
@@ -54,7 +54,11 @@ class ExtText : public IExtText, public IGeoObjRW
virtual bool Copy( const IGeoObj* pGObjSrc) ;
virtual bool Set( const std::string& sText, const Point3d& ptP, double dAngDeg, double dH) ;
virtual bool Set( const std::string& sText, const Point3d& ptP, double dAngDeg,
const std::string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv) ;
const std::string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv,
int nInsPos = 7) ;
virtual bool Set( const std::string& sText, const Point3d& ptP, const Vector3d& vtN, const Vector3d& vtD,
const std::string& sFont, int nW, bool bItl, double dH, double dRat, double dAddAdv,
int nInsPos = 7) ;
virtual const Point3d& GetPoint( void) const
{ return m_ptP ; }
virtual const Vector3d& GetNormVersor( void) const
@@ -75,8 +79,13 @@ class ExtText : public IExtText, public IGeoObjRW
{ return m_dRatio ; }
virtual double GetAddAdvance( void) const
{ return m_dAddAdvance ; }
virtual int GetInsPosition( void) const
{ return m_nInsPos ; }
virtual bool GetHeightVersor( Vector3d& vtH) const ;
virtual bool GetStartPoint( Point3d& ptStart) const ;
virtual bool GetOverStartPoint( Point3d& ptStart) const ;
virtual bool GetEndPoint( Point3d& ptEnd) const ;
virtual bool GetOverEndPoint( Point3d& ptEnd) const ;
virtual bool GetMidPoint( Point3d& ptMid) const ;
virtual bool GetCenterPoint( Point3d& ptCen) const ;
virtual bool GetOutline( ICURVEPLIST& lstPC) const ;
@@ -111,4 +120,5 @@ class ExtText : public IExtText, public IGeoObjRW
double m_dHeight ; // altezza del carattere
double m_dRatio ; // rapporto tra larghezza e altezza
double m_dAddAdvance ; // avanzamento addizionale tra caratteri
int m_nInsPos ; // posizione del punto di inserimento rispetto al testo
} ;
+59
View File
@@ -0,0 +1,59 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : FontAux.cpp Data : 05.06.14 Versione : 1.5f2
// Contenuto : Implementazione delle funzioni ausiliarie per i font.
//
//
//
// Modifiche : 05.06.14 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "FontAux.h"
#include "/EgtDev/Include/EGkExtText.h"
//----------------------------------------------------------------------------
bool
IsLineBreak( const UINTVECTOR& vCode, int nInd, int& nLen)
{
// riconoscimento del comando di interruzione di linea "<br/>"
if ( vCode[nInd] == '<' && ( nInd + 4) < int( vCode.size()) &&
vCode[nInd+1] == 'b' && vCode[nInd+2] == 'r' &&
vCode[nInd+3] == '/' && vCode[nInd+4] == '>') {
nLen = 4 ;
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
Vector3d
GetTextInsertPointMove( double dMaxW, double dAscent, double dMinH, int nInsPos)
{
switch ( nInsPos) {
case ETXT_IPTL :
return Vector3d( 0, - dAscent, 0) ;
case ETXT_IPTC :
return Vector3d( - 0.5 * dMaxW, - dAscent, 0) ;
case ETXT_IPTR :
return Vector3d( - dMaxW, - dAscent, 0) ;
case ETXT_IPML :
return Vector3d( 0, 0.5 * ( dMinH - dAscent), 0) ;
case ETXT_IPMC :
return Vector3d( - 0.5 * dMaxW, 0.5 * ( dMinH - dAscent), 0) ;
case ETXT_IPMR :
return Vector3d( - dMaxW, 0.5 * ( dMinH - dAscent), 0) ;
default :
case ETXT_IPBL :
return Vector3d( 0, - dMinH, 0) ;
case ETXT_IPBC :
return Vector3d( - 0.5 * dMaxW, - dMinH, 0) ;
case ETXT_IPBR :
return Vector3d( - dMaxW, - dMinH, 0) ;
}
}
+21
View File
@@ -0,0 +1,21 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : FontAux.h Data : 05.06.14 Versione : 1.5f2
// Contenuto : Dichiarazione delle funzioni ausiliarie per i font.
//
//
//
// Modifiche : 05.06.14 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkVector3d.h"
#include "/EgtDev/Include/EGtNumCollection.h"
//----------------------------------------------------------------------------
bool IsLineBreak( const UINTVECTOR& vCode, int nInd, int& nLen) ;
Vector3d GetTextInsertPointMove( double dMaxW, double dAscent, double dMinH, int nInsPos) ;
+27 -19
View File
@@ -25,7 +25,7 @@ using namespace std ;
//----------------------------------------------------------------------------
bool
FontManager::Init( const std::string& sNfeFontDir, const std::string& sDefaultFont)
FontManager::Init( const string& sNfeFontDir, const string& sDefaultFont)
{
// assegno direttorio file per font Nfe
m_sNfeFontDir = sNfeFontDir ;
@@ -37,22 +37,30 @@ FontManager::Init( const std::string& sNfeFontDir, const std::string& sDefaultFo
//----------------------------------------------------------------------------
bool
FontManager::SetCurrFont( const std::string& sFont, int nWeight, bool bItalic,
FontManager::SetCurrFont( const string& sFont, int nWeight, bool bItalic,
double dHeight, double dRatio, double dAddAdvance)
{
// gestione font di default
string sTFont = (( sFont.empty()) ? m_sDefaultFont : sFont) ;
string sFontName = (( sFont.empty()) ? m_sDefaultFont : sFont) ;
// lo cerco tra i font Nfe
if ( FileExtensionMatches( sTFont, "NFE")) {
if ( FileExtensionMatches( sFontName, "NFE")) {
// verifico che il font richiesto esista, altrimenti prendo il primo dello stesso tipo
string sPath = m_sNfeFontDir + "\\" + sFontName ;
if ( ! ExistsFile( sPath)) {
if ( FindFirstFileEgt( m_sNfeFontDir + "\\*.Nfe", sFontName))
sPath = m_sNfeFontDir + "\\" + sFontName ;
}
// imposto il font corrente
m_bCurrNfeFont = true ;
if ( ! m_NfeFont.SetCurrFont( m_sNfeFontDir + "\\" + sTFont, nWeight, bItalic,
dHeight, dRatio, dAddAdvance))
if ( ! m_NfeFont.SetCurrFont( sPath, nWeight, bItalic, dHeight, dRatio, dAddAdvance))
return false ;
}
// altrimenti lo cerco tra i font di sistema
else {
m_bCurrNfeFont = false ;
if ( ! m_OsFont.SetCurrFont( sTFont, nWeight, bItalic, dHeight, dRatio, dAddAdvance))
if ( ! m_OsFont.SetCurrFont( sFontName, nWeight, bItalic, dHeight, dRatio, dAddAdvance))
return false ;
}
@@ -91,40 +99,40 @@ FontManager::GetDescent( double& dDesc)
//----------------------------------------------------------------------------
bool
FontManager::GetLength( const string& sText, double& dLen)
FontManager::GetCapBox( const string& sText, int nInsPos, BBox3d& b3Box)
{
if ( m_bCurrNfeFont)
return m_NfeFont.GetLength( sText, dLen) ;
return m_NfeFont.GetXBox( sText, nInsPos, true, b3Box) ;
else
return m_OsFont.GetLength( sText, dLen) ;
return m_OsFont.GetXBox( sText, nInsPos, true, b3Box) ;
}
//----------------------------------------------------------------------------
bool
FontManager::GetBBox( const string& sText, BBox3d& b3Box)
FontManager::GetBBox( const string& sText, int nInsPos, BBox3d& b3Box)
{
if ( m_bCurrNfeFont)
return m_NfeFont.GetBBox( sText, b3Box) ;
return m_NfeFont.GetXBox( sText, nInsPos, false, b3Box) ;
else
return m_OsFont.GetBBox( sText, b3Box) ;
return m_OsFont.GetXBox( sText, nInsPos, false, b3Box) ;
}
//----------------------------------------------------------------------------
bool
FontManager::GetOutline( const string& sText, ICURVEPLIST& lstPC)
FontManager::GetOutline( const string& sText, int nInsPos, ICURVEPLIST& lstPC)
{
if ( m_bCurrNfeFont)
return m_NfeFont.GetOutline( sText, lstPC) ;
return m_NfeFont.GetOutline( sText, nInsPos, lstPC) ;
else
return m_OsFont.GetOutline( sText, lstPC) ;
return m_OsFont.GetOutline( sText, nInsPos, lstPC) ;
}
//----------------------------------------------------------------------------
bool
FontManager::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL)
FontManager::ApproxWithLines( const string& sText, int nInsPos, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL)
{
if ( m_bCurrNfeFont)
return m_NfeFont.ApproxWithLines( sText, dLinTol, dAngTolDeg, lstPL) ;
return m_NfeFont.ApproxWithLines( sText, nInsPos, dLinTol, dAngTolDeg, lstPL) ;
else
return m_OsFont.ApproxWithLines( sText, dLinTol, dAngTolDeg, lstPL) ;
return m_OsFont.ApproxWithLines( sText, nInsPos, dLinTol, dAngTolDeg, lstPL) ;
}
+6 -6
View File
@@ -13,8 +13,8 @@
#pragma once
#include "NfeFont.h"
#include "OsFont.h"
#include "FontNfe.h"
#include "FontOs.h"
#include "/EgtDev/Include/EGkBBox3d.h"
#include "/EgtDev/Include/EGkPolyLine.h"
#include <string>
@@ -29,10 +29,10 @@ class FontManager
bool GetCapHeight( double& dCapH) ;
bool GetAscent( double& dAsc) ;
bool GetDescent( double& dDesc) ;
bool GetLength( const std::string& sText, double& dLen) ;
bool GetBBox( const std::string& sText, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) ;
bool GetCapBox( const std::string& sText, int nInsPos, BBox3d& b3Box) ;
bool GetBBox( const std::string& sText, int nInsPos, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, int nInsPos, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, int nInsPos, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) ;
private :
std::string m_sNfeFontDir ;
+91 -32
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : NfeFont.cpp Data : 29.05.14 Versione : 1.5f1
// File : FontNfe.cpp Data : 05.06.14 Versione : 1.5f2
// Contenuto : Implementazione della classe NfeFont (formato font proprietario).
//
//
@@ -13,11 +13,13 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "NfeFont.h"
#include "FontNfe.h"
#include "FontAux.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EGkGdbIterator.h"
#include "/EgtDev/Include/EGkCurve.h"
#include "/EgtDev/Include/EGkCurveAux.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
#include "/EgtDev/Include/EgnStringUtils.h"
#include "/EgtDev/Include/EGnStringDecoder.h"
@@ -150,7 +152,7 @@ NfeFont::GetDescent( double& dDesc)
//----------------------------------------------------------------------------
bool
NfeFont::GetLength( const string& sText, double& dLen)
NfeFont::GetXBox( const string& sText, int nInsPos, bool bCapOrBound, BBox3d& b3Box)
{
// verifico esistenza font corrente
if ( m_pGDB == nullptr || m_sFont.empty())
@@ -161,53 +163,63 @@ NfeFont::GetLength( const string& sText, double& dLen)
if ( ! IsValid( pIter))
return false ;
// calcolo il fattore di scala
double dScaX = m_dHeight / m_dHCap * m_dRatio ;
// calcolo i fattori di scala
double dScaY = m_dHeight / m_dHCap ;
double dScaX = dScaY * m_dRatio ;
// recupero altezza maiuscole, ascent, descent e interlinea
double dHCap = m_dHeight ;
double dAscent = m_dAsc * m_dHeight / m_dHCap ;
double dDescent = m_dDesc * m_dHeight / m_dHCap ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// scandisco i codici
dLen = 0 ;
double dCurrW = 0 ;
double dMaxW = 0 ;
double dMinH = 0 ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
dCurrW = 0 ;
dMinH -= dH ;
i += nLbLen ;
continue ;
}
// gruppo del carattere
int nGroup = sText[i] ;
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) == GDB_TY_NONE)
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) != GDB_TY_GROUP)
nGroup = NFE_ERR_CHAR ;
// recupero lo spostamento per il prossimo carattere
double dAdvance ;
if ( ! m_pGDB->GetInfo( nGroup, NFE_LEN_CHAR, dAdvance))
dAdvance = m_dAdv ;
dLen += dAdvance * dScaX + m_dAddAdvance ;
dCurrW += dAdvance * dScaX + m_dAddAdvance ;
if ( dCurrW > dMaxW)
dMaxW = dCurrW ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
NfeFont::GetBBox( const string& sText, BBox3d& b3Box)
{
// recupero le dimensioni
double dAsc ;
if ( ! GetAscent( dAsc))
return false ;
double dDesc ;
if ( ! GetDescent( dDesc))
return false ;
double dLen ;
if ( ! GetLength( sText, dLen))
return false ;
// punti estremi
Point3d ptMin( 0, dMinH - ( bCapOrBound ? 0 : dDescent), 0) ;
Point3d ptMax( dMaxW, ( bCapOrBound ? dHCap : dAscent), 0) ;
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
ptMin.Translate( vtIpMove) ;
ptMax.Translate( vtIpMove) ;
// assegno l'ingombro
b3Box.Set( 0, - dDesc, 0, dLen, dAsc, 0) ;
b3Box.Set( ptMin, ptMax) ;
return true ;
}
//----------------------------------------------------------------------------
bool
NfeFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
NfeFont::GetOutline( const string& sText, int nInsPos, ICURVEPLIST& lstPC)
{
// verifico esistenza font corrente
if ( m_pGDB == nullptr || m_sFont.empty())
@@ -223,21 +235,36 @@ NfeFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
double dScaX = dScaY * m_dRatio ;
double dScaZ = 1 ;
// recupero altezza maiuscole e interlinea
double dHCap = m_dHeight ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// scandisco i codici
double dMaxW = 0 ;
double dMinH = 0 ;
Vector3d vtMove ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
vtMove.Set( 0, vtMove.y - dH, 0) ;
if ( vtMove.y < dMinH)
dMinH = vtMove.y ;
i += nLbLen ;
continue ;
}
// verifico esistenza del gruppo del carattere
int nGroup = vCode[i] ;
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) == GDB_TY_NONE)
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) != GDB_TY_GROUP)
nGroup = NFE_ERR_CHAR ;
// ciclo sulle entità geometriche del carattere
bool bIter = pIter->GoToFirstInGroup( nGroup) ;
while ( bIter) {
ICurve* pCrv = GetCurve( pIter->GetGeoObj()) ;
const ICurve* pCrv = GetCurve( pIter->GetGeoObj()) ;
if ( pCrv != nullptr) {
ICurve* pCopyCrv = GetCurve( pCrv->Clone()) ;
if ( pCopyCrv == nullptr)
@@ -265,14 +292,23 @@ NfeFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
if ( ! m_pGDB->GetInfo( nGroup, NFE_LEN_CHAR, dAdvance))
dAdvance = m_dAdv ;
vtMove += Vector3d( ( dAdvance * dScaX + m_dAddAdvance), 0, 0) ;
if ( vtMove.x > dMaxW)
dMaxW = vtMove.x ;
}
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
ICURVEPLIST::iterator iIter ;
for ( iIter = lstPC.begin() ; iIter != lstPC.end() ; ++ iIter)
(*iIter)->Translate( vtIpMove) ;
return true ;
}
//----------------------------------------------------------------------------
bool
NfeFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL)
NfeFont::ApproxWithLines( const string& sText, int nInsPos, double dLinTol, double dAngTolDeg,
POLYLINELIST& lstPL)
{
// verifico esistenza font corrente
if ( m_pGDB == nullptr || m_sFont.empty())
@@ -289,21 +325,36 @@ NfeFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg
double dScaZ = 1 ;
double dInvScaMed = 1 / max( ( dScaX + dScaY) / 2, EPS_SMALL) ;
// recupero altezza maiuscole e interlinea
double dHCap = m_dHeight ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// scandisco i codici
double dMaxW = 0 ;
double dMinH = 0 ;
Vector3d vtMove ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
vtMove.Set( 0, vtMove.y - dH, 0) ;
if ( vtMove.y < dMinH)
dMinH = vtMove.y ;
i += nLbLen ;
continue ;
}
// verifico esistenza del gruppo del carattere
int nGroup = vCode[i] ;
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) == GDB_TY_NONE)
if ( nGroup < NFE_MIN_CHAR || m_pGDB->GetGdbType( nGroup) != GDB_TY_GROUP)
nGroup = NFE_ERR_CHAR ;
// ciclo sulle entità geometriche del carattere
bool bIter = pIter->GoToFirstInGroup( nGroup) ;
while ( bIter) {
ICurve* pCrv = GetCurve( pIter->GetGeoObj()) ;
const ICurve* pCrv = GetCurve( pIter->GetGeoObj()) ;
if ( pCrv != nullptr) {
lstPL.push_back( PolyLine()) ;
pCrv->ApproxWithLines( dLinTol * dInvScaMed, dAngTolDeg, lstPL.back()) ;
@@ -319,7 +370,15 @@ NfeFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg
if ( ! m_pGDB->GetInfo( nGroup, NFE_LEN_CHAR, dAdvance))
dAdvance = m_dAdv ;
vtMove += Vector3d( ( dAdvance * dScaX + m_dAddAdvance), 0, 0) ;
if ( vtMove.x > dMaxW)
dMaxW = vtMove.x ;
}
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
POLYLINELIST::iterator iIter ;
for ( iIter = lstPL.begin() ; iIter != lstPL.end() ; ++ iIter)
(*iIter).Translate( vtIpMove) ;
return true ;
}
+5 -5
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : NfeFont.h Data : 29.05.14 Versione : 1.5f1
// File : FontNfe.h Data : 05.06.14 Versione : 1.5f2
// Contenuto : Dichiarazione della classe NfeFont (formato font proprietario).
//
//
@@ -29,10 +29,10 @@ class NfeFont
bool GetCapHeight( double& dCapH) ;
bool GetAscent( double& dAsc) ;
bool GetDescent( double& dDesc) ;
bool GetLength( const std::string& sText, double& dLen) ;
bool GetBBox( const std::string& sText, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) ;
bool GetXBox( const std::string& sText, int nInsPos, bool bCapOrBound, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, int nInsPos, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, int nInsPos, double dLinTol, double dAngTolDeg,
POLYLINELIST& lstPL) ;
private :
IGeomDB* m_pGDB ;
+87 -30
View File
@@ -1,8 +1,8 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : OsFont.cpp Data : 01.06.14 Versione : 1.5f1
// Contenuto : Implementazione della classe NfeFont (formato font proprietario).
// File : FontOs.cpp Data : 05.06.14 Versione : 1.5f2
// Contenuto : Implementazione della classe OsFont (font di sistema).
//
//
//
@@ -13,7 +13,8 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "OsFont.h"
#include "FontOs.h"
#include "FontAux.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EGkGdbIterator.h"
#include "/EgtDev/Include/EGkCurve.h"
@@ -179,7 +180,7 @@ OsFont::GetDescent( double& dDesc)
//----------------------------------------------------------------------------
bool
OsFont::GetLength( const string& sText, double& dLen)
OsFont::GetXBox( const string& sText, int nInsPos, bool bCapOrBound, BBox3d& b3Box)
{
// verifico esistenza font corrente
if ( m_hDC == nullptr || m_hFont == nullptr || m_sFont.empty())
@@ -194,13 +195,29 @@ OsFont::GetLength( const string& sText, double& dLen)
double dScaY = m_dHeight / m_dHCap ;
double dScaX = dScaY * m_dRatio ;
// recupero altezza maiuscole, ascent, descent e interlinea
double dHCap = m_dHeight ;
double dAscent = m_dAsc * m_dHeight / m_dHCap ;
double dDescent = m_dDesc * m_dHeight / m_dHCap ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// ciclo sui caratteri
dLen = 0 ;
// scandisco i codici
double dCurrW = 0 ;
double dMaxW = 0 ;
double dMinH = 0 ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
dCurrW = 0 ;
dMinH -= dH ;
i += nLbLen ;
continue ;
}
// recupero l'avanzamento di ogni carattere
ABC abc ;
double dAdvance ;
@@ -208,9 +225,22 @@ OsFont::GetLength( const string& sText, double& dLen)
dAdvance = ( abc.abcA + abc.abcB + abc.abcC) ;
else
dAdvance = m_dAdv ;
dLen += dAdvance * dScaX + m_dAddAdvance ;
dCurrW += dAdvance * dScaX + m_dAddAdvance ;
if ( dCurrW > dMaxW)
dMaxW = dCurrW ;
}
// punti estremi
Point3d ptMin( 0, dMinH - ( bCapOrBound ? 0 : dDescent), 0) ;
Point3d ptMax( dMaxW, ( bCapOrBound ? dHCap : dAscent), 0) ;
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
ptMin.Translate( vtIpMove) ;
ptMax.Translate( vtIpMove) ;
// assegno l'ingombro
b3Box.Set( ptMin, ptMax) ;
// ripristino il font originale
SelectObject( m_hDC, hPrevFont) ;
@@ -219,27 +249,7 @@ OsFont::GetLength( const string& sText, double& dLen)
//----------------------------------------------------------------------------
bool
OsFont::GetBBox( const string& sText, BBox3d& b3Box)
{
// recupero le dimensioni
double dAsc ;
if ( ! GetAscent( dAsc))
return false ;
double dDesc ;
if ( ! GetDescent( dDesc))
return false ;
double dLen ;
if ( ! GetLength( sText, dLen))
return false ;
// assegno l'ingombro
b3Box.Set( 0, - dDesc, 0, dLen, dAsc, 0) ;
return true ;
}
//----------------------------------------------------------------------------
bool
OsFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
OsFont::GetOutline( const string& sText, int nInsPos, ICURVEPLIST& lstPC)
{
// verifico esistenza font corrente
if ( m_hDC == nullptr || m_hFont == nullptr || m_sFont.empty())
@@ -255,14 +265,29 @@ OsFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
double dScaX = dScaY * m_dRatio ;
double dScaZ = 1 ;
// recupero altezza maiuscole e interlinea
double dHCap = m_dHeight ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// ciclo sui caratteri
// ciclo sui codici
double dMaxW = 0 ;
double dMinH = 0 ;
Vector3d vtMove ;
ICURVEPLIST lstTmpPC ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
vtMove.Set( 0, vtMove.y - dH, 0) ;
if ( vtMove.y < dMinH)
dMinH = vtMove.y ;
i += nLbLen ;
continue ;
}
// recupero l'outline
double dAdvance ;
if ( ! GetCharOutline( vCode[i], dAdvance, lstTmpPC))
@@ -277,10 +302,18 @@ OsFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
lstPC.push_back( (*iIter)) ;
}
vtMove += Vector3d( dAdvance * dScaX + m_dAddAdvance, 0, 0) ;
if ( vtMove.x > dMaxW)
dMaxW = vtMove.x ;
// ciclo di pulizia ( non devo cancellare le curve, perchè spostate nella lista principale)
lstTmpPC.clear() ;
}
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
ICURVEPLIST::iterator iIter ;
for ( iIter = lstPC.begin() ; iIter != lstPC.end() ; ++ iIter)
(*iIter)->Translate( vtIpMove) ;
// ripristino il font originale
SelectObject( m_hDC, hPrevFont) ;
@@ -289,7 +322,8 @@ OsFont::GetOutline( const string& sText, ICURVEPLIST& lstPC)
//----------------------------------------------------------------------------
bool
OsFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL)
OsFont::ApproxWithLines( const string& sText, int nInsPos, double dLinTol, double dAngTolDeg,
POLYLINELIST& lstPL)
{
// verifico esistenza font corrente
if ( m_hDC == nullptr || m_hFont == nullptr || m_sFont.empty())
@@ -305,14 +339,29 @@ OsFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg,
double dScaX = dScaY * m_dRatio ;
double dScaZ = 1 ;
// recupero altezza maiuscole e interlinea
double dHCap = m_dHeight ;
double dH = m_dH * m_dHeight / m_dHCap ;
// converto i byte della stringa in codici carattere
UINTVECTOR vCode ;
GetCodePoints( sText, vCode) ;
// ciclo sui caratteri
double dMaxW = 0 ;
double dMinH = 0 ;
Vector3d vtMove ;
ICURVEPLIST lstPC ;
for ( unsigned int i = 0 ; i < vCode.size() ; ++ i) {
// verifico se comando di a capo
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
vtMove.Set( 0, vtMove.y - dH, 0) ;
if ( vtMove.y < dMinH)
dMinH = vtMove.y ;
i += nLbLen ;
continue ;
}
// recupero l'outline
double dAdvance ;
if ( ! GetCharOutline( vCode[i], dAdvance, lstPC))
@@ -327,12 +376,20 @@ OsFont::ApproxWithLines( const string& sText, double dLinTol, double dAngTolDeg,
}
}
vtMove += Vector3d( dAdvance * dScaX + m_dAddAdvance, 0, 0) ;
if ( vtMove.x > dMaxW)
dMaxW = vtMove.x ;
// ciclo di pulizia
for ( iIter = lstPC.begin() ; iIter != lstPC.end() ; ++ iIter)
delete (*iIter) ;
lstPC.clear() ;
}
// sistemazioni per la posizione del punto di inserimento
Vector3d vtIpMove = GetTextInsertPointMove( dMaxW, dHCap, dMinH, nInsPos) ;
POLYLINELIST::iterator iIter ;
for ( iIter = lstPL.begin() ; iIter != lstPL.end() ; ++ iIter)
(*iIter).Translate( vtIpMove) ;
// ripristino il font originale
SelectObject( m_hDC, hPrevFont) ;
+5 -5
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : OsFont.h Data : 01.06.14 Versione : 1.5f1
// File : FontOs.h Data : 05.06.14 Versione : 1.5f2
// Contenuto : Dichiarazione della classe OsFont (font di sistema).
//
//
@@ -31,10 +31,10 @@ class OsFont
bool GetCapHeight( double& dCapH) ;
bool GetAscent( double& dAsc) ;
bool GetDescent( double& dDesc) ;
bool GetLength( const std::string& sText, double& dLen) ;
bool GetBBox( const std::string& sText, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) ;
bool GetXBox( const std::string& sText, int nInsPos, bool bCapOrBound, BBox3d& b3Box) ;
bool GetOutline( const std::string& sText, int nInsPos, ICURVEPLIST& lstPC) ;
bool ApproxWithLines( const std::string& sText, int nInsPos, double dLinTol, double dAngTolDeg,
POLYLINELIST& lstPL) ;
private :
bool CalcFontData( void) ;
+58 -6
View File
@@ -264,8 +264,8 @@ GdbExecutor::ExecuteVector( const string& sCmd2, const STRVECTOR& vsParams)
// definizione diretta
if ( sCmd2 == "" || sCmd2 == "MAKE") {
Vector3d Vect ;
// 3 parametri : Id, IdParent e vettore
if ( vsParams.size() != 3)
// 3 o 4 parametri : Id, IdParent, Vettore [, ScaleFactor]
if ( vsParams.size() != 3 && vsParams.size() != 4)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frVect ;
@@ -274,11 +274,15 @@ GdbExecutor::ExecuteVector( const string& sCmd2, const STRVECTOR& vsParams)
// recupero i tre componenti
if ( ! GetVectorParam( vsParams[2], frVect, Vect))
return false ;
// recupero l'eventuale fattore di scala
double dScale = 1 ;
if ( vsParams.size() == 4 && ! FromString( vsParams[3], dScale))
return false ;
// creo il vettore
IGeoVector3d* pGVect = CreateGeoVector3d() ;
if ( pGVect == nullptr)
return false ;
pGVect->Set( Vect) ;
pGVect->Set( Vect * dScale) ;
return AddGeoObj( vsParams[0], vsParams[1], pGVect) ;
}
// definizione come differenza di due punti
@@ -1971,8 +1975,8 @@ GdbExecutor::TextSimple( const STRVECTOR& vsParams)
bool
GdbExecutor::TextComplete( const STRVECTOR& vsParams)
{
// parametri : Id, ParentId, Text, Point, AngDeg, Font, W, Italic, H, Rat, AddAdv
if ( vsParams.size() != 11)
// parametri : Id, ParentId, Text, Point, AngDeg, Font, W, Italic, H, Rat, AddAdv, PosIns
if ( vsParams.size() != 12)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
@@ -2005,12 +2009,34 @@ GdbExecutor::TextComplete( const STRVECTOR& vsParams)
double dAddAdv ;
if ( ! FromString( vsParams[10], dAddAdv))
return false ;
// falg per posizione di inserimento
int nInsPos = ETXT_IPBL ;
string sInsPos = vsParams[11] ;
ToUpper( sInsPos) ;
if ( sInsPos == "TL")
nInsPos = ETXT_IPTL ;
else if ( sInsPos == "TC")
nInsPos = ETXT_IPTC ;
else if ( sInsPos == "TR")
nInsPos = ETXT_IPTR ;
else if ( sInsPos == "ML")
nInsPos = ETXT_IPML ;
else if ( sInsPos == "MC")
nInsPos = ETXT_IPMC ;
else if ( sInsPos == "MR")
nInsPos = ETXT_IPMR ;
else if ( sInsPos == "BL")
nInsPos = ETXT_IPBL ;
else if ( sInsPos == "BC")
nInsPos = ETXT_IPBC ;
else if ( sInsPos == "BR")
nInsPos = ETXT_IPBR ;
// creo il testo
PtrOwner<IExtText> pTXT( CreateExtText()) ;
if ( ! IsValid( pTXT))
return false ;
// lo riempio
if ( ! pTXT->Set( vsParams[2], ptP, dAngRotDeg, vsParams[5], nW, bItl, dH, dRat, dAddAdv))
if ( ! pTXT->Set( vsParams[2], ptP, dAngRotDeg, vsParams[5], nW, bItl, dH, dRat, dAddAdv, nInsPos))
return false ;
// inserisco il testo nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pTXT)) ;
@@ -2301,6 +2327,24 @@ GdbExecutor::GetVectorParam( const string& sParam, const Frame3d& frVect, Vector
return false ;
}
}
// se testo
else if ( pGObj->GetType() == EXT_TEXT) {
// recupero il testo
const IExtText* pTxt = GetExtText( pGObj) ;
switch ( cType) {
case 'D' : // versore direzione longitudinale del testo
vtV = pTxt->GetDirVersor() ;
return vtV.LocToLoc( frEnt, frVect) ;
case 'H' : // versore direzione trasversale del testo
return ( pTxt->GetHeightVersor( vtV) &&
vtV.LocToLoc( frEnt, frVect)) ;
case 'O' : // versore ortogonale al piano del testo
vtV = pTxt->GetNormVersor() ;
return vtV.LocToLoc( frEnt, frVect) ;
default :
return false ;
}
}
}
return false ;
}
@@ -2451,10 +2495,18 @@ GdbExecutor::GetPointParam( const string& sParam, const Frame3d& frPnt, Point3d&
if ( ! pTxt->GetStartPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'T' : // punto sopra l'iniziale
if ( ! pTxt->GetOverStartPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'E' : // punto finale
if ( ! pTxt->GetEndPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'F' : // punto sopra il finale
if ( ! pTxt->GetOverEndPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'M' : // punto medio
if ( ! pTxt->GetMidPoint( ptP))
return false ;