From 8a0534a3679dc89781008a187e42089a444d74b5 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 2 Jan 2020 08:26:25 +0000 Subject: [PATCH] EgtGeomKernel : - migliorie e correzioni alle quotature. --- ExtDimension.cpp | 93 +++++++++++++++++++++++++++++++++++++++++------- ExtDimension.h | 39 ++++++++++++++++++-- 2 files changed, 118 insertions(+), 14 deletions(-) diff --git a/ExtDimension.cpp b/ExtDimension.cpp index cceafcf..bd9e12c 100644 --- a/ExtDimension.cpp +++ b/ExtDimension.cpp @@ -22,24 +22,32 @@ #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkExtText.h" #include "/EgtDev/Include/EGkUiUnits.h" +#include "/EgtDev/Include/EgtNumUtils.h" #include using namespace std ; //---------------------------------------------------------------------------- static const string IS_MEASURE = "<>" ; +static const double STD_EXTLINELEN = 5.0 ; +static const double MIN_EXTLINELEN = 0.1 ; +static const double STD_ARROWLEN = 5.0 ; +static const double MIN_ARROWLEN = 0.1 ; +static const double STD_TEXTDIST = 2.0 ; +static const double MIN_TEXTDIST = 0.1 ; +static const int STD_DECDIGIT = -2 ; +static const int MAX_DECDIGIT = 6 ; static const string STD_FONT = "ModernPropS.Nfe" ; -static const int FONT_WEIGHT = 400 ; -static const bool FONT_ITALIC = false ; -static const double FONT_RATIO = 0.75 ; -static const double FONT_ADDADVANCE = 0 ; +static const double STD_TEXTHEIGHT = 10.0 ; +static const double MIN_TEXTHEIGHT = 1.0 ; //---------------------------------------------------------------------------- GEOOBJ_REGISTER( EXT_DIMENSION, NGE_E_DIM, ExtDimension) ; //---------------------------------------------------------------------------- ExtDimension::ExtDimension( void) - : m_dExtLineLen( 5), m_dArrowLen( 5), m_dTextDist( 2), m_bLenIsMM( true), m_nLenDec( -2), m_sFont( STD_FONT), m_dTextHeight( 10) + : m_dExtLineLen( STD_EXTLINELEN), m_dArrowLen( STD_ARROWLEN), m_dTextDist( STD_TEXTDIST), + m_bLenIsMM( true), m_nDecDigit( STD_DECDIGIT), m_sFont( STD_FONT), m_dTextHeight( STD_TEXTHEIGHT) { } @@ -48,6 +56,21 @@ ExtDimension::~ExtDimension( void) { } +//---------------------------------------------------------------------------- +bool +ExtDimension::SetStyle( double dExtLineLen, double dArrowLen, double dTextDist, bool bLenIsMM, + int nDecDigit, const string& sFont, double dTextHeight) +{ + m_dExtLineLen = max( dExtLineLen, MIN_EXTLINELEN) ; + m_dArrowLen = max( dArrowLen, MIN_ARROWLEN) ; + m_dTextDist = max( dTextDist, MIN_TEXTDIST) ; + m_bLenIsMM = bLenIsMM ; + m_nDecDigit = Clamp( nDecDigit, -MAX_DECDIGIT, MAX_DECDIGIT) ; + m_sFont = sFont ; + m_dTextHeight = max( dTextHeight, MIN_TEXTHEIGHT) ; + return true ; +} + //---------------------------------------------------------------------------- bool ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptPos, @@ -160,7 +183,7 @@ ExtDimension::CopyFrom( const ExtDimension& clSrc) m_dArrowLen = clSrc.m_dArrowLen ; m_dTextDist = clSrc.m_dTextDist ; m_bLenIsMM = clSrc.m_bLenIsMM ; - m_nLenDec = clSrc.m_nLenDec ; + m_nDecDigit = clSrc.m_nDecDigit ; m_sFont = clSrc.m_sFont ; m_dTextHeight = clSrc.m_dTextHeight ; m_nTempProp = clSrc.m_nTempProp ; @@ -213,7 +236,7 @@ ExtDimension::Dump( string& sOut, bool bMM, const char* szNewLine) const " Al=" + ToString( GetInUiUnits( m_dArrowLen, bMM), 3) + " Td=" + ToString( GetInUiUnits( m_dTextDist, bMM), 3) + szNewLine ; sOut += "Mm=" + string( m_bLenIsMM ? "1" : "0") + - " Dec=" + ToString( m_nLenDec) + szNewLine ; + " Dec=" + ToString( m_nDecDigit) + szNewLine ; sOut += "Fnt=" + m_sFont + " H=" + ToString( GetInUiUnits( m_dTextHeight, bMM), 3) + szNewLine ; @@ -266,7 +289,7 @@ ExtDimension::Save( NgeWriter& ngeOut) const return false ; if ( ! ngeOut.WriteBool( m_bLenIsMM, ",")) return false ; - if ( ! ngeOut.WriteInt( m_nLenDec, ",")) + if ( ! ngeOut.WriteInt( m_nDecDigit, ",")) return false ; if ( ! ngeOut.WriteString( m_sFont, ",")) return false ; @@ -318,7 +341,7 @@ ExtDimension::Load( NgeReader& ngeIn) return false ; if ( ! ngeIn.ReadBool( m_bLenIsMM, ",")) return false ; - if ( ! ngeIn.ReadInt( m_nLenDec, ",")) + if ( ! ngeIn.ReadInt( m_nDecDigit, ",")) return false ; if ( ! ngeIn.ReadString( m_sFont, ",")) return false ; @@ -648,7 +671,7 @@ ExtDimension::Update( void) const m_sCalcText = m_sText ; if ( m_sCalcText.find( IS_MEASURE) != string::npos) { double dVal = ( m_ptP2 - m_ptP1) * m_vtDir * ( m_bLenIsMM ? 1 : 1. / ONEINCH) ; - string sVal = ToString( dVal, m_nLenDec) ; + string sVal = ToString( dVal, m_nDecDigit) ; ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; } // punto di inserimento del testo @@ -685,6 +708,36 @@ ExtDimension::Update( void) const return false ; } +//---------------------------------------------------------------------------- +bool +ExtDimension::GetMidPoint( Point3d& ptMid) const +{ + // eventuale ricalcolo + Update() ; + // se quota lineare + if ( m_nType == DT_LINEAR) { + ptMid = ( m_ptP1 + m_ptP2) / 2 ; + return true ; + } + else + return false ; +} + +//---------------------------------------------------------------------------- +bool +ExtDimension::GetCenterPoint( Point3d& ptCen) const +{ + // eventuale ricalcolo + Update() ; + // se quota lineare + if ( m_nType == DT_LINEAR) { + ptCen = ( m_ptP5 + m_ptP6) / 2 ; + return true ; + } + else + return false ; +} + //---------------------------------------------------------------------------- bool ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const @@ -768,6 +821,18 @@ ExtDimension::GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLin return true ; } +//---------------------------------------------------------------------------- +bool +ExtDimension::SetCurrFont( FontManager& fntMgr) const +{ + static const int FONT_WEIGHT = 400 ; + static const bool FONT_ITALIC = false ; + static const double FONT_RATIO = 0.75 ; + static const double FONT_ADDADVANCE = 0 ; + + return fntMgr.SetCurrFont( m_sFont, FONT_WEIGHT, FONT_ITALIC, m_dTextHeight, FONT_RATIO, FONT_ADDADVANCE) ; +} + //---------------------------------------------------------------------------- bool ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const @@ -775,9 +840,13 @@ ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELI // eventuale ricalcolo Update() ; + // se testo vuoto, risultato vuoto + if ( IsEmptyOrSpaces( m_sCalcText)) + return true ; + // imposto il font corrente e i suoi dati FontManager& fntMgr = FontManager::GetFontManager() ; - if ( ! fntMgr.SetCurrFont( m_sFont, FONT_WEIGHT, FONT_ITALIC, m_dTextHeight, FONT_RATIO, FONT_ADDADVANCE)) + if ( ! SetCurrFont( fntMgr)) return false ; // richiedo l'outline @@ -809,7 +878,7 @@ ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const // imposto il font corrente e i suoi dati FontManager& fntMgr = FontManager::GetFontManager() ; - if ( ! fntMgr.SetCurrFont( m_sFont, FONT_WEIGHT, FONT_ITALIC, m_dTextHeight, FONT_RATIO, FONT_ADDADVANCE)) + if ( ! SetCurrFont( fntMgr)) return false ; // richiedo il box diff --git a/ExtDimension.h b/ExtDimension.h index 2d83757..fa73734 100644 --- a/ExtDimension.h +++ b/ExtDimension.h @@ -18,6 +18,8 @@ #include "GeoObjRW.h" #include "/EgtDev/Include/EGkExtDimension.h" +class FontManager ; + //---------------------------------------------------------------------------- class ExtDimension : public IExtDimension, public IGeoObjRW { @@ -26,7 +28,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW ExtDimension* Clone( void) const override ; GeoObjType GetType( void) const override ; bool IsValid( void) const override - { return true ; } + { return ( m_nType != DT_NONE) ; } const std::string& GetTitle( void) const override ; bool Dump( std::string& sOut, bool bMM = true, const char* szNewLine = "\n") const override ; bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ; @@ -55,10 +57,42 @@ class ExtDimension : public IExtDimension, public IGeoObjRW public : // IExtDimension bool CopyFrom( const IGeoObj* pGObjSrc) override ; + bool SetStyle( double dExtLineLen, double dArrowLen, double dTextDist, bool bLenIsMM, + int nDecDigit, const std::string& sFont, double dTextHeight) override ; bool SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptPos, const Vector3d& vtN, const Vector3d& vtDir, const std::string& sText) override ; const Vector3d& GetNormVersor( void) const override { return m_vtN ; } + const Vector3d& GetDirVersor( void) const override + { return m_vtDir ; } + const Point3d& GetStart( void) const override + { return m_ptP1 ; } + const Point3d& GetOverStart( void) const override + { return m_ptP3 ; } + const Point3d& GetEnd( void) const override + { return m_ptP2 ; } + const Point3d& GetOverEnd( void) const override + { return m_ptP4 ; } + const Point3d& GetPosition( void) const override + { return m_ptPos ; } + const std::string& GetText( void) const override + { return m_sText ; } + double GetExtLineLen( void) const override + { return m_dExtLineLen ; } + double GetArrowLen( void) const override + { return m_dArrowLen ; } + double GetTextDist( void) const override + { return m_dTextDist ; } + bool GetLenIsMM( void) const override + { return m_bLenIsMM ; } + int GetDecDigit( void) const override + { return m_nDecDigit ; } + const std::string& GetFont( void) const override + { return m_sFont ; } + double GetTextHeight( void) const override + { return m_dTextHeight ; } + bool GetMidPoint( Point3d& ptMid) const override ; + bool GetCenterPoint( Point3d& ptCen) const override ; bool ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const override ; public : // IGeoObjRW @@ -82,6 +116,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW bool Update( void) const ; double GetTextHalfDist( const Point3d& ptText) const ; bool GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLine& PL) const ; + bool SetCurrFont( FontManager& fntMgr) const ; bool ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const ; bool GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const ; bool GetTextLocalBBox( BBox3d& b3Loc) const ; @@ -110,7 +145,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW double m_dArrowLen ; // lunghezza delle frecce double m_dTextDist ; // distanza della linea di quotatura dal testo bool m_bLenIsMM ; // flag per mm/pollici se lunghezza - int m_nLenDec ; // numero di cifre decimali + int m_nDecDigit ; // numero di cifre decimali std::string m_sFont ; // font del testo double m_dTextHeight ; // altezza del testo int m_nTempProp ; // proprietà temporanea