EgtGeomKernel 1.5f2 :
- aggiunta gestione testi multilinea - migliorie e correzioni varie sui testi.
This commit is contained in:
Binary file not shown.
@@ -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" />
|
||||
|
||||
@@ -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
@@ -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 ;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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) ;
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 ;
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user