From 97fd05640b1bfab85a7b1d2856ec31b43594c2a1 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 19 Apr 2023 17:27:04 +0200 Subject: [PATCH] EgtGeomKernel : - aggiustamenti alla classe ExtDimension --- ExtDimension.cpp | 576 ++++++++++++++++++++++++----------------------- ExtDimension.h | 2 +- 2 files changed, 290 insertions(+), 288 deletions(-) diff --git a/ExtDimension.cpp b/ExtDimension.cpp index eed2c3b..ac154a9 100644 --- a/ExtDimension.cpp +++ b/ExtDimension.cpp @@ -2,7 +2,7 @@ // EgalTech 2019-2019 //---------------------------------------------------------------------------- // File : ExtDimension.cpp Data : 27.12.19 Versione : 2.2a1 -// Contenuto : Implementazione della classe Dimension (quota). +// Contenuto : Implementazione della classe Dimension ( quota). // // // @@ -64,7 +64,7 @@ ExtDimension::~ExtDimension( void) //---------------------------------------------------------------------------- bool ExtDimension::SetStyle( double dExtLineLen, double dArrowLen, double dTextDist, bool bLenIsMM, - int nDecDigit, const string& sFont, double dTextHeight) + int nDecDigit, const string& sFont, double dTextHeight) { m_dExtLineLen = max( dExtLineLen, MIN_EXTLINELEN) ; m_dArrowLen = max( dArrowLen, MIN_ARROWLEN) ; @@ -94,7 +94,7 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d // verifico che i punti di misura non siano coincidenti if ( AreSamePointApprox( m_ptP1, m_ptP2)) return false ; - // direzione di riferimento (nel piano perpendicolare a vtN) + // direzione di riferimento ( nel piano perpendicolare a vtN) m_vtDir = vtDir ; if ( m_vtDir.IsSmall()) m_vtDir = m_ptP2 - m_ptP1 ; @@ -138,7 +138,7 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d bool ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const string& sText) -{ +{ // il punto m_ptP6 viene utilizzato per il centro // dichiaro quota non ancora determinata m_nType = DT_NONE ; // verifico la definizione del versore normale e del versore X @@ -146,25 +146,20 @@ ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos, m_vtDir = ptPos - ptCen ; if ( ! m_vtN.Normalize() || ! m_vtDir.Normalize()) return false ; - // porto i punti nel piano definito da ptCen e vtN - m_ptP1 = ptCen ; - m_ptPos = ptPos - ( ptPos - m_ptP5) * m_vtN * m_vtN ; - m_ptP3 = m_ptP1 ; + m_ptP6 = ptCen ; + m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ; + m_ptP1 = m_ptPos ; m_ptP5 = m_ptP1 ; m_ptP2 = m_ptPos ; - m_ptP4 = m_ptPos ; - m_ptP6 = m_ptPos ; - // verifico che i punti di misura non siano coincidenti - if ( AreSamePointApprox( m_ptP5, m_ptPos)) + if ( AreSamePointApprox( m_ptP6, m_ptPos)) return false ; - - // assegnazione del testo + // assegnazione del testo m_sText = sText ; - // assegno il tipo + // assegno il tipo m_nType = DT_RADIAL ; - // imposto da calcolare + // imposto da calcolare m_bToCalc = true ; m_OGrMgr.Reset() ; @@ -175,33 +170,29 @@ ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos, bool ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const string& sText) -{ +{ // il punto m_ptP6 viene utilizzato per il centro // dichiaro quota non ancora determinata m_nType = DT_NONE ; - // verifico la definizione del versore normale + // verifico la definizione del versore normale e del versore X m_vtN = vtN ; m_vtDir = ptPos - ptCen ; if ( ! m_vtN.Normalize() || ! m_vtDir.Normalize()) return false ; - - // porto i punti nel piano definito da ptP1 e vtN - m_ptPos = ptPos - ( ptPos - ptCen) * m_vtN * m_vtN ; + // porto i punti nel piano definito da ptP6 e vtN + m_ptP6 = ptCen ; + m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ; m_ptP2 = m_ptPos ; - m_ptP6 = m_ptPos ; - m_ptP4 = m_ptPos ; // ottengo il punto diametralmente opposto a ptPos m_ptP1 = ptCen - ( m_ptPos - ptCen) ; m_ptP5 = m_ptP1 ; - m_ptP3 = m_ptP1 ; - // verifico che i punti di misura non siano coincidenti if ( AreSamePointApprox( m_ptP5, m_ptPos)) return false ; // assegnazione del testo m_sText = sText ; - // assegno il tipo + // assegno il tipo m_nType = DT_DIAMETRAL ; - // imposto da calcolare + // imposto da calcolare m_bToCalc = true ; m_OGrMgr.Reset() ; @@ -210,7 +201,7 @@ ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos, //---------------------------------------------------------------------------- bool -ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptV, const Point3d& ptPos, +ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos, const Vector3d& vtN, const string& sText) { // dichiaro quota non ancora determinata @@ -222,32 +213,25 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3 // porto i punti nel piano definito da P1 e N m_ptP1 = ptP1 ; m_ptP2 = ptP2 - ( ptP2 - m_ptP1) * m_vtN * m_vtN ; - m_ptP5 = ptV - ( ptV - m_ptP1) * m_vtN * m_vtN ; + m_ptP6 = ptV - ( ptV - m_ptP1) * m_vtN * m_vtN ; m_ptPos = ptPos - ( ptPos - m_ptP1) * m_vtN * m_vtN ; // verifico che i punti di misura non siano coincidenti - if ( AreSamePointApprox( m_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP5) || AreSamePointApprox( m_ptP2, m_ptP5)) + if ( AreSamePointApprox( m_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP6) || AreSamePointApprox( m_ptP2, m_ptP5)) return false ; - // calcolo le direzioni su cui giacciono i due lati dell'angolo - Vector3d vtLine1 = m_ptP1 - m_ptP5 ; - Vector3d vtLine2 = m_ptP2 - m_ptP5 ; - double dLen1 = vtLine1.Len() ; - double dLen2 = vtLine2.Len() ; - if ( ! vtLine1.Normalize() || ! vtLine2.Normalize()) - return false ; - // direzione di riferimento (nel piano perpendicolare a vtN) - m_vtDir = m_ptPos - m_ptP5 ; + // direzione di riferimento ( nel piano perpendicolare a vtN) + m_vtDir = m_ptPos - m_ptP6 ; double dLenDir = m_vtDir.Len() ; - + // controllo se è testo o se è la misura - double dHalfDist ; double dFactor ; if ( m_sCalcText.find( IS_MEASURE) != string::npos) { - dHalfDist = GetTextHalfDist( m_ptPos) ; + m_sCalcText = "300.00" ; + double dHalfDist = GetTextHalfDist( m_ptPos) ; dFactor = 2.5 * dHalfDist ; m_sCalcText = "" ; } else { - dHalfDist = GetTextHalfDist( m_ptPos) ; + double dHalfDist = GetTextHalfDist( m_ptPos) ; dFactor = 2.5 * dHalfDist ; } // allungo m_vtDir se è troppo vicino al centro @@ -255,24 +239,26 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3 Vector3d vtDir_n = m_vtDir ; if ( ! vtDir_n.Normalize()) return false ; - m_ptPos = m_ptP5 + dFactor * vtDir_n ; + m_ptPos = m_ptP6 + dFactor * vtDir_n ; // ricalcolo m_vtDir - m_vtDir = m_ptPos - m_ptP5 ; + m_vtDir = m_ptPos - m_ptP6 ; dLenDir = m_vtDir.Len() ; } - + // calcolo le direzioni su cui giacciono i due lati dell'angolo + Vector3d vtLine1 = m_ptP1 - m_ptP6 ; + Vector3d vtLine2 = m_ptP2 - m_ptP6 ; + double dLen1 = vtLine1.Len() ; + double dLen2 = vtLine2.Len() ; + if ( ! vtLine1.Normalize() || ! vtLine2.Normalize()) + return false ; // segnalo se i punti che definiscono i lati sono più lontani dal centro di ptPos - bool bPt1Close = false ; - bool bPt2Close = false ; - if ( dLenDir < dLen1) - bPt1Close = true ; - if ( dLenDir < dLen2) - bPt2Close = true ; + bool bPt1Close = ( dLenDir < dLen1 ? true : false) ; + bool bPt2Close = ( dLenDir < dLen2 ? true : false) ; m_ptP5 = m_ptP1 + ( dLenDir - dLen1) * vtLine1 ; - m_ptP6 = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ; + Point3d ptP5_bis = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ; m_ptP3 = m_ptP5 + ( bPt1Close ? - vtLine1 : vtLine1) * m_dExtLineLen ; - m_ptP4 = m_ptP6 + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ; - + m_ptP4 = ptP5_bis + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ; + // assegnazione del testo m_sText = sText ; // assegno il tipo @@ -379,15 +365,15 @@ ExtDimension::Dump( string& sOut, bool bMM, const char* szNewLine) const { // parametri sOut += GetSubType() + szNewLine ; - sOut += "VN(" + ToString( m_vtN, 3) + ") " + szNewLine ; - sOut += "VD(" + ToString( m_vtDir, 3) + ") " + szNewLine ; - sOut += "P1(" + ToString( GetInUiUnits( m_ptP1, bMM), 3) + ") " + szNewLine ; - sOut += "P2(" + ToString( GetInUiUnits( m_ptP2, bMM), 3) + ") " + szNewLine ; - sOut += "P3(" + ToString( GetInUiUnits( m_ptP3, bMM), 3) + ") " + szNewLine ; - sOut += "P4(" + ToString( GetInUiUnits( m_ptP4, bMM), 3) + ") " + szNewLine ; - sOut += "P5(" + ToString( GetInUiUnits( m_ptP5, bMM), 3) + ") " + szNewLine ; - sOut += "P6(" + ToString( GetInUiUnits( m_ptP6, bMM), 3) + ") " + szNewLine ; - sOut += "Pos(" + ToString( GetInUiUnits( m_ptPos, bMM), 3) + ") " + szNewLine ; + sOut += "VN( " + ToString( m_vtN, 3) + ") " + szNewLine ; + sOut += "VD( " + ToString( m_vtDir, 3) + ") " + szNewLine ; + sOut += "P1( " + ToString( GetInUiUnits( m_ptP1, bMM), 3) + ") " + szNewLine ; + sOut += "P2( " + ToString( GetInUiUnits( m_ptP2, bMM), 3) + ") " + szNewLine ; + sOut += "P3( " + ToString( GetInUiUnits( m_ptP3, bMM), 3) + ") " + szNewLine ; + sOut += "P4( " + ToString( GetInUiUnits( m_ptP4, bMM), 3) + ") " + szNewLine ; + sOut += "P5( " + ToString( GetInUiUnits( m_ptP5, bMM), 3) + ") " + szNewLine ; + sOut += "P6( " + ToString( GetInUiUnits( m_ptP6, bMM), 3) + ") " + szNewLine ; + sOut += "Pos( " + ToString( GetInUiUnits( m_ptPos, bMM), 3) + ") " + szNewLine ; sOut += "Txt=" + m_sText + szNewLine ; sOut += "El=" + ToString( GetInUiUnits( m_dExtLineLen, bMM), 3) + " Al=" + ToString( GetInUiUnits( m_dArrowLen, bMM), 3) + @@ -528,7 +514,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const return true ; } else if ( m_nType == DT_RADIAL) { - b3Loc.Set( m_ptP5) ; + b3Loc.Set( m_ptP6) ; b3Loc.Add( m_ptPos) ; // ingombro del testo BBox3d b3Text ; @@ -537,7 +523,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const return true ; } else if ( m_nType == DT_DIAMETRAL) { - b3Loc.Set( m_ptP5) ; + b3Loc.Set( m_ptP6) ; b3Loc.Add( m_ptPos) ; // ingombro del testo BBox3d b3Text ; @@ -551,6 +537,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const b3Loc.Add( m_ptP3) ; b3Loc.Add( m_ptP4) ; b3Loc.Set( m_ptP5) ; + b3Loc.Set( m_ptP6) ; b3Loc.Add( m_ptCalcP7) ; b3Loc.Add( m_ptCalcP8) ; // ingombro del testo @@ -574,7 +561,7 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const Update() ; // se valido if ( m_nType == DT_LINEAR) { - // ingombro dei punti (portati nel riferimento passato) + // ingombro dei punti ( portati nel riferimento passato) Point3d ptFrP1 = m_ptP1 ; ptFrP1.ToGlob( frRef) ; b3Ref.Set( ptFrP1) ; @@ -600,8 +587,8 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const return true ; } else if ( m_nType == DT_RADIAL) { - // ingombro dei punti (portati nel riferimento passato) - Point3d ptFrP5 = m_ptP5 ; + // ingombro dei punti ( portati nel riferimento passato) + Point3d ptFrP5 = m_ptP6 ; ptFrP5.ToGlob( frRef) ; b3Ref.Set( ptFrP5) ; Point3d ptFrPos = m_ptPos ; @@ -614,8 +601,8 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const return true ; } else if ( m_nType == DT_DIAMETRAL) { - // ingombro dei punti (portati nel riferimento passato) - Point3d ptFrP5 = m_ptP5 ; + // ingombro dei punti ( portati nel riferimento passato) + Point3d ptFrP5 = m_ptP6 ; ptFrP5.ToGlob( frRef) ; b3Ref.Set( ptFrP5) ; Point3d ptFrPos = m_ptPos ; @@ -628,9 +615,6 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const return true ; } else if ( m_nType == DT_ANGULAR) { - Point3d ptFrP5 = m_ptP5 ; - ptFrP5.ToGlob( frRef) ; - b3Ref.Set( ptFrP5) ; Point3d ptFrP1 = m_ptP1 ; ptFrP1.ToGlob( frRef) ; b3Ref.Add( ptFrP1) ; @@ -643,6 +627,12 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const Point3d ptFrP4 = m_ptP4 ; ptFrP4.ToGlob( frRef) ; b3Ref.Add( ptFrP4) ; + Point3d ptFrP5 = m_ptP5 ; + ptFrP5.ToGlob( frRef) ; + b3Ref.Set( ptFrP5) ; + Point3d ptFrP6 = m_ptP6 ; + ptFrP6.ToGlob( frRef) ; + b3Ref.Set( ptFrP6) ; Point3d ptFrP7 = m_ptCalcP7 ; ptFrP7.ToGlob( frRef) ; b3Ref.Add( ptFrP7) ; @@ -691,14 +681,14 @@ ExtDimension::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, // se valido if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { return ( m_vtN.Rotate( vtAx, dCosAng, dSinAng) && - m_vtDir.Rotate( vtAx, dCosAng, dSinAng) && - m_ptP1.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptP2.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptP3.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptP4.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptP5.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptP6.Rotate( ptAx, vtAx, dCosAng, dSinAng) && - m_ptPos.Rotate( ptAx, vtAx, dCosAng, dSinAng)) ; + m_vtDir.Rotate( vtAx, dCosAng, dSinAng) && + m_ptP1.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptP2.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptP3.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptP4.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptP5.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptP6.Rotate( ptAx, vtAx, dCosAng, dSinAng) && + m_ptPos.Rotate( ptAx, vtAx, dCosAng, dSinAng)) ; } else return false ; @@ -739,11 +729,11 @@ ExtDimension::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, doubl case DT_LINEAR : return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; case DT_RADIAL : - return SetRadial( m_ptP5, m_ptPos, m_vtN, m_sText) ; + return SetRadial( m_ptP6, m_ptPos, m_vtN, m_sText) ; case DT_DIAMETRAL : - return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ; + return SetDiametral( m_ptP6, m_ptPos, m_vtN, m_sText) ; case DT_ANGULAR : - return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ; + return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ; default : return false ; } @@ -769,7 +759,7 @@ ExtDimension::Mirror( const Point3d& ptOn, const Vector3d& vtNorm) return false ; if ( ! m_vtDir.Mirror( vtNorm)) return false ; - // eseguo il mirror dei punti + // eseguo il mirror dei punti if ( ! m_ptP1.Mirror( ptOn, vtNorm)) return false ; if ( ! m_ptP2.Mirror( ptOn, vtNorm)) @@ -825,11 +815,11 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d case DT_LINEAR : return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; case DT_RADIAL : - return SetRadial( m_ptP5, m_ptPos, m_vtN, m_sText) ; + return SetRadial( m_ptP6, m_ptPos, m_vtN, m_sText) ; case DT_DIAMETRAL : - return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ; + return SetDiametral( m_ptP6, m_ptPos, m_vtN, m_sText) ; case DT_ANGULAR : - return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ; + return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ; default : return false ; } @@ -855,14 +845,14 @@ ExtDimension::ToGlob( const Frame3d& frRef) if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { // trasformo punto e versori return ( m_vtN.ToGlob( frRef) && - m_vtDir.ToGlob( frRef) && - m_ptP1.ToGlob( frRef) && - m_ptP2.ToGlob( frRef) && - m_ptP3.ToGlob( frRef) && - m_ptP4.ToGlob( frRef) && - m_ptP5.ToGlob( frRef) && - m_ptP6.ToGlob( frRef) && - m_ptPos.ToGlob( frRef)) ; + m_vtDir.ToGlob( frRef) && + m_ptP1.ToGlob( frRef) && + m_ptP2.ToGlob( frRef) && + m_ptP3.ToGlob( frRef) && + m_ptP4.ToGlob( frRef) && + m_ptP5.ToGlob( frRef) && + m_ptP6.ToGlob( frRef) && + m_ptPos.ToGlob( frRef)) ; } else return false ; @@ -885,14 +875,14 @@ ExtDimension::ToLoc( const Frame3d& frRef) if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { // trasformo punto e versori return ( m_vtN.ToLoc( frRef) && - m_vtDir.ToLoc( frRef) && - m_ptP1.ToLoc( frRef) && - m_ptP2.ToLoc( frRef) && - m_ptP3.ToLoc( frRef) && - m_ptP4.ToLoc( frRef) && - m_ptP5.ToLoc( frRef) && - m_ptP6.ToLoc( frRef) && - m_ptPos.ToLoc( frRef)) ; + m_vtDir.ToLoc( frRef) && + m_ptP1.ToLoc( frRef) && + m_ptP2.ToLoc( frRef) && + m_ptP3.ToLoc( frRef) && + m_ptP4.ToLoc( frRef) && + m_ptP5.ToLoc( frRef) && + m_ptP6.ToLoc( frRef) && + m_ptPos.ToLoc( frRef)) ; } else return false ; @@ -915,14 +905,14 @@ ExtDimension::LocToLoc( const Frame3d& frOri, const Frame3d& frDest) if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { // trasformo punto e versori return ( m_vtN.ToGlob( frOri) && m_vtN.ToLoc( frDest) && - m_vtDir.ToGlob( frOri) && m_vtDir.ToLoc( frDest) && - m_ptP1.ToGlob( frOri) && m_ptP1.ToLoc( frDest) && - m_ptP2.ToGlob( frOri) && m_ptP2.ToLoc( frDest) && - m_ptP3.ToGlob( frOri) && m_ptP3.ToLoc( frDest) && - m_ptP4.ToGlob( frOri) && m_ptP4.ToLoc( frDest) && - m_ptP5.ToGlob( frOri) && m_ptP5.ToLoc( frDest) && - m_ptP6.ToGlob( frOri) && m_ptP6.ToLoc( frDest) && - m_ptPos.ToGlob( frOri) && m_ptPos.ToLoc( frDest)) ; + m_vtDir.ToGlob( frOri) && m_vtDir.ToLoc( frDest) && + m_ptP1.ToGlob( frOri) && m_ptP1.ToLoc( frDest) && + m_ptP2.ToGlob( frOri) && m_ptP2.ToLoc( frDest) && + m_ptP3.ToGlob( frOri) && m_ptP3.ToLoc( frDest) && + m_ptP4.ToGlob( frOri) && m_ptP4.ToLoc( frDest) && + m_ptP5.ToGlob( frOri) && m_ptP5.ToLoc( frDest) && + m_ptP6.ToGlob( frOri) && m_ptP6.ToLoc( frDest) && + m_ptPos.ToGlob( frOri) && m_ptPos.ToLoc( frDest)) ; } else return false ; @@ -975,7 +965,7 @@ ExtDimension::Update( void) const else m_ptCalcPos = m_ptCalcP8 + m_vtDir * dHalfDist ; } - // dichiaro ricalcolo eseguito + // dichiaro ricalcolo eseguito m_bToCalc = false ; return true ; } @@ -994,15 +984,21 @@ ExtDimension::Update( void) const ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; } // punto di inserimento del testo - m_ptCalcPos = ( m_ptP5 + m_ptP6) / 2 ; + m_ptCalcPos = ( m_ptP5 + m_ptP2) / 2 ; // alzo il testo dalla linea di misura BBox3d b3Text ; if ( ! GetTextMyBBox( b3Text) && ! b3Text.IsEmpty()) return false ; double dHeight = b3Text.GetMax().y - b3Text.GetMin().y ; - Vector3d vtPerpDir = m_ptPos - m_ptP5 ; - vtPerpDir.Normalize() ; - if ( ! vtPerpDir.Rotate( m_vtN, 90)) + Vector3d vtPerpDir = m_ptPos - m_ptP6 ; + if ( ! vtPerpDir.Normalize()) + return false ; + // calcolo il frame dell'arco per valutare la posizione del testo + Frame3d frRef ; + if ( ! frRef.Set( m_ptP6, m_vtN)) + return false ; + double dAngDeg = 0 ; + if ( ! m_vtDir.GetAngle( frRef.VersX(), dAngDeg) || ! vtPerpDir.Rotate( m_vtN, ( dAngDeg < 90 ? 90 : -90))) return false ; m_ptCalcPos = m_ptCalcPos + 0.6 * dHeight * vtPerpDir ; // semidistanza di interruzione @@ -1021,7 +1017,7 @@ ExtDimension::Update( void) const m_bCalcArrowIn = false ; m_bCalcTextOn = true ; m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; - m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; + m_ptCalcP8 = m_ptP2 + m_vtDir * 2 * m_dArrowLen ; } // stanno fuori sia le frecce sia il testo else { @@ -1029,7 +1025,8 @@ ExtDimension::Update( void) const m_bCalcTextOn = false ; // metto la quotatura dal lato di ptPos Vector3d vtRad = m_ptPos - m_ptP5 ; - vtRad.Normalize() ; + if ( ! vtRad.Normalize()) + return false ; m_ptCalcPos = m_ptPos + vtRad * ( dHalfDist + 2 * m_dArrowLen) ; } // dichiaro ricalcolo eseguito @@ -1039,9 +1036,11 @@ ExtDimension::Update( void) const case DT_ANGULAR : { // angolo double dAngDeg, dAngDeg1, dAngDeg2 = 0 ; - Vector3d vtLine1 = m_ptP1 - m_ptP5 ; - Vector3d vtLine2 = m_ptP2 - m_ptP5 ; - Vector3d vtLine3 = m_ptPos - m_ptP5 ; + Vector3d vtLine1 = m_ptP1 - m_ptP6 ; + Vector3d vtLine2 = m_ptP2 - m_ptP6 ; + Vector3d vtLine3 = m_ptPos - m_ptP6 ; + // calcolo gli angoli tra m_ptPos e i due punti che identificano i lati dell'angolo + // per capire se sto calcolando l'angolo interno o esterno if ( ! vtLine1.GetAngle( vtLine2, dAngDeg) || ! vtLine1.GetAngle( vtLine3, dAngDeg1) || ! vtLine2.GetAngle( vtLine3, dAngDeg2)) return false ; if ( dAngDeg < dAngDeg1 + dAngDeg2 - EPS_SMALL || dAngDeg > dAngDeg1 + dAngDeg2 + EPS_SMALL) @@ -1049,14 +1048,17 @@ ExtDimension::Update( void) const // testo m_sCalcText = m_sText ; if ( m_sCalcText.find( IS_MEASURE) != string::npos) { - // calcolo gli angoli tra m_ptPos e i due punti che identificano i lati dell'angolo - // per capire se sto calcolando l'angolo interno o esterno string sAngDeg = ToString( dAngDeg, m_nDecDigit) ; ReplaceString( m_sCalcText, IS_MEASURE, sAngDeg + "°") ; } + // calcolo ptP5_bis + double dLen2 = vtLine2.Len() ; + if ( ! vtLine2.Normalize()) + return false ; + Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; // calcolo l'arco su cui metterò la misura PtrOwner pCrvPos( CreateBasicCurveArc()) ; - if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false)) + if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false)) return false ; // punto di inserimento del testo pCrvPos->GetMidPoint( m_ptCalcPos) ; @@ -1067,15 +1069,14 @@ ExtDimension::Update( void) const if ( ! pCrvPos->GetLength( dLen)) return false ; // calcolo anche lo spazio ad una distanza dal centro maggiorata - double dLenPos = 0 ; - double dDist = Dist( m_ptCalcPos, m_ptP5) ; - dLenPos = dDist * dAngDeg * DEGTORAD ; - // determino come orientare le frecce e dove mettere il testo - double dU ; + double dDist = Dist( m_ptCalcPos, m_ptP6) ; + double dLenPos = dDist * dAngDeg * DEGTORAD ; + // determino come orientare le frecce e dove mettere il testo // frecce e testo dentro if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { m_bCalcArrowIn = true ; m_bCalcTextOn = true ; + double dU ; pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; @@ -1086,12 +1087,11 @@ ExtDimension::Update( void) const else if ( dLen > 2 * dHalfDist || ( dLen < 2 * dHalfDist && dLenPos > 2 * dHalfDist)) { m_bCalcArrowIn = false ; m_bCalcTextOn = true ; + double dU ; pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP8) ; - //pCrvPosExt->GetStartPoint( m_ptCalcP8) ; - //pCrvPosExt->GetEndPoint( m_ptCalcP7) ; if ( dLen < 2 * dHalfDist) { m_ptCalcPos += ( m_ptCalcPos - m_ptP5) ; m_bCalcTextOn = false ; @@ -1101,11 +1101,9 @@ ExtDimension::Update( void) const else { m_bCalcArrowIn = false ; m_bCalcTextOn = false ; - //pCrvPosExt->GetStartPoint( m_ptCalcP8) ; - //pCrvPosExt->GetEndPoint( m_ptCalcP7) ; vtLine1.Normalize() ; vtLine2.Normalize() ; - if ( Dist( m_ptPos, m_ptP5) < Dist( m_ptPos, m_ptP6)) { + if ( Dist( m_ptPos, m_ptP5) < Dist( m_ptPos, ptP5_bis)) { Vector3d vtDirEnd ; pCrvPos->GetEndDir( vtDirEnd) ; m_ptCalcPos = m_ptP5 + dHalfDist * ( vtDirEnd + vtLine1) ; @@ -1113,7 +1111,7 @@ ExtDimension::Update( void) const else { Vector3d vtDirStart ; pCrvPos->GetStartDir( vtDirStart) ; - m_ptCalcPos = m_ptP6 + dHalfDist * ( - vtDirStart + vtLine2) ; + m_ptCalcPos = ptP5_bis + dHalfDist * ( - vtDirStart + vtLine2) ; } } // dichiaro ricalcolo eseguito @@ -1138,12 +1136,18 @@ ExtDimension::GetMidPoint( Point3d& ptMid) const ptMid = ( m_ptP1 + m_ptP2) / 2; return true ; case DT_ANGULAR : - { PtrOwner pCrvPos( CreateBasicCurveArc()) ; - if ( ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false)) - return false ; - pCrvPos->GetMidPoint( ptMid) ; - return true ; - } + { // calcolo ptP5_bis + Vector3d vtLine2 = m_ptP2 - m_ptP6 ; + double dLen2 = vtLine2.Len() ; + if ( ! vtLine2.Normalize()) + return false ; + Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; + Vector3d vtMid = ( ptP5_bis + m_ptP5) / 2 - m_ptP6 ; + if ( ! vtMid.Normalize()) + return false ; + ptMid = m_ptP6 + vtMid * m_vtDir.Len() ; + return true; + } default : return false ; } @@ -1163,7 +1167,7 @@ ExtDimension::GetCenterPoint( Point3d& ptCen) const case DT_RADIAL : case DT_DIAMETRAL : case DT_ANGULAR : - ptCen = m_ptP5 ; + ptCen = m_ptP6 ; return true ; default : return false ; @@ -1178,156 +1182,155 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& Update() ; // se quota valida switch ( m_nType) { - case DT_LINEAR : { - // prima linea di riferimento + case DT_LINEAR : { + // prima linea di riferimento + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP1) ; + lstPL.back().AddUPoint( 1, m_ptP3) ; + // seconda linea di riferimento + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP2) ; + lstPL.back().AddUPoint( 1, m_ptP4) ; + // se non c'è testo, linea di misura intera + if ( IsEmptyOrSpaces( m_sCalcText)) { lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP1) ; - lstPL.back().AddUPoint( 1, m_ptP3) ; - // seconda linea di riferimento - lstPL.emplace_back() ; - lstPL.back().AddUPoint(0, m_ptP2) ; - lstPL.back().AddUPoint(1, m_ptP4) ; - // se non c'è testo, linea di misura intera - if ( IsEmptyOrSpaces(m_sCalcText)) { - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP5) ; - lstPL.back().AddUPoint( 1, m_ptP6) ; - } - // altrimenti, linea di misura divisa in due parti - else { - // prima parte - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP5) ; - lstPL.back().AddUPoint( 1, m_ptCalcP7) ; - // seconda parte - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP6) ; - lstPL.back().AddUPoint( 1, m_ptCalcP8) ; - } - // frecce - lstPL.emplace_back() ; - GetArrowHead(m_ptP5, ( m_bCalcArrowIn ? -m_vtDir : m_vtDir), lstPL.back()) ; - lstPL.emplace_back() ; - GetArrowHead(m_ptP6, ( m_bCalcArrowIn ? m_vtDir : -m_vtDir), lstPL.back()) ; - // testo - POLYLINELIST lstTxt; - if ( ApproxTextWithLines(dLinTol, dAngTolDeg, lstTxt)) - lstPL.splice(lstPL.end(), lstTxt) ; - return true ; + lstPL.back().AddUPoint( 0, m_ptP5) ; + lstPL.back().AddUPoint( 1, m_ptP6) ; } - case DT_RADIAL : - case DT_DIAMETRAL : { - Vector3d vtRad = m_ptPos - m_ptP5 ; - vtRad.Normalize() ; - // prima linea di riferimento + // altrimenti, linea di misura divisa in due parti + else { + // prima parte lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP1) ; - lstPL.back().AddUPoint( 1, m_ptP2) ; - // freccia + lstPL.back().AddUPoint( 0, m_ptP5) ; + lstPL.back().AddUPoint( 1, m_ptCalcP7) ; + // seconda parte lstPL.emplace_back() ; - GetArrowHead(m_ptP6, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ; - Point3d ptArrowTail ; + lstPL.back().AddUPoint( 0, m_ptP6) ; + lstPL.back().AddUPoint( 1, m_ptCalcP8) ; + } + // frecce + lstPL.emplace_back() ; + GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? -m_vtDir : m_vtDir), lstPL.back()) ; + lstPL.emplace_back() ; + GetArrowHead( m_ptP6, ( m_bCalcArrowIn ? m_vtDir : -m_vtDir), lstPL.back()) ; + // testo + POLYLINELIST lstTxt; + if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) + lstPL.splice( lstPL.end(), lstTxt) ; + return true ; + } + case DT_RADIAL : + case DT_DIAMETRAL : { + // prima linea di riferimento + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP1) ; + lstPL.back().AddUPoint( 1, m_ptP2) ; + // freccia + lstPL.emplace_back() ; + Vector3d vtRad = m_ptPos - m_ptP6 ; + vtRad.Normalize() ; + GetArrowHead( m_ptP2, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ; + if ( ! m_bCalcArrowIn) { + lstPL.emplace_back() ; + Point3d ptArrowTail = m_ptP2 + vtRad * m_dArrowLen * 2 ; + lstPL.back().AddUPoint( 0, m_ptP2) ; + lstPL.back().AddUPoint( 1, ptArrowTail) ; + } + if ( m_nType == DT_DIAMETRAL) { + lstPL.emplace_back() ; + GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? - vtRad : vtRad), lstPL.back()) ; if ( ! m_bCalcArrowIn) { lstPL.emplace_back() ; - Point3d ptArrowTail = m_ptP2 + vtRad * m_dArrowLen * 2 ; - lstPL.back().AddUPoint( 0, m_ptP2) ; + Point3d ptArrowTail = m_ptP5 - vtRad * m_dArrowLen * 2 ; + lstPL.back().AddUPoint( 0, m_ptP5) ; lstPL.back().AddUPoint( 1, ptArrowTail) ; } - if ( m_nType == DT_DIAMETRAL) { - lstPL.emplace_back() ; - GetArrowHead(m_ptP5, ( m_bCalcArrowIn ? - vtRad : vtRad), lstPL.back()) ; - if ( ! m_bCalcArrowIn) { - lstPL.emplace_back() ; - Point3d ptArrowTail = m_ptP5 - vtRad * m_dArrowLen * 2 ; - lstPL.back().AddUPoint( 0, m_ptP5) ; - lstPL.back().AddUPoint( 1, ptArrowTail) ; - } - } - // testo - POLYLINELIST lstTxt; - if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) - lstPL.splice( lstPL.end(), lstTxt) ; - return true ; } - case DT_ANGULAR : { - // approssimerò l'arco con una polyline - PolyLine plApprox ; - // cerca nel geom kernel delle tolleranze standard - double dLinTol = 0.01 ; - double dAngTolDeg = 0.01 ; - // prima linea di riferimento - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP1) ; - lstPL.back().AddUPoint( 1, m_ptP3) ; - // seconda linea di riferimento - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP2) ; - lstPL.back().AddUPoint( 1, m_ptP4) ; - // curva per l'arco - PtrOwner pCrvPos( CreateBasicCurveArc()) ; - if ( IsNull( pCrvPos)) - return false ; - double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; - - // se non ho testo - if ( IsEmptyOrSpaces( m_sCalcText)) { - if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP6, m_ptP5, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) - return false ; - lstPL.emplace_back( plApprox) ; - } - // altrimenti, linea di misura divisa in due parti - else { - // prima parte - if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP5, m_ptCalcP7, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) - return false ; - lstPL.emplace_back( plApprox) ; - // seconda parte - if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP6, m_ptCalcP8, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) - return false ; - lstPL.emplace_back( plApprox) ; - } - // frecce - if ( ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false)) - return false ; - Vector3d vtStartDir ; - Vector3d vtEndDir ; - pCrvPos->GetStartDir( vtStartDir) ; - pCrvPos->GetEndDir( vtEndDir) ; - //storto la punta delle frecce su una direzione mediata tra l'arco e la perpendicolare al lato - double dFactor = 1 / ( 0.6 * m_vtDir.Len()) ; // questo fattore dipende direttamente dalla distanza di m_ptPos dal centro e smorza lo scostamento - Vector3d vtLine1 = m_ptP1 - m_ptP5 ; - Vector3d vtLine2 = m_ptP2 - m_ptP5 ; - vtLine1.Normalize() ; - vtLine2.Normalize() ; - // se però le frecce sono fuori non le storto e faccio le code dritte anziché curvilinee - if ( ! m_bCalcArrowIn) { - Point3d ptArrowTail1, ptArrowTail2 ; - ptArrowTail1 = m_ptP5 + vtEndDir * m_dArrowLen *2 ; - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP5) ; - lstPL.back().AddUPoint( 1, ptArrowTail1) ; - ptArrowTail2 = ptP5_bis - vtStartDir * m_dArrowLen *2 ; - lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, ptP5_bis) ; - lstPL.back().AddUPoint( 1, ptArrowTail2) ; - dFactor = 0 ; - } - lstPL.emplace_back() ; - Vector3d vtLine1 = m_ptP1 - m_ptP6 ; - if ( ! vtLine1.Normalize()) - return false ; - GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? vtEndDir : - vtEndDir) + vtLine1 * dFactor, lstPL.back()) ; - lstPL.emplace_back() ; - GetArrowHead( ptP5_bis, ( m_bCalcArrowIn ? - vtStartDir : vtStartDir) + vtLine2 * dFactor, lstPL.back()) ; - // testo - POLYLINELIST lstTxt ; - if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) - lstPL.splice( lstPL.end(), lstTxt) ; - return true ; - } - default: + // testo + POLYLINELIST lstTxt; + if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) + lstPL.splice( lstPL.end(), lstTxt) ; + return true ; + } + case DT_ANGULAR : { + // prima linea di riferimento + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP1) ; + lstPL.back().AddUPoint( 1, m_ptP3) ; + // seconda linea di riferimento + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP2) ; + lstPL.back().AddUPoint( 1, m_ptP4) ; + // curva per l'arco + PtrOwner pCrvPos( CreateBasicCurveArc()) ; + if ( IsNull( pCrvPos)) return false ; + double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; + // calcolo ptP5_bis + Vector3d vtLine2 = m_ptP2 - m_ptP6 ; + double dLen2 = vtLine2.Len() ; + if ( ! vtLine2.Normalize()) + return false ; + Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; + // approssimerò l'arco con una polyline + PolyLine plApprox ; + double dLinTol = 0.01 ; + double dAngTolDeg = 0.01 ; + // se non ho testo + if ( IsEmptyOrSpaces( m_sCalcText) || ! m_bCalcTextOn) { + if ( ! pCrvPos->SetC2PN( m_ptP6, ptP5_bis, m_ptP5, m_vtN) || ! pCrvPos->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + return false ; + lstPL.emplace_back( plApprox) ; } + // altrimenti, linea di misura divisa in due parti + else { + // prima parte + if ( ! pCrvPos->SetC2PN( m_ptP6, m_ptP5, m_ptCalcP7, m_vtN) || ! pCrvPos->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + return false ; + lstPL.emplace_back( plApprox) ; + // seconda parte + if ( ! pCrvPos->SetC2PN( m_ptP6, ptP5_bis, m_ptCalcP8, m_vtN) || ! pCrvPos->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + return false ; + lstPL.emplace_back( plApprox) ; + } + // frecce + if ( ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false)) + return false ; + Vector3d vtStartDir ; + Vector3d vtEndDir ; + pCrvPos->GetStartDir( vtStartDir) ; + pCrvPos->GetEndDir( vtEndDir) ; + //storto la punta delle frecce su una direzione mediata tra l'arco e la perpendicolare al lato + double dFactor = 1 / ( 0.6 * m_vtDir.Len()) ;// questo fattore dipende direttamente dalla distanza di m_ptPos dal centro e smorza lo scostamento + // se però le frecce sono fuori non le storto e faccio le code dritte anziché curvilinee + if ( ! m_bCalcArrowIn) { + Point3d ptArrowTail1, ptArrowTail2 ; + ptArrowTail1 = m_ptP5 + vtEndDir * m_dArrowLen *2 ; + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, m_ptP5) ; + lstPL.back().AddUPoint( 1, ptArrowTail1) ; + ptArrowTail2 = ptP5_bis - vtStartDir * m_dArrowLen *2 ; + lstPL.emplace_back() ; + lstPL.back().AddUPoint( 0, ptP5_bis) ; + lstPL.back().AddUPoint( 1, ptArrowTail2) ; + dFactor = 0 ; + } + lstPL.emplace_back() ; + Vector3d vtLine1 = m_ptP1 - m_ptP6 ; + if ( ! vtLine1.Normalize()) + return false ; + GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? vtEndDir : - vtEndDir) + vtLine1 * dFactor, lstPL.back()) ; + lstPL.emplace_back() ; + GetArrowHead( ptP5_bis, ( m_bCalcArrowIn ? - vtStartDir : vtStartDir) + vtLine2 * dFactor, lstPL.back()) ; + // testo + POLYLINELIST lstTxt ; + if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) + lstPL.splice( lstPL.end(), lstTxt) ; + return true ; + } + default: + return false ; + } } //---------------------------------------------------------------------------- @@ -1405,12 +1408,11 @@ ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELI Frame3d frRef ; if ( ! frRef.Set( m_ptCalcPos, m_vtN)) return false ; - + // oriento il testo con il raggio/diametro, ma solo se il testo è dentro la circonferenza if ( ( m_nType == DT_RADIAL || m_nType == DT_DIAMETRAL) && m_bCalcTextOn) { double dAngDeg = 0 ; - Vector3d vtRad = m_ptPos - m_ptP5 ; - m_vtDir.GetAngle( vtRad, dAngDeg) ; - if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - vtRad : vtRad))) + m_vtDir.GetAngle( frRef.VersX(), dAngDeg) ; + if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - m_vtDir : m_vtDir))) return false ; } diff --git a/ExtDimension.h b/ExtDimension.h index ceb49be..7ebae29 100644 --- a/ExtDimension.h +++ b/ExtDimension.h @@ -66,7 +66,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW const Vector3d& vtN, const std::string& sText) override ; bool SetDiametral( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const std::string& sText) override ; - bool SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptV, const Point3d& ptPos, + bool SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos, const Vector3d& vtN, const std::string& sText) override ; const Vector3d& GetNormVersor( void) const override { return m_vtN ; }